材料費400円の赤外線送受信器を、1,800円のラズパイZeroに載せて、Google Homeから操作する方法を、ゼロから丁寧に解説します。
- 安くても高機能
- むしろ市販のスマートリモコンではできない、きめ細かな操作も簡単に実現できます。(例えば こんなこと ができます。)
- 簡単
- 電子回路を作ったことのない初心者でも作れるよう、電子部品の買い方から、丁寧に説明します。
電子工作の基本
ラズパイでの電子工作が初めてなら、こちら → Raspberry Piの電源でLEDを1個光らせてみる - ツール・ラボ
(素晴らしく丁寧な解説なので、予備知識ゼロでも理解できるはず。)
ここで紹介するスマートリモコンの回路も、まずはブレッドボードを使って、半田付けをせずに試作します。
試作品をしばらく使ってみて問題がないようなら、基板に半田付けして完成させます。
半田付けが初めてなら、こちら → うまくいく電子工作のコツ - 村田製作所
(小学校高学年向けのサイトなので、予備知識ゼロでも理解できるはず。)
(読むのは、実際に半田付けをする段階になってからでも構いません。)
電子部品
ほぼすべて秋月電子通商で購入できます。(通販が楽チン)
1台あたりの材料費は378円です。(赤外線LEDを4個載せる場合)
ただし、試作のためのブレッドボードや、抵抗(100本入り)の余った材料にかかる費用も含めると、総額は1,169円になります。
価格 | 品名 | 備考 |
---|---|---|
100円 | 赤外線リモコン受信モジュール OSRB38C9AA(2個入) | |
100円 | 5mm 赤外線LED OSI5LA5113A(10個入) | 可視光線のLEDもあると、赤外線LEDの動作確認に便利 |
20円 | MOSFET 2N7000(1個) | |
60円 | MOSFET IRFU9024NPBF(1個) | |
100円 | 抵抗 4.7kΩ 1/2W(100本入) | 1W、1/4W、1/6WでもOK |
200円 | 抵抗 27Ω 1W(100本入) | より遠くに赤外線を届けたければ、より小さい抵抗も買う |
80円 | ピンソケット(メス)2x20(40P) | |
100円 | Raspberry Pi ZERO用ユニバーサル基板 | |
170円 | ブレッドボード(1枚) | |
220円 | ジャンパ・ワイヤー(オス - メス)(10本入) | |
0円 | ジャンパ・ワイヤー(オス - オス) | 抵抗の脚などの廃材で代用 |
その他の機材
以下の機材は、すでに類似品が手元にあるなら買う必要はありません。
価格 | 品名 | 販売店 | 補足 |
---|---|---|---|
2,199円 | はんだごて 8点セット 温度調節可 | amazon | とりあえずブレッドボードの試作品で様子を見るだけなら、無理に頑張って半田付けする必要はありません |
1,814円 | ラズパイZero WH | SWITCH SCIENCE | 送料150円。スマートリモコンとして使うだけなら、Zero WHで十分。消費電力も少ないので、むしろ好都合。(秋月でも買えます) |
540円 | microSDカード 8GB | amazon | スマートリモコンとして使うだけなら、8GBで十分 |
700円 | ACアダプター 5V3A | 秋月電子通商 | ラズパイZeroの消費電力は少ないので、わざわざ買わなくても、普通のACアダプタを流用できます。このアダプタはラズパイ3にも使える5V3A仕様なので、電源トラブルに悩みたくないなら、買って損はありません |
注意
部品が手に入ったら、いよいよ電子回路を試作します。ただし、回路の設計や配線などを間違えると、ラズパイは簡単に壊れます。作業はくれぐれも注意深く、慎重に、自己責任で。
赤外線を受信する回路
赤外線受信モジュール OSRB38C9AA
OUTPUT → GPIO18(物理番号12)
GROUND → GND(物理番号6)
VCC ← 3.3V(物理番号1)
ちなみに、もし受信の精度を上げたければ、CRフィルターを付けると尚よいです。
【回路】データシートの2ページ目の「For Noisy Power Supply」
【部品】抵抗 22kΩ、47〜100Ω、コンデンサ 47〜100μF(これら3つの部品は、上述の「電子部品」には含めていません。)
Raspberry PiのGPIOの番号
出典:GPIO: MODELS A+, B+, RASPBERRY PI 2 B AND RASPBERRY PI 3 B
こちらも参考になります → Raspberry PiのGPIO概要 - RaspberryPi電子工作入門
GPIO番号
物理番号
赤外線を発信する回路
こちらのサイトに、とても丁寧に解説されています → 赤外線LEDドライブ回路の決定版 - 電脳伝説
(冒頭に「WiringPiのせいで1mしか赤外線が届かない」との記載がありますが、WiringPiを使わない方法を紹介するのでご安心を)
- 【追記 2020年3月28日、30日】
- コメント(なぜか削除済み)でご指摘頂いたのですが、この回路は、そのままでは赤外線LEDの絶対最大定格を超えてしまうため、破裂による負傷や、発火による火災など、重大な事故を引き起こす可能性があります。ですので、赤外線LEDに流れる電流が定格に収まるように、定格の大きな赤外線LEDを使ったり、電流制限抵抗を27Ωより大きくするなど、調整が必要です。上述のサイトの本文やコメント欄には、制限抵抗を27Ωにした経緯などが書かれているので、目を通しておくと調整の参考になるかもしれません。
MOSFET 2N7000
出典:2N7000 / 2N7002 / NDS7002A N-Channel Enhancement Mode Field Effect Transistor
MOSFET IRFU9024NPBF
出典:Digi-Key Catalog JP2011-JA Page 1553
赤外線LEDの電流と個数の調整
-
より遠くまで赤外線を飛ばしたければ、赤外線LEDに流れる電流を増やしてみてください。例えば、抵抗を半分にしてみたら(2つの27Ωを並列に繋げてみたら)、飛距離が5m以上になりました。(27Ωのときは3m以上だったので、倍近く伸びました。)【追記 2020年3月28日】絶対最大定格を越えるため危険です。 - より広範囲に赤外線を飛ばしたければ、赤外線LEDの個数を増やして、いろいろな方向に赤外線を発光してみてください。ただし、赤外線LEDを増やす際には、LEDごとに抵抗を繋げることを忘れずに → 1個じゃダメ!パワーLEDを並列にする時、抵抗はLEDの数だけ必要!
- 注意 ラズパイの電流能力を超えないよう、くれぐれも慎重に → Raspberry PiのUSBの電流能力
ユニバーサル基盤へのハンダ付け
ユニバーサル基板へのハンダ付けは、ブレッドボードで試作した回路ですべての動作を確認するまでは行わない方がよいです。この記事の作業をすべて終えて、Google Homeから自宅のすべての家電を操作できることを十分に確認できたら、基板にハンダ付けしておくと、安心して長期間使えます。(ブレッドボードのままだと、見た目が悪いだけでなく、振動で接触不良になったりします。)
基板上の配線は、例えば、こちらが参考になるかと。
- Raspberry Pi zero W + IR - something tech.
- Google Home + Raspberry PiリモコンでIoT - NORI TECH BLOG の一番下の画像
- 表/裏(【Raspberry Pi】ラズベリー・パイ part38【ARM】- 5ch)
- tororoさんのツイート
他にも、配線を楽にするご提案を、この記事へのコメントで頂いています。
さらに、プリント基板を作った方もいます → えかわさんのツイート
ラズパイで回路を制御
ブレッドボード上に試作した回路を、ラズパイから制御して、赤外線を送受信します。ここでは、GPIOの制御ライブラリpigpioによる制御方法を紹介します。
(なお、赤外線の送受信でよく用いられるLIRCは使いません。色々と試しましたが、何をするにも手間がかかるので採用を見送りました。例えば、学習した赤外線コードの発信に、root権限でのデーモン再起動が必要だったりして不便でした。)
(pigpioなら、デーモンを一度起動してしまえば、ユーザ権限でもGPIOを高い精度で制御できます。)
pigpioのインストール
$ sudo apt update
$ sudo apt upgrade
$ sudo apt install pigpio python3-pigpio
$ sudo systemctl enable pigpiod.service # ラズパイ再起動時に pigpiod を自動的に起動させます
$ sudo systemctl start pigpiod # いますぐ pigpiod を起動
(過去にLIRCやその他GPIO系ライブラリを導入したことがあるなら、それらを無効にしておいた方が無難?)
GPIOの設定
GPIO17
を、output(w
)に設定し、出力を low(0
)にしておきます。
GPIO18
を、input(r
)、かつ、pull up(u
)に設定します。
(注意:設定内容は電子回路によって異なります。市販の既製品などを制御する場合は、製品に応じた設定が必要です。)
$ echo 'm 17 w w 17 0 m 18 r pud 18 u' > /dev/pigpio
コマンドの意味はこちら
さらに、ラズパイの起動時に、自動的にGPIOの設定を行うようにします。
(先ほど同様、電子回路に応じた内容で設定してください。)
$ crontab -e
# 初めての場合は、どのエディタで編集するか聞かれるので、好きなエディタを選んでください。
# 最後の行に以下の1行を追加して保存。
@reboot until echo 'm 17 w w 17 0 m 18 r pud 18 u' > /dev/pigpio; do sleep 1s; done
(ちなみに、これは「デーモンpigpiod
が起動して、GPIOの設定が成功するまで、1秒おきに設定を試みる」という設定です。)
pigpioによる送受信プログラム
pigpioの作者自らが作った IR Record and Playbackをダウンロードします。
$ curl http://abyz.me.uk/rpi/pigpio/code/irrp_py.zip | zcat > irrp.py
学習
例えば、照明をONにする赤外線コードを学習するには、以下のコマンドを実行してから、リモコンのONボタンを押します。
$ python3 irrp.py -r -g18 -f codes light:on --no-confirm --post 130
Recording
Press key for 'light:on'
Okay
学習した赤外線コードは、-f
で指定したファイル codes
に、light:on
という名前で記録されます。-r
は record、-g18
はGPIO18
という意味です。--no-confirm
を指定しない場合は、確認用にもう一度、リモコンの同じボタンを押すように促されます。また、--post 130
には、学習を打ち切る目安を指定します。この場合、赤外線の受信が130ミリ秒途絶えたら、そこで赤外線コードが終了したものとみなされます。
(補足:学習が失敗する場合の対処方法)
- 対処法(その1):エラー
pigpio.error: 'chain is too long'
の解決法 - 対処法(その2):
--post
を調整してみる-
--post
のデフォルトはかなり短い(15
ミリ秒)ので、35
〜130
ミリ秒あたりに調整してみましょう。 - 実際、我が家のエアコンのリモコンは、デフォルトでは学習に失敗しましたが、
35
にしたら成功しました。 - おそらく、
130
にしておけば、大抵のリモコンに対応できるはずです。-
赤外線リモコンの通信フォーマットによると、赤外線コードのリピート間隔は最長でも約130ミリ秒なので、
130
にしておけば、例えば、ボタンの長押しによる繰り返しも1つの赤外線コードとして学習できるはずです。 -
130
だと長過ぎて雑音を拾うかもしれませんが、雑音は受信側が無視するだけなので害は少ないはずです。学習に失敗して、試行錯誤するよりはずっといいかと。
-
赤外線リモコンの通信フォーマットによると、赤外線コードのリピート間隔は最長でも約130ミリ秒なので、
-
- 対処法(その3):暗い場所で学習を試みる
- 昼間の日光や部屋の照明などにも赤外線は含まれるので、暗い場所で試すと成功する場合もあります。
- 対処法(その4):赤外線受信回路から離れた場所からリモコンを操作してみる
- リモコンが近過ぎると、むしろ受信回路に赤外線が届かないこともあります。
- 対処法(その5):他にも調整可能なパラメータがあるので、ファイル
irrp.py
の冒頭の説明をご覧ください。 - 対処法(その6):受信した赤外線コードを編集する
- 赤外線リモコンの通信フォーマットに近い形になるよう整形すると、成功する場合があるとのご報告を頂きました。
- 対処できないケース:リモコンと家電とが双方向にデータを交換するような特殊な赤外線コードは学習できません。
送信
先ほど学習した赤外線コードlight:on
を送信するには、以下のコマンドを実行します。
$ python3 irrp.py -p -g17 -f codes light:on
点灯したら成功!
もし点灯しないなら、上述の対処法を試すか、そもそも電子回路に配線ミスや接触不良がないか調べてみて下さい。
なお、-p
は playbackという意味です。デフォルトのキャリア周波数は38kHzですが、世の中には36kHz、40kHz、56kHzなどの赤外線コードも存在します。もしインターネットなどから拾ってきた、38kHz以外の赤外線コードを発信する場合には、--freq
でキャリア周波数を指定するとよいでしょう。
Google Homeから操作
回路さえ完成すれば、あとの作業は簡単です。
送受信コマンドをhubotに登録して、IFTTTアプレットを用意するだけで、Google Homeから回路を操作できるようになります。
作業を始める前に、システムの概要を理解しておくと捗ります。まずは こちら の「ドキュメント」の「概要」をご覧ください。
hubot-broadlink-rmを導入
自作回路をhubotから操作できるようにするため、私が作ったhubot拡張スクリプト(hubot-broadlink-rm)を、ラズパイにインストールします。
まず、hubotの雛形を作ります → hubotの雛形の生成
(node.jsは安定板(ver.8)を使って下さい。開発版(ver.9)は自力で問題を解決できる技術者向けです。)
次に、以下の手順で、hubot-broadlink-rm をインストールします。
$ cd ~/homebot # hubotのディレクトリに移動
$ npm install hubot-broadlink-rm # hubotを拡張するスクリプトをインストール
ファイルexternal-scripts.json
を、以下のように編集すれば、導入完了です。
[
"hubot-broadlink-rm", // この1行を追加
:
]
これで、hubotにUNIXコマンドを登録して、実行できるようになりました。
コマンドを作る
先ほどダウンロードしたファイル irrp.py
を、~/homebot/bin
に移します。
$ cd <irrp.pyのあるディレクトリ>
$ mv irrp.py ~/homebot/bin
$ cd ~/homebot
$ mkdir data # 学習した赤外線コードなどを保管するためのディレクトリを用意しておく
学習用のコマンドbin/pi-learn.sh
を用意します。
#!/bin/sh
name=$1
python3 bin/irrp.py -r -g18 -f data/pigpio.json --no-confirm --post 130 "$name"
学習した赤外線コードは、ファイルdata/pigpio.json
に記録することにします。
送信用のコマンド bin/pi-send.sh
を用意します。
#!/bin/sh
name=$1
python3 bin/irrp.py -p -g17 -f data/pigpio.json "$name"
実行権限を与えます。
$ chmod 755 bin/pi-learn.sh bin/pi-send.sh
動作を確認します。
$ bin/pi-learn.sh lighton # 点灯コードを学習
$ bin/pi-send.sh lighton # 点灯コードを送信
照明が点灯したらOK。
hubotにコマンドを登録
作ったコマンドを、hubotに登録します。(コマンドの登録方法の詳細はこちら)
$ bin/hubot # hubotを起動 (20秒ほどかかるので、のんびり待つ)
homebot> homebot command pi:learn bin/pi-learn.sh '#' # 学習コマンドを登録
set !pi:learn to bin/pi-learn.sh '#'
homebot> homebot command pi bin/pi-send.sh '#' # 送信コマンドを登録
set !pi to bin/pi-send.sh '#'
hubotで学習と送信
動作確認のため、今度は照明の消灯コードを学習します。
homebot> homebot send pi:learn(lightoff)
# リモコンの消灯ボタンを押して、コードを学習させます。
# 学習コマンドの実行が終わると、以下のメッセージが表示されます。 (学習コマンドの実行中は、メッセージは表示されません)
bin/pi-learn.sh 'lightoff'
Recording
Press key for 'lightoff'
Okay
学習した消灯コードを送信して、照明が消えればOKです。
homebot> homebot send pi(lightoff)
bin/pi-send.sh 'lightoff'
homebot> # Ctrl+d で hubot を終了してください
Slackから操作
まず、hubotをSlackに接続します。設定方法はこちら。
以下のコマンドでhubotをSlackに接続したら、Slackからメッセージhomebot send pi(lighton)
を送って、照明が点灯することを確認します。
$ bin/hubot --adapter slack
Google Homeから操作
「OK Google、明るくして」とGoogle Homeに話しかけたら、homebot send pi(lighton)
というメッセージを送信するようなIFTTTアプレットを作ります。(詳しい作業手順は、こちら)
「OK Google、明るくして」と話しかけて、照明が点灯すれば大成功!
もっと便利に
照明のON / OFFだけでなく、例えば以下のような、きめ細かい家電操作も、手軽に設定できます。(設定方法は、こちら)
- 「OK Google、おやすみ」の一言で、照明もエアコンも、まとめてOFFにする
- 「OK Google、暖房
22
度」で、エアコンの設定温度を22
度にする - 「OK Google、エアコンを
1時間後
に消して」で、1時間後
にエアコンを消す - 「OK Google、テレビの音量を
3
上げて」で、音量アップを3
回繰り返す
「OK Google」と言うのが面倒になったら…
見つめるだけでスマートスピーカーを起こす こともできます。