Raspberry pi をスマートリモコンにする


赤外線センサー(ELEGOOのセンサーキットに付属していた)と赤外線LED(Amazonで買ったけど品質が悪すぎて返品中)を使ってスマートリモコンを作ろうと思います。

参考にする記事はこちら。格安スマートリモコンの作り方。 手順通りにインストール、作業を進めていきます。これによると、pigpioというGPIOを操作するライブラリがあり、この作成者が赤外線リモコンの送信波形をキャプチャし、赤外線LEDを波形通りに光らせることでリモコンにすることが可能になるコードを公開しているみたいです。

ちなみに、エアコンの長い赤外線コードに対応した学習リモコンを作る で紹介されているように、エアコンの場合はコードが長いので、他のプログラムを使うといいみたいです。いずれは Twitter経由で家電を動かせるようにした話【新歓ブログリレー2020 64日目】 や ラズパイに初めて触る人が、Slackから自宅のエアコンを制御する みたいなことをしてみたいです。

スマートリモコンって、買うと2000円はするし、複数の部屋に置こうと思ったらまたお金がかかるので、自作したいですね。こんなものも作れる、というのがRaspberry pi 、Arduinoはじめとしたマイコンの魅力だと思っています。

さて、作業を始めます。

pi@raspberrypi:~/pythons $ sudo apt-get install pigpio
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
pigpio はすでに最新バージョン (1.71-0~rpt1) です。
アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 62 個。
pi@raspberrypi:~/pythons $ sudo systemctl enable pigpiod.service
pi@raspberrypi:~/pythons $ sudo systemctl start pigpiod
pi@raspberrypi:~/pythons $ pip install pigpio
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Requirement already satisfied: pigpio in /usr/lib/python2.7/dist-packages (1.44)
pi@raspberrypi:~/pythons $  echo 'm 17 w   w 17 0   m 18 r   pud 18 u' > /dev/pigpio
bash: /dev/pigpio: 許可がありません

いつも通り、エラーです。なんなんでしょうね、このエラーしか起きないやつ。

Raspberry PiのGPIO制御方法を確認する(GPIO制御編その1) このページを見て、

pi@raspberrypi ~ $ sudo echo 18 > /sys/class/gpio/export

とかしても全然エラーが取れません。というか、

python3 irrp.py -r -g18 -f codes light:on --no-confirm --post 130

これをしても、何にも表示が出ず、Ctrl + cで止めると、

pi@raspberrypi:~/pythons $ python3 irrp.py -r -g26 -f codes light:on --no-confirm --post 130
^CTraceback (most recent call last):
 File "irrp.py", line 357, in <module>
   pi = pigpio.pi() # Connect to Pi.
 File "/usr/lib/python3/dist-packages/pigpio.py", line 5071, in __init__
   self._notify = _callback_thread(self.sl, host, port)
 File "/usr/lib/python3/dist-packages/pigpio.py", line 1102, in __init__
   self.lastLevel = _pigpio_command(self.sl,  _PI_CMD_BR1, 0, 0)
 File "/usr/lib/python3/dist-packages/pigpio.py", line 994, in _pigpio_command
   dummy, res = struct.unpack('12sI', sl.s.recv(_SOCK_CMD_LEN))

と出てきます。これ、pigpioを読んですぐハングしてるみたいです。色々調べても出てこない…。そして、pigpiodが起動できない で質問者が使っているコマンドを私も使ってみることに。(というか気が付けよ、status見るってことに。。。)

すると

pi@raspberrypi:~/pythons $ sudo systemctl stop pigpiod
pi@raspberrypi:~/pythons $ sudo systemctl restart pigpiod
pi@raspberrypi:~/pythons $ sudo systemctl status pigpiod
● pigpiod.service - Daemon required to control GPIO pins via pigpio
  Loaded: loaded (/lib/systemd/system/pigpiod.service; enabled; vendor preset: enabled)
  Active: failed (Result: exit-code) since Thu 2020-12-17 21:36:17 JST; 2s ago
 Process: 2055 ExecStart=/usr/bin/pigpiod -l (code=exited, status=0/SUCCESS)
Main PID: 2056 (code=exited, status=1/FAILURE)
1217 21:36:17 raspberrypi systemd[1]: Starting Daemon required to control GPIO pins via pigpio.
1217 21:36:17 raspberrypi systemd[1]: Started Daemon required to control GPIO pins via pigpio.
1217 21:36:17 raspberrypi pigpiod[2055]: 2020-12-17 21:36:17 initInitialise: bind to port 8888 
1217 21:36:17 raspberrypi pigpiod[2055]: Can't initialise pigpio library
12月 17 21:36:17 raspberrypi systemd[1]: pigpiod.service: Main process exited, code=exited, status
12月 17 21:36:17 raspberrypi systemd[1]: pigpiod.service: Failed with result 'exit-code'.
lines 1-12/12 (END)

