2640浏览
查看: 2640|回复: 6

[ESP8266/ESP32] eps32c3 espnow 实现航模遥控

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




遥控代码

  1. #include <WiFi.h>
  2. #include <esp_now.h>
  3. // 引脚编号
  4. #define ADC0  0
  5. #define ADC1  1
  6. #define ADC2  2
  7. #define ADC3  3
  8. #define ADC4  4
  9. #define ADC5  5
  10. #define IO6  6
  11. #define IO7  7
  12. #define IO8  8
  13. #define IO9  9
  14. #define IO10  10
  15. #define IO20  20
  16. #define IO21  21
  17. // 设置数据结构体
  18. //5 adc 8io
  19. typedef struct struct_message
  20. {
  21.   double adc0;
  22.   double adc1;
  23.   double adc2;
  24.   double adc3;
  25.   double adc4;
  26.   double adc5;
  27.   bool io6;
  28.   bool io7;
  29.   bool io8;
  30.   bool io9;
  31.   bool io10;
  32.   bool io20;
  33.   bool io21;
  34.   //String board_name;
  35. } struct_message;
  36. struct_message myData;
  37. // 接收机设备的 MAC 地址
  38. uint8_t broadcastAddress[] = {0x84, 0xf7, 0x03, 0xbd, 0x15,0xd8};
  39. // 数据发送回调函数
  40. void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
  41.   char macStr[18];
  42.   //Serial.print("Packet to: ");
  43.   snprintf(macStr, sizeof(macStr), "%02x:%02x:%02x:%02x:%02x:%02x",
  44.            mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
  45.            /*
  46.   Serial.println(macStr);
  47.   Serial.print("Send status: ");
  48.   Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
  49.   Serial.println();
  50.   */
  51. }
  52. void setup() {
  53.   Serial.begin(115200);
  54.   // 初始化 ESP-NOW
  55.   WiFi.mode(WIFI_STA);
  56.   if (esp_now_init() != ESP_OK) {
  57.     Serial.println("Error initializing ESP-NOW");
  58.     return;
  59.   }
  60.     Serial.print("STA MAC: "); Serial.println(WiFi.macAddress());
  61.   // 设置发送数据回调函数
  62.   esp_now_register_send_cb(OnDataSent);
  63.   // 绑定数据接收端
  64.   esp_now_peer_info_t peerInfo;
  65.   memcpy(peerInfo.peer_addr, broadcastAddress, 6);
  66.   peerInfo.channel = 0;
  67.   peerInfo.encrypt = false;
  68.   //peerInfo.retransmit_count=0;
  69.   // 检查设备是否配对成功
  70.   if (esp_now_add_peer(&peerInfo) != ESP_OK) {
  71.     Serial.println("Failed to add peer");
  72.     return;
  73.   }
  74.   pinMode(IO6 , INPUT_PULLUP);
  75.   pinMode(IO7, INPUT_PULLUP);
  76.   pinMode(IO8 , INPUT_PULLUP);
  77.   pinMode(IO9 , INPUT_PULLUP);
  78.   pinMode(IO10 , INPUT_PULLUP);
  79.   pinMode(IO20 , INPUT_PULLUP);
  80.   pinMode(IO21 , INPUT_PULLUP);
  81. }
  82. void loop() {
  83.   // 设置要发送的数据
  84.   //myData.board_name = "Fat Donkey";
  85.   
  86.   myData.adc0 = analogRead(ADC0);
  87.   
  88.   myData.adc1 = analogRead(ADC1);
  89.   myData.adc2 = analogRead(ADC2);
  90.   myData.adc3 = analogRead(ADC3);
  91.   myData.adc4 = analogRead(ADC4);
  92.   myData.adc5 = analogRead(ADC5);
  93.   myData.io6 = digitalRead(IO6);
  94.   myData.io7 = digitalRead(IO7);
  95.   myData.io8 = digitalRead(IO8);
  96.   myData.io9 = digitalRead(IO9);
  97.   myData.io10 = digitalRead(IO10);
  98.   myData.io20 = digitalRead(IO20);
  99.   myData.io21 = digitalRead(IO21);
  100.   
  101.   
  102.   
  103.   
  104.   
  105.   // 发送数据
  106.   esp_err_t result = esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));
  107.   // 检查数据是否发送成功
  108.   if (result == ESP_OK) {
  109.     //Serial.println("Sent with success");
  110.   }
  111.   else {
  112.     //Serial.println("Error sending the data");
  113.   }
  114.   //delay(100);
  115. }
复制代码

