ミクちゃんカーのタイヤ、車軸をモータに換装していきます。
素のままモータ置くと位置が高くてタイヤが床に届かないので
削り込みます・・・
削って。。。
こんな感じかな。。。
モータの収まり的にはこんな感じでいけるかな。
ミクちゃんカーのタイヤ、車軸をモータに換装していきます。
素のままモータ置くと位置が高くてタイヤが床に届かないので
削り込みます・・・
削って。。。
こんな感じかな。。。
モータの収まり的にはこんな感じでいけるかな。
コントローラアプリのRemoteXY、電子工作ごととかやってる人なんかは
ちょっと使ってみれば使い方すぐコツがわかると思います。
同じ様なやつでDabbleありますがあれはゲームコントローラモードで
変数10個送れるけど受信表示がない。
デザインも変えられない。
BlynkもBLEが使えてた旧Verではよく使ってたけどWiFiだけになってからは使ってない
RemoteXY、は送信だけなら10個送れるけどそんな使い方より、
送受信合わせて10個ってのがいい。
(貼り付け部品で扱える変数個数は変わる)
何よりデザインが自分で作れるってのがすごくいいです。
こちらのがちょっとモータコントローラのI/F作ってみたところ。
慣れると数分でできるくらい簡単なものです。
・左上の赤字はESP01が実行し始めてからの動作時間、秒。
・緑左はESP01がCPUのVcc電圧をADしたもの・・・受信データ表示
・緑右はM5StickCの電池電圧
任意の文字とかも入れられるのでわかりやすい
リモコンにできる。
・空色のはよくあるジョイスティック風コントローラ
x、yの2値が送信される。
そのコントローラの生成スケッチはこうなります
#pragma pack(push, 1)
uint8_t RemoteXY_CONF[] = // 79 bytes
{ 255,2,0,33,0,72,0,16,31,1,5,49,8,35,50,50,165,26,31,129,
0,4,14,57,5,1,69,83,80,45,48,49,40,118,41,227,128,128,239,188,
173,53,83,116,105,99,107,67,40,118,41,0,67,4,8,19,21,9,136,26,
11,67,4,35,19,21,9,136,26,11,67,4,1,1,19,7,1,26,11 };
struct {
int8_t joystick_1_x; // from -100 to 100
int8_t joystick_1_y; // from -100 to 100
char ESP_01_Batt[11]; // string UTF8 end zero
char M5_Stick_Batt[11]; // string UTF8 end zero
char ESP_01_sec[11]; // string UTF8 end zero
uint8_t connect_flag; // =1 if wire connected, else =0
} RemoteXY;
#pragma pack(pop)
これは何が何だかわからん暗号みたいな感じになってるけど
RemoteXYでお絵描きしてI/F作ったら
右上部の緑楕円の Get soucre code で自動で作ってくれる。
後はそれをArduinoIDEにコピペして使うだけ。
あとはそのオブジェクト作って、変数に読み書きするだけ。
パーツはいろんなのあってメーターやグラフも表示できる。
そこまでやると無料ではできないけど、デバッグごとにも便利そう。
有料アプリで買ってもいいかもしれない。
でもって、そのI/Fでステッピングモータ2個を操作してみたのが
こちら。 こんだけのモノをうまくミクちゃんカーに入れたら、
まずはリモコンミクちゃんカーができる。はず。
簡単には入らないけど・・・
スマホ(#RemoteXY) ⇐#BLE⇒ #M5StickC、
— しん (@shinichi_nin) 2023年2月19日
M5StickC ⇐#ESPNOW⇒ #ESP01
バケツリレー #双方向通信
2個の #ステッピングモーター を操作。
車輪付けて、ミクちゃんカーに積み込めるかな...#Arduino #初音ミク #トミカ #DRV8830 #I2C #ESP32 #ESP8266https://t.co/zuXU45rDtT pic.twitter.com/JTQ6A18WHO
ミニフィグのセグウェイで倒立振子ロボを作ってみたら・・・って
話が出ていろいろ検討してみると思った以上に難しい。
Diorama111さんのクラウン1/150見てあんなの作ってみたいなと思って
もーちょい小さいスバル360買ってみたらチョー小さい。
これはちょっと小道具作らんと、すぐにできるもんじゃないことは
よくわかった。
小さいロボモノ製作するには段階を踏んで
だんだん小さいのにするかなってことにした。
でミニカー辺りでなんかいい素材ないかなって見ていたら
カミさんがミクちゃんでやってみてよ♪ から、
ミクちゃんカー ロボ?製作が始まった。
娘らもこれなら喜ぶよってことで。
ラジコン、リモコン? ライントレーサーにもしていこうと思う。
ミクちゃんカーに入れたいと思う部品はこんな感じ
ミクちゃんカー分解してみたのがこちら。
ミクちゃんサイズに似合わずかなり重い。
同じくらいのチョロQの10倍くらいあるかな。。。
シャーシーはほぼプラスチックだけど、
今はアルミもあるらしいけど重さの感じからすると亜鉛合金っぽい...
入れたい部品と中身を並べるたのがこちら。
外観からしたらまぁ入るかなと思ってたけど、かなり空間は狭い。
鉄ボディーがとにかく分厚い。鉄だから簡単に削るわけにもいかない。
これがプラスチックボディで10gないくらいなら・・・以前やった、、、
小さいステッピングモータをマイコンのポート直叩きでいけたんだっけど
とてもポート電流でのトルクでは動きそうにない。
なのでモータドライバ使用することにした。
見た感じ、ボディの内側は思ったより狭いのでモータドライバICはそのまんまじゃ
入りそうにない。基板から外して別途配線つけるって方法になりそう。
モータドライバもBL113ならいくらか小さいけどポートがたくさんいる。。。
マイコンの足からリード出すのは手間なので今回はI2Cドライバ
使うことにした。これならポート2本なんで楽。
ちょっとIC、DRV8830は大きいけど。これももっと小さいパッケージが
あるけど今回はこちらの足が大きいやつで後々は基板からIC外して配線
してみようかと思う。
でもって、まずは・・・
ESP-01が無線使えて小さいのでいいかなってとこで使い始めたけど
WiFiはとても消費電力大きくて使う気にならない。
ボディに押し込んだら過熱保護で止まるかその前に、電池が切れるか。。。
ってなりそうなので。ESPNOW使うことにした。
操作する側・・・ESPNOWだと
M5とかがまずは簡単だけどやっぱり何かと不便。
誰でも持ってるスマホで行けるってのがいい。
で、RemoteXYが使いやすいのがわかったんで使いたいとこだけど
あまり一般的ではないESPNOWは対応してないっぽい。
なもんで間にM5StickCの中継入れてやってみることにした。
とりあえず、簡単なLチカ風にモータチカやってみたのがこちら。
スマホ(#RemoteXY) ⇐#BLE⇒ #M5StickC、
— しん (@shinichi_nin) 2023年2月18日
M5StickC ⇐#ESPNOW⇒ #ESP01
バケツリレー #双方向通信
で、ステッピングモータ回してみた。
ポート直接駆動では電流オーバーなんでドライバ使用。
そこそこトルクもあるのでタイヤ回せば走れるかな...#Arduino #初音ミク #トミカ #DRV8830 pic.twitter.com/f7KrbSPma4
一応動かしてたスケッチのおぼえ。
他のスケッチの流用なのでゴミが入っててバグもあるかと思うけど・・・
/////////////////////////////////////////////////////////////////////////////
//
// スマホにM5Stick電圧表示
//
#include "M5StickCPlus.h"
#define M5_LED 10
///// ESPNOW//////////////////////////////////////////////////////////////
#include <esp_now.h>
#include <WiFi.h>
uint8_t slaveAddress = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
#define CHANNEL 0
///////////////////////////////////////////////////////////////////////////
///// Remote_BLE ///////////////////////////////////////////////////////////
#define REMOTEXY_MODE__ESP32CORE_BLE
#include <BLEDevice.h>
#include <RemoteXY.h>
#define REMOTEXY_BLUETOOTH_NAME "RemoteXY"
#pragma pack(push, 1)
uint8_t RemoteXY_CONF = // 55 bytes
{ 255,1,0,44,0,48,0,16,31,1,1,0,10,44,44,44,2,31,0,67,
4,2,19,27,16,2,26,11,67,4,2,4,20,9,2,26,11,67,4,35,
19,26,16,2,26,11,67,4,35,4,20,9,2,26,11 };
struct {
uint8_t button_1; // =1 if button pressed, else =0
char M5_Stick_Batt[11];
char M_sec[11];
char ESP_01_Batt[11];
char E_sec[11];
uint8_t connect_flag; // =1 if wire connected, else =0
} RemoteXY;
#pragma pack(pop)
/////////////////////////////////////////////////////////////////////////////////
unsigned char recvData[100];
static int8_t sendData[100];
unsigned long ms100,ms1000;
float batt_M5stick,batt_ESP01;
int M5_sec,ESP_sec;
uint8_t LED_sw;
void setup()
{
M5.begin();
setupESPNOW();
pinMode(M5_LED, OUTPUT);
RemoteXY_Init ();
M5.Lcd.setTextFont(4);
M5.Lcd.setRotation(3);
M5.Lcd.fillScreen(BLACK);
M5.Lcd.setTextSize(1);
M5.Lcd.setCursor(0, 0);
M5.Lcd.println("RemoteXY_BLE_test");
ms100 = ms1000 = millis();
}
void loop()
{
if (millis() > ms100){
// RemoteXY /////////////////////////////////////////////////////////////////////
RemoteXY_Handler ();
LED_sw = RemoteXY.button_1;
digitalWrite(M5_LED,(LED_sw == 1)?LOW:HIGH);
dtostrf(M5_sec, 4, 0, RemoteXY.M_sec);
dtostrf(batt_M5stick, 3, 1, RemoteXY.M5_Stick_Batt);
dtostrf(ESP_sec, 4, 0, RemoteXY.E_sec);
dtostrf(batt_ESP01, 3, 1, RemoteXY.ESP_01_Batt);
// ESPNOW /////////////////////////////////////////////////////////////////////
sendData[0] = LED_sw;
esp_now_send(slaveAddress, (uint8_t*)sendData, 100);
////////////////////////////////////////////////////////////////////////////////////
ms100+=100;
}
if (millis() > ms1000){
M5_sec++;
batt_M5stick = M5.Axp.GetVbatData() * 1.1 / 1000; // 3.3-4.1V
ESP_sec = recvData[1];
batt_ESP01 =(float)(recvData[2]*0.1)-0.1; // 0.1およそ大きいので補正
M5.Lcd.setCursor(0, 25);
M5.Lcd.printf("M5_Count %3d",M5_sec);
M5.Lcd.setCursor(0, 50);
M5.Lcd.printf("M5stick_Batt %3.1f v ",batt_M5stick);
M5.Lcd.setCursor(0, 80);
M5.Lcd.printf("ESP01_Count %3d",ESP_sec);
M5.Lcd.setCursor(0,105);
M5.Lcd.printf("ESP-01_Batt %3.1f v ",batt_ESP01);
ms1000+=1000;
}
}
void setupESPNOW() {
WiFi.mode(WIFI_STA);
WiFi.disconnect();
esp_now_init();
esp_now_register_recv_cb(onRecv);
esp_now_peer_info_t peerInfo={};
memcpy(peerInfo.peer_addr, slaveAddress, 6);
peerInfo.channel = CHANNEL;
peerInfo.encrypt = false;
esp_now_add_peer(&peerInfo);
}
void onRecv(const uint8_t * mac, const uint8_t *on_RecvData, int len) {
for (int i=0; i<len; i++) recvData[i]=on_RecvData[i];
}
ESP-01のスケッチはこんな感じ
/////////////////////////////////////////////////////////////////////////////////////////
#include <ESP8266WiFi.h>
#include <espnow.h>
#define CHANNEL 0
#define LED 2
uint8_t slaveAddress[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
unsigned char recvData[100];
static int8_t sendData[100];
ADC_MODE(ADC_VCC);
unsigned long ms10,ms100,ms200,ms500,ms1000,ms2000;
int8_t Batt,Batt_old,count;
int LED_sw;
void setup() {
setupESPNOW();
pinMode(2,OUTPUT);
digitalWrite(2,LOW);
delay(2000);
digitalWrite(2,HIGH);
ms10=ms100=ms200=ms500=ms1000=ms2000=millis();
}
void loop() {
if (millis() > ms100){
LED_sw = recvData[0];
if( LED_sw == 1 ){
digitalWrite(LED,LOW);
}
else{
digitalWrite(LED,HIGH);
}
ms100+=100;
}
if (millis() > ms1000){
Batt = ESP.getVcc()*0.01;// 受信側でx0.1する
sendData[2] = Batt;
esp_now_send(slaveAddress, (uint8_t*)sendData, 100);
count++;
sendData[1] = count;
ms1000+=1000;
}
}
void setupESPNOW(){
WiFi.mode(WIFI_STA);
WiFi.disconnect();
esp_now_init();
esp_now_set_self_role(ESP_NOW_ROLE_COMBO);
esp_now_register_recv_cb(onRecv);
}
void onRecv(uint8_t* mac_addr, uint8_t* on_RecvData, uint8_t len) {
for (int i=0; i<len; i++) recvData[i] = on_RecvData[i];
}
貼り付けてから気付いた。
setupESPNOW() 同じのつもりだった...けど違う。。。
ろくにコメント入れないもんでちょっと時間経つと
なんでだっけ?になってしまう ちょっと確認しないと。
半年前のこと・・・すっかり忘れてる。
なんかいろいろやったんだけどな。。。
結局、M5StickCのスケッチを
ESP8266側のESPNOWと同じsetupESPNOW()にしたら・・・
esp_・・・3行だけ。 だと
ESPNOWは
M5StickCからESP-01への送信ができない。
ESP-01からM5StickCへの送信はできてる。
ESP32とESP8266ではちょっと使い勝手が違ってたとこあった気もする。
そもそものトラップになるのが
M5StickCでは espnow.h だけど ESP-01ではesp_now.h じゃないといけない。
ArduinoIDEでのボード選定がうまくいってないから?なのかもだけど...
以前、M5StickC Plus では M5StickC Plus が選べてた気がするけど
今はメニューから消えてる M5StickC しか選べない。 よくわからん。
他
BLE,ESPNOWのプログラムはでかいみたい。両方使えるようにしようとすると、
標準設定ではメモリが足りないって怒られる。
なのでOTAを外してやらんといかん。
小物ロボとかを小さい電池で、小さいマイコン(ESP-01)でRCやライントレース
やろうとしてる。
ここで気になるのが末端ロボの消費電力
特にラジコン?リモコン?で動かす時。
ESP01はBLEがないのでスマホで簡単に操作できるDabbleアプリが使えない。
WiFiは使えるけど必要以上に応答がよかったり使わない機能たっぷりで極端に消費電流が大きい。サーバー機能なんていらない。。。
条件で変わるけど、ざっと100mA近い電流消費の感じ。
てことで通信はESP01ならすごく低消費電力ESPNOWを使いたい。
使い方にもよるけど人の操作でついてこれる程度10Hzくらいなら平均にすると1mAも食わない感じ。。。
でもESPNOWとスマホ(操縦機)をうまくつなげれるアプリとかが見つけられない。
最近、気になってたRemoteXY、とってもいい感じなんだけどESPNOWは
使えない。(たぶん。)
で、力技で回りくどい通信になるけどやってみたのが今回の見出し。
・まず、スマホからの指令はBLEでM5StickCに送る。
これはこれでかなり低消費電力通信。
・次に、M5StickCからESP01へはESP01が対応してる、
低消費電力のESPNOWで送る。
*M5StickCは中継器としての役割で使う。
それぞれは双方向通信を行う。
ちょっと気になってたのはM5StickCがBLEとESPNOWを一緒に使えるのか?
ってとこだった。できるっぽいけどネット検索してもあまり情報がない。
やってみたらなんてことなかった。
どっちも2.4GHz帯でなんかハード上のおなじないとかせんと干渉したり
するのかなと思ったけど、単純に両方混ぜるだけであっけなく動いてしまった。
M5StickC、よくできてるなぁ。
動かしてみたのがこちら。
スマホのボタン押した信号をBLEでM5StickCに送り、LED点灯(赤)。
M5StickCからはESPNOWでESP01に送ってESP01は受け取るとLED点灯(青)。
でもって、
ESP01からは3.3系電源(Lipo電池にSBDを通して0.3V落としてある)の電圧を
ADして、それと起動してからの秒カウンタ値をM5StickCにESPNOWで送信。
M5StickCはスマホに ESP01から受け取ったESP01の電圧、カウンタ値と、
M5StickCのLipo電池電圧を検出して2つの電圧とM5の起動してからのカウンタ値、
4つのデータをスマホに送信してる。
RemoteXYはI/Fの自由度がすごく高い。 BLEにしても接続確定が早い。
操作コントローラもいろんなのがある。
無料だと部品はあまり配置できないけどそこそこのことは済んでしまう。
でもこれなら有料の買ってもいいかもしれない。って気がしてきた。
ま、 これでESP01を低消費電力通信で使う目処がついたかなってところ。
スマホ(#RemoteXY) ⇐#BLE⇒ #M5StickC、
— しん (@shinichi_nin) 2023年2月16日
M5StickC ⇐#ESPNOW⇒ #ESP01
バケツリレー #双方向通信
スマホでESPNOWが使えるモノ、見つけれんので
M5StickCにBLEとESPNOWの中継器&通信モニタになって頂きました。
これでESP-01を低消費電力通信で使えます♪https://t.co/lKHDjPi6Y9 pic.twitter.com/Vre1pFeain
ESP-01で小モノロボの検討・・・で、
WiFi・・・RemoteXY使うと消費電力でかいなぁって思っていろいろ調べてた。
ネットにある情報の消費電力がなんか、、、?なところがあった。
消費、電流(電力)が簡単な処理でもなんか多いみたい。
無線通信の設定での影響とか消費電流これまで見てなかった。
どうやらESP-01、WiFiは使わなくてもデフォルトでは何かが裏で
動いてるらしい。
こちらのただLチカするだけのスケッチ、
動かすと、、、3.3Vで46mA (個体差はどんくらいあるかわからんけど)
void setup() {
pinMode(2,OUTPUT);
}
void loop() {
digitalWrite(2,LOW);
delay(1000);
digitalWrite(2,HIGH);
}
で、、、 WiFiを 明示的にOFFにしたのが下記スケッチ
#include <ESP8266WiFi.h>
void setup() {
pinMode(2,OUTPUT);
WiFi.disconnect();
WiFi.mode(WIFI_OFF);
WiFi.forceSleepBegin();
}
void loop() {
digitalWrite(2,LOW);
delay(1000);
digitalWrite(2,HIGH);
delay(1000);
}
動かしてびっくり、3.3Vで 約16mA !? すっごい減るじゃん...
これは小さいな電池で動かす時は効くぞ・・・
これってM5sticKC M5Stack でもそうなんじゃないかな。。。と思って
調べるとどうも同様らしい。
ESP-01 消費電力...
— しん (@shinichi_nin) 2023年2月12日
デフォルトではWiFiは使わなくても何かが裏で動いてるそうな。
以前の、ただLチカだけするように書いたスケッチでは、
3.3V、約46mA だった。
明示的にWiFi OFF にしてLチカすると
3.3V、約16mA 1/3に減った...#ESP01 #Arduino #WifiPresets https://t.co/OjuHtZZHwJ pic.twitter.com/HuiKIiND3I
Bluetooth、BLEとかってどうなんだろう。。。
M5でスマホと通信するなら普段はDabbleをよく使ってる。
とにかく簡単。 ただI/Fデザインは既定ののモノでしか使えない。
ちょっとした通信ではそこそこ使える。
よくある形のゲームコントローラ風で足りるならとっても簡単。。。
なんだけどやっぱしいくつもスライダ風の操作で調整したいってのがやっぱし多い。
Dabbleにもあることはあるんだけどチャンネル少なく使いづらい。
しばし前から気になってなのがRemoteXY。 https://remotexy.com/
有料版とかはBlynkより自由度が高いって感じ。
無料で使える分でもそこそこいけそう。
ESP32,ESP8266とかでは簡単に使えるみたいだけど
M5での使い方がよくわからない。
ま、でも小さいラジコンとか作るならM5じゃなくてESP32,ESP8266になりそうなので
ちょっとESP8266で使い勝手を試してみることにした。
ESP8266なのでBLEは使えない。WiFiになってしまう。
ESPNOWはまだ対応してない?っぽい
今までM5、ESP32でWiFiだと消費電力がすごくでかいって感じだけど
ESP8266でどんなもんかちゃんと見てない。のでそれも見てみた。
ESP-01のWiFi通信でボタン押しでのLチカのスケッチはこんだけ。
Dabbleよりは一見、意味不明なおまじないがけっこう増える。。。けどこれは
RemoteXYが自動で生成してくれるので手間はそんなに掛からない。
setup、loopでの実際の動作処理はとっても簡単。
動かしてたのがこんな感じ。
ちょっと前から気になってた、
— しん (@shinichi_nin) 2023年2月10日
自由なI/Fが簡単に作れる #RemoteXY、試してみた。
押しボタンだけの #WiFi 経由での #Lチカ。
簡単に使えるけどやっぱし消費電流がすごい。。。
3.3V、140mA...これではちんちんになってしまう
ESPNOWじゃないとつらいな...#ESP8266https://t.co/6CjOcuPjxG pic.twitter.com/I1G4bKQfT4
触ったらかなり熱い・・・
— しん (@shinichi_nin) 2023年2月10日
測ってみたら60度越え...
狭いとこに入れちゃうと冷やす工夫せんと
ダメだよなぁ#RemoteXY #ESP8266 #WiFi #Lチカ pic.twitter.com/lkAWS8zXKz