n_shinichi’s blog

日々の備忘録、 趣味のあれこれなど紹介 (すみません、メニュー、リンク、カテゴリー分けがうまくできてません、★記事一覧★で見てください...) NHK魔改造の夜ではDンソーのベテランアドバイザーってことで出ました♪

MENU

ミクちゃんカー フレームをモータが乗るように改造

 

ミクちゃんカーのタイヤ、車軸をモータに換装していきます。

 

素のままモータ置くと位置が高くてタイヤが床に届かないので

削り込みます・・・

 

削って。。。

 

こんな感じかな。。。

 

モータの収まり的にはこんな感じでいけるかな。

 

 

RemoteXY 使って ちょっとコントローラっぽいやつで モータ動かしてみた。

コントローラアプリの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個を操作してみたのが

こちら。 こんだけのモノをうまくミクちゃんカーに入れたら、

まずはリモコンミクちゃんカーができる。はず。

  簡単には入らないけど・・・

 

 

 

 

ミニフィグ倒立振子ロボの前に小物ロボ製作の練習

ミニフィグのセグウェイ倒立振子ロボを作ってみたら・・・って

 話が出ていろいろ検討してみると思った以上に難しい。

 

Diorama111さんのクラウン1/150見てあんなの作ってみたいなと思って

 もーちょい小さいスバル360買ってみたらチョー小さい。

 これはちょっと小道具作らんと、すぐにできるもんじゃないことは

 よくわかった。

 

小さいロボモノ製作するには段階を踏んで

 だんだん小さいのにするかなってことにした。

  でミニカー辺りでなんかいい素材ないかなって見ていたら

  カミさんがミクちゃんでやってみてよ♪ から、

  ミクちゃんカー ロボ?製作が始まった。

  娘らもこれなら喜ぶよってことで。

  ラジコン、リモコン? ライントレーサーにもしていこうと思う。

 

ミクちゃんカーに入れたいと思う部品はこんな感じ


ミクちゃんカー分解してみたのがこちら。

ミクちゃんサイズに似合わずかなり重い。

 同じくらいのチョロQの10倍くらいあるかな。。。

シャーシーはほぼプラスチックだけど、

ボディーはやっぱりトミカだけあってほぼ亜鉛合金。

今はアルミもあるらしいけど重さの感じからすると亜鉛合金っぽい...

 

入れたい部品と中身を並べるたのがこちら。

外観からしたらまぁ入るかなと思ってたけど、かなり空間は狭い。

 鉄ボディーがとにかく分厚い。鉄だから簡単に削るわけにもいかない。

 これがプラスチックボディで10gないくらいなら・・・以前やった、、、

 小さいステッピングモータをマイコンのポート直叩きでいけたんだっけど

 とてもポート電流でのトルクでは動きそうにない。

 なのでモータドライバ使用することにした。

 

見た感じ、ボディの内側は思ったより狭いのでモータドライバICはそのまんまじゃ

 入りそうにない。基板から外して別途配線つけるって方法になりそう。

 

モータドライバもBL113ならいくらか小さいけどポートがたくさんいる。。。

  マイコンの足からリード出すのは手間なので今回はI2Cドライバ

  使うことにした。これならポート2本なんで楽。

   ちょっとIC、DRV8830は大きいけど。これももっと小さいパッケージが

   あるけど今回はこちらの足が大きいやつで後々は基板からIC外して配線

   してみようかと思う。

  

 

でもって、まずは・・・

 ESP-01が無線使えて小さいのでいいかなってとこで使い始めたけど

 WiFiはとても消費電力大きくて使う気にならない。

 ボディに押し込んだら過熱保護で止まるかその前に、電池が切れるか。。。

  ってなりそうなので。ESPNOW使うことにした。

操作する側・・・ESPNOWだと

  M5とかがまずは簡単だけどやっぱり何かと不便。

誰でも持ってるスマホで行けるってのがいい。

 で、RemoteXYが使いやすいのがわかったんで使いたいとこだけど

 あまり一般的ではないESPNOWは対応してないっぽい。

なもんで間にM5StickCの中継入れてやってみることにした。

 

 とりあえず、簡単なLチカ風にモータチカやってみたのがこちら。

 

 

 

Arduinoスケッチのおぼえ。 スマホ(RemoteXY) ⇐BLE⇒ M5StickC ⇐ESPNOW⇒ ESP-01 

一応動かしてたスケッチのおぼえ。

他のスケッチの流用なのでゴミが入っててバグもあるかと思うけど・・・

/////////////////////////////////////////////////////////////////////////////

//
//  スマホに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を外してやらんといかん。

 

 

 

 

 

 

スマホ(RemoteXY) ⇐BLE⇒ M5StickC ⇐ESPNOW⇒ ESP-01 回りくどい通信やってみた

小物ロボとかを小さい電池で、小さいマイコン(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を低消費電力通信で使う目処がついたかなってところ。

 

 

 

 

 

消費電力、WiFiは使わないなら明示的にOFFにした方がよさそう。 ESP-01

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 でもそうなんじゃないかな。。。と思って

調べるとどうも同様らしい。

 

Bluetooth、BLEとかってどうなんだろう。。。

 

 

 

自由なI/Fが作れるって評判のいいRemoteXY 試してみた...  やっぱしWiFiは消費電力が大きいよなぁ

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での実際の動作処理はとっても簡単。

 

動かしてたのがこんな感じ。