たっち&びーぷとATOM LiteでLチカ💡
iPad/iPhoneアプリ『たっち&びーぷ Connect』のBLEコネクトセンターを使ってみよう!のシリーズ、ATOM Lite編です。
今回の目標は「iPadの画面をタッチして無線接続したATOM LiteのLEDが点灯させる」です。
検証環境
動作検証の環境は以下の通り。
- PC: Windowsのパソコン(Windows11)
- 開発用ソフト: Arduino IDE 2.3.7
- BLEデバイス: ATOM Lite
作業の全体像
Arduinoが初めて・・・という方にはややハードルが高いかもしれません。
概要としては以下のような流れです。
- Arduino IDEのインストール
- ボードマネージャーのインストール
- ライブラリのインストール
- プログラムの編集
- デバイスを接続してプログラムを流し込む
Arduino IDEのインストール
以下のページからインストールしてください。
ボードマネージャーのインストール
Atom Liteの公式ドキュメントに沿って作業を進めます。
以下のページの、「2.開発ボードの選択」まで行なってください。
M5StackのボードマネージャーをインストールできればOKです。
ライブラリのインスール
今回のプログラムでは3つのライブラリが必要となります。
- M5Atom by M5Stack
- FastLED by Daniel Garcia
- NimBLE-Arduino byh2zero
Arduino環境の場合、FastLEDはM5Atomと一緒にインストールされます。
そのため、作業が必要なのは2つだけ。
まずはM5Atom。
インストールのボタンをクリックしたら、次に出てくる画面で「全てインストール」をクリックしてください。
これで上述の2番目、FastLEDも一緒にインストールされるはずです。
次にNimBLE-Arduino。
これでライブラリのインストールは完了です。
プログラムの編集
以下、サンプルのプログラムです。
#include <M5Atom.h>
#include <NimBLEDevice.h>
// 説明を簡単にするため、固定 UUID を使用しています。
// 実際のアプリケーションでは、独自に生成した UUID を使用してください。
#define SERVICE_UUID "12345678-1234-5678-1234-56789abcdef0"
#define CHARACTERISTIC_UUID "12345678-1234-5678-1234-56789abcdef1"
bool isConnected = false;
class BleServerCallbacks : public NimBLEServerCallbacks
{
void onConnect(NimBLEServer *pServer, NimBLEConnInfo &connInfo)
{
isConnected = true;
Serial.printf("Client connected: %s\n", connInfo.getAddress().toString().c_str());
M5.dis.drawpix(0, CRGB::Blue); // 接続時に青色に点灯
}
void onDisconnect(NimBLEServer *pServer, NimBLEConnInfo &connInfo, int reason)
{
isConnected = false;
Serial.println("Client disconnected, restarting advertising");
NimBLEDevice::getAdvertising()->start();
}
};
class LEDCallback : public NimBLECharacteristicCallbacks
{
void onWrite(NimBLECharacteristic *pChar, NimBLEConnInfo &connInfo) override
{
std::string value = pChar->getValue();
if (value.length() > 0)
{
uint8_t cmd = value[0];
Serial.printf("Received: %d\n", cmd);
// ここで指定したコマンドをアプリ『たっち&びーぷ Connect』側で指定(Hexモード)
if (cmd == 0x01) // 01というコマンドを受信した場合
{
M5.dis.drawpix(0, CRGB::Red); // 赤く点灯
}
else // その他のコマンドを受信した場合
{
M5.dis.clear(); // 消灯
}
}
}
};
void setup()
{
Serial.begin(115200);
M5.begin(true, false, true);
M5.dis.clear();
// ここでデバイス名を指定します。任意です。
// アプリ『たっち&びーぷ Connect』側からはこの名称で検索できます。
NimBLEDevice::init("AtomLite-LED");
NimBLEServer *pServer = NimBLEDevice::createServer();
pServer->setCallbacks(new BleServerCallbacks());
NimBLEService *pService = pServer->createService(SERVICE_UUID);
NimBLECharacteristic *pCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID,
NIMBLE_PROPERTY::WRITE | NIMBLE_PROPERTY::WRITE_NR);
pCharacteristic->setCallbacks(new LEDCallback());
pService->start();
NimBLEAdvertising *pAdvertising = NimBLEDevice::getAdvertising();
pAdvertising->addServiceUUID(SERVICE_UUID);
pAdvertising->start();
Serial.println("Advertising started");
}
void loop()
{
if (!isConnected)
{
// 接続待機中は緑点滅
uint32_t now = millis();
if (now % 1000 < 500)
{
M5.dis.drawpix(0, CRGB::Green);
}
else
{
M5.dis.clear();
}
}
M5.update();
}
詳しくはコード内のコメントをご確認ください。
- UUIDやデバイス名は任意のものに変えてください。趣味・実験用途でしたらこのままでも差し支えないと思います。
- 途中の if (cmd == 0x01) の部分が大事です。「0x」の後の数字がアプリ側から送信されるコマンドとなります。
- 詳しく知りたい方は生成AIに聞いてください!
ここまでできたら、Arduino IDEの画面左上のチェックマークのボタンを押して、「検証」してみましょう。
デバイスを接続してプログラムを流し込む
デバイス(ATOM Lite)をパソコンをUSBケーブルで接続し、プログラムを送ります。
ポートを選択してアップロード、という流れです。
困った時は公式ページの情報を参考にしましょう。
USBドライバのことなどが書かれていますが、私の環境ではこれといった特別な操作は必要なく、接続したらすぐにアップロードできました。
たっち&びーぷ Connectと接続して動作確認
ここからは別記事たっち&びーぷとmicro:bitでLチカ💡と同じ流れです。
周辺のデバイスのスキャンする
『たっち&びーぷ Connect』を開き、[Connect]セクションの外部デバイス設定を開きます。
[その他のBLEデバイスに接続] - [周辺のデバイスを探す] と操作していくと、近くにあるBLEデバイスの一覧が表示されます。
AtomLite-LED という名称(Arduinoのプログラム内で指定した名称)のデバイスを探してください。
接続してサービス/キャラクタリスティックを選択する
デバイス名をタップして接続が成功すると、次の画面に遷移します。
Arduinoのプログラム内で指定した SERVICE_UUID と CHARACTERISTIC_UUID が記されているはず。
[Select]ボタンをタップしてください。
送信するコマンドを設定する
ATOM Liteに送信するコマンドを編集します。
設定内容は以下の通りです。
Aコマンド
// Hexモード
01
// 1 でもOK
// Arduinoのプログラムで指定したコマンド
Bコマンド
// Hexモード
00
// 今回は01以外ならなんでもOK
TextからHexに切り替えるのをお忘れなく!
おまけ
Windowsで動作確認しましたが、Macでも大丈夫です!
私は
- Mac
- VSCode + PlatformIO(Arduino IDEの代わり)
という環境を使っています。
PlatformIOの方がビルド時間が短いのが嬉しいですね。
Web関係の開発に使っているVSCodeを使えるというのもポイントとして大きいです。
ただ、Arduinoに比べるとVSCodeそのものの知識が必要だったりするので、初心者にはお勧めできません。
Arduino環境では気にしなくてよかったFastLEDのライブラリは手動で追加する必要があるなど、細かなトラップがあります。
自力で解決できるよ〜という方は既に使っているかもしれませんが、試したことがなければ是非。
ビルド時間はけっこう差があると思います。