3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ATOM Mate for toio を使って障害物回避するときの M5AtomS3 の実装

Last updated at Posted at 2023-12-13

本記事について

この記事は 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 のプロジェクトです。

この役割・機能は本作品の「ランダム移動」「障害物回避」に特化していない汎用的なものです。
そのため別の作品にそのまま使うことも可能ではあると思います。

通信仕様

BLE.cpp

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 で定義された値をそのまま使っています

m5stack-avatar Expression

通信仕様の改善点

今回の作品では十分でしたが以下のようにすると良くなりそうだと思っています

  • 距離センサの Notify の頻度を可変にする
  • 現状だと Avatar の表情以外を変更しづらいため、データ位置の最初はデータの種類 (表情、口の開ける度合い、目の開ける度合いなど) を表すようにしたほうが良かったかもしれません。
  • Avatar の表情を変更するときに、時間のパラメータを追加しても良さそうです.(0なら無期限)

接続、非接続時の動作変更制御

FSM で実装しています。

main.cpp

.cpp
enum class State
{
    Start,
    Ready,
    Idle,
};

class BaseStateBehavior
{
public:
    virtual void onEnter() {}
    virtual void onUpdate() {}
    virtual void onExit() {}
};

接続してない時は Ready で、接続したら Idle になります。(動いてるのに Idle はいかがなものかとは思いましたが他の名前思いつきませんでした。)

再 Advertise が非常にわかりやすく書けたのが良かったかなと思っています。

.cpp
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 を使う上での参考になれば幸いです!

3
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
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?