1: 2018-04-05 (木) 06:40:06 yuji | 現: 2020-12-26 (土) 16:08:03 yuji Attached file: RPZ-IR-Sensor.png |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | #topicpath | ||
- | |||
* Raspberry Pi Zero WにRPZ-IR-Sensorを使って学習リモコンを作る [#rde78df1] | * Raspberry Pi Zero WにRPZ-IR-Sensorを使って学習リモコンを作る [#rde78df1] | ||
Raspberry Pi Zero Wに,RPZ-IR-Sensorを使って学習リモコンを作ってみる。~ | Raspberry Pi Zero Wに,RPZ-IR-Sensorを使って学習リモコンを作ってみる。~ | ||
- | 手持ちのパーツで自作しても良かったが,今回は,温度,湿度,気圧センサーも搭載されている[[RPZ-IR-Sensor>http://indoor.lolipop.jp/IndoorCorgiElec/RPZ-IR-Sensor.php]]を購入して使ってみることに。 | + | 手持ちのパーツで自作しても良かったが,今回は,温度,湿度,気圧センサーも搭載されている[[RPZ-IR-Sensor>http://indoor.lolipop.jp/IndoorCorgiElec/RPZ-IR-Sensor.php]]を[[Amazonから>https://amzn.to/3H1Spwc]]5000円ぐらいで購入して使ってみることに。 |
- | 以前使用していた[[LIRC>http://lirc.org/]]を使って,学習リモコン機能を作ってみる。 | + | #ref("RPZ-IR-Sensor.png",50%) |
- | [[Raspbian Stretch>/PC/RaspberryPi/Linuxを動かしてみる/Raspbianのインストール]]が入っているRaspberry Pi Zero Wで,作業を行った。 | + | 以前使用していた[[LIRC>http://lirc.org/]]を使って,学習リモコン機能を作ってみる。~ |
- | $ lsb_release -a | + | |
- | No LSB modules are available. | + | Raspberry Pi Zero Wには,[[Raspbian Stretch>/PC/RaspberryPi/Linuxを動かしてみる/Raspbianのインストール]]が入っている。 |
- | Distributor ID: Raspbian | + | |
- | Description: Raspbian GNU/Linux 9.4 (stretch) | + | |
- | Release: 9.4 | + | |
- | Codename: stretch | + | |
** LIRCのインストール [#lca85cfa] | ** LIRCのインストール [#lca85cfa] | ||
- | lircのPackageをインストールする。 | + | lircをパッケージを使ってインストールする。 |
# apt-get install lirc | # apt-get install lirc | ||
+ | |||
+ | Raspbian Stretchの新しいものやBusterでは,Kernelが4.19以降が使われている。~ | ||
+ | Kernel 4.19以降の場合,デバイスドライバが変更になったので,変更されたデバイスドライバを使う必要があるのだが,その場合lircパッケージをそのまま使用すると,リモコンの受信がタイムアウトでうまく行かなかったり,送信もデバイスドライバの問題で256個以上のpulse/spaceを送信出来なかったり,トータル500ms以上のデータが送信出来なくなってしまった。 | ||
+ | |||
+ | 受信の問題は,''lircをパッケージでインストールするのではなく,lircのソースに修正パッチを当ててビルドしたものを使うことで回避できる。''~ | ||
+ | しかし送信の問題は,Kernelのソースコードの修正が必要なため,簡単に修正できない。 | ||
+ | |||
+ | 受信を改善するためにlircをビルドする場合は,[[kernel4.19用LIRCのビルド>../kernel4.19用LIRCのビルド]]を参照。 | ||
** LIRCの設定 [#eb919efe] | ** LIRCの設定 [#eb919efe] | ||
- | /boot/config.txtを以下のように編集する。 | + | *** デバイスドライバの設定 [#f0852cf5] |
+ | LIRCが使用するデバイスドライバーを用意する。 | ||
+ | /boot/config.txtを以下のように編集する。~ | ||
''/boot/config.txt'' | ''/boot/config.txt'' | ||
# Uncomment this to enable the lirc-rpi module | # Uncomment this to enable the lirc-rpi module | ||
Line 29: | Line 33: | ||
dtparam=gpio_in_pin=4 | dtparam=gpio_in_pin=4 | ||
- | /etc/lirc/lirc_options.confを以下のように編集する。 | + | ''Raspbian Stretchの新しいものやBusterではKernelが4.19以降に更新されていて,それによってlirc-rpiのDeviceTreeがサポートされなくなった。''~ |
+ | このため上記の代わりに,/boot/config.txtを以下のように編集して,gpio-irとgpio-ir-txを使うようにする。 | ||
+ | dtoverlay=gpio-ir,gpio_pin=4 | ||
+ | dtoverlay=gpio-ir-tx,gpio_pin=13 | ||
+ | 編集が終わったらRaspberry Pi Zero Wを再起動する。 | ||
+ | |||
+ | lsmodでlircモジュールがロードされているか確認する。 | ||
+ | $ lsmod | grep lirc | ||
+ | lirc_rpi 8001 2 | ||
+ | lirc_dev 8313 1 lirc_rpi | ||
+ | |||
+ | ''Kernelが4.19以降では,以下のようになっているか確認する。'' | ||
+ | $ lsmod | grep gpio_ir | ||
+ | gpio_ir_tx 3569 0 | ||
+ | gpio_ir_recv 3095 0 | ||
+ | |||
+ | /dev/lirc0が作成されているか確認する。 | ||
+ | $ ls -l /dev/lirc* | ||
+ | crw-rw---- 1 root video 243, 0 4月 3 14:55 /dev/lirc0 | ||
+ | 送受信には,/dev/lirc0が使われる。 | ||
+ | |||
+ | ''Kernelが4.19以降では,/dev/lirc0,/dev/lirc1が作成されているか確認する。'' | ||
+ | $ ls -la /dev/lirc* | ||
+ | crw-rw---- 1 root video 252, 0 8月 2 05:51 /dev/lirc0 | ||
+ | crw-rw---- 1 root video 252, 1 8月 2 05:51 /dev/lirc1 | ||
+ | ''/dev/lirc0が送信用のデバイスで,/dev/lirc1が受信用のデバイスになっていて,送信と受信で違うデバイスを使用するようになってしまった。''~ | ||
+ | |||
+ | *** LIRC設定ファイルの修正 [#o8a56fcf] | ||
+ | /etc/lirc/lirc_options.confを以下のように編集する。~ | ||
''/etc/lirc/lirc_options.conf'' | ''/etc/lirc/lirc_options.conf'' | ||
[lircd] | [lircd] | ||
Line 42: | Line 74: | ||
allow-simulate = No | allow-simulate = No | ||
repeat-max = 600 | repeat-max = 600 | ||
+ | この設定で,LIRCの送受信にはデフォルトで''/dev/lirc0''を使用するようになる。 | ||
- | 編集が終わったらRaspberry Pi Zero Wを再起動する。 | + | kernel 4.19以降では,受信の時(リモコン学習するときなど)に受信コマンドで使うデバイスを''/dev/lirc1''に指定しない場合は,このファイルのdeviceのところを,/dev/lirc1に書き換えるようにする。 |
- | + | ||
- | lsmodでlircモジュールがロードされているか確認する。 | + | |
- | $ lsmod | grep lirc | + | |
- | lirc_rpi 8001 2 | + | |
- | lirc_dev 8313 1 lirc_rpi | + | |
- | + | ||
- | /dev/lirc0が作成されているか確認する。 | + | |
- | $ ls -l /dev/lirc* | + | |
- | crw-rw---- 1 root video 243, 0 4月 3 14:55 /dev/lirc0 | + | |
** リモコン信号の受信の確認 [#s1957bb3] | ** リモコン信号の受信の確認 [#s1957bb3] | ||
Line 59: | Line 83: | ||
lircdデーモンを一旦停止する。 | lircdデーモンを一旦停止する。 | ||
# systemctl stop lircd.service | # systemctl stop lircd.service | ||
- | これしておかないと,mode2実行時にデバイス使用中のエラーとなる。 | + | これしておかないと,mode2(リモコン信号をキャプチャするコマンド)実行時にデバイス使用中のエラーとなる。 |
リモコンの動作確認をする前に,mode2コマンドのバージョンを確認する。 | リモコンの動作確認をする前に,mode2コマンドのバージョンを確認する。 | ||
Line 66: | Line 90: | ||
リモコン信号受光部に向けて,適当なリモコンからなんかのボタンを押して信号を送信してみる。~ | リモコン信号受光部に向けて,適当なリモコンからなんかのボタンを押して信号を送信してみる。~ | ||
+ | 注意:kernel 4.19以降では,デバイスに''/dev/lirc1''を指定する。また,lircを修正したものが必要。 | ||
$ mode2 -d /dev/lirc0 | $ mode2 -d /dev/lirc0 | ||
Using driver default on device /dev/lirc0 | Using driver default on device /dev/lirc0 | ||
Trying device: /dev/lirc0 | Trying device: /dev/lirc0 | ||
Using device: /dev/lirc0 | Using device: /dev/lirc0 | ||
+ | |||
space 2610664 <--- リモコン受光モジュールにリモコンを向けてボタンを押すと受信する | space 2610664 <--- リモコン受光モジュールにリモコンを向けてボタンを押すと受信する | ||
pulse 1202 | pulse 1202 | ||
Line 84: | Line 109: | ||
** irrecordでリモコンデータを学習する [#l8528e74] | ** irrecordでリモコンデータを学習する [#l8528e74] | ||
- | リモコンデータを学習するので,デーモンを停止しておく。 | + | リモコンデータを学習するので,デーモンが動いている場合は停止しておく。 |
# systemctl stop lircd.service | # systemctl stop lircd.service | ||
- | TVのリモコンを学習してみる。 | + | TVのリモコンを学習してみる。~ |
+ | 注意:kernel 4.19以降では,デバイスに''/dev/lirc1''を指定する。また,lircを修正したものが必要。 | ||
$ irrecord -n -f -d /dev/lirc0 | $ irrecord -n -f -d /dev/lirc0 | ||
Using raw access on device /dev/lirc0 | Using raw access on device /dev/lirc0 | ||
: | : | ||
Press RETURN to continue. <--- リターンを押す | Press RETURN to continue. <--- リターンを押す | ||
+ | |||
Checking for ambient light creating too much disturbances. | Checking for ambient light creating too much disturbances. | ||
Please don't press any buttons, just wait a few seconds... | Please don't press any buttons, just wait a few seconds... | ||
+ | |||
No significant noise (received 0 bytes) | No significant noise (received 0 bytes) | ||
+ | |||
Enter name of remote (only ascii, no spaces) :TV <--- リモコン操作の名前(保存するファイル名)を入力 | Enter name of remote (only ascii, no spaces) :TV <--- リモコン操作の名前(保存するファイル名)を入力 | ||
Using TV.lircd.conf as output filename | Using TV.lircd.conf as output filename | ||
+ | |||
Now start pressing buttons on your remote control. | Now start pressing buttons on your remote control. | ||
: | : | ||
Line 107: | Line 133: | ||
Please enter the name for the next button (press <ENTER> to finish recording) | Please enter the name for the next button (press <ENTER> to finish recording) | ||
power <--- リモコンのボタン名powerを学習させる | power <--- リモコンのボタン名powerを学習させる | ||
+ | |||
Now hold down button "power". <--- リモコンの電源ボタンを押す | Now hold down button "power". <--- リモコンの電源ボタンを押す | ||
+ | |||
Please enter the name for the next button (press <ENTER> to finish recording) | Please enter the name for the next button (press <ENTER> to finish recording) | ||
volup <--- リモコンのボタン名volupを学習させる | volup <--- リモコンのボタン名volupを学習させる | ||
+ | |||
Now hold down button "volup". <--- リモコンのVolume↑ボタンを押す | Now hold down button "volup". <--- リモコンのVolume↑ボタンを押す | ||
+ | |||
Please enter the name for the next button (press <ENTER> to finish recording) | Please enter the name for the next button (press <ENTER> to finish recording) | ||
voldown <--- リモコンのボタン名voldownを学習させる | voldown <--- リモコンのボタン名voldownを学習させる | ||
+ | |||
Now hold down button "voldown". <--- リモコンのVolume↓ボタンを押す | Now hold down button "voldown". <--- リモコンのVolume↓ボタンを押す | ||
+ | |||
Please enter the name for the next button (press <ENTER> to finish recording) <--- 学習終了の場合はリターン。 | Please enter the name for the next button (press <ENTER> to finish recording) <--- 学習終了の場合はリターン。 | ||
+ | |||
Successfully written config file TV.lircd.conf | Successfully written config file TV.lircd.conf | ||
このようにして学習したリモコンデータを,/etc/lirc/lircd.conf.d/ にコピーする。 | このようにして学習したリモコンデータを,/etc/lirc/lircd.conf.d/ にコピーする。 | ||
Line 133: | Line 159: | ||
devinput | devinput | ||
TV | TV | ||
- | のように,devinputが2個表示された場合はうまくいかないので,devinput.lircd.confファイルを削除する。 | + | のように,devinputが2個表示されたらdevinput.lircd.confファイルを削除する。 |
# rm /etc/lirc/lircd.conf.d/devinput.lircd.conf | # rm /etc/lirc/lircd.conf.d/devinput.lircd.conf | ||
デーモンをリスタートする。 | デーモンをリスタートする。 | ||
Line 146: | Line 172: | ||
$ irsend SEND_ONCE TV power | $ irsend SEND_ONCE TV power | ||
- | power信号は,テレビをOn/Offするトグル動作になる。(OnのためのデータやOffのためのデータは無い) | + | power信号は,テレビをOn/Offするトグル動作になる。(OnのためのリモコンデータやOffのためのリモコンデータは無い) |
ちなみに,リモコンデータを数回連続で送信したい場合は, | ちなみに,リモコンデータを数回連続で送信したい場合は, | ||
- | $ irsend -#5 SEND_ONCE TV volup | + | $ irsend -#3 SEND_ONCE TV volup |
のようにする。(#の後に回数を指定する) | のようにする。(#の後に回数を指定する) | ||
+ | |||
+ | Kernel 4.19以降の場合,デバイスドライバの問題で256個以上のpulse/spaceを送信出来なかったり,トータル500ms以上のデータが送信できなくなっている。~ | ||
+ | これは,Kernelが修正されないと残念ながら解決できない。 | ||
+ | |||
+ | また,この場合,1回irsendしただけだと機器が反応しない事があるようになった。 | ||
+ | $ irsend -#3 SEND_ONCE TV volup | ||
+ | しょうがないんで,3回ぐらい連続で送ってちゃんと反応するようにした。 | ||
+ | |||
+ | Kernelを4.14.98に戻した方が良いかも。 |