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の画面に表示されているバッテリーの電圧も表示しています。)
おわり