本記事について
この記事は M5Stack Advent Calendar 2023 の14日目の記事です。
ATOM Mate for toio についている距離センサを利用して、障害物を回避するロボットを作りました。本記事ではこの作品における M5AtomS3 の実装について紹介します。
前提
以下については別記事を参照ください。
- Bluetooth 関連単語
- 距離センサの値の取得方法
ATOM Mate for toio とは
toio™ コア キューブと連携するために作られた M5ATOM 用拡張ベースです。
バッテリーと距離検出センサ (VL53L0X) が搭載されています。
システム構成
M5AtomS3(Peripheral) <-> Unity(Central) <-> toio(Peripheral)
M5AtomS3 と toio は直接通信していません。
M5AtomS3 の役割は 顔の表示と距離センサの値の取得・送信であり、それを使ってどう動くかは Unity で制御しています。
本記事では Unity 側の実装については触れません。
以下が M5AtomS3 のプロジェクトです。
この役割・機能は本作品の「ランダム移動」「障害物回避」に特化していない汎用的なものです。
そのため別の作品にそのまま使うことも可能ではあると思います。
通信仕様
Unity と M5AtomS3 の通信は Bluetooth Low Energy (BLE) を使っています。
以下のように独自で設計しました。
距離センサー
プロパティ | 値 | 補足 |
---|---|---|
Characteristic UUID | 29C2D1B2-944A-4FBA-AFCD-133E09532556 |
独自UUID |
Properties | Read, Notify |
Notify の頻度は 100ms ごとで決めうちしました。
距離センサー情報
データ位置 | データ型 | 内容 |
---|---|---|
0 | UInt16 | 距離 (mm) |
Avatar
m5stack-avatar の表情を変更
プロパティ | 値 | 補足 |
---|---|---|
Characteristic UUID | 29C2D1B2-944A-4FBA-AFCD-133E09532557 |
独自UUID |
Properties | Read, Write | Read ついてますが使っていません |
表情書き込み
データ位置 | データ型 | 内容 | 例 |
---|---|---|---|
0 | UInt8 | 表情ID | 0x00 (Happy) |
ID は enum で定義された値をそのまま使っています
通信仕様の改善点
今回の作品では十分でしたが以下のようにすると良くなりそうだと思っています
- 距離センサの Notify の頻度を可変にする
- 現状だと Avatar の表情以外を変更しづらいため、データ位置の最初はデータの種類 (表情、口の開ける度合い、目の開ける度合いなど) を表すようにしたほうが良かったかもしれません。
- Avatar の表情を変更するときに、時間のパラメータを追加しても良さそうです.(0なら無期限)
接続、非接続時の動作変更制御
FSM で実装しています。
enum class State
{
Start,
Ready,
Idle,
};
class BaseStateBehavior
{
public:
virtual void onEnter() {}
virtual void onUpdate() {}
virtual void onExit() {}
};
接続してない時は Ready で、接続したら Idle になります。(動いてるのに Idle はいかがなものかとは思いましたが他の名前思いつきませんでした。)
再 Advertise が非常にわかりやすく書けたのが良かったかなと思っています。
class ReadyStateBehavior : public BaseStateBehavior
{
public:
void onEnter() override
{
BLEDevice::startAdvertising();
}
void onUpdate() override
{
if (ble.isConnected())
{
setNextState(State::Idle);
}
}
void onExit() override
{
BLEDevice::stopAdvertising();
}
};
おわりに
ATOM Mate for toio で障害物回避をすることは非常に王道な使い方だと思います。
しかし、UIFlow で開発されている場合がほとんどなようです。GitHub Code Search で検索しても ATOM Mate for toio を使っているプロジェクトは1件しか見つかりませんでした。
非常に面白くて魅力的な製品だと思うためもっと流行って欲しいと思っています!
本記事が ATOM Mate for toio を使う上での参考になれば幸いです!