M5StackCを使ったお手軽なバランシングカーのDIYキットが4,200円程度で販売されていたので購入してみたんです。

このDIYキットにはサンプルコードが用意されていて、電源ボタンの操作の仕方で倒立するだけの動作と、倒立したまま円を描く動作ができるようになっています。
まぁ、それだけでも楽しいのですが、やっぱり自分の好きなように動き回れないとつまらないので、BlynkのJoystickウィジットで操作できるようにサンプルコードを改造してみました。
動作ビデオ

ESP32はBluetoothも使えるので、今回は通信にBluetoothを使っています。
サンプルコードの実行
サンプルコードはArduino用に書かれているので、次のサイトにアクセスしてM5StickC用の開発環境を整えておいてください。
開発環境が整ったら、サンプルコードをダウンロードして実行してみましょう。
サンプルコードはGitHubからダウンロードできます。
上のURLにアクセスすると、ソースコードが表示されるのでブラウザの「名前を付けて保存」とかで保存します。

ファイルの種類を「すべてのファイル」に変更し、ファイル名を「Balac.ino」にしてから保存しましょう。
保存したら、Arudinoの環境設定画面で確認できる「スケッチブックの保存場所」フォルダに「Balac」フォルダを作って、保存した「Balac.ino」を移動させます。
あとは、プログラムをM5StickCに書き込めばサンプルコードを実行できます。
サンプルコードのコメントに使い方が次にように書かれています。
// 1. Lay the robot flat, and power on. // 2. Wait until Gal-1 (Pitch Gyro calibration) completes. // 3. Hold still the robot upright in balance until Cal-2 (Accel & Yaw Gyro cal) completes. // // short push of power button: Gyro calibration // long push (>1sec) of power button: switch mode between standig and demo(circle)
ぼくの経験では、BalaCを平らな場所において、やや前傾姿勢にした状態で電源を入れ、動き出すまでその状態を保つのが動かすコツのように感じました。
倒立状態になった後で、電源ボタンを長く押す(1秒以上)と円を描いて動作するようになります。
サンプルコードの改造
改造のポイント
サンプルコードには、「直立するだけのモード」と「円を描くモード」の2つの動作モードがあります。
この「円を描くモード」は、「直立するだけのモード」に対して次のファンクションを実行しているだけなんです。
void startDemo() {
moveRate=1.0;
spinContinuous=true;
spinStep=-40.0*clk;
}
ここに自由に動かすためのヒントがあります。
上の3つの変数の値を変えることで、自由に動作できるように作られていたんです。
あとは、どの変数がどんな役割を果たしているのかを調べるだけです。
その結果、
- moveRate:移動速度。マイナス値は前進。プラス値は後進。
- spinContinuous:左右に動く場合はture。そうでない場合はfalse。
- spinStep:左右移動。マイナス値は右。プラス値は左。
と、いうことがわかりました。
これらの値をBlynkのJoystickの操作に合わせて変えれば、BalaCを自由にコントロールできるようになる訳です。
サンプルコードの改造
※2020年11月21日追加
iOSのBlynkアプリにはBluetoothがありません。従来通りWiFiで繋ぐ必要があります。
12行目に次のコードを追加
#define BLYNK_PRINT Serial #define BLYNK_USE_DIRECT_CONNECT #include <blynksimpleesp32_bt.h> char auth[] = "Blynkからメールで送られてきたAuth Tokenで置き換えます"; BlynkTimer timer;

※2020年11月21日追加 WiFiの場合のコード
#define BLYNK_PRINT Serial #include <BlynkSimpleEsp32.h> char auth[] = "Blynkからメールで送られてきたAuth Tokenで置き換えます"; char ssid[] = "WiFiのSSIDで置き換えます"; char pass[] = "WiFiのパスワードで置き換えます"; BlynkTimer timer;
79行目に次のコードを追加
Blynk.setDeviceName("Blynk"); // Bluetoothのデバイス名
Blynk.begin(auth);
timer.setInterval(10L, Orgloop); // Orgloopは元のコードのloop()

※2020年11月21日追加 WiFiの場合のコード
Blynk.begin(auth, ssid, pass); timer.setInterval(10L, Orgloop); // Orgloopは元のコードのloop()
84行目に次のコードを追加
void loop() {
Blynk.run();
timer.run();
}
BLYNK_WRITE(V1) { // BlynkアプリのJoystickデータの取得
int x = param[0].asInt(); // JoystickのX軸
int y = param[1].asInt(); // JoystickのY軸
moveRate=0.0;
spinContinuous=false;
spinStep=0.0;
if (-6<x && x<6) {
if (4<y) { // 前
moveRate=-2.0;
} else if (y<-4) { // 後
moveRate=2.0;
}
}
if (-6<y && y<6) {
if (4<x) { // 右
moveRate=-2.0;
spinContinuous=true;
spinStep=-40.0*clk;
} else if (x<-4) { // 左
moveRate=-2.0;
spinContinuous=true;
spinStep=40.0*clk;
}
}
}

116行目を次にを変更
void Orgloop() {

151行目以降の3行をコメントアウト
/* do time1 = millis(); while (time1 - time0 < interval); time0 = time1; */

388行目に次のコードを追加
Blynk.virtualWrite(V2, vBatt); // Blynkアプリに電圧を送信

Blynkライブラリの追加
Arduino IDEのライブラリマネージャで「Blynk」ライブラリを追加します。
Blynkのプロジェクト設定
Create New Project画面

※2020年11月21日追加 WiFiの場合はCONNECTION TYPEを変更してください。
設計画面の各ウィジット配置

Labeled Valueウィジットの設定画面

Joystickウィジットの設定画面

改造したサンプルコードの実行
※2021/1/5 画像が表示されない問題を修正しました。
まず、改造前と同じようにM5SticCの電源を入れてBalaCを直立させます。
直立したら、スマホのBlynkアプリで作成したBalaCプロジェクトを実行モードにして、Bluetoothアイコンをタップします。

青字の「Connect Bluetooth device」をタップします。

「Blynk」を選びます。
(「Blynk」は、79行目で指定しています。)
また、初回接続時はペアリングを要求されます。

デバイスに接続すると、この画面になるので、左矢印をタップして元の画面に戻ります。

Bluetoothアイコンが青色に変わって、ジョイスティックの操作ができるようになります。
(ついでにM5StickCの画面に表示されているバッテリーの電圧も表示しています。)

おわり