接收机代码


  1. #include <WiFi.h>
  2. #include <esp_now.h>
  3. #if !defined( Arduino_ESP32C3_DEV )
  4.   #error This code is intended to run on the ESP32_C3 platform! Please check your Tools->Board setting.
  5. #endif
  6. #define TIMER_INTERRUPT_DEBUG       -1
  7. #define ISR_SERVO_DEBUG             -1
  8. // Select different ESP32 timer number (0-1) to avoid conflict
  9. #define USE_ESP32_TIMER_NO          1
  10. #include "ESP32_C3_ISR_Servo.h"
  11. // 引脚编号
  12. #define ADC0  0
  13. #define ADC1  1
  14. #define ADC2  2
  15. #define ADC3  3
  16. #define ADC4  4
  17. #define ADC5  5
  18. #define IO6  6
  19. #define IO7  7
  20. #define IO8  8
  21. #define IO9  9
  22. #define IO10  10
  23. #define IO20  20
  24. #define IO21  21
  25. // 设置数据结构体
  26. //5 adc 8io
  27. typedef struct struct_message
  28. {
  29.   double adc0;
  30.   double adc1;
  31.   double adc2;
  32.   double adc3;
  33.   double adc4;
  34.   double adc5;
  35.   bool io6;
  36.   bool io7;
  37.   bool io8;
  38.   bool io9;
  39.   bool io10;
  40.   bool io20;
  41.   bool io21;
  42.   //String board_name;
  43. } struct_message;
  44. struct_message myData;
  45. // Published values for SG90 servos; adjust if needed
  46. #define MIN_MICROS      800  //544
  47. #define MAX_MICROS      2450
  48. int servoIndex0  = -1;
  49. int servoIndex1  = -1;
  50. int servoIndex2 = -1;
  51. int servoIndex3  = -1;
  52. int servoIndex4  = -1;
  53. int servoIndex5  = -1;
  54. // 数据接收回调函数
  55. void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) {
  56.   memcpy(&myData, incomingData, sizeof(myData));
  57.   //Serial.print("board_name: ");
  58.   //Serial.println(myData.board_name);
  59.   int pulseWidth=0;
  60.   
  61.   pulseWidth=map(myData.adc0,0,4095,MIN_MICROS,MAX_MICROS);
  62.   ESP32_ISR_Servos.setPulseWidth(servoIndex0, pulseWidth);
  63.   pulseWidth=map(myData.adc1,0,4095,MIN_MICROS,MAX_MICROS);
  64.   ESP32_ISR_Servos.setPulseWidth(servoIndex1, pulseWidth);
  65.   pulseWidth=map(myData.adc2,0,4095,MIN_MICROS,MAX_MICROS);
  66.   ESP32_ISR_Servos.setPulseWidth(servoIndex2, pulseWidth);
  67.   pulseWidth=map(myData.adc3,0,4095,MIN_MICROS,MAX_MICROS);
  68.   ESP32_ISR_Servos.setPulseWidth(servoIndex3, pulseWidth);
  69.   pulseWidth=map(myData.adc4,0,4095,MIN_MICROS,MAX_MICROS);
  70.   ESP32_ISR_Servos.setPulseWidth(servoIndex4, pulseWidth);
  71.   pulseWidth=map(myData.adc5,0,4095,MIN_MICROS,MAX_MICROS);
  72.   ESP32_ISR_Servos.setPulseWidth(servoIndex5, pulseWidth);
  73.   digitalWrite(IO6,myData.io6);
  74.   
  75.   digitalWrite(IO7,myData.io7);
  76.   digitalWrite(IO8,myData.io8);
  77.   digitalWrite(IO9,myData.io9);
  78.   digitalWrite(IO10,myData.io10);
  79.   digitalWrite(IO20,myData.io20);
  80.   digitalWrite(IO21,myData.io21);
  81. }
  82. void setup() {
  83.   Serial.begin(115200);
  84.   // 初始化 ESP-NOW
  85.   WiFi.mode(WIFI_STA);
  86.   if (esp_now_init() != 0) {
  87.     Serial.println("Error initializing ESP-NOW");
  88.     return;
  89.   }
  90.     Serial.print("STA MAC: "); Serial.println(WiFi.macAddress());
  91.   // 设置接收数据回调函数
  92.   esp_now_register_recv_cb(OnDataRecv);
  93.   ESP32_ISR_Servos.useTimer(USE_ESP32_TIMER_NO);
  94.   servoIndex0 = ESP32_ISR_Servos.setupServo(ADC0, MIN_MICROS, MAX_MICROS);
  95.   servoIndex1 = ESP32_ISR_Servos.setupServo(ADC1, MIN_MICROS, MAX_MICROS);
  96.   servoIndex2 = ESP32_ISR_Servos.setupServo(ADC2, MIN_MICROS, MAX_MICROS);
  97.   servoIndex3 = ESP32_ISR_Servos.setupServo(ADC3, MIN_MICROS, MAX_MICROS);
  98.   servoIndex4 = ESP32_ISR_Servos.setupServo(ADC4, MIN_MICROS, MAX_MICROS);
  99.   servoIndex5 = ESP32_ISR_Servos.setupServo(ADC5, MIN_MICROS, MAX_MICROS);
  100.   
  101.   pinMode(IO6 , OUTPUT);
  102.   pinMode(IO7, OUTPUT);
  103.   pinMode(IO8 , OUTPUT);
  104.   pinMode(IO9 , OUTPUT);
  105.   pinMode(IO10 , OUTPUT);
  106.   pinMode(IO20 , OUTPUT);
  107.   pinMode(IO21 , OUTPUT);
  108. }
  109. void loop() {
  110.    
  111.   //ESP32_ISR_Servos.setPosition(servoIndex1, position);
  112.   //setPulseWidth(servoIndex1, uint16_t& pulseWidth);
  113. }
复制代码


性能测试
通过示波器在遥控和接收机做了延时测试
eps32c3 espnow 实现航模遥控图1

小结
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

有没有演示视频看?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail