2026年4月29日水曜日

nRF52840でUART BLE変換アダプタ

 先日入手したSeeed Studio XIAO nRF52840を使ってUARTをBLEで飛ばせないかどうか試してみた。FNIRSI DMC-100のリアルタイム計測データとか飛ばせたら便利かなぁと言うことで。

どうやらbluefruitライブラリを使うとNordic UART ServiceのUUIDとかがそのまま使えるっぽいので結構簡単にUARTをBLEに変換できそう。DMC-100は1パケット13バイトなのでBLEの1パケットにも収まりそうだし。

#include <bluefruit.h>

BLEUart bleuart;

void setup() {
  Serial1.begin(9600);

  Bluefruit.begin();
  Bluefruit.setTxPower(4);
  Bluefruit.setName("DMC100-BLE");

  bleuart.begin();
  startAdv();
}

void startAdv(void) {
  Bluefruit.Advertising.addFlags(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE);
  Bluefruit.Advertising.addTxPower();
  Bluefruit.Advertising.addService(bleuart);
  Bluefruit.ScanResponse.addName();

  Bluefruit.Advertising.restartOnDisconnect(true);
  Bluefruit.Advertising.setInterval(32, 244);
  Bluefruit.Advertising.setFastTimeout(30); 
  Bluefruit.Advertising.start(0);
}

void loop() {
  if (!Bluefruit.connected()) {
    return;
  }
  if (Serial1.available() >= 2) {
    if (Serial1.peek() == 0x5A) {
      Serial1.read();  // 0x5A

      if (Serial1.peek() == 0xA5) {
        Serial1.read();  // 0xA5

        uint8_t buffer[13];
        buffer[0] = 0x5A;
        buffer[1] = 0xA5;

        Serial1.readBytes(&buffer[2], 11);

        bleuart.write(buffer, 13);
      }
    } else {
      Serial1.read();
    }
  }
}

とりあえずDMC-100のヘッダを確認するぐらいでそのまま13バイトを送るようにしてみた。データのデコードはPC側でやる形に。

とりあえずGNDとUARTのRXをDMC-100に繋いでPCから給電してテスト。
この前のPythonツールをbleakライブラリを使ってBLE対応にしただけ。

13バイト6Hzぐらいのデータだったら問題なくBLEでも取れてそう。発熱も全く無いのでこれなら内蔵してしまっても良さそうだな…

内蔵したときに内部のソフトを書き換えるのが面倒かもという理由で今回データを直接送ってみたけど、他社品とかのアプリがそのまま使えるようなスケッチにすればスマホからも簡単に使えたりするかな…

とりあえずFNIRSI DMC-100を簡単にBLE対応にできてしまった。受信側のツールをもう少し作り込まないとだめかな。グラフとか欲しいし。

0 件のコメント:

コメントを投稿