2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

長野高専Advent Calendar 2024

Day 16

ラジコン3分クッキング(ESP-NOWを用いた爆速通信構築)

Posted at

はじめに

本記事は、長野高専アドベントカレンダー2024 16日目の記事です。
https://qiita.com/advent-calendar/2024/nnct

この記事では、工嶺祭(学園祭)での出し物でつくったラジコンで、ESP-NOWという触れたことのない無線規格を使ったという話でもしようと思います。

自己紹介

普段はロボコン部で回路・制御などなどいろいろやってます。
昨年までの工嶺祭(学園祭)クラス企画では画像認識をやったりしてました。

経緯

ロボコンが一段落ついた(地区大会敗退)ため、クラス企画に力を入れることにしました。
今年は二人三脚ラジコンを作ろうという話になったので、その電装をやってみることにしました。
工嶺祭準備も大詰めというような時期に作り始めたので、即席でラジコンとコントローラーを組むことになりました。

こんな流れで爆速でラジコンを作ることになったので、その話を振り返ってみます。

構想

二人三脚=レバーを二人で操作してラジコンを動かすというものなので、レバーとラジコン間の通信のやり方などを考えました。

ラジコン側はたまたまESP32S3というマイコンの乗ったロボット用基板の設計データがあったので流用して作りました。
構成としてはESP32S3+モータードライバー+αとちょうどラジコンに適した基板だったので、そのまま仕組むことにしました。

コントローラー側はそのマイコンと遠隔通信することになるので、送信する手段の選定をしました。
ESP32S3のBluetoothは5.0でBluetoothSerialが使用できないので、ESPNOWというマイコン間無線通信ができる規格を使って実装することにしました。

コントローラーとラジコンの構成

コントローラーはバネで戻るレバーを作り、その角度をArduinoで読んでM5Atomに送り、ESP-NOWでラジコンに転送するという形の実装としました。
(M5Atom⋯ESP32で動く、ボタンとかLEDとかがまとまったモジュール)

ラジコンはESP32S3というマイコンが載っていて、ESP-NOWに対応しているのでその受信データを使ってモーターを駆動する形にしました。

実装

ESP-NOWをArduino環境(espressif公式)で使う場合、esp_now.hをインクルードして、起動時に初期化・コールバック関数指定のみ行えば最低限動作させられます。
実際のプログラムは見せられる完成度ではないため一部抜粋して紹介します。

受信側は以下のように書いて、espnow::init関数をsetup関数などから呼び出せば最低限受信できます。実際は、受信したASCII文字列から数値を起こしてモーター出力を調整するようにしました。

//インクルード
#include "WiFi.h"
#include "esp_now.h"

//初期化処理
namespace espnow{
    void onDataRecv(const uint8_t *mac, const uint8_t *buf, int len)
        {
//受信後の処理
        }
    
    void init(){
        WiFi.mode(WIFI_STA);
        if (esp_now_init() != ESP_OK)
        {
            Serial.println("[error] espnow init fail");
            return;
        }
        esp_now_register_recv_cb(wifi::onDataRecv);
    }
};

送信側は、送信先の指定が必要なので手間が若干増えますが、こちらも簡単に実装できます。
今回は、サクッと作りたかったのでブロードキャスト機能を使って無差別に送受信するようにしました。
このサンプルの場合、send関数を適当に呼べば勝手にデータが飛んでいきます。

//追加部分
namespace espnow{
//
esp_now_peer_info_t peerInfo;
    
    void init(){
        WiFi.mode(WIFI_STA);
        if (esp_now_init() != ESP_OK)
        {
            Serial.println("[error]espnow init fail");
            return;
        }
        memset(&peerInfo.peer_addr,0xFF,6);
        peerInfo.channel=0;
        peerInfo.encrypt=0;
        if(esp_now_add_peer(&peerInfo)!=ESP_OK){
            Serial.println("[error]espnow peer fail");
        }
    }
    void send(uint8_t *buf,uint8_t len){
    esp_now_send(peerInfo.peer_addr,buf,len);
    }
};

これらのコードを加えて適当に取り決めを作ってデータを送受信すれば無線化ができます。

ESP-NOWのまとめ

ESP-NOWはラフに無線通信をしたいときに使いやすいプロトコルです。
単純にシリアル通信を無線化しているような使い勝手なので、シリアル通信で有線接続していた部分の置き換えにちょうど良さそうです。
また、BluetoothやWifiと違ってペアリング処理が省けるのも楽な点です。

上記の実装では同じチャンネルで違う通信が行われていた際に問題が起きますが、自分が使った際には学園祭程度の規模で他に使っている人がいなかったので特に問題は置きませんでした。

もう少しまともに実装すればMACアドレスで絞り込み等を行えるので、大会のような信頼性を求める場面でなければかなり開発の手間を省けると思います。

さいごに

この規格を使ったことで、ラジコンの無線化実装は数十分だけで済みました。
また、ペアリングなどの煩雑な作業がなく当日のメンテナンスなしに安定稼働させることができました。

先人の知恵に感謝しつつ、無線で動かすちょっとした工作にまた使ってみたいと思います。

以上、お読みいただきありがとうございました。

2
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?