M5StickC + Blynk でRoverCをスマホからBLEでコントロール

# M5StickCとRoverC、さらにUnitVを買ってしまった
ArduinoとESP32はライフワーク（？）の室内二酸化炭素測定とクラウド（[Ambient IoT](https://ambidata.io/)）へのデータのアップロードに以前から利用中。
授業テーマでもあるIoTだからという大義名分のもと、小さくて見た目がかわいいので、M5StickCに加えてRoverCをついつい楽天でポチってしまった。さらにUnitV（AIカメラユニット）も購入してあり、RoverCに物体追尾をさせる予定。ところがUnitVをRoverCに取り付けるのになんとレゴブロックが必要ではないか。さすがに子供も大きくなり、そんなものはあるわけもないので、これは別途ばら売りのレゴブロックパーツを発注中。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153572/25dd6932-fdcf-c3d1-a80b-94d26ce35029.png)

# スマホでRoverC動かしたい
レゴブロックのパーツが届くまでしばらくかかりそうなので、とりあえず、まずRoverCを動かしてみることに。
最初はArduinoのM5SticCライブラリのRoverCというスケッチで動かそうと思ったのだが、どうも専用のジョイスティックJoyCが必要な模様。ジョイスティックの要らないシンプルなスケッチ[RoverC_Arduino_Alone.ino](https://github.com/m5stack/M5-ProductExampleCodes/blob/master/Application/RoverC_Arduino_Alone/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チカ）](http://blog.robotakao.jp/blog-entry-365.html)を参考にスケッチを用意。RoverC_Arduino_Alone.inoに前後進、左右平行移動、右回り、左回りの関数が用意されていたのでそれをそのまま活用。
複雑なことは何もせず、RoverC_Arduino_Alone.inoにBlynk固有の処理を書き加えた感じ。Blynk上のリモコン画面（？）用に前進、後進などのボタンを６つ用意したので、それに対応した処理が最後の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チカ）](http://blog.robotakao.jp/blog-entry-365.html)に詳しいので参照されたい。
ここではBLEという名前で新しいプロジェクトを作り、方眼紙（？）上の画面をタップすると、Widgetと呼ばれるパーツを選択する画面が出てくる。使ったのは、RoverCの動きを規定する6つのボタンとBLEのWidgetで、以下のようにリモコン画面っぽく（？）配置した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153572/5f2dc948-dc0e-c4d4-b66f-af0ec3f42fce.png)

各ボタンごとの設定は以下の通りで、バーチュアルなピンをそれぞれV0からV5までアサインしてあり、先ほどのArduinoのスケッチに対応するものとなっている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153572/8385268a-912d-99f3-5dc0-d17caf4e93b6.png)

BLEセッティングのConnect BLE DeviceをクリックするとBluetoothの選択肢が出てくるので、先ほどのスケッチが書き込まれたM5StickCの名称（スケッチ中のBlynk.setDeviceName("M5StickC_RoverC");で決めた名称を選んで接続する。もちろんこの時点ではM5StickCはスケッチが書き込まれて電源が入っている想定。あとは、リモコン画面のプレイボタンを押せば操作可能となる。もちろんRoverCのスイッチもオンにすることを忘れないこと。
かなり軽快に動いてくれ、特に左右のカニ歩き（？）は本当に可愛い。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153572/aa264045-4bf3-8ce7-cdae-edf6174dd151.png)

仕上がりはこんな感じで。

![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153572/7ed37947-6ea2-2e75-aaf6-e88e09ead67e.gif)