Arduinoでkikuzo用赤外線リモコンを作る
はじめに
時がたつのが早い。「きくぞう」と呼ぶと、さっと忍者kikuzoがあらわれて、エアコンとかテレビとかをon-offしてくれるイメージがわいてから、すでに1年以上たってしまいました。
声でコントロールしたい、ことばの認識をgoogle assistantなどに頼ることなく、家の中だけで完結させたい、という動機は、下の記事に書いた通りです。
ずいぶん寄り道しながらも、edge impulseのおかげでようやくたどり着いたと思えるところまできたので、記事にします。
まずは、リモコン部分の作製から紹介します。はじめはBroadlinkのRM3をpython APIでコントロールすることを考えていましたが、kikuzoがエアコンに向かってIR LEDを構えている様子が思い浮かんでしまってからは、そのイメージから離れられなくなってしまいました。赤外線送信の部分も作ることにしました。
今回は、その赤外線リモコンを作るところのお話です。
材料と回路
Arduino UNOかcompatible board (sparkfun RedBoardなど)を使います。
シグナル受信用
- IR receiver (38kHz, TTSP4038, VISHAY)
でっぱりを手前にしてみた時に左からPin 1 -> D2, Pin 2 -> GND, Pin 3 -> 5 V (receiverによってpinの順序が違うかもしれないので、datasheetを見て調べてください)
シグナル送信用
電脳伝説:赤外線LED回路の決定版を見て作りました。以前どこかを参考にして作ったLED回路は暗くて少し離れると信号が届かなくなったのですが、これはうまく動きました。
- MOSFET2種類 (element 14より)
- 2N7000
- IRFU9024NPBF
- resistors
- 4.7k ohm
- 27 ohm (なかったので34 ohmで代用)
- IR LED (940 nm, Adafruit super bright 5mm IR LED)
リモコンからのシグナルを記録する
Arduino IDEにIRremote libraryがinstallされているかどうか確認。ない場合には、Sketch > Include Library > Manage Libraryとたどり、IRremoteを検索してinstall します。
File > Examples > IRremote から、ReceiveDampを開きます。
BoardにArduino UNOが選択されていることを確認し、uploadをクリックします。
Uploadが完了したら、Tools > Serial Monitorを選択するか、右上の方にある虫眼鏡のアイコンをクリックしてSerial Monitorを開きます。Baud rateは115200にしておきます。(ReceiveDamp中のsetup{}でそのようにセットされています)
IR receiverに向けて記録したリモコンのボタンを押すと、Serial Monitorに読み取った情報が流れます。
いろいろな形で読み取ったシグナルが表現されているのですが、”Result as microseconds arrayうんぬん”というところを探し出し、その部分の行をコピーしてエディタに貼り付けます。例えば下のような感じです。
よく見ると、rawData[99] = {}の中に二つの数字がペアになったものが何組も入っているのがわかります。すべてカンマで区切られていますが、カンマのあとにスペースがあるところとないところがありますね。3480,1670が一つの組、次が480,420という具合です。一番最後だけ一人ぼっちの数字になっています。
次にこれをpythonのコードで処理してarduino codeの記述に書き換えるのですが、数字の部分だけが必要なので、その部分だけをコピペしてファイルを保存します。例としてDVD-on.txtとして保存しました。
これをms-array-to-func-lines.py(GitHubに置いておきました)で次のように処理して
# まずはうまく動くか確認
python ms-array-to-func-lines.py DVD-on.txt
# うまくいったらリダイレクトして保存。例えば
python ms-array-to-func-lines.py DVD-on.txt > DVD-on-func-lines.txt
pulseIR(1230); delayMicroseconds(420);,,,のような関数呼び出しの行の連続に書き換えます。使い方は上で保存したファイルをargとしてとるだけです。結果はSTDOUTに流れますから、うまく動いていそうなことが確認できたらリダイレクトして保存してください。
記録したシグナルを送信してみる
送信コードはAdafruitのMaking an Intervalometerのページを参考にしました。(IRremoteのexampleにはSendRawDemoというのがあるのですが、勉強不足で使いきれていません)
Test用のArduino codeのひな型を示します。(GitHubにもおいておきました)下の方にあるyour_command()関数に上で用意したpulseIR(); delayMicroseconds();,,,たちを張り付ければテストできます。setup()中で一度だけyour_command()が呼び出されます。必要であればloop()中にyour_command()呼び出しとdelay(適当な長さ)を入れて実験してみてください。
// IR signal emitter test code
int IRledPin = 13;
void setup() {
Serial.begin(9600);
delay(1000);
// ir blast pin
pinMode(IRledPin, OUTPUT);
// call yours only once
your_command();
}
void loop() {
// leave this empty for now
// to emit repeatedly, uncomment following lines
// your_command();
// delay(5000); // wait 5 seconds. change the duration as you like
}
// this is from Adafruit page
void pulseIR(long microsecs)
{
// we'll count down from the number of microseconds we are told to wait
// cli(); // this turns off any background interrupts
noInterrupts();
while (microsecs > 0) {
// 38 kHz is about 13 microseconds high and 13 microseconds low
digitalWrite(IRledPin, HIGH); // this takes about 3 microseconds to happen
delayMicroseconds(10); // hang out for 10 microseconds, you can also change this to 9 if its not working
digitalWrite(IRledPin, LOW); // this also takes about 3 microseconds
delayMicroseconds(10); // hang out for 10 microseconds, you can also change this to 9 if its not working
// so 26 microseconds altogether
microsecs -= 26;
}
//sei(); // this turns them back on
interrupts();
}
void your_command()
{
// PLACE YOUR pulseIR(); delayMicroseconds();,,, lines here
}
注意
赤外線リモコンからのシグナルは、メーカーごとに異なる仕様に基づいています。いくつかの標準フォーマットがあるようで、high部分を作り出すためのシグナル周波数も38kHzとか40kHzとか異なるものが使われているようです。
ここに示した方法は、IRremote libraryで読み取ったシグナルパターンを38kHzぐらいでhighを送るように書かれたpulseIR()関数で再現するというものなので、仕様を理解してシグナルを組み立てるようなことは一切していません。読み取ったものがうまく動かない場合には、何度か読み取りからやり直すとうまくいくことがあります。周波数が大きく異なる仕様のものでは全くうまくいかないということもあり得ます。
私の場合、PanasonicのテレビとDVDプレーヤー、Mitsubishi、Daikinのエアコン、SONAという会社の扇風機で動くことが確認できています。
このあと
edge impulseより得られたモデルを使って、声によるコマンドで動くリモコン忍者kikuzoを作ります。これは別の記事として紹介いたします。
Mar30, 2024追記
リモコン忍者kikuzo初仕事の巻を投稿しました。