はじめに
子供たちのプログラミング学習でMicro:bitが利用されていて、ボード単品の動作で楽しむ以外に学習用のマシンとしてライントレーサーなども販売されています。Micro:bitの取り扱いに慣れた子供たちがこういったマシンをNode-RED MCUで使ってみる機会を設けようと思い立ち、Seeed StudioのXIAO_ESP32C3を使用してMicro:bitと端子互換のMCUボードを手作りしてみました。ライントレーサーの動作をDashboard経由でコントロールすることもできました。
材料
主要な部品は以下の通りですが、ターゲットとする用途や部品入手性で調整します。
・SeeedStudio XIAO ESP32C3
・micro:bitユニバーサル基板 (秋月電子)
・タクトスイッチ 2個
・LiPoバッテリー (ボード単品動作の場合に使用)
・スライドスイッチ (LiPoバッテリー切り替え用)
・その他、(CR類、ピンヘッダやコネクタなど)
XIAO ESP32C3はLiPoバッテリーの充電回路が内蔵されていて、モジュール裏のバッテリー専用端子(BAT +,-)に小型のLiPoバッテリーを接続するとUSBから給電したときにバッテリーに充電してくれます。ボード単品動作の時はこの機能が便利です。今回のボードでもLiPoバッテリーを接続し、スライドスイッチでON/OFFできるようにしています。また、3.3Vを外部から給電することもできますが、オプションとしています。
ターゲットマシンの制御ポート
今回のMCUボードで動作させるターゲットは、前述のスイッチサイエンス社から販売されているライントレーサにします。以下のピンが割り当てられています。
・右モーター 速度制御(PWM) : P13
・右モーター 回転方向(Digital) : P14
・左モーター 速度制御(PWM) : P15
・左モーター 回転方向(Digital) : P16
・右センサー 反射型 (Analog) : P0
・左モーター 反射型 (Analog) : P1
・右オプション端子 : P2
・左オプション端子 : P8
また、Micro:bitのボード内部でもアサインされているポートがあります。
・ボタンA : P5
・ボタンB : P11
・I2C ポート(SCL,SDA) : P19(SCL), P20(SDA)
MCUへのポートの割り付け
今回使用するXIAO ESP32C3の詳細な情報はSeeedStudioのwikiにあります。
ポート数が限られているので、どのポートに何を接続するかよく検討します。
Seeed K.K. エンジニアブログにもポート割り付けに関する注意点の記事があります。
この情報を元に、問題が起きない使い方になるよう割り付けます。
・D9(GPIO9)はBootボタンと接続されプルアップされている→スイッチ入力に使用。
・D6(GPIO21)は起動時にUART出力に設定される→LED出力に使用。
・D8(GPIO8)はBootstrapで参照されるのでプルアップ必要→スイッチ入力に使用。
すべてのポートを割り付けるにはポート数が不足しています。今回は今後I2Cセンサを搭載することを考慮してD4(GPIO6),D5(GPIO7)をMicro:bitのI2Cにアサインし、左右のオプション端子を割り付けなしとしておきます。
Micro:bit V2 の端子のピンアサインはWeb上に資料がありました。この情報を元に結線していきます。各ポートの配線は図のようにしました。
モジュール単体動作用の3.3Vをコネクタを介して外部にも給電する場合は、ジャンパー対応で給電できるようにしておきます。
バッテリーの接続
ESP32C3モジュールの裏側にあるBAT端子にLiPoバッテリーを接続します。バッテリー給電をON/OFFするためにスライドスイッチを介して接続しておきます。
システム構成
全体の構成は次の通りです。Raspberry Piでサーバを用意し、WiFiアクセスポイントとして使えるようにしてあります。このサーバ上のNode-REDでMQTT Brokerを動かしてライントレーサに搭載したMCUボードと通信を行います。また、Dashboardでコントロール画面を作成しておき、スマートフォンでアクセスして操作できるようにします。
コントロールコマンド
MQTTを使用してライントレーサのデバイスとRaspberry Piのサーバ間でコマンドをやり取りしますが、操作インターフェースと、そのコマンドを決めます。
操作インターフェース
・前進(ボタン) :モーターの回転方向を正方向で起動します。
・停止(ボタン) :現在のモーターのPWM値を保持した上で0にします。
・後退(ボタン) :モーターの回転方向を逆回転で起動します。
・速度(スライダー):モーター駆動のPWM値をUp/Downします。
・方向(スライダー):左右のモーターのPWM値のバランスを変更します。
コマンド
{
"motor": { → motor オブジェクト
"right": { → 右モーター
"pwm": 0.35, → 速度(0.0~1.0)
"dir": 1 → 方向(0/1)
},
"left": { → 左モーター
"pwm": 0.35, → 速度(0.0~1.0)
"dir": 1 → 方向(0/1)
}
}
}
制御フロー
MCUボードのESP32C3に書き込む「デバイス用フロー」と、Raspberry Pi サーバ上のNode-REDで動かす「サーバ用フロー」の2種類を用意します。
・デバイス用フロー
・サーバ用フロー
サーバ用フローの中のfunctionノードで、ダッシュボードの操作に応じたモーター駆動コマンドを作成してMQTTサーバでMCUボードに送信しています。
さいごに
とりあえず互換ボードとしてライントレーサーは動かすことができましたが、今後はI2Cで接続できるセンサを搭載したり拡張版も試してみたいと思います。
オリジナルのMicro:bitも子供たちはたいへん楽しく取り組んでいますので、どちらが良いという話ではなく、選択肢としていろいろ試せる環境を提供できれば良いなと思います。
Node-REDではソフトウェアモジュールの連携を意識したメッセージ駆動型のプログラミングが視覚的に組み立てられる事と、今回のサーバー用フローでも使用したようにfunctionノードでガッツリとテキストベースのプログラミングもできますので、良いプログラミング体験ができる環境だと思っています。








