スクリプトと連携してエアコン操作がしたかったので,Raspberry Pi Zero W でスマートリモコンを作ってみました.
はじめに
最近,スマホのアプリからエアコンとかを操作できるスマートリモコンがいろいろ出ています.
Broadlink RM Mini3 とかだと Aliexpress で $16 程度で手に入るので自分で作るメリットはなくなってきていますが,スクリプトから自動制御したかったので Raspberry Pi Zero W で作ることにしました.
目標は次の2点.
- 部屋のどこにおいても制御ができる信号強度
- リビングにも設置できるようような外観に
前者だけだと,次のようなお手軽モジュールが売られていますが,常用するにはもう少しシンプルな見た目にしたい.
必要な部品
必要な部品はこんな感じ.
秋月電子 で入手するもの
- 5mm 赤外 LED L12170
-
リモコンの肝となる赤外線 LED です.リモコン信号で使用するパルス幅 10us だと脅威の 5A も流せます.普通の赤外線 LED の 10倍以上!
- LED光拡散キャップ(5mm) 白
-
LED にかぶせるキャップです.むき出しのままだと指向性がかなりあるので,これを付けて光を拡散させることにより,どの方向でも信号が届くようにします.
- 両面ユニバーサル基板 Dタイプ (47x36mm) 4穴 スルホール
-
小型の基板です.
Digi-Key で入手するもの
- MOSFET N-CH 30V 4A RQ5E040AJTCL
-
3.3V でほぼフル ON する MOSFET です.秋月とかで扱っているものだと ON 電圧と ON 抵抗がここまで低いものは今のところ無いです.
- T-600型貼り付けボス
-
Raspberry Pi Zero W をケースに固定するためのボスです.下側が強力な両面テープになっているので,好きな位置に基板を固定できます.
MonotaRO で入手するもの
- PF型ネットワークケース PF10-2-7W
-
基板を納めるケースです.Raspberry Pi Zero W と小型基板を納めるのにぴったりサイズです.
回路
作成する回路は下記のようになります.LED には 5V を接続し,Raspberry Pi から SEND を制御して,赤外線で信号を送ります.
上の回路図で R となっているのは電流制限用の保護抵抗ですが,データシートから必要な直列抵抗を計算すると,次のようになります.
コネクタ等を介して普通に回路を組むと配線抵抗として 0.5 Ω程度にはなるので,わざわざ抵抗を配置する必要は有りません.
一方,5A 流せる前提としてパルス幅 100us 以下であることが必要なので注意が必要です.具体的には,SEND をつなぐ Raspberry Pi の端子は下記の挙動が必要になります.
- デバイスとして,初期 H 出力を行わない
- Linux がブートする過程で,H 出力を行わない
5V や GND の近くでオススメなのが 12pin (GPIO18) です.
不適切な端子につなぐと LED が故障してしまいます.私の場合,最初に回路を組んだ際,デバイスのデータシートだけみて 8pin (GPIO14) につないだところ,Linux のブートの過程で H が出力され,見事に壊してしまいました.
組み立て
回路はこんな感じで収まります.
上側に穴を開けて LED を取り付けます.
学習もさせたかったので,受光部を背面に付けています.(黒い部分)
設定
まず,Linux で赤外線リモコンを使うときの定番 lirc をインストールします.
1 |
% sudo apt install lirc |
設定は,/boot/config.txt
に次の行を追加すれば OK.
送信は前述のとおり GPIO18 に,受信は GPIO15 に割り当てています.
1 |
dtoverlay=lirc-rpi,gpio_in_pin=15,gpio_out_pin=18 |
あとは,次のようにすることで,機器を操作できるようになります.それぞれのキーワードで検索すると分かりやすい解説がいろいろ出てきます.
- mode2 コマンドで既存のリモコンの送信信号を記録.
(事前にsudo service lircd stop
する必要有り) - 先ほどの信号の内容を
/etc/lirc/lircd.conf
ファイルに記載. irsend
コマンドで信号送信.
性能
LED が真上を置いている状態で,10m 程度離れている機器にも普通に信号が届きます.
抜群です.
お試しあれ.
コメント
参考になります
上記を作成しようと思っております。
mosfetと基盤はどのように接続してますか?
dip変換キットなど見当たらなかったので‥