question 发表于 2022-9-7 11:01:35

eps32c3 espnow 实现航模遥控

espnow 简介:
      ESP-NOW 是由乐鑫开发的另一款协议,可以使多个设备在没有或不使用 Wi-Fi 的情况下进行通信。这种协议类似常见于无线鼠标中的低功耗 2.4GHz 无线连接——设备在进行通信之前要进行配对。配对之后,设备之间的连接是持续的、点对点的,并且不需要握手协议。




遥控代码
#include <WiFi.h>
#include <esp_now.h>

// 引脚编号
#define ADC00
#define ADC11
#define ADC22
#define ADC33
#define ADC44
#define ADC55

#define IO66
#define IO77
#define IO88
#define IO99
#define IO1010
#define IO2020
#define IO2121



// 设置数据结构体
//5 adc 8io
typedef struct struct_message
{
double adc0;
double adc1;
double adc2;
double adc3;
double adc4;
double adc5;
bool io6;
bool io7;
bool io8;
bool io9;
bool io10;
bool io20;
bool io21;
//String board_name;
} struct_message;

struct_message myData;

// 接收机设备的 MAC 地址
uint8_t broadcastAddress[] = {0x84, 0xf7, 0x03, 0xbd, 0x15,0xd8};


// 数据发送回调函数
void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
char macStr;
//Serial.print("Packet to: ");
snprintf(macStr, sizeof(macStr), "%02x:%02x:%02x:%02x:%02x:%02x",
         mac_addr, mac_addr, mac_addr, mac_addr, mac_addr, mac_addr);
         /*
Serial.println(macStr);
Serial.print("Send status: ");
Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
Serial.println();
*/
}

void setup() {
Serial.begin(115200);

// 初始化 ESP-NOW
WiFi.mode(WIFI_STA);
if (esp_now_init() != ESP_OK) {
    Serial.println("Error initializing ESP-NOW");
    return;
}
    Serial.print("STA MAC: "); Serial.println(WiFi.macAddress());

// 设置发送数据回调函数
esp_now_register_send_cb(OnDataSent);

// 绑定数据接收端
esp_now_peer_info_t peerInfo;
memcpy(peerInfo.peer_addr, broadcastAddress, 6);
peerInfo.channel = 0;
peerInfo.encrypt = false;
//peerInfo.retransmit_count=0;

// 检查设备是否配对成功
if (esp_now_add_peer(&peerInfo) != ESP_OK) {
    Serial.println("Failed to add peer");
    return;
}
pinMode(IO6 , INPUT_PULLUP);
pinMode(IO7, INPUT_PULLUP);
pinMode(IO8 , INPUT_PULLUP);
pinMode(IO9 , INPUT_PULLUP);
pinMode(IO10 , INPUT_PULLUP);
pinMode(IO20 , INPUT_PULLUP);
pinMode(IO21 , INPUT_PULLUP);
}

void loop() {
// 设置要发送的数据
//myData.board_name = "Fat Donkey";

myData.adc0 = analogRead(ADC0);

myData.adc1 = analogRead(ADC1);
myData.adc2 = analogRead(ADC2);
myData.adc3 = analogRead(ADC3);
myData.adc4 = analogRead(ADC4);
myData.adc5 = analogRead(ADC5);
myData.io6 = digitalRead(IO6);
myData.io7 = digitalRead(IO7);
myData.io8 = digitalRead(IO8);
myData.io9 = digitalRead(IO9);
myData.io10 = digitalRead(IO10);
myData.io20 = digitalRead(IO20);
myData.io21 = digitalRead(IO21);






// 发送数据
esp_err_t result = esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));

// 检查数据是否发送成功
if (result == ESP_OK) {
    //Serial.println("Sent with success");
}
else {
    //Serial.println("Error sending the data");
}

//delay(100);
}
接收机代码


#include <WiFi.h>
#include <esp_now.h>

#if !defined( ARDUINO_ESP32C3_DEV )
#error This code is intended to run on the ESP32_C3 platform! Please check your Tools->Board setting.
#endif

#define TIMER_INTERRUPT_DEBUG       -1
#define ISR_SERVO_DEBUG             -1

// Select different ESP32 timer number (0-1) to avoid conflict
#define USE_ESP32_TIMER_NO          1
#include "ESP32_C3_ISR_Servo.h"

// 引脚编号
#define ADC00
#define ADC11
#define ADC22
#define ADC33
#define ADC44
#define ADC55

#define IO66
#define IO77
#define IO88
#define IO99
#define IO1010
#define IO2020
#define IO2121



