M5Stack Core2の準備
ハンズオンの前に、M5Stack Core2にブリッジのプログラムを書き込み、サーボドライバーを配線しておきます。 このページの作業は、講師が事前に済ませた機体を配布する場合は不要です。
UIFlow2を書き込む
M5Stack Core2では、UIFlow2というファームウェアを使ってMicroPythonのプログラムを動かします。 UIFlow2のファームウェアの書き込みには、M5Stack公式のデスクトップアプリM5Burnerを使います。
- Core2のUSBシリアル変換チップ用のドライバー(CP210XまたはCH9102)をインストールします。どちらのチップか分からなければ、両方をインストールして構いません。
- M5Burnerをインストールして起動し、アカウントでログインします。
- 機種の一覧からCore2を選び、UIFlow2のファームウェアをダウンロードします。
- Core2をUSBケーブルでPCに接続し、「Burn」を押してポートを選び、書き込みを始めます。
書き込みの途中でWi-Fiの設定を求められますが、このハンズオンではWi-Fiを使いません。 詳しい手順と画面は、M5Stack公式のCore2: Flash Firmware & Run Codeを参照してください。
ブリッジのプログラムを書き込む
プログラムの書き込みには、ブラウザで動く開発環境 UIFlow2 を使います。 UIFlow2はブラウザからUSBでCore2に接続するため、ハンズオンと同じChromeで開きます。
- UIFlow2を開き、「Controller」からCore2を選んで「Confirm」を押します。
- 「WebTerminal」を押し、Core2のポートを選んで接続します。「Connected to Serial Port!」と表示されれば接続できています。
- エディターをPythonの表示に切り替え、ブリッジのプログラム(
main.py)の内容で置き換えます。 - 「Run Always」を押します。プログラムがデバイスの
main.pyとして保存され、電源を入れるたびに自動で起動するようになります。 - Core2の画面に「Serial Bridge」と表示されたら、UIFlow2のタブを閉じます。
最後の手順でタブを閉じるのは、シリアルポートを同時に開けるのは1つのページだけだからです。 UIFlow2がポートを開いたままだと、ハンズオンのページからは接続できません。
サーボドライバーを配線する
サーボモーターは、PCA9685を搭載したサーボドライバーのボードを経由して動かします。 PCA9685は16チャンネル分のPWM信号を生成できるICで、I2CでCore2から角度を指示します。
| Core2(Port A、赤いGrove端子) | サーボドライバー |
|---|---|
| GND | GND |
| 5V | VCC |
| G32 | SDA |
| G33 | SCL |
サーボモーターは、アームの根元の旋回をチャンネル0、グリッパーの開閉をチャンネル1につなぎます。 サーボモーターの電源(ボードのV+端子)には、Core2とは別の5V電源をつなぎます。 複数のサーボモーターが同時に動くと大きな電流が流れ、Core2から給電するとCore2が再起動することがあるからです。
ブリッジとの通信の取り決め
ブリッジは、通信速度115200bpsのUSBシリアルで次のコマンドを受け付けます。 コマンドは1行に1つ、改行で区切って送ります。
| コマンド | 動作 |
|---|---|
ping | 生存確認。PCA9685が見つかったかどうかも返す |
servo <ch> <deg> | チャンネルchのサーボモーターをdeg度(0〜180)にする |
servo 0 90 1 45 | 複数のチャンネルをまとめて指定する |
release [<ch> ...] | サーボモーターへの信号を止めて脱力させる(省略時は全チャンネル) |
sensor on / off | センサー値の送信を開始または停止する |
sensor <ms> | センサー値の送信間隔をミリ秒で指定する(既定は100) |
ブリッジからは、1行に1つのJSONが届きます。
{"type": "sensor", "time": 12345, "accel": [0.01, -0.02, 0.998], "gyro": [0.1, 0.2, 0.3], "battery": 87, "charging": false}
{"type": "button", "name": "A"}
{"servo": {"0": 90}, "type": "ok", "command": "servo"}
{"type": "error", "command": "servo", "message": "angle out of range: 200"}
送る側と受け取る側で形式を変えているのは、それぞれの読み手が違うからです。
コマンドは、人がシリアルターミナルから手で打って確かめられるよう、短いテキストにしています。
応答は、ブラウザがJSON.parse()だけで解釈できるよう、JSONにしています。
動作を確かめる
書き込みと配線が済んだら、センサー値をブラウザでモニターするのサンプルを開いて接続します。
「コマンドを送る」の欄にpingと入力して送り、ログに{"servo":true,"type":"ok","command":"ping"}が表示されれば準備は完了です。
"servo":falseが返る場合は、サーボドライバーの配線を確認してください。