お知らせ:この記事はJLCPCBの提供でお送りしています。

みなさんこんにちは。キューブ型ロボットトイ”toio”で作る台車ロボットの製作記、第2回です。今回は試しにESP32-S3からtoioを制御する話です。

ESP32-S3でとりあえず実験してみる

前回書いたように、このミニ台車ロボットでは制御用マイコンとしてESP32-S3を採用することにしました。ある程度勝手のわかっているESP32シリーズとはいえ、S3を使うのは今回が初めてということで、台車ロボット用の基板を起こす前に、とりあえず市販のESP32-S3を使った基板で試しにtoioを制御してみることにしました。

今回はスイッチサイエンスから2月に発売されたばかりの”ESPr® Developer S3 Type-C (USBシリアル変換ICなし)“を使うことにしました。ESP32(無印)と異なり、ESP32-S3はUSBでのファームウェア書き込み機能を持っているので、基板上に別途ファームウェア書き込み用のUSB-UART変換ICを配置する必要がありません。そのため、この基板はかなりすっきりとした見た目になっています。

toioのモーターをBLE経由で制御する

toio1には位置読み取りセンサーやモーションセンサー、ランプなど、様々な入出力デバイスが内蔵されていますが、今回はお試しでまずはモーターを制御することにしました。toioに内蔵されているその他の入出力デバイスも、同様に制御できるはずです。

toio™コア キューブ 技術仕様」のページにある通り、toioはBluetooth Low Energy (BLE)によってスマートフォンなどのデバイスと通信します。BLEの規格では、スマートフォンのような「親機」となるデバイスを”Central”、「子機」となるデバイスを”Peripheral”と呼びます。ESP32-S3にはCentralとPeripheralのどちらも実装することができますが、今回通信相手となるtoioはPeripheralなのでESP32-S3はCentralとして動かすことになります。toioのモーターを動かすまでのCentral(ESP32-S3)とPeripheral(toio)の間の通信の流れを簡単に図示したものが以下となります。

(1)アドバタイズパケットの送信

まず最初に、Peripheralは自分自身の情報を含んだアドバタイズパケットと呼ばれるパケットを周囲にブロードキャストします。アドバタイズパケットには自分自身のアドレスや、そのPeripheralが提供する機能の種別を表すService UUID2と呼ばれるIDなどが含まれます。

(2)接続実行/(3)接続確立

Centralは、接続先のデバイスを検出するため、アドバタイズパケットを送信しているデバイスがないかスキャンを行います。スキャン中にアドバタイズパケットを受信し、そこに含まれるService UUIDなどの情報からアドバタイズパケットを送信してきたPeripheralが通信したい相手であると判断した場合、CentralとPeripheralの間の接続を確立する処理を行います。

(4)Characteristic一覧の要求/(5)Characteristic一覧の送信

ここまででCentralが受け取ったアドバタイズパケットには、Peripheralが提供する機能の種類を示すService UUIDが含まれていました。しかし、Peripheralを制御するためにはService UUIDに加えてそのデバイスが提供しているCharacteristicと呼ばれるデータを読み書きするための通信ポートの詳細を把握する必要があります。そのため、CentralはPeripheralに接続した後、Peripheralが持つCharacteristicの一覧を要求し、Peripheralが所望のCharacteristicを持っているかどうかを確認します。

なお、toioの場合、モーションセンサーやボタン、バッテリー、モーターなど、内蔵されているそれぞれのデバイスに1つずつCharacteristicが割り当てられています。具体的には、モーターの場合は”10B20102-5B3B-4571-9508-CF3EFCD7BBAE”というUUIDを持つCharacteristicが割り当てられています。

(6)Characteristicへの書き込み要求

Peripheralが所望のCharacteristicを持っていることが分かったら、CentralからそのCharacteristicのUUIDを指定して読み書きの要求を行います。toioのモーターを動かす場合は「toio™コア キューブ 技術仕様」の「モーター」のページに書かれた内容に従って、コマンドのバイト列を組み立ててCharacteristicに書き込み要求を行うことになります。

 

…と、ここまで書いた内容を一通り実行するとESP32-S3からめでたくtoioを制御できるというわけです。実際にこの処理をArduino環境で実装しtoioを動かしている様子が下記のTweetになります。

なお、実際に上記Tweet内でtoioを動かすために使ったArduinoのソースコードはGistにアップロードしてあります。ESP32 BLE Arduinoライブラリのサンプル、”BLE_client“を小改造して実装しています。

3Dプリントパーツも到着!

ちょっと別件(先日お知らせしたMaker Faire Rangsit参加準備などなど…)でバタバタしており、受け取りが遅くなってしまったのですが、前回設計しJLCPCBに発注していた3Dプリントパーツも無事到着しました。

印刷品質も申し分なく、toio本体との嵌合もばっちりでした。これで$1.39は本当に安いですね…

まとめ

今回はtoioを使った台車ロボットを制御するためのコントローラーとして使おうとしているESP32-S3からtoioを制御する基本的な流れについて説明しました。また、実際にESP32-S3からtoioを制御するサンプルを作成しました。JLCPCBの3Dプリントで製作した3Dプリントパーツも問題なく使えそうなので、この後は実際にtoioの上に載せられる制御基板を作っていこうと考えています。

  1. 正確にはtoioのコアキューブ、ですが、便宜上”toio”と記載します。
  2. Universally Unique IDentifier:128bitの識別番号
公開日:2023/03/28