編集履歴一覧に戻る
HakoHiroのアイコン画像

HakoHiro が 2020年06月25日14時16分33秒 に編集

初版

タイトルの変更

+

ステンドグラススタンドのBLE+IRリモートコントロール

タグの変更

+

ESP32

+

Blynk

+

BLE

+

LED

+

PlatformIO

+

VSCode

本文の変更

+

# 概要 自作ステンドグラススタンドの照明に LEDを埋め込みます。 IRリモコンで発光色、発光パターンを変えられる T10 LEDルームランプを使用します。 ランプ自体に赤外線受光器、コントローラが組み込まれていて、スタンドの中に設置するとリモコンが届きにくいことがあるので、スマホ(iPhone)からESP32のBLE経由でランプの受光部近傍に設置した赤外LEDでリモートコントロールします。 これで夜間隣の部屋へ行く時、メイン照明スイッチを探さなくて良くなります。また、ディスプレイとしても面白いです。 先々は、elchikaキャンペーンでプレゼントしていただいた「Leafony」に代替えしようと思っています。 なお、製作にあたって、elchika運営さんの「M5StickCでスマホから操作できる家電リモコンを作る」が非常に参考になりました。 ※長文ですのでお時間のある時に御覧ください。 # 概略図 ![](https://camo.elchika.com/f65ab148e0b5446d4ddd81f42de7399a42126c99/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38333537363361302d393332382d343665392d383165622d3234323436633435373839342f35386632363261652d633462332d346234372d383237622d366433353864303163363761/) # ステンドグラススタンド 錫で色ガラスを固定したステンドグラスです。製作方法等は 電子工作とは関連がないので外観の紹介に留めます。 サイズ:断面正三角形 Width 100mm Hight 170mm 重量:約700 g ![こちらの面には和紙を貼っています](https://camo.elchika.com/044e77e24fa416755a7eb02249383a419bd595f8/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38333537363361302d393332382d343665392d383165622d3234323436633435373839342f38613336333561352d373431372d343333342d623937392d396436613639633664363333/) ![ステンドグラスの面](https://camo.elchika.com/f0528ebaa09bc0d0421b0055f9180f58c8ca86f2/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38333537363361302d393332382d343665392d383165622d3234323436633435373839342f39623463666163632d656561622d346464392d623738342d306231663862666436306433/) ![上面](https://camo.elchika.com/96837f0f019152e3f13d09d0829368361bf99bd0/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38333537363361302d393332382d343665392d383165622d3234323436633435373839342f62616233656138392d333635362d343830372d613830622d653165623666363262333263/) ![点灯例](https://camo.elchika.com/0cb377bc1c01525e6c105dec13398c835635f991/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38333537363361302d393332382d343665392d383165622d3234323436633435373839342f64346666343534342d366538392d343833332d383331332d636562333836333637303231/) ## 部品構成 - ESP32 DevKit C 秋月電子通商 - T10 フルカラーLEDルームランプ 秋月電子通商 200円/1個 ![秋月電子通商HPの画像](https://camo.elchika.com/7489c5104b8c5b1619b751ae6dd1604d284fd364/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38333537363361302d393332382d343665392d383165622d3234323436633435373839342f36623034356332642d666438342d343562312d383138362d663764613663636434343538/) - メーカーカテゴリ SANYOU LIGHTINGS TECHNOLOGY CO.,LTD 自由に色を変えられるT10ウェッジ球LEDです。本体に赤外線受光部があり専用のリモコンで操作します。電源を切っても点灯の色やパターンは保持されますのでガラスケースやショーウインドーの演出にも最適です。(秋月電子通商HPより抜粋) - 主な仕様 ・ソケット:T10 ・電源:DC9~16V - T10 フルカラーLEDルームランプ リモコン付 秋月電子通商 600円(リモコンフォーマット解析用として) ![秋月電子通商HPの画像](https://camo.elchika.com/8d592531c65cd1cc79daea8b04a3a3edaa372c03/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38333537363361302d393332382d343665392d383165622d3234323436633435373839342f66636632393637312d366638342d343334352d393962632d323733663436363165653162/) パッケージに上記のT10が2個、リモコンが1個入っています - 赤外線受光器、 赤外LED: アマゾン(受光器はリモコンフォーマット解析用) KeeYees VS1838B HX1838 1838 赤外線センサー リモコン 受光部 受信機 赤外線受光モジュール 25個入り + 5mm 赤外線LED 940nm 高輝度 25個入り 850円 ![アマゾンHP画像より](https://camo.elchika.com/32ea48938e7b81da8a852f1a03d526136c647cca/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38333537363361302d393332382d343665392d383165622d3234323436633435373839342f33373435313065632d303063312d346262392d616461392d363662616135653761323464/) 秋月電子通商さんでも良いのですが、アマゾンプライム会員なので、輸送費を考えてこちらにしました。 25個×2も入っているので、一生使えそうです。なお、全く問題なく使えました。 # SoftWare ## Blynk iPhoneのBLEコントロール用に使用 簡単に、無料枠でIoTを実現できます。 ※非常に良くできたSoftです。外部接続のプロトタイピングSoftとして最強だと思います。 出来上がった外観もなかなかです。 具体例、使い方は、elchika運営さんの「M5StickCでスマホから操作できる家電リモコンを作る」を参照してください。 ## PlatformIO+VSCode ESP32の開発用:こちらも elchikaに記載が沢山あります。 慣れてきたせいもあり、使い心地最高!! お薦めです。 なお、上記のBlynkも PlatformIO+VSCodeから利用しています。 # 前準備 ## IRリモコンボタン構成 ![秋月電子通商HPの画像より](https://camo.elchika.com/36ec8bee07b8af68458b4e8b20d81f91c0dfcd50/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38333537363361302d393332382d343665392d383165622d3234323436633435373839342f65313137386361622d626136312d346639662d386239362d636235316364613231373638/) この内、PowerOn/PowerOff/ Light Up/ Light Down R/G/B/W/ Flash/ Strobe / Fade/ Smooth のコマンドを実装する。 ## IRリモコンのフォーマット解析 上記コマンドを実装するために、リモコンのフォーマット解析をします。 これについても 上記記事が参考になりますが、それと異なる所のみ記載します。 ### H/W ![ESP32に接続](https://camo.elchika.com/368c9044fe28b9d0d140c8c71df8790a55b93c06/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38333537363361302d393332382d343665392d383165622d3234323436633435373839342f61316361356163622d333862362d343665312d616632642d663637653430623538393738/) ### フォーマット解析 IRremoteESP8266のexamplesのIRrecvDumpV2のスケッチを書き込むと簡単に受信した信号を表示することができます。 - PlatformIO.ini このファイルで「IRremoteESP8266」をインクルードします。 ``` [env:esp32dev] platform = espressif32 board = esp32dev framework = arduino lib_deps = IRremoteESP8266 monitor_port = /dev/cu.SLAB_USBtoUART upload_port = /dev/cu.SLAB_USBtoUART monitor_speed = 115200 ``` lib_deps = ・・・・・ とすると、 そのライブラリがプロジェクトに読み込まれます ![キャプションを入力できます](https://camo.elchika.com/d46347d643cff9f1b4ee10e60aa384c3ccac506e/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38333537363361302d393332382d343665392d383165622d3234323436633435373839342f34353833613866302d316330372d346131642d383261322d356438633432393330303132/) - examples > IRrecvDumpV2>IRrecvDumpV2.ino のファイルをコピーし、src>IRrecvDumpV2.inoとペーストします。 コンパイル、転送をし、上記受光センサに対し、リモコンのボタンを押すと、解析結果がターミナルに出力されます。 ```ターミナル出力例 --- Available filters and text transformations: colorize, debug, default, direct, esp32_exception_decoder, hexlify, log2file, nocontrol, printable, send_on_enter, time --- More details at http://bit.ly/pio-monitor-filters --- Miniterm on /dev/cu.SLAB_USBtoUART 115200,8,N,1 --- --- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H --- Timestamp : 000021.775 Library : v2.7.7 Protocol : NEC Code : 0x807FB04F (32 Bits) uint16_t rawData[71] = {8932, 4484, 636, 1616, 636, 514, 636, 512, 582, 568, 636, 512, 636, 514, 634, 514, 582, 566, 582, 566, 582, 1672, 634, 1620, 636, 1618, 638, 1614, 638, 1616, 644, 1610, 634, 1618, 582, 1672, 636, 514, 632, 1620, 634, 1618, 638, 510, 582, 566, 634, 516, 636, 512, 634, 514, 582, 1670, 582, 566, 584, 566, 584, 1670, 632, 1622, 634, 1620, 638, 1616, 638, 38798, 8932, 2248, 634}; // NEC 807FB04F uint32_t address = 0x1; uint32_t command = 0xD; uint64_t data = 0x807FB04F; ``` - 解析結果:全てNECプロトコル ![キャプションを入力できます](https://camo.elchika.com/535b59093bfd19170a0a08755babf42479ed964c/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38333537363361302d393332382d343665392d383165622d3234323436633435373839342f32356338623266392d343534372d343261312d393535312d323237633830363464366236/) ※ ノイズフィルターは全く必要有りませんでした。 ## IRリモコン IR送信 ### H/W 赤外線LEDのアノード側に制限抵抗47Ωを接続そして、ESP32 GPIO4に接続 カソード側は ESP32 GNDに接続 ### 送信テスト 上記フォーマット解析と同様 PlatformIO.ini に lib_deps = IRremoteESP8266 を記載 展開されたexamples の IRSendDemo.ino をベースに修正 (NECプロトコルに対応) ```arduino:NECプロトコルコマンド送信テスト #include <Arduino.h> #include <IRremoteESP8266.h> #include <IRsend.h> const uint16_t kIrLed = 4; // ESP8266 GPIO pin to use. Recommended: 4 (D2). IRsend irsend(kIrLed); // Set the GPIO to be used to sending the message. void setup() { irsend.begin(); #if ESP8266 Serial.begin(115200, SERIAL_8N1, SERIAL_TX_ONLY); #else // ESP8266 Serial.begin(115200, SERIAL_8N1); #endif // ESP8266 Serial.println("NEC On"); irsend.sendNEC(0x807FB04F); delay(10000); } void loop() { Serial.println("NEC Red"); irsend.sendNEC(0x807F9867); delay(5000); Serial.println("NEC Green"); irsend.sendNEC(0x807FD827); delay(5000); Serial.println("NEC Blue"); irsend.sendNEC(0x807F8877); delay(5000); Serial.println("NEC White"); irsend.sendNEC(0x807FA857); delay(5000); } ``` ESP32 DevKit Cの赤外LEDを T10 フルカラーLEDルームランプに向けて 上記プログラムを走らすと、問題なく点灯、R/G/B/W の変更が動作しました。 (delayはこんなには必要ないです) # Blynk - iPhoneにAppleStoreからインストール - また、PlatformIOのGlobal StrageにBlynkライブラリをインストール PlatformIO.iniは各Project毎のライブラリ管理であり、Global Strageにインストールするのは行儀が悪いのですが、後でGlobalから移動させようと思っています。 詳細は 件の記事を参照してください。 ## 画面構成 ![iPhone Blynkの画面](https://camo.elchika.com/3ee1438e47f6a0ad953155d14bc0bb745ea4a92c/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38333537363361302d393332382d343665392d383165622d3234323436633435373839342f34653764366639652d313364372d343539342d613261362d313733373865363835383133/) PowerOn/Off ボタン LightUp/Downボタン Menu選択 (画面はGreenを選択途中) # ESP32 ソースコード ```arduino:BLE_IRリモコンソース #include <Arduino.h> #include <IRremoteESP8266.h> #include <IRsend.h> const uint16_t kIrLed = 4; // ESP8266 GPIO pin to use. Recommended: 4 (D2). IRsend irsend(kIrLed); // Set the GPIO to be used to sending the message. #define BLYNK_PRINT Serial #define BLYNK_USE_DIRECT_CONNECT #include <BlynkSimpleEsp32_BLE.h> #include <BLEDevice.h> #include <BLEServer.h> char auth[] = "ここにプロジェクト作成時にメールで送られてきた Auth Tokenを入れる"; void setup() { Serial.begin(115200, SERIAL_8N1); pinMode(GPIO_NUM_4, OUTPUT); Serial.begin(15200); Serial.println("Waiting for connections..."); Blynk.setDeviceName("ESP32 IRremote"); //これがBLEのデバイス名 Blynk.begin(auth); } void loop() { Blynk.run(); } // Function Menu BLYNK_WRITE(V0) { int pinValue = param.asInt(); // assigning incoming value from pin V1 to a variable unsigned long sendCommand = 0xFFFFFFFF; Serial.println(pinValue); switch (pinValue) { case 1: //Red sendCommand = 0x807F9867; break; case 2: //Green sendCommand = 0x807FD827; break; case 3: //Blue sendCommand = 0x807F8877; break; case 4: //White sendCommand = 0x807FA857; break; case 5: //Flash sendCommand = 0x807FB24D; break; case 6: //Strobe sendCommand = 0x807F00FF; break; case 7: //Fade sendCommand = 0x807F58A7; break; case 8: //Smooth sendCommand = 0x807F30CF; break; default: Serial.println("V0:Unknown Command"); break; } irsend.sendNEC(sendCommand); delay(10); } BLYNK_WRITE(V2) { if (param.asInt() == 1) { // Power On irsend.sendNEC(0x807FB04F); } else { // Power Off irsend.sendNEC(0x807FF807); } } BLYNK_WRITE(V4) { // light Up if (param.asInt() == 1) { irsend.sendNEC(0x807F906F); } } BLYNK_WRITE(V5) { // light Down if (param.asInt() == 1) { irsend.sendNEC(0x807FB847); } } ``` リモコンがNECプロトコルだけなので、32bitデータを送信するだけです。 BLYNK_WRITE(V0)は、ボタン等のWindgetに割り当てたバーチャルピンの値です。 iPhone側でMenuが確定すると、BLEからV0の値が渡ってきます。 # 動作状況 @[Youtube動画](https://youtu.be/Lm-bNQU-AkQ) # 感想 - T10 フルカラーLEDルームランプ これだけの機能を盛り込んだLEDが 200円!! 照度もかなりありすぐれものです。 自作の回路で100Vを引き回したくないので、9-16V入力は嬉しい。 - Blynk 通信制御するプロトタイプには最適と思います。 BLEのメニューを自前で実装するとかなり大変です。(AppleStoreにBLEアプリケーションを公開した経験から言っても) また、iPhoneの場合はAppleStoreの審査が必要です。この際に、Hardwareを要求される場合もあるので、かなりハードルが高いです。 もし、公開する際でも、プロトタイプで十分検証してから開発に取り掛かるべきです。 そのためのツールとして Blynkは最高です。 - 赤外線信号の解析、実装の「IRremoteESP8266」ライブラリ ライブラリを組み込んで、サンプルプログラムをちょこっと手直しするだけですぐ使えます。 また、サンプルプログラムも無駄に長くなく理解しやすいです。 - PlatformIO+VSCode ライブラリ管理が簡単で、プロジェクト毎のローカルに入れることが出来る。 また、インテリセンスの補完も効いて使いやすい。 VSCodeも使いやすく MicroSoftでもやれば出来るじゃないと思いました。 (偏見がだいぶ入っていますが) # 今後の方針 一応基本は出来上がったので、これからやりたいことを列挙してみます。 - スタンド下部のケーシング - 概要にも書きましたが、プレゼントでいただいたLeafonyでのESP32代替え 最初からLeafonyでやりたかったのですが、焼いてしまったら大変なので・・・・ - iPhoneの加速度計を利用してジェスチャーによるコントロール - 音声コマンドによるコントロール 「おい起きろ!」という事により点灯するのも面白い - iBeaconを利用して近づいたら点灯 但し、BlynkにiBeaconのウィジェットはあるのかな? - ハンドメードマーケットへの出品 既に色々とハンドメードマーケットに出品しているのですが、 elchikaの投稿を見るようなマニアック(褒め言葉です)な人たち以外の、おじいさん、おばあさんには通常のリモコンのほうが使いやすい。また、一般ユーザーに取扱説明書を書くのを考えるだけで憂鬱です。 そのためには 赤外リモコンリピーターがいいと思うのですが、コストを考えてCPU無しで実装してみたいと考えています。 # 最後に 出来上がったプロジェクトをこういう具合に投稿するのは、自分のまとめにもなっていいですね。 「elchika」さんには、これから「Leafony」の投稿が集まってくると思いますが、皆さんどんどん投稿してください。