HakoHiroのアイコン画像

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

HakoHiro 2020年06月25日に作成  (2020年06月25日に更新)

概要

自作ステンドグラススタンドの照明に LEDを埋め込みます。
IRリモコンで発光色、発光パターンを変えられる T10 LEDルームランプを使用します。
ランプ自体に赤外線受光器、コントローラが組み込まれていて、スタンドの中に設置するとリモコンが届きにくいことがあるので、スマホ(iPhone)からESP32のBLE経由でランプの受光部近傍に設置した赤外LEDでリモートコントロールします。
これで夜間隣の部屋へ行く時、メイン照明スイッチを探さなくて良くなります。また、ディスプレイとしても面白いです。

先々は、elchikaキャンペーンでプレゼントしていただいた「Leafony」に代替えしようと思っています。
なお、製作にあたって、elchika運営さんの「M5StickCでスマホから操作できる家電リモコンを作る」が非常に参考になりました。

※長文ですのでお時間のある時に御覧ください。

概略図

ステンドグラススタンド

錫で色ガラスを固定したステンドグラスです。製作方法等は 電子工作とは関連がないので外観の紹介に留めます。
サイズ:断面正三角形 Width 100mm Hight 170mm 重量:約700 g
こちらの面には和紙を貼っています
ステンドグラスの面
上面
点灯例

部品構成

  • ESP32 DevKit C 秋月電子通商

  • T10 フルカラーLEDルームランプ 秋月電子通商 200円/1個
    秋月電子通商HPの画像

    • メーカーカテゴリ SANYOU LIGHTINGS TECHNOLOGY CO.,LTD
      自由に色を変えられるT10ウェッジ球LEDです。本体に赤外線受光部があり専用のリモコンで操作します。電源を切っても点灯の色やパターンは保持されますのでガラスケースやショーウインドーの演出にも最適です。(秋月電子通商HPより抜粋)

    • 主な仕様
      ・ソケット:T10
      ・電源:DC9~16V

  • T10 フルカラーLEDルームランプ リモコン付 秋月電子通商 600円(リモコンフォーマット解析用として)
    秋月電子通商HPの画像
    パッケージに上記のT10が2個、リモコンが1個入っています

  • 赤外線受光器、 赤外LED: アマゾン(受光器はリモコンフォーマット解析用)
    KeeYees VS1838B HX1838 1838 赤外線センサー リモコン 受光部 受信機 赤外線受光モジュール 25個入り + 5mm 赤外線LED 940nm 高輝度 25個入り 850円
    アマゾンHP画像より

秋月電子通商さんでも良いのですが、アマゾンプライム会員なので、輸送費を考えてこちらにしました。
25個×2も入っているので、一生使えそうです。なお、全く問題なく使えました。

SoftWare

Blynk

iPhoneのBLEコントロール用に使用 簡単に、無料枠でIoTを実現できます。
※非常に良くできたSoftです。外部接続のプロトタイピングSoftとして最強だと思います。
出来上がった外観もなかなかです。

具体例、使い方は、elchika運営さんの「M5StickCでスマホから操作できる家電リモコンを作る」を参照してください。

PlatformIO+VSCode

ESP32の開発用:こちらも elchikaに記載が沢山あります。
慣れてきたせいもあり、使い心地最高!! お薦めです。
なお、上記のBlynkも PlatformIO+VSCodeから利用しています。

前準備

IRリモコンボタン構成

秋月電子通商HPの画像より
この内、PowerOn/PowerOff/ Light Up/ Light Down
R/G/B/W/ Flash/ Strobe / Fade/ Smooth
のコマンドを実装する。

IRリモコンのフォーマット解析

上記コマンドを実装するために、リモコンのフォーマット解析をします。
これについても 上記記事が参考になりますが、それと異なる所のみ記載します。

H/W

ESP32に接続

フォーマット解析

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 = ・・・・・ とすると、
そのライブラリがプロジェクトに読み込まれます
キャプションを入力できます

  • 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プロトコル
    キャプションを入力できます

    ※ ノイズフィルターは全く必要有りませんでした。

IRリモコン IR送信

H/W

赤外線LEDのアノード側に制限抵抗47Ωを接続そして、ESP32 GPIO4に接続
カソード側は ESP32 GNDに接続

送信テスト

上記フォーマット解析と同様 PlatformIO.ini に lib_deps = IRremoteESP8266 を記載
展開されたexamples の IRSendDemo.ino をベースに修正
(NECプロトコルに対応)

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の画面
PowerOn/Off ボタン LightUp/Downボタン
Menu選択 (画面はGreenを選択途中)

ESP32 ソースコード

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動画
ところでYoutubeの動画が、リンクだけでインラインで画面を表示するにはどうすればよいのですかね?

感想

  • T10 フルカラーLEDルームランプ
    これだけの機能を盛り込んだLEDが 200円!!
    照度もかなりありすぐれものです。
    自作の回路で100Vを引き回したくないので、DC 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」の投稿が集まってくると思いますが、皆さんどんどん投稿してください。

1
2
2
2
HakoHiroのアイコン画像
函館在住のOldエンジニアです。マイコンは Z80ワンボードの頃から使っています。なにせあの頃は、ハンドアセンブルでプログラム作成していました。(ニーモニックを手書きで書き、それを表を見ながら機械語コードに落とします)おかげで リターンコード(RTN=0xC9)はいまだに覚えています。RTNまで来るとサブルーチンが一段落でホッとするので・・・ 現在は、電子工作の他に錫で色々作って楽しんでいます。
HakoHiro さんが 2020/06/25 に 編集 をしました。 (メッセージ: 初版)
HakoHiro さんが 2020/06/25 に 編集 をしました。 (メッセージ: 写真変更)
ログインしてコメントを投稿する