Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

M5Stack Core2の準備

ハンズオンの前に、M5Stack Core2にブリッジのプログラムを書き込み、サーボドライバーを配線しておきます。 このページの作業は、講師が事前に済ませた機体を配布する場合は不要です。

UIFlow2を書き込む

M5Stack Core2では、UIFlow2というファームウェアを使ってMicroPythonのプログラムを動かします。 UIFlow2のファームウェアの書き込みには、M5Stack公式のデスクトップアプリM5Burnerを使います。

  1. Core2のUSBシリアル変換チップ用のドライバー(CP210XまたはCH9102)をインストールします。どちらのチップか分からなければ、両方をインストールして構いません。
  2. M5Burnerをインストールして起動し、アカウントでログインします。
  3. 機種の一覧からCore2を選び、UIFlow2のファームウェアをダウンロードします。
  4. Core2をUSBケーブルでPCに接続し、「Burn」を押してポートを選び、書き込みを始めます。

書き込みの途中でWi-Fiの設定を求められますが、このハンズオンではWi-Fiを使いません。 詳しい手順と画面は、M5Stack公式のCore2: Flash Firmware & Run Codeを参照してください。

ブリッジのプログラムを書き込む

プログラムの書き込みには、ブラウザで動く開発環境 UIFlow2 を使います。 UIFlow2はブラウザからUSBでCore2に接続するため、ハンズオンと同じChromeで開きます。

  1. UIFlow2を開き、「Controller」からCore2を選んで「Confirm」を押します。
  2. 「WebTerminal」を押し、Core2のポートを選んで接続します。「Connected to Serial Port!」と表示されれば接続できています。
  3. エディターをPythonの表示に切り替え、ブリッジのプログラム(main.py)の内容で置き換えます。
  4. 「Run Always」を押します。プログラムがデバイスのmain.pyとして保存され、電源を入れるたびに自動で起動するようになります。
  5. Core2の画面に「Serial Bridge」と表示されたら、UIFlow2のタブを閉じます。

最後の手順でタブを閉じるのは、シリアルポートを同時に開けるのは1つのページだけだからです。 UIFlow2がポートを開いたままだと、ハンズオンのページからは接続できません。

サーボドライバーを配線する

サーボモーターは、PCA9685を搭載したサーボドライバーのボードを経由して動かします。 PCA9685は16チャンネル分のPWM信号を生成できるICで、I2CでCore2から角度を指示します。

Core2(Port A、赤いGrove端子)サーボドライバー
GNDGND
5VVCC
G32SDA
G33SCL

サーボモーターは、アームの根元の旋回をチャンネル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が返る場合は、サーボドライバーの配線を確認してください。