ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

ホーム > コミュニティ > アート > arduino > トピック一覧 > 赤外線リモコンが動きません

arduinoコミュの赤外線リモコンが動きません

  • mixiチェック
  • このエントリーをはてなブックマークに追加

コミュ内全体

はじめまして。今月頭に arduino の存在を知り、現在色々と
勉強をしている者です、よろしくお願いします。

DCモーターやLCD、SDカードなどはある程度コントロールが
できるようになったのですが、赤外線リモコンの制御がうまく
いかず現在困っております。識者の方の知識をお借りしたく
今回トピ立てさせていただきました。

赤外線リモコンにつきましては、こちらのページを参考に
(というかまずは動かすためにこちらのページのままに)
回路を写真のように作成しました。
http://d.hatena.ne.jp/NeoCat/20090419/1240158722

こちらのページの通りにスケッチを arduino UNO に書き込み
Panasonic の VIERA のリモコンをセンサに照射すると、
確かにシリアルに数字が表示され認識している様が表示
されているため、受信は正常に動いているようです。
しかし、そのデータをシリアル経由で送信してもTV側が
反応しない状態です。赤外線LEDが発光していないのかも
しれないと思い、可視光LEDに取り替えたところきちんと
光っており、赤外線LEDもデジカメを通して見れば発光
している事を確認できます。

なぜこちらの環境でリモコンとして正常に動作しないのかが
まるっきりわからず途方にくれておりますが、こちらのページ
の赤外線リモコンを試して正常に動作された方にノウハウを
教えていただければ幸いです。

現在考えうる不具合の原因に

1)受光素子でノイズが混入していてシリアルに出された
 数値が正確ではない。
2)受光素子で受けた信号の 38kHz のキャリアを削除されて
 いるため、そのまま発光してもTVが認識しない。
3)発光素子に38kHzを乗せる必要がある。
4)発光素子の出力が弱すぎて認識しない。

などがありますが、ノウハウ不足で先に進めない状況です。
発光素子に OSI5LA5113A 、光素子に PL-IRM2121-A538を
使っています。(写真は確認用に可視光LEDをつないでます)

以上の通り、是非ご教授願えれば幸いです。よろしくお願いします。

コメント(17)

「たく」さん
1.赤外線LEDに規定の電流が供給できているのか?
赤外線LEDはけっこう電流を必要とします。規定の電流が供給出来ているか?
継続して安定に電気が供給できてる?(最初は流れていても、時間と共に電流が
減衰してしまうような電源を使ってない?)
http://akizukidenshi.com/catalog/g/gI-04312/
↑ここにOSI5LA5113Aのデータシートと接続抵抗の計算方法の資料が掲載されて
いるので勉強してみてください。

2.Duemilanove 328とUNOのハードの違いにより、スケッチを修正しなければ
ならない所はないの?
3.2009年4月当時のIDEと現在お使いのIDEのバージョンの違いによりスケッチ
を修正しなければならない所はないの?

・先ずはこのスケッチが何をやっているのか?を理解して修正が必要な箇所は
ないのかを確認する。
・私ならUNO、赤外線受光素子、赤外線LEDを2組み用意し、非常に単純な
赤外線通信のスケッチから試していくけどなあ。こっちのスイッチを押すと
向こうのLEDが点灯する。の様な単純なスケッチ。それから38kHzを乗せた
通信にチャレンジしてみる。次に家電赤外通信のプロトコルを理解し、
スケッチを書いてみる。

(スケッチの内容が理解できていないものを、コピーして利用する場合は
Arduino、IDEのバージョン、電子部品、回路をまったく同じ物にしないと
正確に動かない場合の方が多いと思います。)

いかがでしょうか?
いさおさんのアドバイスは実験をする上でとても重要だと思います。

少し付け加えさせてください。
1)受光素子でノイズが混入していてシリアルに出された数値が正確ではない。

これは繰り返し同じ信号を受信して再現性があれば正確と言えると思いますが、
その前に、ビエラのリモコンの周波数が本当に38KHzかどうかの検討が必要です。
このサイトによるとパナソニックのテレビリモコンのキャリアは
36.5-37KHzと低めだったそうで、そのばあい、キャリア38KHzのセンサーで
取りこぼしが起きる可能性があります。
http://freiheitstrom.fam.cx/~saitou/DIARY/XDATE_110723-XKEY_ELEHOBBY.html
テレビ以外の色々なリモコンで試してみるのもいいですね。

2)受光素子で受けた信号の 38kHz のキャリアを削除されて いるため、そのまま発光してもTVが認識しない。

