材料費400円の赤外線送受信器を、1,800円のラズパイZeroに載せて、Google Homeから操作する方法を、ゼロから丁寧に解説します。
- 安くても高機能
- 安かろう悪かろうでは決してなく、むしろ市販のスマートリモコンでは出来ない、きめ細かな操作も簡単に実現できます。(例えばこんなことができます。)
- 簡単
- 電子回路を作ったことのない初心者でも作れるよう、電子部品の買い方から、丁寧に説明します。
電子工作の基本
ラズパイでの電子工作が初めてなら、こちら → Raspberry Piの電源でLEDを1個光らせてみる - ツール・ラボ
(素晴らしく丁寧な解説なので、予備知識ゼロでも理解できるはず。)
ここで紹介するスマートリモコンの回路も、まずはブレッドボードを使って、半田付けをせずに試作します。
試作品をしばらく使ってみて問題がないようなら、基板に半田付けして完成させます。
半田付けが初めてなら、こちら → うまくいく電子工作のコツ - 村田製作所
(小学校高学年向けのサイトなので、予備知識ゼロでも理解できるはず。)
(読むのは、実際に半田付けをする段階になってからでも構いません。)
電子部品
ほぼすべて秋月電子通商で購入できます。(通販が楽チン)
1台あたりの材料費は379円です。(赤外線LEDを4個載せる場合)
ただし、試作のためのブレッドボードや、抵抗(100本入り)の余った材料にかかる費用も含めると、総額は1,269円になります。
価格 | 品名 | 備考 |
---|---|---|
100円 | 赤外線リモコン受信モジュール OSRB38C9AA(2個入) | |
100円 | 5mm 赤外線LED OSI5LA5113A(10個入) | 可視光線のLEDもあると、赤外線LEDの動作確認に便利 |
20円 | MOSFET 2N7000(1個) | |
60円 | MOSFET IRFU9024NPBF(1個) | |
200円 | 抵抗 4.7kΩ 1W(100本入) | |
200円 | 抵抗 27Ω 1W(100本入) | |
80円 | ピンソケット(メス)2x20(40P) | |
119円 | ユニバーサル基板 ラズパイZERO用 | これだけは秋月で買えない。 ラズパイ3用で代用する? |
170円 | ブレッドボード(1枚) | |
220円 | ジャンパ・ワイヤー(オス - メス)(10本入) | |
0円 | ジャンパ・ワイヤー(オス - オス) | 抵抗の脚などの廃材で代用 |
その他の機材
以下の機材は、すでに類似品が手元にあるなら買う必要はありません。
価格 | 品名 | 販売店 | 補足 |
---|---|---|---|
2,199円 | はんだごて 8点セット 温度調節可 | amazon | とりあえずブレッドボードの試作品で様子を見るだけなら、無理に頑張って半田付けする必要はありません |
1,814円 | ラズパイZero WH | SWITCH SCIENCE | 送料150円。スマートリモコンとして使うだけなら、Zero WHで十分。消費電力も少ないので、むしろ好都合。秋月でも買えます(ケース付き。2,680円) |
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を使わない方法を紹介するのでご安心を)
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以上だったので、倍近く伸びました。)
- より広範囲に赤外線を飛ばしたければ、赤外線LEDの個数を増やして、いろいろな方向に赤外線を発光してみてください。ただし、赤外線LEDを増やす際には、LEDごとに抵抗を繋げることを忘れずに → LEDのご利用方法の一番下の図
- 注意 ラズパイの電流能力を超えないよう、くれぐれも慎重に → Raspberry PiのUSBの電流能力
ラズパイで回路を制御
ブレッドボード上に試作した回路を、ラズパイから制御して、赤外線を送受信します。ここでは、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 - pigpioをダウンロードします。
$ 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):
--post
を調整してみる-
--post
のデフォルトはかなり短い(15
ミリ秒)ので、35
〜130
ミリ秒あたりに調整してみましょう。 - 実際、我が家のエアコンのリモコンは、デフォルトでは学習に失敗しましたが、
35
にしたら成功しました。 - おそらく、
130
にしておけば、大抵のリモコンに対応できるはずです。-
赤外線リモコンの通信フォーマットによると、赤外線コードのリピート間隔は最長でも約130ミリ秒なので、
130
にしておけば、例えば、ボタンの長押しによる繰り返しも1つの赤外線コードとして学習できるはずです。 -
130
だと長過ぎて雑音を拾うかもしれませんが、雑音は受信側が無視するだけなので害は少ないはずです。学習に失敗して、試行錯誤するよりはずっといいかと。
-
赤外線リモコンの通信フォーマットによると、赤外線コードのリピート間隔は最長でも約130ミリ秒なので、
-
- 対処法(その2):周波数を調整してみる
-
--freq
のデフォルトは38kHzですが、世の中には36kHz、40kHz、56kHzなどの赤外線コードも存在します。
-
- 対処法(その3):暗い場所で学習を試みる
- 昼間の日光や部屋の照明などにも赤外線は含まれるので、暗い場所で試すと成功する場合もあります。
- 対処法(その4):赤外線受信回路から離れた場所からリモコンを操作してみる
- リモコンが近過ぎると、むしろ受信回路に赤外線が届かないこともあります。
- 対処法(その他):他にも調整可能なパラメータがあるので、ファイル
irrp.py
の冒頭の説明をご覧ください。 - 対処できないケース:リモコンと家電とが双方向にデータを交換するような特殊な赤外線コードは学習できません。
送信
先ほど学習した赤外線コードlight:on
を送信するには、以下のコマンドを実行します。
$ irrp.py -p -g17 -f codes light:on
点灯したら成功!
もし点灯しないなら、上述の対処法を試すか、そもそも電子回路に配線ミスや接触不良がないか調べてみて下さい。
Google Homeから操作
回路さえ完成すれば、あとの作業は簡単です。
送受信コマンドをhubotに登録して、IFTTTアプレットを用意するだけで、Google Homeから回路を操作できるようになります。
(もし、まだ Google Home から IFTTT 経由で hubot にメッセージを送ったことがない場合は、こちらの「ドキュメント」の「概要」をご覧ください。)
準備
先ほどダウンロードしたファイル irrp.py
を、~/homebot/bin
に移します。
$ 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
hubotにコマンドを登録
command pi:learn bin/pi-learn.sh '#'
command pi bin/pi-send.sh '#'
hubotで送受信
send pi:learn(lighton)
send pi(lighton)
Google Homeから操作
「OK Google、明るくして」とGoogle Homeに話しかけたら、send pi(lighton)
というメッセージを送信するIFTTTアプレットを作ります。(詳しい作業手順は、こちら)
「OK Google、明るくして」と話しかけて、照明が点灯すれば大成功!