ESP-NOWによるESP32C3の1対1通信でDCモータやサーボをリモートコントロールしてみた
ESP-NOWはESP系マイコン同士の通信方法で,MACアドレスを使って1対1、1対多などの無線通信ができます。→ ESP系マイコン同士のお手軽な無線通信ESP-NOWを試してみた今回はESP-NOWをESP32C3の1対1通信で使い,実際にDCモータやR/Cサーボをリモートコントロールしてみました。試作のシステムです。送受信ともにXIAO ESP32C3 を使っています。送信側の装置です。・MCU:Seeed Studio XIAO ESP32-C3・アナログ・デジタル入力 A0, A1:DCモータ値 アナログ入力(12bit) A2:R/Cサーボ値 アナログ入力(12bit) D8, D9, D10:タクトスイッチ値 デジタル入力受信側の装置です。・MCU:Seeed Studio XIAO ESP32-C3・DC ギアードモータ D0, D1:モータ1 ドライバを介しての pwm 制御 D2, D3:モータ2 ドライバを介しての pwm 制御・R/Cサーボ I2Cによるサーボドライバ(自作ATtiny1604)を介しての 制御・LED D8, D9, D10:デジタル出力実際の動作の短い(^^;;;動画です。思ったより機敏に動いてくれて,内心満足しています(^^)。今回は小さいMCUに主に入出力ともに直付けでコントロールの種類が少ないですね。これはI2Cとか使えば拡張できますし,ま,素直に入出力ピン数の多いMCUを使うというのもアリですね。せっかく動いたので送受信のプログラムもメモしておきます。送信側のプログラムです。/* XIAO_ESP32C3 ESP-NOW Sender Code test1 */#include <WiFi.h>#include <esp_now.h>// Set Receiver_Address (MAC Address)uint8_t Receiver_Address[] = {0x58, 0x8c, 0x81, 0x--, 0x--, 0x--};// Create a struct_message called myDatatypedef struct { int m1; int m2; int s1; byte red; byte green; byte blue;} struct_message;struct_message myData;// create peer_infoesp_now_peer_info_t peerInfo;// callback function will be executed when data is sentvoid OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) { Serial.print("\r\nLast Packet Send Status:\t"); Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");}void setup() { pinMode(8, INPUT); pinMode(9, INPUT); pinMode(10,INPUT); // Initialize Serial Serial.begin(115200); // Set device as Wi-Fi Station mode WiFi.mode(WIFI_STA); // Init ESP-NOW if (esp_now_init() != ESP_OK) { Serial.println("Error initializing ESP-NOW"); return; } // Set a callback_function that will be executed when data is sent esp_now_register_send_cb(OnDataSent); // Set peer_Info memcpy(peerInfo.peer_addr, Receiver_Address, 6); // Set receiver address peerInfo.channel = 0; // Set channel 0 peerInfo.encrypt = false; // No encryption if (esp_now_add_peer(&peerInfo) != ESP_OK){ // add peer node and Error check Serial.println("Failed to add peer"); return; }} // setup endvoid loop() { // Insert test_data into myData // Read Analog data (12bit) and Button switch myData.m1 = analogRead(A0); myData.m2 = analogRead(A1); myData.s1 = analogRead(A2); myData.red = digitalRead(8); myData.green = digitalRead(9); myData.blue = digitalRead(10); // Send data esp_now_send(Receiver_Address, (uint8_t *) &myData, sizeof(myData)); delay(100);} // loop end 受信側のプログラムです。/* XIAO_ESP32C3 Receiver Code test1 */// ESP-NOW#include <WiFi.h>#include <esp_now.h>// I2C Target Slave_Address 6 for R/C servo#include <Wire.h>#define slave_Address 6//#include <ESP32PWM.h>//ESP32PWM pwm;// Create a struct_message called myDatatypedef struct { int m1; int m2; int s1; byte red; byte green; byte blue;} struct_message;struct_message myData;// callback function will be executed when data is receivedvoid OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) { memcpy(&myData, incomingData, sizeof(myData)); Serial.print("Bytes received: "); Serial.println(len); Serial.print("m1m2s1: "); Serial.print(myData.m1); Serial.print(", "); Serial.print(myData.m2); Serial.print(", "); Serial.println(myData.s1); Serial.print (myData.red); Serial.print (myData.green); Serial.println (myData.blue); // DC motor1 int mv=map(myData.m1, 0, 4095, -255, 255); if (mv < 0){ analogWrite(2, 0); analogWrite(3, (byte)-mv); }else{ analogWrite(2, (byte)mv); analogWrite(3, 0); } // DC motor2 mv=map(myData.m2, 0, 4095, -255, 255); if (mv < 0){ analogWrite(4, 0); analogWrite(5, (byte)-mv); }else{ analogWrite(4, (byte)mv); analogWrite(5, 0); } // R/C Servo (via I2C driver) Wire.beginTransmission(slave_Address); Wire.write(1); // servo number Wire.write((byte)(myData.s1 & 0x00FF)); // Low byte Wire.write((byte)(myData.s1 >> 8)); // High byte Wire.endTransmission(); delay(20); // Color LED digitalWrite(8,myData.red); digitalWrite(9,myData.green); digitalWrite(10,myData.blue);}void setup() { // Initialize Serial Serial.begin(115200); // Initialize I2C Wire.begin(); // Initialize output_Pin for (byte i = 2; i <6; i++){ // pwm pinMode(i, OUTPUT); } for (byte i = 8; i <11; i++){ // LED pinMode(i, OUTPUT); } // Set device as Wi-Fi Station mode WiFi.mode(WIFI_STA); // Init ESP-NOW if (esp_now_init() != ESP_OK) { Serial.println("Error initializing ESP-NOW"); return; } // Set a callback_function that will be executed when data is received esp_now_register_recv_cb(OnDataRecv);} // setup end void loop() {} // loop end