スマホの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行を変更
    • driver = default device = /dev/lirc0

  • モジュールとピンの設定を追加する

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

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

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

    • OKっぽい。

    • $ ls -l /dev/lirc*
      crw-rw---- 1 root video 245, 0 Dec 24 16:09 /dev/lirc0
  • リモコンコードの受信をしているかどうか確認する(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が使われる。
    • $ sudo /etc/init.d/lircd stop [....] Stopping lircd (via systemctl): lircd.serviceWarning: Stopping lircd.service, but it can still be activated by: lircd.socket . ok $ sudo mode2 -d /dev/lirc0  ・・・sudoは無くてもOK) Using driver default on device /dev/lirc0 Trying device: /dev/lirc0 Using device: /dev/lirc0 Running as regular user yy space 16777215 pulse 2437 space 604 pulse 575 space 578 pulse 1249 .....

    • 波形で観測しようと思ったが、リモコンから直接出ている赤外線と、Raspberryが出力している赤外線の区別が出来ないのでやめた。(勘違い・・。このmode2コマンドでは、赤外線の出力がされている訳では無い。単純に、入力したパルスの幅を検出して、その検出した幅を 標準出力にprintしているだけ。早とちり・・・。)
    • このmode2とは何か? mode2 -vでバージョンを確認すると、lircと同じバージョン番号だ。これは、lircと一緒にインストールされたコマンドと思われる。他に、librcでインストールされたコマンドには何があるのか?本家のページを見ると、Daemons and toolsというページに以下のリストがある。これらが、librcで使えるツール群かな。確かにmode2がある。確かに入力されたパルスをそのまま出力するツールらしい。
    • Daemons and tools
      ircat
      irdb-get
      irexec
      irpty
      irrecord
      irsend
      irsimsend
      irtestcase
      irtext2udp
      irw
      irxevent
      lirc-config-tool
      lirc-lsplugins
      lirc-lsremotes
      lirc-setup
      lircd
      lircmd
      lircrcd
      mode2
      pronto2lirc
      xmode2

  • リモコンを受信して、設定ファイルを作成する

    • irrecordを試してみたが、エラーが出た。
    • $ irrecord -n -d /dev/librc0 Using driver default on device /dev/librc0 Could not init hardware (lircd running ? --> close it, check permissions) $

    • 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 を実行する。
    • Using driver default on device /dev/lirc0
      
      irrecord -  application for recording IR-codes for usage with lirc
      Copyright (C) 1998,1999 Christoph Bartelmus(lirc@bartelmus.de)
      
      This program will record the signals from your remote control
      and create a config file for lircd.
      
      A proper config file for lircd is maybe the most vital part of this
      package, so you should invest some time to create a working config
      file. Although I put a good deal of effort in this program it is often
      not possible to automatically recognize all features of a remote
      control. Often short-comings of the receiver hardware make it nearly
      impossible. If you have problems to create a config file READ THE
      DOCUMENTATION at https://sf.net/p/lirc-remotes/wiki
      
      If there already is a remote control of the same brand available at
      http://sf.net/p/lirc-remotes you might want to try using such a
      remote as a template. The config files already contains all
      parameters of the protocol used by remotes of a certain brand and
      knowing these parameters makes the job of this program much
      easier. There are also template files for the most common protocols
      available. Templates can be downloaded using irdb-get(1). You use a
      template file by providing the path of the file as a command line
      parameter.
      
      Please take the time to finish the file as described in
      https://sourceforge.net/p/lirc-remotes/wiki/Checklist/ an send it
      to  <lirc@bartelmus.de> so it can be made available to others.
      
      Press RETURN to continue.
    • この指示に従って、ソニーのリモコンで configurationファイルを作成する。
    • begin remote
      
        name  play
        bits            4
        flags SPACE_ENC|CONST_LENGTH
        eps            30
        aeps          100
      
        header       2425   578
        one          1229   572
        zero          626   572
        post_data_bits  8
        post_data      0x9C
        gap          45084
        toggle_bit_mask 0x0
        frequency    38000
      
            begin codes
                play                     0x5
                ff                       0x3
                rew                      0xD
                stop                     0x1
            end codes
      
      end remote
    • できた confファイルを、/etc/lirc/lircd.conf.d/ の中へ移動する。
      • sudo mv sony.lircd.conf /etc/lirc/lircd.conf.d/
    • もともと入っている、devinput.lircd.confを使わないように、ファイル名を変えておく。(拡張子が confで無ければ無視されるから)
      • $ sudo mv /etc/lirc/lircd.conf.d/devinput.lircd.conf /etc/lirc/lircd.conf.d/devinput.lircd.conf.dist
      • confファイルを変更したため、設定を再読込が必要。そのためには、lircdを再起動ればよい。(systemctl restartで試してみたが、エラーが出たので、stop して startするという形で二回に分けて実行した)
  • irwコマンドで、リモコンのキーが正しく検出されるかを確認→OK!

      • $ irw
        000000000000059c 00 Play sony-handycam
        000000000000059c 01 Play sony-handycam
        000000000000059c 02 Play sony-handycam
        000000000000059c 03 Play sony-handycam
        000000000000059c 04 Play sony-handycam
        000000000000039c 00 FF sony-handycam
        000000000000039c 01 FF sony-handycam
        000000000000039c 02 FF sony-handycam
        000000000000039c 03 FF sony-handycam
        000000000000039c 04 FF sony-handycam
        0000000000000d9c 00 REW sony-handycam
        0000000000000d9c 01 REW sony-handycam
        0000000000000d9c 02 REW sony-handycam
        0000000000000d9c 03 REW sony-handycam
        0000000000000d9c 04 REW sony-handycam
        000000000000019c 00 Stop sony-handycam
        000000000000019c 01 Stop sony-handycam
        000000000000019c 02 Stop sony-handycam
        000000000000019c 03 Stop sony-handycam
        000000000000019c 04 Stop sony-handycam
  • 送信してみる

    • irsendコマンドを使って、実際にIRを送信してみる。
    • $ irsend list "" ""
      
      sony-handycam
      $ irsend list sony-handycam ""
      
      0000000000000005 Play
      0000000000000003 FF
      000000000000000d REW
      0000000000000001 Stop
      
      $ irsend SEND_ONCE sony-handycam Play
      $ irsend SEND_ONCE sony-handycam Play
      $ irsend SEND_ONCE sony-handycam Play
      
    • 波形を観測 (上: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件のコメント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください