2013年3月6日水曜日

Raspberry Piの赤外線リモコン


もうすぐ基板が出来上がってくるので前準備です。
RaspberryPiに載せて赤外線リモコンを送受信するための回路とプログラムをまとめておきます。

■回路図

























GPIO4(GPIO_CLK0)で赤外線リモコンの出力時のPWMを作るために76KHz(38KHzの倍)のclkを出力します。
それをPCM_CLKに入力しサンプリングCLKとして使用します。
PCM_INに赤外線受光部の信号を入れてサンプリング、PCM_OUTからFETを通して赤外線LEDを制御します。


■RaspberryPiの環境
linuxはRaspbian wheezyを使用。X-Windowは重たいのでoff。基本的にsshでloginして制御しています。

iraccess.tgzを適当なdirectoryに展開するとirremote/以下にソースコードが展開されるので
irremoteに移動してmakeするとirremote/irremoteが作成されます。

/dev/memをとおしてPCM I/Fを操作するのでirremoteの実行は
# sudo irremote [record|send] <file>
とroot権限で実行して下さい。/dev/memの属性を666にしてもOKですが、危険なのでお勧めしません。
record時のファイル名は何でも大丈夫ですが、MAKER_CATEGORY_MODEL_COMMAND.rmcとしたほうが後々整理しやすくて良いかと思います。
例えばsonyのTV KDL-32EX720の1chのボタンの場合はSONY_TV_KDL-32EX720_1.rmcなどです。

記録するには
# sudo irremote record SONY_TV_KDL-32EX720_1.rmc
を実行し、リモコンの1chボタンを押すと少ししてファイルを作って終了します。

コマンドを発行するには
# sudo irremote send SONY_TV_KDL-32EX720_1.rmc
とすると赤外線リモコンコードを出力します。

動作原理
GPIO_CLK0をOSC CLKの19.2MHzから分周して76KHzを作り出力する設定にします。
これをHWでPCM_CLKに入力し、サンプリングCLKとして使用しています。
受信時はPCMを16bit x 2chでCH1 16bit, CH2 16bitと間を開けないモードに設定しサンプリングします。
これで76KHzで1bitずつsamplingされたデータがPCMのFIFOに入ってくるので、SWでFIFOからメモリに読み出しをします。
FIFOは32bitx64段あるので26.9ms以上task switchが回ってこないと取りこぼしますが、相当重たい処理を裏で実行してない限り大丈夫かと思います。FIFOを何段位使っているかを計測したところ通常は11段程度までしか使用されていませんでした。
メモリに読み込んだデータは、メモリ上でNEC/AEHA/SONY/Otherの解析をして、ファイルへ出力するデータを生成します。NEC/AEHA/SONY以外のフォーマットの場合はOtherになりますが、この場合はちょっとサイズが大きめになります。

送信時は受信時の逆で、ファイルからデータを読み込み、PCMで出せる形にメモリ上で展開します。
この時、受信時には赤外線受光部で搬送波が除かれた状態で出力されていますが、送信時は38KHzの搬送波に載せる必要があるので、Highの区間は偶数bitのみ1、奇数bitは0にします。サンプリング周波数が76KHzなのでこれで38KHzの搬送波になります。

基板ができてきました。-> RP-1/IR基板

2 件のコメント:

  1. この暑さに参って、自分もRasberyPiでエアコン制御を試してみたいと思い参考にさせていただいてます。
    LIRCと違ってWPMを使っている分、こちらのほうがシステム負荷が少そうです。
    ぜひ回路を参考にさせていただきたいのですがR103以外は抵抗値が記載されていないっぽいんですが・・・。

    返信削除
  2. R103以外は0Ωで大丈夫です。
    R108,109はピンアサインの違うIR-RECEIVERで電源の接続を入れ替えられうように基板を設計したために入っています。使うIR-RECEIVERのピンアサインを気をつけてください。
    R102,103は赤外線LEDの電流制限用ですがこの電圧で使うときにはFETの方の電流制限が効いてくるので0Ωで大丈夫です。違うFETを使う場合は特性をチェックして必要なら電流規制の抵抗を入れてください。

    返信削除