initInitialise: bind to port 8888 この辺でエラーが起きてる…。

そういえば、他の記事でDockerを入れてみるときに、

docker: Error response from daemon: driver failed programming external 
connectivity on endpoint fervent_elbakyan 
 Error starting userland proxy: listen tcp 0.0.0.0:8888:
  bind: address already in use.
ERRO[1649] error waiting for container: context canceled

とあったことを思い出し、さらに他の記事でjupyter labをポート8888で立ち上げてることを思い出しました。

pi@raspberrypi:~/pythons $ lsof -i -P | grep "LISTEN"
jupyter-l  376   pi    4u  IPv4  22540      0t0  TCP *:8888 (LISTEN)
jupyter-l  376   pi    5u  IPv6  22541      0t0  TCP *:8888 (LISTEN)
pulseaudi 1354   pi   43u  IPv6  28387      0t0  TCP *:4713 (LISTEN)
pulseaudi 1354   pi   45u  IPv4  28388      0t0  TCP *:4713 (LISTEN)
pi@raspberrypi:~/pythons $ sudo systemctl disable jupyter.service 
Removed /etc/systemd/system/multi-user.target.wants/jupyter.service.
pi@raspberrypi:~/pythons $ lsof -i -P | grep "LISTEN"
jupyter-l  376   pi    4u  IPv4  22540      0t0  TCP *:8888 (LISTEN)
jupyter-l  376   pi    5u  IPv6  22541      0t0  TCP *:8888 (LISTEN)
pulseaudi 1354   pi   43u  IPv6  28387      0t0  TCP *:4713 (LISTEN)
pulseaudi 1354   pi   45u  IPv4  28388      0t0  TCP *:4713 (LISTEN)
pi@raspberrypi:~/pythons $ kill 376
pi@raspberrypi:~/pythons $ lsof -i -P | grep "LISTEN"
pulseaudi 1354   pi   43u  IPv6  28387      0t0  TCP *:4713 (LISTEN)
pulseaudi 1354   pi   45u  IPv4  28388      0t0  TCP *:4713 (LISTEN)
pi@raspberrypi:~/pythons $ 

さよなら、jupyter lab。。。と思ったら、

pi@raspberrypi:~/pythons $ lsof -i -P | grep "LISTEN"
pulseaudi 1354   pi   43u  IPv6  28387      0t0  TCP *:4713 (LISTEN)
pulseaudi 1354   pi   45u  IPv4  28388      0t0  TCP *:4713 (LISTEN)
jupyter-l 2104   pi    4u  IPv4  37189      0t0  TCP *:8888 (LISTEN)
jupyter-l 2104   pi    5u  IPv6  37190      0t0  TCP *:8888 (LISTEN)
pi@raspberrypi:~/pythons $ sudo systemctl disable jupyter.service 
^[[Api@raspberrypi:~/pythons $ sudo systemctl stop jupyter.service 
pi@raspberrypi:~/pythons $ lsof -i -P | grep "LISTEN"
pulseaudi 1354   pi   43u  IPv6  28387      0t0  TCP *:4713 (LISTEN)
pulseaudi 1354   pi   45u  IPv4  28388      0t0  TCP *:4713 (LISTEN)
pi@raspberrypi:~/pythons

復活してたので、きちんとstopさせました(サービスについて不勉強がバレました)

そしたら、

pi@raspberrypi:~/pythons $ sudo systemctl status pigpiod
● pigpiod.service - Daemon required to control GPIO pins via pigpio
  Loaded: loaded (/lib/systemd/system/pigpiod.service; enabled; vendor preset: enabled)
  Active: active (running) since Thu 2020-12-17 21:51:26 JST; 4s ago
 Process: 2160 ExecStart=/usr/bin/pigpiod -l (code=exited, status=0/SUCCESS)
Main PID: 2161 (pigpiod)
   Tasks: 4 (limit: 4915)
  CGroup: /system.slice/pigpiod.service
          └─2161 /usr/bin/pigpiod -l12月 17 21:51:26 raspberrypi systemd[1]: Starting Daemon required to control GPIO pins via pigpio...
1217 21:51:26 raspberrypi systemd[1]: Started Daemon required to control GPIO pins via pigpio.

はい、動きました。

ここから続き、と行きたいですが、リモコンとなるLEDがないため中断です。(返品したLEDを使ったところ、今回参考にした記事通りうまくできました)










この記事が気に入ったらサポートをしてみませんか?