LoginSignup
0
0

More than 1 year has passed since last update.

M5Stackにせっかく赤外線がついているんだから、互いに送受信し合おう

Last updated at Posted at 2022-03-22

M5Stackには、WiFiやBluetoothがついているので、無線でやりとりすることができます。
ですが、通信するためのHTTPの実装やら、BLEの実装やらで、面倒です。
慣れてしまえばよいのですが、メモリもたくさん食うし、ちょっとしたデータの交換だけの場合は大げさに見えてきます。

一方で、たくさんあるM5Stackモジュールには、意外と赤外線送信機がついているものです。
ちょっと挙げただけでも、M5StickC、M5StickC Plus、M5Atom Matrix、M5Atom Lite、M5Echoなど。
一方で、赤外受信機は、あまりついていないですが、M5Unitとして赤外線送受信ユニットがあります。

ということで、今回は、お手軽に赤外線で送受信してデータを交換してみます。

ちなみに、最近技術書を書きまして、それの拡張として実装しましたので、それも説明します。こちらもぜひ見てみてください!実装が非常に楽になります!

M5StackとJavascriptではじめるIoTデバイス制御

利用するライブラリ

利用するのは、「IRremoteESP8266」です。PlatformIOのLibraryで検索に引っ掛かります。
platformio.iniに以下を追加するのでもよいです。

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);

以上

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0