はじめに
今回は、WioBG770AでEnOceanの受信を試してみたいと思います。
EnOceanは電池レスで動作するセンサが豊富で、IoT用途にとても相性が良い無線規格です。WioBG770Aと組み合わせることで、省電力なセンシングデータをクラウドへ送信する構成が期待できます。
今回のゴール
- WioBG770AでEnOceanのデータが受信できることを確認
使用したもの
- Wio BG770A
- EnOceanセンサ(開閉センサなど)
- EnOceanユニット(TCM410J搭載)
接続方法
WioBG770AのUARTのポートに、EnOceanを接続します。
注意事項
EnOceanユニット(TCM410J)は本来5V電源での動作が想定されています。
今回はWioBG770AのGrove(3.3V)で動作させていますが、これは仕様外のため動作保証はありません。環境や個体差によっては正常に動作しない可能性があります。
サンプルコード
まずは受信データをそのままシリアル出力させます。
#include <Arduino.h>
#include <Adafruit_TinyUSB.h>
#include <WioCellular.h>
// EnOcean モジュール(TCM410J)との UART 通信設定
#define ENOCEAN_SERIAL Serial1 // Grove UART は Serial1 に接続
#define ENOCEAN_BAUD 57600 // TCM410J の固定ボーレート
// 受信バイト間のギャップがこの時間(ms)を超えたら1パケット終端とみなす
#define PACKET_TIMEOUT_MS 20
void setup() {
// USB CDC シリアルモニター初期化(最大3秒待機)
Serial.begin(115200);
while (!Serial && millis() < 3000) {}
Serial.println("=== EnOcean Receiver (Wio BG770A + TCM410J) ===");
// Grove コネクタへの電源供給を有効化
WioCellular.begin();
WioCellular.enableGrovePower();
delay(100); // 電源安定待ち
// EnOcean モジュールとの UART 通信開始
ENOCEAN_SERIAL.begin(ENOCEAN_BAUD);
Serial.println("Waiting for EnOcean data...");
Serial.println();
}
void loop() {
static uint32_t lastByteAt = 0; // 最後にバイトを受信した時刻
static bool receiving = false;
// 受信バッファにデータがある間、1バイトずつ16進数で出力
while (ENOCEAN_SERIAL.available()) {
uint8_t b = (uint8_t)ENOCEAN_SERIAL.read();
if (b < 0x10) Serial.print('0'); // ゼロパディング(例: 0x05 → "05")
Serial.print(b, HEX);
Serial.print(' ');
lastByteAt = millis();
receiving = true;
}
// 一定時間バイトが来なければパケット終端と判断して改行
if (receiving && millis() - lastByteAt > PACKET_TIMEOUT_MS) {
Serial.println();
receiving = false;
}
}
サンプルコードはGithubで公開しています。
実際の動作確認
先頭の 0x55 はEnOceanの同期バイト(Sync Byte)です。
このデータが確認できれば、EnOceanフレームの受信ができています。
まとめ
WioBG770AとEnOceanユニットを使って、EnOceanのデータが受信できることが確認できました。
次回
次は実際にEnOceanセンサのデータを受信してみて、データの中身を見ながら、センサ値(温度や開閉など)を取り出してみたいと思います。また、WioBG770Aを使っているので、SORACOMに送ってクラウド連携も試してみる予定です。
その他の参考リンク

