Raspberry Pi 3 Model B で赤外線リモコン学習&操作
やりたいこと
- 家にある赤外線リモコンの信号を学習する
- 学習したリモコンの信号を発信して機器を操作する
参考ページ
Raspbian Stretchで LIRC機能を使った学習リモコン、赤外線リモコンを動かす方法
購入した部品
上述のページを参考に
- 赤外線受信モジュール:OSRB38C9AA
- 赤外線LED:OSI5LA5113A グレー
- 1/4W 1kΩ カーボン抵抗
- 1/4W 47Ω カーボン抵抗
- NPN トランジスタ:2SC1815-BL
- ブレッドボード:EIC-15010
- ジャンパーワイヤー:BBJ-20
環境
項目 | 内容 | 備考 |
---|---|---|
OS | Raspbian Stretch | つまりDebian 9 |
赤外線送受信のハンドリング | LIRC 0.9.4c | Stretch でapt-get install するとこのバージョン |
LIRC セットアップ
ファームウェアのアップデート
$ sudo rpi-update $ sudo reboot
インストール
$ sudo apt-get -y install lirc $ sudo rpi-update
設定ファイル lirc_option.conf を編集します。 ドライバとデバイスの指定及び後でPython からソケットに直接コマンドを送信したいのでlisten も。
$ sudoedit /etc/lirc/lirc_option.conf 〜略〜 driver = default device = /dev/lirc0 〜略〜 listen = 127.0.0.1:8765
/boot/config.txt にGPIO の入出力ピンを指定します。今回は17番を出力に、18番を入力にしました。 dtparam=invert=on はトランジスタ経由なので正論理となるため不要です。
$ sudoedit /boot/config.txt dtoverlay=lirc-rpi dtparam=gpio_out_pin=17 dtparam=gpio_in_pin=18 dtparam=gpio_in_pull=up
Raspberry Pi のGPIO ピンは公式ドキュメントを参考のこと。 www.raspberrypi.org
ここで一度リブートします。
$ sudo reboot
/dev/lirc0 が存在するか確認します。
$ ls -l /dev/lirc* crw-rw---- 1 root video 244, 0 11月 12 12:53 /dev/lirc0
lsmodで lircの存在を確認します。
$ lsmod | grep lirc lirc_rpi 9032 0 lirc_dev 10583 1 lirc_rpi rc_core 24377 1 lirc_dev
赤外線受信のチェック
LIRC をインストールすると同梱されているコマンド mode2 で赤外線受信モジュールがリモコンの信号を読み取れるか確認します。
まず、lircd デーモンを停止(STRETCH 以降のやり方)
$ sudo systemctl stop lircd
以下のコマンド実行後に赤外線受信モジュールにリモコンを向けてボタンを押し、受信できればOKです。
$ sudo mode2 -d /dev/lirc0 Using driver default on device /dev/lirc0 Trying device: /dev/lirc0 Using device: /dev/lirc0 この後、リモコンを赤外線受信モジュールに向けて何かボタンを押す。 正しく動いていれば↓のようなパルスが表示される。 space 14384396 pulse 2356 space 627 pulse 1161 space 617 pulse 574
リモコンの信号を保存する
同じくLIRC のirrecord でリモコンの信号をLIRC でハンドリングできるファイルに保存できます。
$ irrecord -n -d /dev/lirc0
手順は割愛。家の照明用リモコンはmode2 で受信した生データを加工しないと無理でした。
出力されたファイルを/etc/lirc/lircd.conf.d 以下にコピーします。左記のディレクトリに予め保存されているdevinput.lircd.conf はリネームするか消しておきます。
信号を送信する
lircd をリスタートしておきます。※これをやらなくても、後述のirsend を実行すると自動的にデーモンが起動しました。
$ sudo systemctl start lircd
登録したリモコンの定義内容を確認します。
リモコン一覧の表示 $ irsend LIST "" "" tv_sony light_livingroom
リモコンのボタン一覧を表示
% irsend LIST light_livingroom "" 0000000000000001 power 0000000000000002 change 0000000000000003 fan_3 0000000000000004 fan_2 0000000000000005 fan_1 0000000000000006 fan_up 0000000000000007 fan_down 0000000000000008 fan_off
リモコン送信
$ irsend SEND_ONCE light_livingroom power
補足:irrecord で作成した定義ファイルではうまくいかないとき
自宅の照明はirrecord で作成したファイルではうまく動かなかったので、mode2 の信号を利用しました。 (SONY のテレビリモコンは問題なし。規格の問題かと。)
手順はざっくりと次のようになります。
mode2 で信号をファイルに書き出す。
mode2 -d /dev/lirc0 | tee light.txt
light.txt に対して、以下のスクリプトでデータを加工し、
import argparse import re parser = argparse.ArgumentParser(description='Parse output of mode2 command') parser.add_argument('-i', '--input', required=True, help='input file of mode2 output') parser.add_argument('-o', '--output', required=True, help='output file parsed') args = parser.parse_args() inFile = open(args.input) lines = inFile.readlines() inFile.close outFile = open(args.output, 'w') pattern = r"pulse|space" isFirstLine = False outList = [] for l in lines: l = l.strip() matchRes = re.match(pattern, l) if matchRes is None: continue if not isFirstLine: isFirstLine = True continue data = l.split(' ') outList.append(data[-1]) if len(outList) > 17: outFile.write(" ".join(outList) + "\n") outList = [] outFile.write(" ".join(outList) + "\n") outFile.close
/etc/lirc/lircd.conf.d/ 以下に配置するファイルのボタン名以下の信号データ部分にペタッと貼り付けて以下のようにしました。
begin remote name light_livingroom bits 25 flags RAW_CODES eps 30 aeps 100 header 1228 398 one 0 0 zero 0 0 gap 28133 toggle_bit_mask 0x0 frequency 38000 begin raw_codes name power 1209 447 374 1252 368 1220 1211 451 1171 454 1173 450 375 1238 375 1249 375 1246 376 1257 1173 443 376 1248 373 8246 1216 443 376 1246 375 1255 1177 442 1178 450 1180 441 372 1248 375 1220 412 1238 377 1248 1181 453 364 1247 382 8243 1187 470 373 1250 373 1247 1181 445 1191 433 1181 442 375 1225 397 1248 375 1248 375 1248 1179 449 370 1248 377 8241 1224 437 347 1275 349 1250 1206 443 1182 412 1211 443 374 1248 377 1245 378 1219 406 1210 1216 450 374 1207 410 8242 1189 436 380 1242 381 1239 1259 369 1188 437 1184 439 381 1241 382 1239 465 1158 391 1237 1187 434 381 1242 381 8266 1241 386 380 1242 430 1196 1219 407 1209 441 1183 441 376 1214 408 1214 408 1215 409 1247 1186 437 374 1249 376 name change 1182 438 380 1242 381 1243 1186 440 1184 436 1189 437 379 1243 1189 435 381 1243 381 1246 375 1242 379 1242 385 8271 1189 436 382 1242 434 1189 1249 376 1186 437 1188 441 375 1242 1188 438 431 1191 381 1242 380 1245 379 1241 382 8279 1183 437 379 1242 382 1243 1191 435 1185 436 1188 440 384 1236 1187 437 380 1240 383 1242 383 1240 382 1240 381 8274 1191 436 380 1241 381 1242 1188 437 1188 436 1193 432 380 1242 1188 437 380 1243 388 1231 385 1242 380 1240 381 8274 1189 438 380 1242 387 1236 1187 437 1193 431 1189 435 382 1241 1188 437 380 1242 381 1242 381 1241 382 1242 381 8266 1192 436 379 1244 447 1174 1189 439 1187 437 1189 436 377 1241 1190 433 383 1242 381 1247 374 1244 437 1182 389 8262 1189 436 381 1248 376 1240 1190 436 1186 441 1187 436 379 1242 1245 379 381 1239 383 1242 381 1243 380 1248 376 〜略〜 end raw_codes end remote