はじめに
Pybricks の API ドキュメントの中には独自デバイス用のものがあります。
しかし、独自デバイスの作り方に関するドキュメントは見当たりませんでした。本記事では独自デバイスに挑戦してみたことを書きます。
ハブとデバイス間の通信プロトコル
ハブに繋げられるデバイスの多くはマイコンを内蔵していて、ハブとUARTでシリアル通信しています。通信プロトコルについて Pybricks で解析したドキュメントはここにあります。見てみると、けっこうめんどうくさいプロトコルです。
プロトコルの概略は次のようなものです。
-
システムメッセージ(2400bps)
デバイス情報をハブに通知するメッセージ- デバイスID
- モード数
- 通信速度
- デバイスバージョン(ファームウェア、ハードウェア)
-
モード情報メッセージ(2400bps)
各デバイスモードの情報をハブに通知するメッセージ- モード名
- データサイズ
- 生データ値の範囲
- パーセントデータ値の範囲
- SI単位データ値の範囲
- 単位名
- マッピング(絶対値か相対値か、NULL値を許すかなど)
- 値のフォーマット(データセット数、バイト数、全体桁数、小数部桁数)
-
送信データメッセージ(システムメッセージで通知した通信速度)
実際のデータ送信- デバイスモード
- データ長
- データ値
通信に使うピンとケーブル
13日目の記事にも書いたとおり、UART の通信にはコネクタの5番と6番を使います。
ポートのピン構成は次のようになっています。
ピン | ラベル | 機能 |
---|---|---|
1 | M1 | モータ出力用 |
2 | M2 | モータ出力用 |
3 | GND | グラウンド |
4 | VCC | 3.3V |
5 | D1 | UART(ハブ→デバイス) |
6 | D2 | UART(デバイス→ハブ) |
問題はケーブルです。独自デバイスのためにセットに付属のケーブルをぶった斬るのはもったいないですが、純正品の個別販売もしていないようでした。
AliExpress に互換品がないか探したところ、使えそうなのがありました。
これに、ピンソケットを半田付けして、独自デバイスの実験用にしてみました。
独自デバイス作成
独自デバイス用のマイコンとしては XIAO RP2040 を使いました。センサーとしてはLEGO純正で絶対に出そうもない人感センサーを選んでみました。
結果、作ってみたのが以下のようなもので、人感センサーが反応すると、Color Light Matrix が点灯するものです。
デバイス側スクリプトとしてはここにあるものを参考にさせてもらい、独自デバイスを拡張できることを確認できました。