M5StickCとRoverC、さらにUnitVを買ってしまった
ArduinoとESP32はライフワーク(?)の室内二酸化炭素測定とクラウド(Ambient IoT)へのデータのアップロードに以前から利用中。
授業テーマでもあるIoTだからという大義名分のもと、小さくて見た目がかわいいので、M5StickCに加えてRoverCをついつい楽天でポチってしまった。さらにUnitV(AIカメラユニット)も購入してあり、RoverCに物体追尾をさせる予定。ところがUnitVをRoverCに取り付けるのになんとレゴブロックが必要ではないか。さすがに子供も大きくなり、そんなものはあるわけもないので、これは別途ばら売りのレゴブロックパーツを発注中。
スマホでRoverC動かしたい
レゴブロックのパーツが届くまでしばらくかかりそうなので、とりあえず、まずRoverCを動かしてみることに。
最初はArduinoのM5SticCライブラリのRoverCというスケッチで動かそうと思ったのだが、どうも専用のジョイスティックJoyCが必要な模様。ジョイスティックの要らないシンプルなスケッチRoverC_Arduino_Alone.inoでしばらく楽しんだものの、やはりリモートコントロールしたくなる。
そういえばBlynkってあったなー
専用のジョイスティックなど使わなくてもスマホでコントロールできるのではないかと思いだしたのがBlynk。iPhoneのアプリで簡単にパーツを組み立てる感覚でwifiやBluetooth、BLEでリモートからESP32のコントロールが可能。いままでWifiでリモートコントロールしたことはあったが、今回、はじめてBLEに挑戦。BLEはBluetooth Low Energyの略でBluetoothの拡張仕様で名前の通りきわめて低電力で動くらしい。ビーコンと呼ばれているものもBLE。
まず、Arduinoのスケッチを用意
RoverC_Arduino_Alone.inoとM5StickCでBlynkを試してみた(Lチカ)を参考にスケッチを用意。RoverC_Arduino_Alone.inoに前後進、左右平行移動、右回り、左回りの関数が用意されていたのでそれをそのまま活用。
複雑なことは何もせず、RoverC_Arduino_Alone.inoにBlynk固有の処理を書き加えた感じ。Blynk上のリモコン画面(?)用に前進、後進などのボタンを6つ用意したので、それに対応した処理が最後のBLYNK_WRITEで記述されている。
#include <M5StickC.h>
#include "RoverC.h"
#include <BlynkSimpleEsp32_BLE.h>
#include <BLEDevice.h>
#include <BLEServer.h>
#define BLYNK_PRINT Serial
#define BLYNK_USE_DIRECT_CONNECT
// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "認証コード"; //Auth Token for BLE
// the setup routine runs once when M5StickC starts up
void setup() {
// Initialize the M5StickC object
M5.begin();
M5.Lcd.setRotation(3);
M5.Lcd.setTextColor(BLUE);
M5.Lcd.setCursor(40, 30, 4);
M5.Lcd.printf("BlynkBLE");
// Debug console
Serial.begin(9600);
Serial.println("Waiting for connections...");
Blynk.setDeviceName("M5StickC_RoverC");
Blynk.begin(auth);
RoverC_Init();
}
// the loop routine runs over and over again forever
void loop() {
//ここは具体的な処理はかかない。Blynkで何かアクションがあると下の関数が呼ばれる
Blynk.run();
}
//以下の関数はボタンがプッシュされるたびに呼ばれる
BLYNK_WRITE(V0) {
int16_t forward = param.asInt(); //入ってくる信号を変数に渡す
if (forward == 1) {
Move_forward(50);
}
else {
Move_stop(0);
}
}
BLYNK_WRITE(V1) {
int16_t backward = param.asInt();
if (backward == 1) {
Move_back(50);
}
else {
Move_stop(0);
}
}
BLYNK_WRITE(V2) {
int16_t right = param.asInt();
if (right == 1) {
Move_right(50);
}
else {
Move_stop(0);
}
}
BLYNK_WRITE(V3) {
int16_t left = param.asInt();
if (left == 1) {
Move_left(50);
}
else {
Move_stop(0);
}
}
BLYNK_WRITE(V4) {
int16_t rightT = param.asInt();
if (rightT == 1) {
Move_turnright(50);
}
else {
Move_stop(0);
}
}
BLYNK_WRITE(V5) {
int16_t leftT = param.asInt();
if (leftT == 1) {
Move_turnleft(50);
}
else {
Move_stop(0);
}
}
肝心のBlynkの方は?
Blynkアプリの設定はM5StickCでBlynkを試してみた(Lチカ)に詳しいので参照されたい。
ここではBLEという名前で新しいプロジェクトを作り、方眼紙(?)上の画面をタップすると、Widgetと呼ばれるパーツを選択する画面が出てくる。使ったのは、RoverCの動きを規定する6つのボタンとBLEのWidgetで、以下のようにリモコン画面っぽく(?)配置した。
各ボタンごとの設定は以下の通りで、バーチュアルなピンをそれぞれV0からV5までアサインしてあり、先ほどのArduinoのスケッチに対応するものとなっている。
BLEセッティングのConnect BLE DeviceをクリックするとBluetoothの選択肢が出てくるので、先ほどのスケッチが書き込まれたM5StickCの名称(スケッチ中のBlynk.setDeviceName("M5StickC_RoverC");で決めた名称を選んで接続する。もちろんこの時点ではM5StickCはスケッチが書き込まれて電源が入っている想定。あとは、リモコン画面のプレイボタンを押せば操作可能となる。もちろんRoverCのスイッチもオンにすることを忘れないこと。
かなり軽快に動いてくれ、特に左右のカニ歩き(?)は本当に可愛い。
仕上がりはこんな感じで。