スマホのBlynkアプリを操作して、WiFiで接続したラズパイ(Raspberry Pi Zero WH)からリモコンを出力してみる。

構成

  • Raspberry Pi Zero WH (USBから電源供給、WiFiでネットワークに接続)x 1
  • 赤外線LED x 1
  • 電流制限抵抗(100ホーム)  x 1
  • 赤外線受光モジュール x 1 (波形確認用)

環境

  • OSは、Raspbian Strech Lite ($ lsb_release -aで表示できる)
  • WiFiでの接続設定は済。TeraTermからSSHでログインして操作
  • プログラム開発は、Windows上のVS Codeでソースコードを記述し、SSH File Systemでラズパイに接続してコピーする。(本当に便利!!)
  • Blynkアプリをスマホにインストール

ラズパイ側にLIRCを入れる

ネット上の記事を検索すると、皆一様に LIRC (Linux Infrared Remote Control) を使っているので、素直に右にならえする。

参考にさせていただいたサイト

手順

  • LIRCを apt-getでインストールする

    • $ sudo apt-get install lirc
  • デバイスとドライバーを設定する。

    • Raspbianのバージョンによって、設定ファイルが異なるらしい。自分はstretchなので注意して検索すると、、
    • 設定するファイルは、/etc/lirc/hardware.confでは無く、/etc/lirc/lirc_options.confらしい。下記2行を変更
  • モジュールとピンの設定を追加する

    • /boot/config.txt ファイルにピンを設定する。ここでは、IR受信用入力ピン=22, 送信用出力ピン=23として設定する。config.txtファイルには、lirc設定が一行だけ、コメントアウトされて記述されているので、#を消して、二行を追加した。
  • Rebootする。(sudo reboot)

  • モジュールが有効になっているかどうかを確認する。

    • 参考にしたサイトでは、この他に、rc_coreというのが表示されているが、自分の環境では表示されなかった。あと、librc_rpiの最後の数字が3で無く、2になっているが、これが問題なのかどうか分からない。とりあえず、次へ進んでみる。
  • lircがデバイスとして認識されているかどうかを確認する。

    • OKっぽい。
  • リモコンコードの受信をしているかどうか確認する(mode2)。

    • ここでは、手元にあった、ソニーのリモコンを操作してみた。ソニーのリモコンの、2.4msec、0.6msecの空白と0.6msecの「0」、0.6msecの空白と1.2msecの「1」・・・というパルス列が検出できているので大丈夫と思われる。
    • mode2を実行するためには、lircdが停止している必要がある。socketとserviceの両方を一度に止めるには、$sudo systemctl stop lircd.socket lircd.service を実行すれば良い。
    • mode2で –dを指定しない場合は、ディフォルトで /dev/lirc0が使われる。
    • 波形で観測しようと思ったが、リモコンから直接出ている赤外線と、Raspberryが出力している赤外線の区別が出来ないのでやめた。(勘違い・・。このmode2コマンドでは、赤外線の出力がされている訳では無い。単純に、入力したパルスの幅を検出して、その検出した幅を 標準出力にprintしているだけ。早とちり・・・。)
    • このmode2とは何か? mode2 -vでバージョンを確認すると、lircと同じバージョン番号だ。これは、lircと一緒にインストールされたコマンドと思われる。他に、librcでインストールされたコマンドには何があるのか?本家のページを見ると、Daemons and toolsというページに以下のリストがある。これらが、librcで使えるツール群かな。確かにmode2がある。確かに入力されたパルスをそのまま出力するツールらしい。
  • リモコンを受信して、設定ファイルを作成する

    • irrecordを試してみたが、エラーが出た。
    • sudo service lircd stop あるいは、sudo /etc/init.d/lircd stop でデーモンを止めて、再度、irrecordをやってみたが同じエラーが続く。なぜだ。
    • ネットで色々調べてみたが、このような症状の例は見つからない。lsmod の結果で rc_coreが表示されない事が、関連しているのかもしれない。なぜ、rc_coreが出てこないのか?について、要調査。
      • lircdのソケットとサービス両方の止め方
        • $ sudo systemctl stop lircd.socket lircd.servic
      • 再開の仕方
        • $ sudo systemctl start lircd.socket lircd.service
    • なぜだ・・・ rc_coreがlsmodで表示されないことがそもそも問題なのかどうかが分からない。色々やっていたら、一度だけ、irrecordが動作してconfファイルも出来た。が、その後また出来ない。設定は変えていないのに・・・。
  • 再度やってみる。
    • reboot
    • lircdのserviceとsocketを止める
    • mode2でIR入力を確認する
    • irrecord -n -d /dev/lirc0 hoge.conf を実行する。→ 出来た!
    • この時点で、lsmod | grep lircを叩くと やはり lirc_rpiと、lirc_devしか無い。rc_coreは存在しないが、とりあえず、irrecordは出来た。違いは? 先程は書き込み権限の無いディレクトリで実行しようとしていたかも?
    • 大丈夫っぽい。
    • ちなみに、-d /dev/lirc0 は指定しなくても、defaultのドライバーが /dev/lirc0 になるので結果は同じ。
    • $ irrecord –n test.conf を実行する。
    • この指示に従って、ソニーのリモコンで configurationファイルを作成する。
    • できた confファイルを、/etc/lirc/lircd.conf.d/ の中へ移動する。
      • sudo mv sony.lircd.conf /etc/lirc/lircd.conf.d/
    • もともと入っている、devinput.lircd.confを使わないように、ファイル名を変えておく。(拡張子が confで無ければ無視されるから)
      • confファイルを変更したため、設定を再読込が必要。そのためには、lircdを再起動ればよい。(systemctl restartで試してみたが、エラーが出たので、stop して startするという形で二回に分けて実行した)
  • irwコマンドで、リモコンのキーが正しく検出されるかを確認→OK!

  • 送信してみる

    • irsendコマンドを使って、実際にIRを送信してみる。
    • 波形を観測 (上:IR受光部の出力、下:GPIO-23からの出力)
      • pic_33_1
      • IR受光部からの信号の振幅が2V程度しか出ていない理由は不明。電源電圧は 3.3Vだからもっと高くても良いはずだが。
      • GPIO-23番の出力は3.3Vあるので正常。この実験では、赤外線ダイオードのドライブにトランジスタは使わず、直接 GPIO23→抵抗(100Ω)→アノード→カソード→GNDとして接続した。
      • GPIOから出ているパルスを拡大すると、約37kHzのパルスが出ている事がわかる。ソニーの規格は38kHzなので正しいといえる。
      • pic_33_2

Pythonのプログラムから IRを出力する

コメント

  1. […] Raspberry PiにLircをインストールして、シェルからの赤外線送信、受信が正常にできるように設定する。(この記事に詳細を記載) […]