n_shinichi’s blog

日々の備忘録、 趣味のあれこれなど紹介

MENU

ESPNOWでリモコン? ラジコン? M5stickCのIMUで直感操縦 その2

ESPNOWの使い方がだいぶわかってきたので

M5stickの倒立振子ロボと組み合わせてみた。

 

2つのM5stickくん、 1台は操縦用TXくん(左)、

もう1台は受信用 倒立ロボRXくん(右)

ものはほとんど同じ。中身のスケッチもほぼ同じ・・・

自分でも間違う...一応表示1行目に名前を出してるけど。

まずはヨー回転の送信部を作ってみた。

 

TXくんには送信用のスケッチ

あたまに、

// ESPNOW /////////////////////////////////////////////////////////////////////
#include <esp_now.h>
#include <WiFi.h>
uint8_t slaveAddress[] = {マックアドレス }; 
uint8_t data_0,data_1,data_2,data_3,data_4;
// ESPNOW /////////////////////////////////////////////////////////////////////

 

せっとあっぷに、

// 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 /////////////////////////////////////////////////////////////////////

 

るーぷに、

// ESPNOW /////////////////////////////////////////////////////////////////////
        data_0 = -varAng*0;  //前後進はまだ。
        data_1 = (uint8_t)(yawAng*0.1);  // LSB:10deg 
        uint8_t data[5] = {data_0,data_1,0,0,0}; 
        esp_now_send(slaveAddress, data, sizeof(data));        
// ESPNOW /////////////////////////////////////////////////////////////////////

追加したのはこれだけ。

 

でもって、RXくんには受信用のスケッチ

あたまに、

// ESPNOW /////////////////////////////////////////////////////////////////////
#include <WiFi.h>
#include <esp_now.h>
int i,esp_now[5],yawAng_RX;
void onReceive(const uint8_t* mac_addr, const uint8_t* data, int data_len) {
    for (i=0; i<=4; i++) esp_now[i] = (int8_t)data[i];
}
// ESPNOW /////////////////////////////////////////////////////////////////////

 

せっとあっぷに、

// ESPNOW /////////////////////////////////////////////////////////////////////
    WiFi.mode(WIFI_STA);
    WiFi.disconnect();
    esp_now_init();
    esp_now_register_recv_cb(onReceive);
// ESPNOW /////////////////////////////////////////////////////////////////////

 

るーぷに、

// ESPNOW /////////////////////////////////////////////////////////////////////
    Kspin = esp_now[1]*10.0;
// ESPNOW /////////////////////////////////////////////////////////////////////  

 

こんだけ。

 

動かしたときの様子はこんな感じ

まだヨー角信号だけ、回転動作のみ送信。

ESPNOW使ってみて・・・

スケッチの設定はBlynkよりちょいと多い。

Blynkよりはるかに高速。

消費電力はどうなんだろう。

使い方

 

ちょっとシンクロして動いてるっぽい。

これなら小さな子にも特に説明なく、

ちょいと動かしてるとこ見せるだけでそこそこ遊べるかも。。。

 

次は前後進を実装してみる。。。

ESPNOWでリモコン M5stickCのIMUで直感操縦 準備。

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と比べたら書くことちょいと多いくらい。。。

 

一応、い感じで送れてる。

www.youtube.com

 

 

スマホの傾きで M5stickくんの操縦検討・・・ BLEリモコン

Blynkを使うとスマホの状態等々をBLEでマイコンなど、

M5にも送受信できる。

 

これまでBlynkで リモコン? ラジコン? で

M5stickくんを操縦できるようにしてみた。。。けど

 いまいちだった... の覚え。

 

せっかくスマホのIMU、Gセンサ値なんかも送信できるので

操作の理屈をほとんどすることなくほぼ説明不要で

誰でも小さな子供でも楽しみながらリモートコントロールとか

できるんじゃないか・・・

直感で操縦する感じにしたらゲーム的に使えるんじゃなかろうかと思い

ちょっと試してみた。

 

ひとまず信号は V10 に設定

 

スマホのBlynk設定はこれだけ。とっても簡単...

パラメータも信号番号 V10 と サンプリング時間設定だけ。

 

Gセンサの値は±10の範囲で送信されてくる。
顔の上の数値、

X値が左右の傾き値 右に向けると+

Y値が前後の傾き値 手前に向けるとー 奥、向こうへ傾けると+

www.youtube.com

で、、、この時点では、

スマホの傾きでリモートコントロール行けると思った。

 

その値で動かすよう実装してみたら・・・・

全く倒立ができない!!!

 

よくよく通信の時間を調べたら、

Gの取得、Blink_write関数が異常に時間がかかってる!

一定ではなくてバラつくけど0.1秒程度はある。

 

さすがにそんなに長い時間倒立制御が止まってると立ってられない・・・

 

ほかのスライダや、ボタン、ジョイスティック入力とかはmsオーダーで

値が取得できるのに不思議。

ネットで調べても通信データ取得時間についてはよくわからんかったので

深みにはまりそうなので中止。。。

 

もちろん、、、これは倒立振子みたいにリアルタイムで制御が必要な場合だけで

 ふつう?のリモコンカーみたいなのを作るにはほぼ影響ないです。

 

M5stickくんの場合、制御周期は遅くして辛抱できるのは

 だいたい50Hzくらいまで。ロバスト性はだいぶ悪くなってくるけど。

 