これはスケッチのこの部分でキャリアを作成しているようです。
do {
digitalWrite(ir_out, 1 - (cnt&1)); // iが偶数なら赤外線ON、奇数なら0のOFFのまま
delayMicroseconds(8); // キャリア周波数38kHzでON/OFFするよう時間調整
digitalWrite(ir_out, 0);
delayMicroseconds(7);
} while (long(us + len - micros()) > 0); // 送信時間に達するまでループ
}
ここではdelayMicroseconds(), digitalWrite()の関数, do, whileの実行時間がキャリア周波数に直接影響する事が重要です。Arduinoの製品名やコンパイラーのバージョンによってプログラムの実行速度が変わった場合に最も影響を受けるのがこの部分だと思います。

3)発光素子に38kHzを乗せる必要がある。
これは2)と同じことなので、キャリアは乗せてあると理解しましょう。(私の勘違いでなければ)

4)発光素子の出力が弱すぎて認識しない。
これはテレビとの距離にもよると思います。それよりも、元記事よりも強力な赤外線発光ダイオードに変えてありますが、お使いのものは順方向電流が標準50mAなのでArduinoのピン出力から見ると大きすぎると思います。元記事のLEDでは順方向電流は標準20mAです。ATMega328, 328Pではピン出力の絶対最大定格で40mAのはずでこれはUNOでもDuemilanoveでも同じです。抵抗無しの直結でピンから5Vを出力すると、Vf1.35VのLEDにはかなり大きな電流が流れることが出来るので50mAを越えるかも知れません。LED側は絶対最大定格で100mA, パルスでは1000mAまで許容されるので、破損はしていないでしょうが、LED出力波形は正しい矩形波にならず、信号が伝わらない可能性があります。こういうときはトランジスタを間に挟むのが常套手段ですが、その回路次第では出力信号が不正確になる可能性もあります。

最後に、手詰まりになる一番の理由は測定器の不足ではないかと思います。
今回の工作ならオシロスコープで入力信号と出力信号の違いを見れば原因究明が進むはずです。素人工作家の私が使っているオシロスコープは簡易のものですが、あるとないとではデバッグの効率が随分違います。DSO nano2というもので1万円しません。
 卓上ポータブル型は3万円くらいから売られています。USBタイプでパソコンにつなぐものもあります。低速の実験にはテスターやLED、シリアル出力など動作確認できるのですが、高速となると動作確認にはデジタルオシロスコープがあったほうがいいです。中でもコンパクトでArduinoと接続したまま持ち運べるという点でDSOシリーズは便利です。

arduino工作は楽しいですよね。ぜひ頑張ってください。
いさおさん、nnishiさん
 アドバイスありがとうございます。ここ数日ちょっと赤外線周りをいじれて
 いないので、時間ができ次第追試して結果を報告させていただきます。
 それまでの間すこしお時間をください。
Atmelチップは普段Cで書いてて、たまに他人から動かないから見てくれといわれたときにArduinoをさわる程度なので、的外れだったらすみません。

ソースを見てみた感じ、キャリア生成部の1サイクルのディレイの総時間が15uSになってて、ほかの命令の実行時間とあわせてもまず38KHzにはならないと思うのですがいかがでしょう?ちゃんと計算してませんが38KHzだと1T=26uSぐらいですよね?

とりあえず自分はキャリアがあやしいとおもいます。自分で発光させた者を受光センサにあてて、端子をマルチメーターか何かで見て、ちゃんとキャリアをディテクトしてるかどうか調べてみるといいんじゃないでしょうか?

受光部はそんなにバンド幅は狭くないのである程度あってれば反応しますが、できればPWMで発光させた方が安定するかなと思います。
ねこ蔵さんのいう通りキャリアが怪しいと思います。そのほか、わたしの経験では、

部屋の蛍光灯(特に高周波点灯)が邪魔になります。

あと、赤外LEDの指向性にも注意が必要ですね。
ねこ蔵さん、御指摘ありがとうございます。

