前編はこちらです。
yoichi-41.hatenablog.com
後編では、プログラムの本体とWebサービスの連携に関して書きたいと思います。
ライントレースよりもこちらの方が正直大変でした。
目次
LINEとIFTTTの連携
ここまでは比較的簡単でした。LINE Developersに登録後にbotを作りIFTTTでWebhookをトリガと設定して
生成されたURLをLINE botのWebhookの利用をオンにして
URLを打ち込めばLINE botに何かを送信するとトリガが引かれます。
IFは良くてもその後のThenが問題で、だいぶ苦労しました。
MQTTに関して
最初プログラムをUiFlowで作っていたのでそのまま連携を追加できないかと
UiFlowにあるMQTTという通信方式のブロックを使って実現しようとしてみました。
結果から言うとこの方法は一部実行できたものの、失敗しました。
どなたかの何かに役立つ可能性も0ではないと思うので覚書として残します。
LINEに明日の天気を知らせる連携を以前にIFTTTという無料のサービスを使ってやったことがあったので
IFTTTとMQTTのサービスで連携できるものがないかを調べました。
下記記事によるとどうやらCloud MQTTはできない様です。
mqtt - IFTTT Maker service and CloudMQTT - Stack Overflow
そこでもう少し調べたところBebotteというサービスがあり、そちらでは連携ができそうということがわかりました。
アカウントを作りチャンネルを作ってAccount SettingのAccess ManegementのIdentify and Access Managementの横のCreate new Tokenを押してアクセス権を設定し、トークンを作ります。
こちらのトークンをUiFlowのトークンへ張り付けます。
※画像では空欄ですが、キーにも同様のトークンを入力します。
これでそれぞれトピックに対してSubscribeした際に画面表示
ボタンを押したときにPublishするように設定したM5AtomとM5StickCを用意して実験したところ、相互に通信することができました。
また、IFTTTとBeebotteの連携もできました。
しかしながら、色々設定を変えてもIFTTTからのM5StickCへ送ることがどうしてもできませんでした。
おそらくですが、この記事の証明書の辺りが関係していると思われます。
証明書まわりはUiFlowのmicro pythonでは容易にいじれない設定の様です。
また、ラズパイを中継すれば実現できそうですが、手間がかかりそうなのでMQTTは諦めることにしました。
参考: IFTTT, Beebotte, Mosquitto, SSL/TLS を使って, なるべく安全に Google Home から Raspberry Pi や ESP8266 を操作する - Qiita
Blynkに関して
そこで調べていて見つけたのがBlynkというサービスでした。
こちらはArduinoで専用のライブラリを入れて連携をすると手軽にESP32等のマイコンをスマホと連携できるアプリです。
面白いのがArduino側に仮想ピンというものを設定可能でBlynkからの操作でその仮想ピンの状態を変化させることができます。
今回は仮想ピンが[1]になったタイミングで状態を切り替えるプログラムにしています。
ただ、今回は譲れないところとして「LINEからメッセージを送ってLINE TRACEマシンにおやつを運んでもらう」というところがあるので一工夫が必要でした。
具体的には下記記事のAction側の設定URLの解説が大変参考になりました。ありがとうございました。
IFTTTのwebhookチャンネルでArduinoを使う(Action側) - Qiita
上記項でLINEからIFTTTの連携はできていたのでそこからついにBlynkに繋げることができました。
動画でも出しましたが構成の概要図はこんな感じです。
#include "M5StickC.h"
#include "bugC.h"
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "YOUR_BLYNK_KEY";
// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "YOUR_SSID";
char pass[] = "YOUR_PASSWORD";
volatile bool startFlag = false;
#define LEFT_PIN 33
#define RIGHT_PIN 32
int lval = 0;
int rval = 0;
int threval = 200;
void setup()
{
M5.begin();
Wire.begin(0, 26, 400000);
M5.Lcd.setTextColor(TFT_GREEN);
M5.Lcd.setRotation(1);
M5.Lcd.drawCentreString("LineBugC program", 80, 30, 2);
// if add battery, need increase charge current
M5.Axp.SetChargeCurrent(CURRENT_360MA);
// Debug console
Serial.begin(9600);
pinMode(GPIO_NUM_10, OUTPUT); //add
digitalWrite(GPIO_NUM_10, HIGH);//add
Blynk.begin(auth, ssid, pass);
}
void loop()
{
Blynk.run();
M5.update();
if(startFlag == true){
M5.Lcd.fillScreen(TFT_BLACK); //塗りつぶし
M5.Lcd.drawCentreString("RUN", 80, 30, 2);
lval = analogRead(LEFT_PIN);
rval = analogRead(RIGHT_PIN);
M5.Lcd.setCursor(10, 50,1);
M5.Lcd.printf("%d", lval);
M5.Lcd.setCursor(10, 10,1);
M5.Lcd.printf("%d", rval);
if(threval < rval and threval < lval){
BugCSetColor(0x100000, 0x100000);
BugCSetAllSpeed(30, -30, 30, -30);
}else if(threval < rval and threval >= lval){
BugCSetColor(0x000000, 0x100000);
BugCSetAllSpeed(20, 20, 20, 20);
}else if(threval >= rval and threval < lval){
BugCSetColor(0x100000, 0x000000);
BugCSetAllSpeed(-20, -20, -20, -20);
}else{
BugCSetColor(0x000000, 0x000000);
BugCSetAllSpeed(35, -35, 35, -35);
}
}else{
BugCSetColor(0x000000, 0x000000);
BugCSetAllSpeed(0, 0, 0, 0);
M5.Lcd.fillScreen(TFT_BLACK); //塗りつぶし
M5.Lcd.drawCentreString("STOP", 80, 30, 2);
}
if(M5.BtnA.wasPressed())
{
BugCSetColor(0x000000, 0x000000);
BugCSetAllSpeed(0, 0, 0, 0);
startFlag = !startFlag;
if(startFlag == false){
M5.Lcd.fillScreen(TFT_BLACK); //塗りつぶし
M5.Lcd.drawCentreString("STOP", 80, 30, 2);
}
}
}
BLYNK_WRITE(V0){ //仮想ピンを読んだ時の動作
int LED = param[0].asInt();
Serial.println(LED);
if(param[0].asInt() == 1){
digitalWrite(GPIO_NUM_10, LOW); //LEDを光らせる LOWで光るので注意
delay(1000);
digitalWrite(GPIO_NUM_10, HIGH);
startFlag = !startFlag; //フラグのTrueとFalseを入れ替える
}
}
こちらM5Stack、M5StickCおよびBlynkのライブラリとBugC.hとBugC.Cppが必須ですのでご注意ください。
M5StickC/examples/Hat/BUGC at master · m5stack/M5StickC · GitHub
まとめ
スタートストップだけとはいえ当初予定していた目的が果たせて達成感がありました。
先人の知恵に助けられながら電子工作を楽しめているので、もしこの記事が誰かの助けになったら嬉しいです。
読んで下さりありがとうございました。
メイカーフェア京都オンライン楽しみましょう!