Stacks

技術関連のメモ書きです

Raspberry Pi 3 Model B で赤外線リモコン学習&操作

やりたいこと

  • 家にある赤外線リモコンの信号を学習する
  • 学習したリモコンの信号を発信して機器を操作する

参考ページ

Raspbian Stretchで LIRC機能を使った学習リモコン、赤外線リモコンを動かす方法

購入した部品

上述のページを参考に

環境

項目 内容 備考
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