M5stickくんをスマホのIMU情報Blynkで送って直感操縦リモコンは
ちょいと無理かもって感じになった。
ちゃんとBlynk調べればやりようはあるかもしれんけど
けっこーいじったけどBlynkで勝手に飛んでく割込み先の処理...は、
よくわからんかった。
スマホで直感操縦リモコンはウケると思ったんだけど・・・断念。
なもんで・・・
M5のIMUを使って直感操縦リモコンを検討することにした。
で、無線通信を何でやるか・・・
いろいろあるけど、以前から気になってたのがESPNOW。
(ESP32の開発会社であるEspressifが開発した通信方式で、
内容的にはIEEE 802.11のCCM Protocolを使って通信)
MACアドレス直に送りつける感じでペアリングもいらない。
ハンドシェイクみたいなのもやらんので
BLEよりも消費電流が少ないかも? らしい。
ネットには情報いっぱいあるけど
通信に必要な最低限のとこだけって感じのがあんまり
見当たらなかった。
丁寧にエラー処理等々入ってるのがほとんど。
なので、自分なりに必要最低限で確認したりしたことの
覚えを残しとこう。。。
M5stickくんのプログラムにESPNOWの送信をつけて
ボディの傾きと回転データを送ってみるのを試してみた。
元のM5stickくんの倒立制御に追加したものはこんだけ。
頭のとこ。
// ESPNOW /////////////////////////////////////////////////////////////////////
#include <esp_now.h>
#include <WiFi.h>
uint8_t slaveAddress[] = { 0x08, 0x3A, 0xF2, 0x44, 0xA9, 0x50 };
// ESPNOW /////////////////////////////////////////////////////////////////////
setupのとこ。
// ESPNOW /////////////////////////////////////////////////////////////////////
WiFi.mode(WIFI_STA);
WiFi.disconnect();
if (esp_now_init() == ESP_OK) {
M5.Lcd.println("ESPNow ok");
}
esp_now_peer_info_t peerInfo;
memcpy(peerInfo.peer_addr, slaveAddress, 6);
peerInfo.channel = 0;
peerInfo.encrypt = false;
if (esp_now_add_peer(&peerInfo) != ESP_OK) {
M5.Lcd.println("Fail Espnow! ");
return;
}
// ESPNOW /////////////////////////////////////////////////////////////////////
loopのとこ。
// ESPNOW /////////////////////////////////////////////////////////////////////
uint8_t data[5] = { varAng,yawAng ,0,0,0}; // 送信データ
esp_err_t result = esp_now_send(slaveAddress, data, sizeof(data));
// ESPNOW /////////////////////////////////////////////////////////////////////
受信側はCore2を使って試した
理由は特になくて画面大きいので見やすいってだけ。
スケッチはこんだけ。
// ESPNOW /////////////////////////////////////////////////////////////////////
#include <M5Core2.h>
#include <WiFi.h>
#include <esp_now.h>
int i,count,esp_now[5];
void onReceive(const uint8_t* mac_addr, const uint8_t* data, int data_len) {
count++;
M5.Lcd.setCursor(0, 70);
M5.Lcd.printf("count %d\n",count);
for (i=0; i<=4; i++) {esp_now[i] = (int8_t)data[i];
M5.Lcd.printf("data %1d: %3d \n",i,esp_now[i]);
}
}
void setup() {
M5.begin();
m5.Lcd.setTextColor(WHITE, BLACK);
M5.Lcd.setTextSize(2);
M5.Lcd.println("ESP_NOW_test");
M5.Lcd.println( WiFi.macAddress());
WiFi.mode(WIFI_STA);
WiFi.disconnect();
if (esp_now_init() == ESP_OK) {
M5.Lcd.println("ESP-Now OK");
}
M5.Lcd.setTextSize(3);
esp_now_register_recv_cb(onReceive);
}
void loop() {
}
// ESPNOW /////////////////////////////////////////////////////////////////////
Blynkと比べたら書くことちょいと多いくらい。。。
一応、い感じで送れてる。