ESPr(R) IR 赤外線リモコンで楽ちんリモコン
お題だけみると楽ちんですが、日頃「基礎学習」を怠っているぐうたらホビィストにはなかなか越える山が多かったので、メモを残します(今日はこのメモ書きだけで終わりそうだ・・)。きょうび、デキる小学生ならあっという間なんじゃないかな。
はじめに成果。
まだブラウザの中で動いております。個人利用ならてきとにapkにすればいいのかなと思ってます。
以下、ドロドロ、ノロノロの試行錯誤。
(1)部品調達
これは買うだけですから、取りこぼしがなければなんとかなるところ。ESP(R) IR 赤外線リモコン(ESP-WROOM-02:スイッチサイエンス)はWiFiも赤外線受光センサも赤外線LEDも全部入りのとっても初心者に優しい小型ボードです。運用は電源さえ繋げばOKで、縦横3〜4cm程度ですから場所も選びやすいです。
www.switch-science.comこのページに、
プログラムの書き込みにはFTDI USBシリアル変換アダプター
(5V/3.3V切り替え機能付き)が必要です。
とありますが、スイッチサイエンスさんでは「在庫切れ」。在庫のあった他社さんでポチ。
www.switch-science.com※あくまでもブツがスイッチサイエンスさんのものなので、引用(リンク)はスイッチサイエンスさんからとしました。
これと、PCとUSBケーブル(TYPE-Bのスマホ充電用)とスマホ充電器(5Vで1A出れば大丈夫)だけで、はんだもブレットボードも一切不要です。この選択は初心者には悪くないと思います。なんと商品ページに説明のWikiまでありますし。
というわけであっさり2,3時間で、というのが「あさはかなり。」ですよ。2日かかりましたね。これだから基礎のなってない奴はダメですね。
(2)Wikiの通り淡々と・・?
部品が揃ったので、開封の儀、の後、上のWikiを観ながら進めます。シリアル変換の方のジャンパは3.3Vに、ESP-WROOM-2のジャンパは以後、PROG(プログラム書込み)とRUN(実行)で挿し替えます。ジャンパを外すとRUNなので、書き込む時だけジャンパを挿してもいいかもです。
自分のPC用のArduino IDEをダウンロードします。私はLinux Mint 18.2 (Ubuntu 16.04LTS相当)ですので、Linux版を。よくできたIDEなので、数ドルでもDonateしましょうね。
Arduino IDEにESP8266ボードの開発環境を整える方法はこちらを参照してください。
とあり、まずはArduino IDEの設定に入ります。さくっと書くと
- IDEを開く。環境設定で開いた画面で、ESP8266用のモジュールURLを設定
- 上記設定の後に、「ボードマネージャー」でesp8266で検索するとESP8266用のプラグイン?各種設定がIDEに展開可能となる
- 再度、今度は「ボードマネージャー」と同列で表示される「Generic ESP8266 Module」を選択する。これでIDEくんはESP8266開発をやる気になってくれます
- 開発設定を後述の表の通りにします。Flash Sizeを当初4Mと書いていたようで、あちこちに訂正が出ています。2Mが正しいようです。
- シリアルポートは「シリアルポート」というメニュー項目をクリックすると右側に選択肢が(おそらく大抵は1つだけ)でます。COMxxxはWindowsのケースでしょう。LinuxではttyUSB0となることがほとんどです(ここでなんでかなーと15分くらいロス)
- さらに下のメニュー「書き込み装置」はいじらなくてOKです。余計なことはしないのが、できるエンジニアの条件??
- 最後のスケッチ書き込みはいずれやるので、ま、いいのかな、と。(まぁハマったわけですが)
Flash Mode QIO Flash Frequency 40MHz Upload Using Serial CPU Frequency 80MHz Flash Size 2M(1M SPIFFS) Reset Method nodemcu Upload Speed 115200 シリアルポート 開発ボードのシリアルポート番号
(3)リモコンの信号(発光)の読み取り
ここらからだいぶシロートは苦戦しました。Wikiの5.サンプルスケッチですが、以下のように「ライブラリ」を使用します。
リモコンのコード解析のためにIRremoteESP8266というライブラリを使用しました
これは「使用します」からにはコンパイラに認識させる必要がありまして、まず、上記IRemoteRSP8266のGitHubサイトから一式をzipでダウンロードします。で、そのzipファイルをいかのようにして取り込みます。たぶん基礎をちゃんと学んでいるArduino使いには「常識」なのでしょう。これをしないとヘッダファイルのincludeもされないので(リンクの前の)コンパイルすら通りません。
ライブラリのインクルードの仕方:
で、~/Arduinoディレクトリの下に、librariesというのがあって、そこにzipファイルが展開されています。その中にexamplesもあるので、そこをオープンしても良いのですが、なんとなくlibの下を触りたくなかった、というだけで、同じzipファイルを~/Arduino直下にも展開しまして、その中のexamplesからIRrecvDump.inoを「これかなぁ」とOpen。ひどい話だ。
そして、これはこれで動くのですが、コードの中にガッツリと
DEPRECATED: Please use IRrecvDumpV2.ino instead!
とあります。試行錯誤で動いた末にこれを見ると、泣けます。しかし気を取り直して、IRrecvDumpV2.inoを開きます。こちらも手を入れるのはPIN番号を5にすることくらいです。
しかし動かすと、2なし版とは違い、大量に数字が出てきて、挫けそうになります。IRrecvDump, IRrecvDumpV2、どちらのどの部分を使ってIR LEDを発光させるのか。。
物語じゃないので(笑)私の得た結論はというと、
- 作成者の指示通り、DumpV2を使うこと。
- DumpV2でベンダー名とヘキサのコードがはっきりとれて、irsend.sendNEC(0x999999999) のようにそのベンダーのメソッドで送信ができるならヘキサのコードを利用する。
- ベンダー名が UNKNOWN の場合は、irsend.sendRaw(rawData, 111, 38) のようにDumpで取れた配列を直接渡す
です。私の場合、部屋の照明は、
Encoding : NEC
Code : 0x218A54AB (32 bits)
Timing[67]:
+ 10242, - 5024, + 756, - 526, + 752, - 526, + 730, - 1808,
+ 752, - 528, ...なので、
irsend.sendNEC(0x218A54AB);
のように取れましたので、irsend.sendNEC()にヘキサのコードを渡してコントロールでき、エアコンは、DumpではPanasonicと出たものの、DumpV2では UNKNOWNでしたので、439個の (uint_t)を渡しています。
Encoding : UNKNOWN
Code : 0x3109B479 (220 bits)
Timing[439]:
+ 3586, - 1652, + 510, - 368, + 506, - 1248, + 504, - 372,
+ 506, - 378, ...・・・(中略)・・・
uint16_t rawData[439] = {3586, 1652, 510, ...
なので、Sendのコードに上記を(IRsend irsend(14);の直後に)コピペし、
irsend.sendRaw(rawData, 439, 38); として全部送信
うちのエアコンの場合、運転モード・温度・風向き・風量など都度、リモコン上の値をまるっと送ってました。まぁこの方が差分だけ送るよりずっと楽ですよね。なので、あとは、照明はOFFも含めた4つのボタンをサンプリング、エアコンは最近お気に入りの3つのパターンとOFFだけサンプリングして、画面を整えて終わりです。
あ、送信のサンプルは展開した中のIRSendDemoなどをみつつ、Wikiのコードを加工して作っています。画面レイアウト以外の主な修正点は、
- IR LEDのPIN番号を14に変更(Wikiと並んでいる回路図でも確認できます)
- WiFi.mode(WIFI_STA); の1行を追加
(追加しないとAPモードで「認証なしのWiFiスポット」と化します・・) - tempのサイズを800から3000まで拡張
(冒頭に貼った程度の画面でもコピペで作るとあっという間に800を超えてしまいます)
です。とりあえずこれでいつもベッドで「何処に行ったぁぁ〜!?」と探しまくってた2つのリモコンは不要になりました。稼働はUSB給電でも、乾電池でもOKですね(シリアルアダプターは当然ながら実運用中は不要です)。4LEDでご丁寧に扇型に広がってますので、置く場所によってはかなりの範囲をカバー可能。IR LEDは照明やエアコンから見える場所に置く必要がありますが、操作の指示自体はWiFiなので、玄関で靴履いてから「あ、エアコン・・」というときも、スマホからOFFにできます。とぉ〜〜っても便利、ですよ!
== END ==