M5Stackには、WiFiやBluetoothがついているので、無線でやりとりすることができます。
ですが、通信するためのHTTPの実装やら、BLEの実装やらで、面倒です。
慣れてしまえばよいのですが、メモリもたくさん食うし、ちょっとしたデータの交換だけの場合は大げさに見えてきます。
一方で、たくさんあるM5Stackモジュールには、意外と赤外線送信機がついているものです。
ちょっと挙げただけでも、M5StickC、M5StickC Plus、M5Atom Matrix、M5Atom Lite、M5Echoなど。
一方で、赤外受信機は、あまりついていないですが、M5Unitとして赤外線送受信ユニットがあります。
ということで、今回は、お手軽に赤外線で送受信してデータを交換してみます。
ちなみに、最近技術書を書きまして、それの拡張として実装しましたので、それも説明します。こちらもぜひ見てみてください!実装が非常に楽になります!
M5StackとJavascriptではじめるIoTデバイス制御
利用するライブラリ
利用するのは、「IRremoteESP8266」です。PlatformIOのLibraryで検索に引っ掛かります。
platformio.iniに以下を追加するのでもよいです。
lib_deps =
crankyoldgit/IRremoteESP8266@^2.8.2
送信側
宣言
#include <IRsend.h>
static IRsend *g_irsend = NULL;
初期化
pinに赤外線送信端子があるPIN番号を指定します。
g_irsend = new IRsend(pin);
g_irsend->begin();
送信
g_irsend->sendNEC(data, 32, repeat);
上記は、NEC方式の送信で、送信データは任意の32ビット長の値です。ほんとは64ビットも大丈夫なのですが、簡略化のため32ビットで。
repeatには、再送回数を指定します。まあ、間に障害物がなければ、0回でも大丈夫でしょう。
受信側
宣言
#include <IRrecv.h>
static IRrecv *g_irrecv = NULL;
static decode_results results;
初期化
pinに赤外線受信端子があるPIN番号を指定します。
g_irrecv = new IRrecv(pin, kRawBuf, kTimeoutMs, true);
受信待ち開始
g_irrecv->enableIRIn();
g_irrecv->resume();
受信チェック
uint32_t checkRecv(void){
if( g_irrecv->decode(&results) ){
g_irrecv->resume();
if( results.decode_type != NEC_LIKE )
return 0;
return results.value;
}
return 0;
}
上記関数は、0以外が返ってきたら、それが受信データという仕様です。簡略化のため、NEC方式しか受け付けません。
これだけで、32ビット(4バイト長)のデータを送り合いっこができます。
Javascriptで実装
以下の技術書で紹介している、ESP32内部で動作するJavascript環境で動作させる場合のJavascriptコード例です。
M5StackとJavascriptではじめるIoTデバイス制御
以下のコードを、サンプルWebページから、それぞれのM5Stackモジュールにダウンロードするだけです。
まずは、送信側。PIN番号9に、赤外線送信端子がついている想定です。
import * as ir from "Ir";
import * as input from "Input";
ir.sendBegin(9);
console.log("setup finished");
setInterval( () =>{
esp32.update();
if( input.wasPressed(input.BUTTON_A) ){
console.log('ir.send');
ir.send(12345678);
}
}, 1);
次は受信側。PIN番号32に、赤外線受信端子がついている想定です。
import * as ir from "Ir";
ir.recvBegin(32);
ir.recvStart();
setInterval(() =>{
var data = ir.checkRecv();
if( data ){
console.log('ir.received: ' + data );
}
}, 1);
以上