それでも、背の高い30cmくらいの倒立ロボならだいぶ制御周期落とせるので

 いけるかもしれない。

 

 

 

扇風機の修理  コンデンサー無理やり容量合わせて復活♪

今年、扇風機が急に回転の低下が目立ってきた。

製造は2012年  トヨトミの足踏みスイッチ型

1台買って家族に評判良くて2台買った。

最近は足踏みSWタイプってない気がする。

 

10年・・・たいていこの手のコンデンサー進相式のモノは

コンデンサーがフィルムなので寿命で容量が落ちてきて

進相が正しくできなくてちゃんと回らなくなってくるのが定番。

 

後ろのカバーを外すとこんな感じ。

 

コンデンサーは250v耐圧の2.5μF±5%品

 

ちょんぎって容量測ってみると・・・2μF  やっぱり。。 0.5μ低下。

20%小さくなってる これだと影響がだいぶ出る。

 

適当にガラクタからジャンク部品探してみるとなんとか容量分はそろった。

250V、1μFが2個。

630V、0.1μFが5個あった。

全部合計で2.5μF 耐圧はオーバースペック。

束ねて・・・

 

ハンダ付けして容量測ってみると、 2.487μF 0.013μF足りない・・・けど、 

誤差はわずか0.5%  おりじなるが±5%でOKなら上出来♪

 

扇風機に取り付け。

ちょっと不格好。。。

 

無事、復活しました♪

あれ、こんなに新品の頃は元気な扇風機なんだっけって感じです。

コンデンサー進相型の扇風機で調子が悪くなって・・・って時

10年ほど経ってるならまずはコンデンサーを疑ってみるといいです。

 

それの比べると遅相型・・・くまどりコイル型は

よほど壊れることはないですね。太い線1ターンついてるだけって感じ

で寿命がくるところない。。。 その代わり効率が悪いですが。

 

DMC変形ロボ

うちの会社のものづくりサークルDMCの変形ロボ

手足を折りたたんで顔?頭?の中に格納できます。

 

うちのサークルの3Dプリンタ先生にデータ頂いて造形。

3Dプリンタならではのものづくり

データは頭、胴体、足、顔が格納された状態での一発造形

造形後に胴、手、足がヒンジになってて引き出せる。

 

標準サイズは動く工作モノに使うには

ちょっと大きいので1/2の作ってみたけど

うちの格安中華プリンタでは限界だった。

 

大きい方が標準サイズ3cm四方位。

小さい方が1/2サイズ品・・・これが1発造形で胴、手、足が既に入ってる。

 

 

胴、手、足を引き出したところ



ゆらゆらソーラーの回路で作ったモータの回転速度

ゆらゆらソーラーの回路、スイッチング周波数は上限が5Hz・・・

 

なりゆき同期しかされない。

なるほど、ロータの磁石個数をいろいろ変えても回転速度は

たいていは100rpm、150rpm、200rpmの3パターンになるわけだ。

 

磁石2個が一番無駄?がない。

5Hz・・・0.2secごとに180度回転となる

スイッチングなので1回転に0.4sec。・・・1分間では150rpm。

www.youtube.com

 

磁石3個が一番高回転の200rpmで安定しやすい

磁石1個飛ばして240度を0.2secで回る。

結果1回転は0.3secで回れることになって 60/0.3・・・200rpm。

www.youtube.com

 

磁石4個の場合は1回磁石が飛ばされて使われない。

結局磁石2個と同じ150rpmで安定しやすい。

www.youtube.com

ただ起動時はどっかの磁石がコイルの近くにいる確率?が上がって

自動起動しやすい。

でも自動起動だと、90度分で5Hzスイッチングと同期しちゃうと、、、

1回転に4回スイッチング、 0.8sec掛かることになり、その結果...

1分間では 60/0.8=75rpmになっちゃう時もある。

 

磁石6個の場合はいい感じで回る時は磁石2個と同じ関係で

150rpmで安定する場合が多い

www.youtube.com

でも120度で同期して安定しちゃうと100rpm

www.youtube.com

6極でも240度で安定同期が取れそうなもんなんだけどなかなかうまくいかない。。。

 

ゆらゆらソーラー ・・・マイクロパワーモジュールの調査その2 〔電圧波形〕

もうちょいゆらゆらソーラーの回路動作をいろいろ調べてみた。

えらいよくできた回路なので

なんかだんだん他社製品調査で、リバースエンジニアリングやるのと

同じ感じになってきて面白くなってきた...

 

基本的な動作は磁極が近づいてきたら誘導電圧を検出して、

電圧が一旦下がって上がるとスイッチングパルスが発生といった感じ。

標準?のコイル磁極方向はN極ができる動作。

 

なので磁石の向きによって力の発生するタイミングが違ってくる。

 

S極をコイルに向けて150rpmで回転させた時のコイルの誘導電圧はこんな感じ


なのでこの状態で回路を接続すると磁石とコイルが交差する直前に吸引力が働いて

回そうとすることになる。

 

2極ロータ、S極コイル対向仕様での動作

磁石がコイルと交差する直前に引力で回す

www.youtube.com

 

2極ロータ、N極コイル対向仕様での動作

磁石がコイルと交差した後、斥力で回す。
電圧が微妙に高い状態でスイッチングするので消費電力が大きく、

太陽電池の電圧が下がってる。

www.youtube.com