Arduinoの標準ライブラリの実行速度についてうろ覚えだったので探してみました。
ガリレオ7の記事によると(http://blog.galileo-7.com/?eid=86932)
Cでポートを直接操作すると3CPUクロックですが、標準ライブラリのdigitalWrite()ではかなり時間がかかって44CPUクロックサイクルだそうです。16MHzクロックだと62.5 nS x 44 = 2.75マイクロS。これが2つあるのでループ内だけで5.5、それに8+7で計20.5マイクロS。条件分岐ループについては資料が見つかりませんでしたが、while()の中に関数があり演算もしているので、総計では案外26.3マイクロSに近づくかもしれません。記事中のコンパイラは2009年時点です。その後に命令実行時間が変わっているかも知れません。従って、実測しながらディレイを決めていくことになると思います。

ついでにdegitalReadは30CPUクロック、アナログ入力ではさらに時間がかかって1664クロック+ライブラリ処理時間だそうです。
>>[6]
うーん(-_-;)だとすると、タイミングがシビアな今回は難しくなってきますね。
#tone()で38kHzってできないかなぁ。
やはり、実測が必須みたいですね。
Arduinoって普通にCでかけるんで、デジタル出力を変えるところだけCで書いてはだめですか?
PORTx |= LED_PIN;
PORTx &= ~LED_PIN; 見たいな感じで。
そうすれば3Clksですか?ほぼdelay関数だけの時間制御しても誤差の範囲ですむと思います。

toneもon/offの切り替えが数クロックであれば十分いけそうですね。Dutyが50%になってしまいますが。
それかtone関数が遅くて使い物にならない場合は、周波数だけ設定しておいて、当該タイマ出力のOCを
直接Cで叩いて切り替えるかですね。

Arduinoはシリアルから何かをよんでSDに記録したりするのはプログラムが数分でかけてすごく便利なんですが、こういうリアルタイム処理が必須な制御なんかをやろうとすると結局ソースがCになってしまうので、どうしてもCメインになってしまってます。このコミュでいう事ではないですが(^^;
皆さん、色々とアドバイスありがとうございます。今すぐにでもいじりたいのですが、
この土日も含めまだ時間が取れそうにありません。必ずテストしてみますので、
いましばらくお時間ください。
コメントくださった皆様、ありがとうございます。ちょっと追試してみました。

もともとの目的としては、キャリアのON/OFFを含めた物理的な発光状態をサンプリング
できるような学習リモコンを目指していたのですが、arduino ではちょっと難しそうだと
いうことがわかってきました。
そもそもの勘違いは、赤外線の受光モジュールで38kHzのキャリアがカットされるという事を
知らなかった事でした。また、受光モジュールの OUT の出力が安定していない状況も確認
できました。(赤外線を受光していないのに時々ノイズが乗る)
そこで、555 を使って 38kHz のキャリアを作り、HC00 でキャリアと受光ユニットの出力を
合わせた出力信号で赤外線LEDをドライブする(赤外線リモコンリピーターのようなもの)と
いう実験をしてみましたがやはりうまく動かず、ちょっと途方に暮れています。

いさおさん
>1.赤外線LEDに規定の電流が供給できているのか?
7805 から 47Ω で 2SC1815 を使ってドライブしています。ベース抵抗は 3.3kΩ です。
データシートありがとうございます。確認してみます。
>2.Duemilanove 328とUNOのハードの違いにより、スケッチを修正しなければ
>ならない所はないの?
>3.2009年4月当時のIDEと現在お使いのIDEのバージョンの違いによりスケッチ
>を修正しなければならない所はないの?
ぱっと見状態でしたが質問当時は「一応」動いている、という認識程度しかありません
でした。クロック単位での動作までは詳しくチェックしていませんでした。
ボタンを押してLEDが点等する、といったスケッチも試してみて動いている事は確認できま
した。家電赤外線やNECフォーマットのプロトコル、というものより、赤外線信号のサンプラー
に近い学習型赤外線リモコンを作りたいと考えておりましたが、arduino のRAMでは難しい
事もわかってきました。23K256 使って拡張を・・・とも考えてますが、これはまた別の機会に。

nnishiさん
>ビエラのリモコンの周波数が本当に38KHzかどうかの検討が必要です。
これ初耳でした。別の機械で試した方が・・・と思いましたが、手元にあるリモコンは困った
ことに VIERA と DiGA・・・パナソニック製品ばかりです orz エアコンはナショナルだから
そっちで試すしかないかなぁ。結構赤外線リモコン、使ってないんです。
>2)受光素子で受けた信号の 38kHz のキャリアを削除されて いるため
これが一番の勘違いの原因だったようです。ですので上記のように HC00 で キャリアと信号を
合成した出力で LED をドライブするようにしてみましたが、うまく動きませんでした。
>4)発光素子の出力が弱すぎて認識しない。
TVのリモコン受信部に接触させてテストしてみましたが、うまくいきませんでした。ただ、
上記のように別問題の可能性もあるので追試中です。
>こういうときはトランジスタを間に挟むのが常套手段ですが
2SC1815でベース抵抗3.3k、コレクタに 5V から 47Ωで赤外線LEDをドライブしました。
>最後に、手詰まりになる一番の理由は測定器の不足ではないかと思います。
今手元にあるのが、SONYテクトロの簡易オシロつきのマルチメーターだけで不足を痛感
しています。校正せず10年放置の50MHzデジオシはありますが、プローブが行方不明
という有様でして。ロジアナが欲しいと思う今日この頃です・・・

