材料費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)
119円 ユニバーサル基板 ラズパイZERO用 これだけは秋月で買えない。 ラズパイ3用で代用する?
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ごとに抵抗を繋げることを忘れずに →  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をダウンロードします。

$ 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):--postを調整してみる
    • --postのデフォルトはかなり短い(15ミリ秒)ので、35130ミリ秒あたりに調整してみましょう。
    • 実際、我が家のエアコンのリモコンは、デフォルトでは学習に失敗しましたが、35にしたら成功しました。
    • おそらく、130にしておけば、大抵のリモコンに対応できるはずです。
      • 赤外線リモコンの通信フォーマットによると、赤外線コードのリピート間隔は最長でも約130ミリ秒なので、130にしておけば、例えば、ボタンの長押しによる繰り返しも1つの赤外線コードとして学習できるはずです。
      • 130だと長過ぎて雑音を拾うかもしれませんが、雑音は受信側が無視するだけなので害は少ないはずです。学習に失敗して、試行錯誤するよりはずっといいかと。
  • 対処法(その2):暗い場所で学習を試みる
    • 昼間の日光や部屋の照明などにも赤外線は含まれるので、暗い場所で試すと成功する場合もあります。
  • 対処法(その3):赤外線受信回路から離れた場所からリモコンを操作してみる
    • リモコンが近過ぎると、むしろ受信回路に赤外線が届かないこともあります。
  • 対処法(その他):他にも調整可能なパラメータがあるので、ファイル irrp.py の冒頭の説明をご覧ください。
  • 対処できないケース:リモコンと家電とが双方向にデータを交換するような特殊な赤外線コードは学習できません。

送信
先ほど学習した赤外線コードlight:onを送信するには、以下のコマンドを実行します。

$ irrp.py -p -g17 -f codes light:on

点灯したら成功!
もし点灯しないなら、上述の対処法を試すか、そもそも電子回路に配線ミスや接触不良がないか調べてみて下さい。

なお、-p は playbackという意味です。デフォルトのキャリア周波数は38kHzですが、世の中には36kHz、40kHz、56kHzなどの赤外線コードも存在します。もしインターネットなどから拾ってきた、38kHz以外の赤外線コードを発信する場合には、--freqでキャリア周波数を指定するとよいでしょう。

Google Homeから操作

回路さえ完成すれば、あとの作業は簡単です。
送受信コマンドをhubotに登録して、IFTTTアプレットを用意するだけで、Google Homeから回路を操作できるようになります。
system.png

まだ Google Home から IFTTT 経由で hubot にメッセージを送ったことがない場合は、こちらの「ドキュメント」の「概要」をご覧ください。

hubot-broadlink-rmを導入
自作回路を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、明るくして」と話しかけて、照明が点灯すれば大成功!

寄付

ご支援を頂けると、開発や投稿の励みになります。
楽しい機能や記事を今後も公開していきますので、ご期待ください。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.