知的好奇心 for IoT

IoT関連の知的好奇心を探求するブログです

M5StackのBALA-CミニセルフバランスカーをBlynkで操作できるようにサンプルコードを改造する方法

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

f:id:IntellectualCuriosity:20201102170109j:plain

このDIYキットにはサンプルコードが用意されていて、電源ボタンの操作の仕方で倒立するだけの動作と、倒立したまま円を描く動作ができるようになっています。

 

まぁ、それだけでも楽しいのですが、やっぱり自分の好きなように動き回れないとつまらないので、BlynkのJoystickウィジットで操作できるようにサンプルコードを改造してみました。

動作ビデオ


 
Blynkのコントローラー画面

f:id:IntellectualCuriosity:20201102132331p:plain

ESP32はBluetoothも使えるので、今回は通信にBluetoothを使っています。

 

サンプルコードの実行

 サンプルコードはArduino用に書かれているので、次のサイトにアクセスしてM5StickC用の開発環境を整えておいてください。

 

開発環境が整ったら、サンプルコードをダウンロードして実行してみましょう。

サンプルコードはGitHubからダウンロードできます。

https://raw.githubusercontent.com/m5stack/M5-ProductExampleCodes/master/App/BalaC/Arduino/Balac/Balac.ino

上のURLにアクセスすると、ソースコードが表示されるのでブラウザの「名前を付けて保存」とかで保存します。

f:id:IntellectualCuriosity:20201102134107p:plain

ファイルの種類を「すべてのファイル」に変更し、ファイル名を「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;

f:id:IntellectualCuriosity:20201108172359p:plain

※2020年11月21日追加 WiFiの場合のコード

#define BLYNK_PRINT Serial
#include <BlynkSimpleEsp32.h>
char auth[] = "Blynkからメールで送られてきたAuth Tokenで置き換えます";
char ssid[] = "WiFiSSIDで置き換えます";
char pass[] = "WiFiのパスワードで置き換えます";
BlynkTimer timer;

 

79行目に次のコードを追加

  Blynk.setDeviceName("Blynk");         // Bluetoothのデバイス名 
  Blynk.begin(auth); 
  timer.setInterval(10L, Orgloop);      // Orgloopは元のコードのloop()

f:id:IntellectualCuriosity:20201108172652p:plain

※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; 
    } 
  } 
}

f:id:IntellectualCuriosity:20201108173107p:plain

116行目を次にを変更

void Orgloop() {

f:id:IntellectualCuriosity:20201108173342p:plain

151行目以降の3行をコメントアウト

/* 
  do time1 = millis(); 
  while (time1 - time0 < interval); 
  time0 = time1; 
*/

f:id:IntellectualCuriosity:20201108173658p:plain

388行目に次のコードを追加

  Blynk.virtualWrite(V2, vBatt);        // Blynkアプリに電圧を送信

f:id:IntellectualCuriosity:20201108173935p:plain

 

Blynkライブラリの追加

Arduino IDEのライブラリマネージャで「Blynk」ライブラリを追加します。

 

Blynkのプロジェクト設定

Create New Project画面

f:id:IntellectualCuriosity:20210105180849p:plain
※2020年11月21日追加 WiFiの場合はCONNECTION TYPEを変更してください。

 

設計画面の各ウィジット配置

f:id:IntellectualCuriosity:20201102164351p:plain

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

f:id:IntellectualCuriosity:20201102164952j:plain

Joystickウィジットの設定画面

f:id:IntellectualCuriosity:20201102165131j:plain

 

改造したサンプルコードの実行

※2021/1/5 画像が表示されない問題を修正しました。

まず、改造前と同じようにM5SticCの電源を入れてBalaCを直立させます。

直立したら、スマホのBlynkアプリで作成したBalaCプロジェクトを実行モードにして、Bluetoothアイコンをタップします。

f:id:IntellectualCuriosity:20210105175358p:plain

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

f:id:IntellectualCuriosity:20210105175341p:plain

「Blynk」を選びます。

(「Blynk」は、79行目で指定しています。)

また、初回接続時はペアリングを要求されます。

f:id:IntellectualCuriosity:20210105175319p:plain

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

f:id:IntellectualCuriosity:20210105175302p:plain

Bluetoothアイコンが青色に変わって、ジョイスティックの操作ができるようになります。

(ついでにM5StickCの画面に表示されているバッテリーの電圧も表示しています。)

f:id:IntellectualCuriosity:20210105175237p:plain


 

おわり