Edited at

格安スマートリモコンの作り方

材料費400円の赤外線送受信器を、1,800円のラズパイZeroに載せて、Google Homeから操作する方法を、ゼロから丁寧に解説します。

result.png


  • 安くても高機能


    • むしろ市販のスマートリモコンではできない、きめ細かな操作も簡単に実現できます。(例えば こんなこと ができます。)



  • 簡単


    • 電子回路を作ったことのない初心者でも作れるよう、電子部品の買い方から、丁寧に説明します。




電子工作の基本

ラズパイでの電子工作が初めてなら、こちら → Raspberry Piの電源でLEDを1個光らせてみる - ツール・ラボ

(素晴らしく丁寧な解説なので、予備知識ゼロでも理解できるはず。)

ここで紹介するスマートリモコンの回路も、まずはブレッドボードを使って、半田付けをせずに試作します。

試作品をしばらく使ってみて問題がないようなら、基板に半田付けして完成させます。

半田付けが初めてなら、こちら → うまくいく電子工作のコツ - 村田製作所

(小学校高学年向けのサイトなので、予備知識ゼロでも理解できるはず。)

(読むのは、実際に半田付けをする段階になってからでも構いません。)


電子部品

ほぼすべて秋月電子通商で購入できます。(通販が楽チン)

1台あたりの材料費は378円です。(赤外線LEDを4個載せる場合)

parts.png

ただし、試作のためのブレッドボードや、抵抗(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本入)

1W1/4W1/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仕様なので、電源トラブルに悩みたくないなら、買って損はありません


注意

部品が手に入ったら、いよいよ電子回路を試作します。ただし、回路の設計や配線などを間違えると、ラズパイは簡単に壊れます。作業はくれぐれも注意深く、慎重に、自己責任で。


赤外線を受信する回路

受信モジュールとラズパイを、3本のワイヤーで繋ぐだけ。

receive.png

赤外線受信モジュール OSRB38C9AA

OSRB38C9AA.png

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番号

gpio.png

物理番号

gpio-physical.png


赤外線を発信する回路

こちらのサイトに、とても丁寧に解説されています → 赤外線LEDドライブ回路の決定版 - 電脳伝説

(冒頭に「WiringPiのせいで1mしか赤外線が届かない」との記載がありますが、WiringPiを使わない方法を紹介するのでご安心を)

send.png

MOSFET 2N7000

出典:2N7000 / 2N7002 / NDS7002A N-Channel Enhancement Mode Field Effect Transistor

2N7000.png

MOSFET IRFU9024NPBF

出典:Digi-Key Catalog JP2011-JA Page 1553

IRFU9024NPBF.png

赤外線LEDの電流と個数の調整


  • より遠くまで赤外線を飛ばしたければ、赤外線LEDに流れる電流を増やしてみてください。例えば、抵抗を半分にしてみたら(2つの27Ωを並列に繋げてみたら)、飛距離が5m以上になりました。(27Ωのときは3m以上だったので、倍近く伸びました。)

  • より広範囲に赤外線を飛ばしたければ、赤外線LEDの個数を増やして、いろいろな方向に赤外線を発光してみてください。ただし、赤外線LEDを増やす際には、LEDごとに抵抗を繋げることを忘れずに →  1個じゃダメ!パワーLEDを並列にする時、抵抗はLEDの数だけ必要!


  • 注意 ラズパイの電流能力を超えないよう、くれぐれも慎重に → Raspberry PiのUSBの電流能力

ユニバーサル基盤へのハンダ付け

ユニバーサル基板へのハンダ付けは、ブレッドボードで試作した回路ですべての動作を確認するまでは行わない方がよいです。この記事の作業をすべて終えて、Google Homeから自宅のすべての家電を操作できることを十分に確認できたら、基板にハンダ付けしておくと、安心して長期間使えます。(ブレッドボードのままだと、見た目が悪いだけでなく、振動で接触不良になったりします。)

基板上の配線は、例えば、こちらが参考になるかと。

他にも、配線を楽にするご提案を、この記事へのコメントで頂いています。


ラズパイで回路を制御

ブレッドボード上に試作した回路を、ラズパイから制御して、赤外線を送受信します。ここでは、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、-g18GPIO18という意味です。--no-confirmを指定しない場合は、確認用にもう一度、リモコンの同じボタンを押すように促されます。また、--post 130には、学習を打ち切る目安を指定します。この場合、赤外線の受信が130ミリ秒途絶えたら、そこで赤外線コードが終了したものとみなされます。

(補足:学習が失敗する場合の対処方法)


  • 対処法(その1):エラー pigpio.error: 'chain is too long'の解決法



  • 対処法(その2):--postを調整してみる



    • --postのデフォルトはかなり短い(15ミリ秒)ので、35130ミリ秒あたりに調整してみましょう。

    • 実際、我が家のエアコンのリモコンは、デフォルトでは学習に失敗しましたが、35にしたら成功しました。

    • おそらく、130にしておけば、大抵のリモコンに対応できるはずです。



      • 赤外線リモコンの通信フォーマットによると、赤外線コードのリピート間隔は最長でも約130ミリ秒なので、130にしておけば、例えば、ボタンの長押しによる繰り返しも1つの赤外線コードとして学習できるはずです。


      • 130だと長過ぎて雑音を拾うかもしれませんが、雑音は受信側が無視するだけなので害は少ないはずです。学習に失敗して、試行錯誤するよりはずっといいかと。





  • 対処法(その3):暗い場所で学習を試みる


    • 昼間の日光や部屋の照明などにも赤外線は含まれるので、暗い場所で試すと成功する場合もあります。



  • 対処法(その4):赤外線受信回路から離れた場所からリモコンを操作してみる


    • リモコンが近過ぎると、むしろ受信回路に赤外線が届かないこともあります。



  • 対処法(その5):他にも調整可能なパラメータがあるので、ファイル irrp.py の冒頭の説明をご覧ください。

  • 対処できないケース:リモコンと家電とが双方向にデータを交換するような特殊な赤外線コードは学習できません。

送信

先ほど学習した赤外線コード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から回路を操作できるようになります。

system.png

作業を始める前に、システムの概要を理解しておくと捗ります。まずは こちら の「ドキュメント」の「概要」をご覧ください。

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/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/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」と言うのが面倒になったら…

見つめるだけでスマートスピーカーを起こす こともできます。