RaspberryPi 3 Model B+ でlircを使ってリモコン化する（その１）

# ブログはこちらです
[RaspberryPi 3 Model B+ でlircを使ってリモコン化する（その１）](http://nomunomu.hateblo.jp/entry/2018/07/29/234200)

## はじめに
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やスマホから制御できるようにしていきたいと思います。

## つづき（2018/07/31）
[RaspberryPi 3 Model B+ でlircを使ってリモコン化する（その２）](https://qiita.com/nomunomu/items/976e30cb026caebcdd86)