Raspberry Pi 3 B+でスマートリモコンを作る

2017年初めにRaspberry Pi 1 B(256MB)とブレッドボードで作ったものをRaspberry Pi 3 B+とユニバーサル基板にした。

特徴

  • Amazon Echo, ブラウザ, curlなどに対応
  • 高強度の発信で天井などに反射して遠くまで届く
  • それでも駄目ならLEDの足を折り曲げて直接飛ばす
  • 難解なLIRCを使わない
  • 赤外線送受信部の総パーツ数は最低4

買い物メモ

Raspberry Pi 3 B+はケースとヒートシンクと送料込みで6000円足らずだったのでPimoroniで買った。
Pibow CoupeのLAN側の穴には六角オネジ・メネジ MB26-11が入らない。
ネジをやすりで削って入れたが力をかけないならそもそも不要そう。でも押すとたわむの気になるので頑張って入れた。

秋月のRaspberry Pi用ユニバーサル基板が便利。基板取付用DCジャックが載りACアダプタから電源供給できるようになっている。
5V4Aというちょうど良い感じに余裕を持たせたACアダプタも売られている。しかもどれも安い。

CPUヘビーな処理をさせる予定があるなら5V25mm角 DCファンみたいなのがあると良さそう。
2個入りのヒートシンクもあるRaspberryPi B+用ヒートシンクセット

参照

本編

pigpio+Pythonで赤外線の記録と再生をし、Node.jsでAPIサーバとブラウザ用クライアントを用意する。
さらにNode-RED経由でAmazon Echoからの音声操作を可能にする。

Raspberry Pi本体のセットアップはほぼ以前の記事のとおり。
config.txtは触らずraspi-configで設定をするようにしたのと固定IPの設定をしたぐらい。

sudoedit /etc/dhcpcd.conf
  # interface wlan0
  # static ip_address=192.168.0.81/24
  # static routers=192.168.0.1
  # static domain_name_servers=192.168.0.1

ハードウェア

3.3V対応赤外線LED駆動回路決定版 | 電脳伝説の回路図のとおりでLPC810がRaspberry Piに代わるだけ。真上からの写真も参考になる。
三本足の赤外線受光部やMOSFETは正面左からGPIO, GND, 電源へ繋ぐことになり、MOSFETと電源の間にはLEDと抵抗が入る。
赤外線受光部はBCM 18と3.3VへMOSFETはBCM 17と5Vへ繋ぎ、抵抗は10Ωを選んだ。

pigpio

sudo apt install python3-pip pigpio
sudo systemctl enable pigpiod
sudo systemctl start pigpiod
pip3 install pigpio

赤外線送受信スクリプト

pigpioのサンプルコードがそのまま使える。

wget http://abyz.me.uk/rpi/pigpio/code/irrp_py.zip
unzip irrp_py.zip
sed -i -e "1 s/python$/python3/g" irrp.py
mv irrp_py ~/bin/
irrp.py --record --gpio 18 --file ircodes.json --no-confirm light:on
irrp.py --play --gpio 17 --file ircodes.json light:on

APIサーバ

スクリプトを書いたがnode-red-dashboardやexecノードを使ってすべてNode-REDで済ますという手もありそう。

curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
sudo apt install nodejs
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
sudo apt update && sudo apt install yarn

mkdir ~/.config/remopi
mv ircodes.json ~/.config/remopi/ircodes.json
vi ~/.config/remopi/commands.json
  # { "desktop:on": "/home/pi/bin/wol.sh desktop" }
git clone https://github.com/ebith/remopi
cd remopi
yarn && yarn run build
sudo ln -s ~/remopi/remopi.service /etc/systemd/system/multi-user.target.wants/remopi.service
sudo systemctl daemon-reload
sudo systemctl start remopi

Amazon Echo

node-red-contrib-amazon-echoはPhilips Hueをエミュレートすることでそれ単品で完結させていて外部のブリッジなどを必要としない。
その代わりにポート80が必要でAmazon Echoが受け付けるコマンドも限られている。
ポート80はsudo sed -i -e '/^\[Service\]$/a AmbientCapabilities=CAP_NET_BIND_SERVICE' /lib/systemd/system/nodered.serviceではだめだったのでsetcapした。

sudo setcap cap_net_bind_service=+ep /usr/bin/node
bash <(curl -sL https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/update-nodejs-and-nodered)
cd ~/.node-red
npm install node-red-contrib-amazon-echo
sudo systemctl enable nodered.service
sudo systemctl start nodered.service

あとはNode-REDのドキュメントやnode-red-contrib-amazon-echoのreadmeを参考に設定する。
Node-RED flow

付録

pigsコマンドでsocket connect failedする

"socket connect failed" but only if starting pigpiod via systemctl · Issue #203 · joan2937/pigpio

sudo sed -i -e 's/pigpiod -l$/pigpiod -l -n 127.0.0.1/g' /lib/systemd/system/pigpiod.service
cat /etc/systemd/system/multi-user.target.wants/pigpiod.service
sudo systemctl daemon-reload
sudo systemctl restart pigpiod

Rclone (バックアップ)

curl https://rclone.org/install.sh | sudo bash
rclone config # https://rclone.org/onedrive/
rclone sync --exclude-from=/home/pi/.config/rclone/ignore.home /home/pi oneDrive:RaspberryPi3B/home
echo -e '#!/bin/sh\nrclone sync --config=/home/pi/.config/rclone/rclone.conf --exclude-from=/home/pi/.config/rclone/ignore.home /home/pi oneDrive:RaspberryPi3B/home' | tee -a ~/bin/backupHome
chmod 755 ~/bin/backupHome
sudo ln -s ~/bin/backupHome /etc/cron.daily/backupHome

Mackerel (死活監視)

sudo mkdir /etc/mackerel-agent/
wget https://github.com/mackerelio/mackerel-agent/releases/download/v0.59.0/mackerel-agent_linux_arm.tar.gz
tar xvf mackerel-agent_linux_arm.tar.gz
mv mackerel-agent_linux_arm/mackerel-agent ~/bin/mackerel-agent
sudo mackerel-agent init -apikey="xxxxxxxx" 
wget https://raw.githubusercontent.com/mackerelio/mackerel-agent/master/packaging/deb-systemd/debian/mackerel-agent.service
vi mackerel-agent.service
  # ExecStart=/home/pi/bin/mackerel-agent supervise --root $ROOT $OTHER_OPTS
sudo mv mackerel-agent.service /etc/systemd/system/multi-user.target.wants/mackerel-agent.service
sudo systemctl daemon-reload
sudo systemctl start mackerel-agent

CPU温度の監視を追加する

sudo apt install bc
wget https://raw.githubusercontent.com/ymyzk/mackerel-plugins/master/raspberrypi/temp.sh
chmod 755 temp.sh
mv temp.sh ~/bin/temp.sh
echo -e '[plugin.metrics.temp]\ncommand = "/home/pi/bin/temp.sh"' | sudo tee -a /etc/mackerel-agent/mackerel-agent.conf
sudo systemctl restart mackerel-agent