ねこ蔵さん
>ほかの命令の実行時間とあわせてもまず38KHzにはならないと思う
uno になった事でクロックが早くなったって事でしょうか、だとしたらここを調整する必要が
ありますね。確認してみます。
>できればPWMで発光させた方が安定するかなと思います。
そうですね、Digital3 はあけてあるので、ここで PWM でドライブするのがスマートかもしれ
ません。PWM の周波数と duty を制御する方法は確かどこかのサイトで見たような・・・
>PORTx |= LED_PIN;
>PORTx &= ~LED_PIN; 見たいな感じで。
個人的にはアセンブラであっても抵抗ないので、早くて安定した処理ができるのであれば
全然問題ありませんです。

ぐっちさん
>部屋の蛍光灯(特に高周波点灯)が邪魔になります。
これありますよね。一応受光素子を黒い樹脂性のケースで囲って、外部から光が入らない
ようにはしてみました。が、それでもノイズがのるようです。電源周りからノイズが来ている
可能性も否定できません。安定化させて追試してみます。
>あと、赤外LEDの指向性にも注意が必要ですね。
ものすごく狭いんですよね。ただ、上記の通り受光素子に接触させて照射しているので、
光が当たっていない、という事はないと思います。

もう少し勉強して頑張ってみます・・・しかし機材不足は厳しいです。
関東近圏で arduino OFF会とか無いかなあ。先人達の技術を拝見したいものです。
今日ちょっと追試してみました。赤外線センサーからの受信信号に
38kHzのキャリアを乗せてそのまま赤外線LEDで出力する回路
(いわゆる赤外線リピーター)を
http://www.eonet.ne.jp/~wakita/remotekairo.html
さんのページを参考に作ってみたところ、最初の1コマンド分だけは
反応するものの次のコマンド以降を受け付けないという謎の症状が
再現しています・・・orz
ただ、確かにキャリアを乗せた信号にTV(VIERA)が反応したので
赤外線リモコンの基礎の基礎の部分はなんとか理解できたかも
しれません。これで、入力と出力をそれぞれ arduino に接続して
制御するという流れに持っていけそう・・・なのかな?
まずは報告まで、赤外線が制御できるようになるまでがんばって
みます。ありがとうございました。
そういえば昔、palmの赤外線リモコンアプリには、
IrDAしかつまれていないにもかかわらず無理やり力技でリモコン化していたものがあったような。
38KHzキャリアはそのままでは出せなかったはず…。
そんな遠い記憶が…
こんばんは。古いオシロを引っ張り出してにらめっこしながら
試した結果、一応動いたのでご報告です。

結局出力は pin3 で PWM で 38kHz 近似のキャリアを生成し
そのデューティーを ON で 50%、OFFで100%にする事で実現
しました。出力のON/OFFの切り替えも、

if (q==0) { // 消燈
OCR2A =0 ; // OFF
OCR2B =0 ;
} else {
OCR2A = ocr2aBuf ; // ON
OCR2B = ocr2bBuf ;
}

とする事で実現でき、実行時の遅延もほとんど存在しません
でした。取得した信号をそのまま一度バッファに溜めて、
バッファから赤外線LEDに出力する事でなんとか動くように
なりました。(100%ではないですが)

色々とご指摘をいただきまして、勉強させていただきました。
ありがとうございました。

現状ではまだLEDの飛距離があまり無いので、今後はいかに
して出力を上げるかを考えています。2SA1015でベース抵抗
10k、コレクタ抵抗47で動かしてますが、5Vではほとんど飛ばない
ですね・・・どうやって市販のリモコンなどは飛距離伸ばしてる
んだろう・・・

あと、試作してるうちにシールドが8階建てになってしまいました。
最終的には1つの基盤におさめる予定ですが・・・現状ものすごい
ことに・・・
>>[13]
本題から外れて恐縮ですが、8階建てシールドがすごいですね。
写真から察するところ万能基板のようですが、半ピッチずらしはどのように処理されているのでしょうか?
2階が半ピッチずらし専用なのかな?
jtakaoさん
これは半ピッチずらしではなくて、最初から写真のように足の長いソケットを
使っています。ストレートに乗せることができるため、ずらしの必要がありま
せん。2階がずれてるように見えますが、最初の試作シールドだったため
ソケットの位置が決まっていなかったので他のシールドとずれているだけ
です。秋葉原の秋月で6本足が30円、8本足が40円で売っているので
1シールドあたり140円です。

カモサワ逃げ道マサオさん
ありがとうございます。完成しないと意味がないですが。w

>>[16]
なるほど。
確かに、足が長ければ確かに基板上でずらさなくても入りますね。シンプルな解決法ですね。
ありがとうございます。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

arduino 更新情報

arduinoのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング

mixiチケット決済