// 设置数据结构体
//5 adc 8io
typedef struct struct_message
{
double adc0;
double adc1;
double adc2;
double adc3;
double adc4;
double adc5;
bool io6;
bool io7;
bool io8;
bool io9;
bool io10;
bool io20;
bool io21;
//String board_name;
} struct_message;
struct_message myData;

// Published values for SG90 servos; adjust if needed
#define MIN_MICROS      800//544
#define MAX_MICROS      2450

int servoIndex0= -1;
int servoIndex1= -1;
int servoIndex2 = -1;
int servoIndex3= -1;
int servoIndex4= -1;
int servoIndex5= -1;


// 数据接收回调函数
void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) {
memcpy(&myData, incomingData, sizeof(myData));
//Serial.print("board_name: ");
//Serial.println(myData.board_name);
int pulseWidth=0;

pulseWidth=map(myData.adc0,0,4095,MIN_MICROS,MAX_MICROS);
ESP32_ISR_Servos.setPulseWidth(servoIndex0, pulseWidth);
pulseWidth=map(myData.adc1,0,4095,MIN_MICROS,MAX_MICROS);
ESP32_ISR_Servos.setPulseWidth(servoIndex1, pulseWidth);
pulseWidth=map(myData.adc2,0,4095,MIN_MICROS,MAX_MICROS);
ESP32_ISR_Servos.setPulseWidth(servoIndex2, pulseWidth);
pulseWidth=map(myData.adc3,0,4095,MIN_MICROS,MAX_MICROS);
ESP32_ISR_Servos.setPulseWidth(servoIndex3, pulseWidth);
pulseWidth=map(myData.adc4,0,4095,MIN_MICROS,MAX_MICROS);
ESP32_ISR_Servos.setPulseWidth(servoIndex4, pulseWidth);
pulseWidth=map(myData.adc5,0,4095,MIN_MICROS,MAX_MICROS);
ESP32_ISR_Servos.setPulseWidth(servoIndex5, pulseWidth);

digitalWrite(IO6,myData.io6);

digitalWrite(IO7,myData.io7);
digitalWrite(IO8,myData.io8);
digitalWrite(IO9,myData.io9);
digitalWrite(IO10,myData.io10);
digitalWrite(IO20,myData.io20);
digitalWrite(IO21,myData.io21);


}

void setup() {
Serial.begin(115200);

// 初始化 ESP-NOW
WiFi.mode(WIFI_STA);
if (esp_now_init() != 0) {
    Serial.println("Error initializing ESP-NOW");
    return;
}
    Serial.print("STA MAC: "); Serial.println(WiFi.macAddress());
// 设置接收数据回调函数
esp_now_register_recv_cb(OnDataRecv);

ESP32_ISR_Servos.useTimer(USE_ESP32_TIMER_NO);

servoIndex0 = ESP32_ISR_Servos.setupServo(ADC0, MIN_MICROS, MAX_MICROS);
servoIndex1 = ESP32_ISR_Servos.setupServo(ADC1, MIN_MICROS, MAX_MICROS);
servoIndex2 = ESP32_ISR_Servos.setupServo(ADC2, MIN_MICROS, MAX_MICROS);
servoIndex3 = ESP32_ISR_Servos.setupServo(ADC3, MIN_MICROS, MAX_MICROS);
servoIndex4 = ESP32_ISR_Servos.setupServo(ADC4, MIN_MICROS, MAX_MICROS);
servoIndex5 = ESP32_ISR_Servos.setupServo(ADC5, MIN_MICROS, MAX_MICROS);


pinMode(IO6 , OUTPUT);
pinMode(IO7, OUTPUT);
pinMode(IO8 , OUTPUT);
pinMode(IO9 , OUTPUT);
pinMode(IO10 , OUTPUT);
pinMode(IO20 , OUTPUT);
pinMode(IO21 , OUTPUT);


}

void loop() {
   
//ESP32_ISR_Servos.setPosition(servoIndex1, position);
//setPulseWidth(servoIndex1, uint16_t& pulseWidth);
}

性能测试
通过示波器在遥控和接收机做了延时测试


小结
arduino主要还是方便,估计也是espnow刚出库没完全更新,测试下来延时比较高,保持关注吧,如果对延时有需求可以考虑下用espidf来试试

yoyojacky 发表于 2022-9-7 16:52:41

老黄出品,必属精品! 先赞为敬!

sky007 发表于 2023-8-10 13:48:55

有micropython测试代码么;)

花生编程 发表于 2023-8-23 21:48:00

厉害厉害

花生编程 发表于 2023-8-23 21:49:02

不错不错!

三春牛-创客 发表于 2023-8-24 14:22:51

厉害厉害

三春牛-创客 发表于 2023-8-24 14:23:56

有没有演示视频看?
页: [1]
查看完整版本: eps32c3 espnow 实现航模遥控