2018年4月14日土曜日

Alexa と Raspberry Pi でルンバに掃除してもらう:(3)Raspberry Piを赤外線リモコンにする

前回まででRaspberry Pi上でNode-REDが動きました。
ここまでが母艦側になります。
今回は母艦からコントロールされるエッジ側の準備です。

余談ですが、、、
ちょっと前までのIoT分野ではデータ収集がメインだったので
「エッジ」→「ゲートウェイ」→「サーバ」という名前の付け方が
多かったように思います。

今回のように母艦が複数のエッジデバイスを制御するような場合、
サーバ/クライアントモデルとかデータフローがあまり関係ないので
「サーバ」とか「ゲートウェイ」という名付け方は不適切に感じます。

呼び方がよく分からないので、ここでは制御の頭脳側を「母艦」と呼ぶことにします。
母艦から制御されるデバイス側を「エッジ」と呼ぶことにします。


エッジ側は複数のデバイスそれぞれに対応させる必要があります。
最終的にはルンバを動かしたいのですが、実はルンバの赤外線は
結構面倒だということがわかったので、まずはテレビを動かしてみようと思います。

【注意】
今回のやり方ではルンバは動きません。
後日説明しますが、ルンバの場合はRaspberry PiではなくArduinoを使います。
  1. 材料を揃える。
  2. 母艦のRaspberry PiにNode-REDをセットアップしてAmazon Echo Dotに認識させる
  3. Raspberry Pi Zero WをヘッドレスでWiFi対応セットアップする
  4. Raspberry Piで赤外線リモコンのコードをコピーする【今回】
  5. Node-REDから赤外線機能を呼び出してテレビを操作する
  6. FlashAirのGPIO機能でArduinoをHTTP API経由で制御する
  7. (おまけ)ArduinoからROI経由でルンバを動かす
  8. Arduinoから赤外線経由でルンバを動かす
  9. Node-REDからFlashAir/Arduino経由でルンバを動かす

lircをインストールする


Raspberry Piで赤外線を使うためにRaspbianにlirdをインストールします。
ググると数年前のブログが頻繁にヒットしてlircが酷評されていますが、
私が試した範囲では普通に使えています。
使い方に若干クセがあるようにも思いますがさほど問題ないように思います。

インストールは普通に apt-get で。
$ sudo apt-get install lirc

続いて、/boot/config.txtを編集します。
古いバージョンだと別の設定ファイルだったり、書き方が異なっていたりして混乱の元になっています。
Raspbian Stretch + lirc 0.9.4 の場合は /boot/config.txt の「#dtoverlay=lirc-rpi」という行を探して書き換えます。
$ sudo vi /boot/config.txt
# Uncomment this to enable the lirc-rpi module
dtoverlay=lirc-rpi
dtparam=gpio_in_pin=24
dtparam=gpio_out_pin=25
gpio_in_pin は、赤外線受信モジュールのセンサピンを繋ぐピン番号です。
gpio_out_pin が、赤外線LEDのアノード側。モジュールを使う場合は当然、入力ピンです。

Raspberry Piのピンアサインはここに書かれています。
config.txt に書くのは、ピン番号ではなくてGPIO番号です。
端から連番ではありません。
ちなみに、基板の半田付けする部分が1個だけ正方形になっていて、そこが3.3Vピンです。

次に、元々置かれている設定ファイルを読み込まないようにします。
デフォルトの設定は送信に対応していないようで、消し忘れると後々面倒なことになります。
$ sudo mv /etc/lirc/lircd.conf.d/devinput.conf /etc/lirc/lircd.conf.d/devinput.conf.disabled

この他、lirc についてググると「hardware.conf」に関する設定が出てくることがあります。
hardware.conf は現在では必要ないようです。
modprobeも必要ありません。

ここまでできたらRaspberry Piを再起動します。
再起動後に /dev/lirc0 デバイスが出来ていればとりあえずOKです。

赤外線受信モジュールを接続する

赤外線受信モジュールと送信モジュールを図のように接続します。
基板に「-」と書いてあるピンがGND、何も書いていないピン(真ん中)が3.3Vです。
「S」と書いてあるピンがGPIOの入出力。
受信モジュールはRaspberry Piから見れば入力センサなのでIN側のピン、つまりGPIO24に繋ぎます。
送信モジュール(赤外線LED)はRaspberry Piの出力なのでOUT側(GPIO25)です。

