はじめに
RaspberryPi3とIRレシーバーとIR送信機を使って、家電類を制御するためのメモ。 ラズパイのGPIOからIR送信機を使って制御する。
目指すは、スマホやPCからラズパイにリクエストを送信して、機器を制御することです。
今回使ったもの
・Raspberry Pi 3 Model B+
・赤外線センサ(VS1838B)
・赤外線LED(型番不明)
・抵抗330Ω
IR解析
LIRCというものを用いてリモコンキーの解析、送信を行います。 LIRCとはIR信号の出コードや送信などを行うことのできるLinuxのパッケージです
LIRCのインストールとセットアップ
インストール
$ sudo apt-get install -y lirc
セットアップ
新しいラズパイと古いラズパイでは少し異なるようなので注意してください。また、gpio_in_pin
とgpio_out_pin
は各自置き換えてください。
lircの有効化設定
・古いラズパイ(/etc/modules)
lirc-rpi,gpio_in_pin=24,gpio_out_pin=25
・新しいラズパイ(/boot/config.txt)
# IR-Remote controller dtoverlay=lirc-rpi dtparam=gpio_out_pin=25 dtparam=gpio_in_pin=24 dtparam=gpio_in_pull=up
ハードウェア設定
/etc/lirc/hardware.conf
にdeamon起動時の引数・デバイス・モジュールを指定します。以下をコピペで実行してください。
cp /etc/lirc/hardware.conf ~/hardware.conf sed -i -e "s/LIRCD_ARGS=\"\"/LIRCD_ARGS=\"--uinput\"/g" ~/hardware.conf sed -i -e "s/DRIVER=\"UNCONFIGURED\"/DRIVER=\"default\"/g" ~/hardware.conf sed -i -e "s/DEVICE=\"\"/DEVICE=\"\/dev\/lirc0\"/g" ~/hardware.conf sed -i -e "s/MODULES=\"\"/MODULES=\"lirc_rpi\"/g" ~/hardware.conf cat ~/hardware.conf sudo mv /etc/lirc/hardware.conf /etc/lirc/hardware.conf.bak sudo cp ~/hardware.conf /etc/lirc/hardware.conf
ここまで来たら一旦再起動を行います。sudo reboot
デバイスチェック
/dev/lirc0
が存在するかを確認します
$ ls -l /dev/lirc* crw-rw---- 1 root video 244, 0 Sep 1 15:41 /dev/lirc0
lsmodで lircの存在を確認します
$ lsmod | grep lirc lirc_rpi 9032 0 lirc_dev 10583 1 lirc_rpi rc_core 24377 1 lirc_dev
それぞれ確認出来たら、一旦サービスを停止します。
$ sudo /etc/init.d/lirc stop
IRレシーバーのチェック
$ mode2 -d /dev/lirc0
を実行し、IRレシーバーに向かってリモコンキーを押して、以下のような表示がされれば動作確認OKです。表示されない場合は、もう一度最初から設定を行うか、GPIOピンなどを確認してください。
pulse 426 space 415 pulse 390 space 450 pulse 389 space 450 pulse 391 space 449 pulse 416 space 424 pulse 416 space 423 pulse 423 : :
リモコンを学習させる
これから実際にリモコンの学習を行っていきます。ここでは、半自動的に学習を行ってくれるコマンドを用いて行っていきます。
# "dvd_player_ir"の部分は各自変更してください $ irrecord -n -d /dev/lirc0 ~/dvd_player_ir.conf """ irrecord: could not open /dev/lirc0 irrecord: default_init(): Device or resource busy irrecord: could not init hardware (lircd running ? --> close it, check permissions) """ のようなエラーが表示されたら、LIRCサービスを再起動してください $ sudo /etc/init.d/lirc restart
irrecord - application for recording IR-codes for usage with lirc Copyright (C) 1998,1999 Christoph Bartelmus(lirc@bartelmus.de) Press RETURN to continue. (リターンキーを押す) Now start pressing buttons on your remote control. It is very important that you press many different buttons and hold them down for approximately one second. Each button should generate at least one dot but in no case 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. (リターンキーを押す) (リモコンのボタンを押したままにする) ................................................................................ ................................................................................ Found const length: 107893 Please keep on pressing buttons like described above. (リモコンのボタンを連打する。押したままにしない) Please enter the name for the next button (press <ENTER> to finish recording) (リモコンのボタンの名前を入力する。例:play) play Now hold down button "play". (リモコンの Playボタンを押す) Got it. Signal length is 67 Please enter the name for the next button (press <ENTER> to finish recording) (リモコンのボタンの名前を入力する。例:stop) stop Now hold down button "stop". (リモコンの Stopボタンを押す) Got it. Signal length is 67 Please enter the name for the next button (press <ENTER> to finish recording) (以下同様) pause Now hold down button "pause". (以下同様) Got it. Signal length is 67 Please enter the name for the next button (press <ENTER> to finish recording) (以下同様) eject Now hold down button "eject". (以下同様) Got it. Signal length is 67 Please enter the name for the next button (press <ENTER> to finish recording) (リターンを押すと学習モードを終了する)
リモコンのボタン学習の時に下記エラーが出てリモコン学習が出来ない場合は -fオプションを付ける。 Something went wrong. Please try again. (9 retries left) Something went wrong. Please try again. (8 retries left) Something went wrong. Please try again. (7 retries left) 例: -fを付けてリモコン学習コマンド irrecordを実行する。 $ irrecord -n -f -d /dev/lirc0 ~/dvd_player_ir.conf
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, then wait a bit between button presses. Press RETURN to continue. (リターンを押す) (リモコンのボタンを連打する。押したままにしない) ....................... No toggle bit mask found. Successfully written config file.
上記で設定ファイルの生成を行ったら、lircのコンフィグファイルに設定ファイルを適用させていきます。
生成したファイルを編集する
$ sudo nano dvd_player_ir.conf # 変更前 name /home/pi/dvd_player_ir.conf # 変更後 name dvd_player # 注意点 name dvd playerのように途中に空白が含まれるとエラーになります。
ファイルを適用する
/etc/lirc/lircd.conf
に生成したファイルの中身を書き込むのですが、初めての場合、ファイルの中身は以下のようになっていると思います。
#UNCONFIGURED # # To find out how to get a proper configuration file please read: # # /usr/share/doc/lirc/README.Debian
なので、今回生成したファイルをコンフィグファイルとしてコピーします。
$ sudo rm -rf /etc/lirc/lircd.conf $ sudo cp dvd_player_ir.conf /etc/lirc/lircd.conf
それ以外の場合は、コンフィグファイルの一番下に生成したファイルの内容をすべてコピーしてください。
LIRCサービスの再起動
$ sudo /etc/init.d/lirc restart
実際に制御してみる
学習させたリモコンの内容を確認
$ irsend list "" "" irsend: DVD_PLAYER $ irsend list DVD_PLAYER "" irsend: 0000000000000001 play irsend: 0000000000000002 stop irsend: 0000000000000003 pause irsend: 0000000000000004 eject
リモコンキーの送信
$ irsend SEND_ONCE DVD_PLAYER play
リモコンキーを複数回送信(Ex. 100回)
$ irsend -#100 SEND_ONCE DVD_PLAYER play
リモコンキーをコマンドを用いて複数回送信(Ex. 100回)
$ for i in {0..100}; do irsend SEND_ONCE DVD_PLAYER play; echo $i; done;
ここまでで、リモコンキーを学習させ、コマンドを打つことで実際に制御することができるようになりました。 次回は、PCやスマホから制御できるようにしていきたいと思います。