接続できたらRaspberry Piを起動し、mode2コマンドでlirc0デバイスを呼ぶと読み込み待ちになります。
この状態でテレビのリモコンを赤外線受信モジュールに向けてボタンを押します。
ボタンを押すと「Partial read 8 bytes on /dev/lirc0」と表示されると思います。
コマンドが終了してプロンプトが返ってくれば成功。
$ mode2 -d /dev/lirc0
Using driver default on device /dev/lirc0
Trying device: /dev/lirc0
Using device: /dev/lirc0

テレビのリモコンコードをコピーする

ここまででようやくRaspberry Piをリモコン化する準備が整いました。
lirc ではリモコンコードを読み込ませるツールが整っているので簡単にリモコン化できます。
$ irrecord -n -d /dev/lirc0
    :(中略)
Please take the time to finish the file as described in
https://sourceforge.net/p/lirc-remotes/wiki/Checklist/ an send it
to   so it can be made available to others.

Press RETURN to continue.
{リターンキーを押して何もしないで待つ}

Checking for ambient light  creating too much disturbances.
Please don't press any buttons, just wait a few seconds...

No significant noise (received 0 bytes)

Enter name of remote (only ascii, no spaces) :{「TV」など、設定の名前をつける}
Using TV.lircd.conf as output filename

Now start pressing buttons on your remote control.

It is very important that you press many different buttons randomly
and hold them down for approximately one second. Each button should
generate at least one dot but never more than ten dots of output.
Don't stop pressing buttons until two lines of dots (2x80) have
been generated.

Press RETURN now to start recording.
{リターンキーを押した後、赤外線受信部に向かってリモコンのボタンをランダムに押しまくる}
................................................................................
Got gap (106874 us)}

Please keep on pressing buttons like described above.
{もう1回押しまくる}
...................................................................................................................

Please enter the name for the next button (press  to finish recording)
{「on」とか「ch1」など、覚えさせたいリモコンボタンの名前を付ける}

Now hold down button "on".
{名前を付けたボタンを1回だけ押す}

Please enter the name for the next button (press  to finish recording)
{以下、ボタンごとに繰り返し。名前を付けずにリターンキーを押すと終了}

Checking for toggle bit mask.
Please press an arbitrary button repeatedly as fast as possible.
Make sure you keep pressing the SAME button and that you DON'T HOLD
the button down!.
If you can't see any dots appear, wait a bit between button presses.

Press RETURN to continue.
{何でも良いので同じリモコンボタンを連打する}
Cannot find any toggle mask.

Successfully written config file TV.lircd.conf
カレントディレクトリに「TV.lircd.conf」というファイルが出来上がります。
このファイルを/etc/lirc/lircd.conf.d/に移動します。
$ sudo mv TV.lircd.conf /etc/lirc/lircd.conf.d/
この状態で、lircdを起動。
$ sudo service lircd start
設定が読まれているか確認します。
$ irsend LIST "" ""
TV
$ irsend LIST TV ""
0043000001000251 on
004d000001000248 ch1
  :
では、実際にテレビに向かって送信してみます。
$ irsend SEND_ONCE TV on
これでテレビが反応すれば成功です。
もし、次のようなメッセージが出た場合はlircの最初の設定で「devinput.conf」を消し忘れている可能性が高いです。
$ irsend SEND_ONCE AV tv
transmission failed
Error running command: Input/output error
このエラーはググっても全く情報がなくてかなりハマりました。
一旦この状態に陥ると、後から「devinput.conf」を消してもダメです。
なぜなら、先ほど作成した TV.lircd.conf の中で、ドライバとして devinput が呼ばれてしまっています。

解決するには、devinput.conf と TV.lircd.conf の両方を消した上で、
lircd を再起動してから TV.lircd.conf を作り直します。


ここまでで Raspberry Pi からテレビを制御できるようになりました。
次回は Node-RED と結合して、ついにAlexaからテレビを動かします。

0 件のコメント:

コメントを投稿