esp32 摇杆控制二自由度云台

本文介绍了如何使用ESP32的PWM和ADC模块控制舵机,通过摇杆输入实现四方向移动,展示了Python编程控制硬件设备的基本示例。
from machine import Pin,ADC,PWM
import time
#定义18 4 引脚为舵机控制PWM,频率50hz,即一个周期0.02s
#初始化占空比让舵机归位
p18=PWM(Pin(18,Pin.OUT),freq=50,duty=26)
p4=PWM(Pin(4,Pin.OUT),freq=50,duty=26)
# 定义摇杆引脚
ps2y=ADC(Pin(33))
ps2x=ADC(Pin(32))
# 设置输出的模拟值在0-4095之间
ps2y.atten(ADC.ATTN_11DB)
ps2x.atten(ADC.ATTN_11DB)
#设置舵机初始角度值为0
anglex=0
angley=0
#限定舵机转动角度为0-180
#舵机在20ms为一个周期内,若高电平时间为0.5ms,则转动方向为0
#有下表: 0.5ms   0°
#         1ms    45°
#         1.5ms  90°
#         2ms    135° 
#         2.5ms    180°
# 从0-180之间有2ms的时间间隔,推出舵机转动1°(angle=1)的占空比公式:
# pw=((angle/180*2000)+500)/20000*65535
#65535与PWM设置的精度有关,esp32默认就是65535

#向左
def move_l():
    # 定义全局变量,方便在函数内修改
    global anglex
    #让舵机转动1°
    anglex += 1
    if anglex > 180:
        anglex = 180
        #括号内的值在0-65535之间,其与65535的比值为占空比
    pw=((anglex/180*2000)+500)/20000*65535
    p4.duty_u16(int(pw))
    
#向右
def move_r():
    # 定义全局变量,方便在函数内修改
    global anglex
    #让舵机相反方向转动1°
    anglex -= 1
    if anglex < 0:
        
要实现使用 ESP32 通过摇杆控制 ESP-NOW 协议实现无线云台控制,需要结合硬件连接、数据采集、通信协议配置和控制逻辑设计等多个方面。以下是具体的实现方法。 ### 摇杆信号采集 ESP32 的 ADC(模数转换)功能可以用于读取摇杆的模拟信号。摇杆通常包含两个轴(X 和 Y),分别连接到 ESP32 的两个 ADC 引脚(例如 GPIO32 和 GPIO33)。ESP32-S3 的 SAR ADC 支持多通道采集,可以用于同时读取多个模拟信号[^1]。 摇杆的中位值可能因硬件不同而有所差异。例如,在 ESP32 上,未操作时的中位值大约为 2000,正推时可达到 4000 以上,反推时低于 350。因此,可以设置阈值来判断摇杆的方向。例如,X 轴大于 3500 时为正推,小于 350 时为反推,Y 轴同理[^2]。 ```cpp int readJoystick(int pin) { int value = analogRead(pin); if (value > 3500) return 1; // 正推 else if (value < 350) return -1; // 反推 else return 0; // 中位 } ``` ### ESP-NOW 协议配置 ESP-NOW 是一种基于 ESP-IDF 的轻量级无线通信协议,适用于低延迟、高可靠性的设备间通信。在无线云台控制中,发送端(ESP32)将摇杆数据发送给接收端(ESP32 控制云台的电机或舵机)。 #### 发送端配置 发送端需要初始化 ESP-NOW 并配置接收端的 MAC 地址。可以通过以下代码获取接收端的 MAC 地址[^4]: ```cpp #include "WiFi.h" void setup() { Serial.begin(115200); WiFi.mode(WIFI_MODE_STA); Serial.print("MAC Address: "); Serial.println(WiFi.macAddress()); } ``` 发送端的 ESP-NOW 配置如下: ```cpp #include <esp_now.h> #include <WiFi.h> // 接收端的 MAC 地址 uint8_t broadcastAddress[] = {0x24, 0x6F, 0x28, 0xAB, 0xCD, 0xEF}; typedef struct struct_message { int x; int y; } struct_message; struct_message myData; esp_now_peer_info_t peerInfo; void setup() { WiFi.mode(WIFI_MODE_STA); if (esp_now_init() != ESP_OK) { Serial.println("Error initializing ESP-NOW"); return; } memcpy(peerInfo.peer_addr, broadcastAddress, 6); peerInfo.channel = 0; peerInfo.encrypt = false; if (esp_now_add_peer(&peerInfo) != ESP_OK) { Serial.println("Failed to add peer"); return; } } void loop() { myData.x = readJoystick(32); // X轴连接到GPIO32 myData.y = readJoystick(33); // Y轴连接到GPIO33 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(50); // 控制发送频率 } ``` #### 接收端配置 接收端需要监听 ESP-NOW 数据,并根据接收到的摇杆数据控制云台的运动。例如,控制两个舵机分别对应 X 和 Y 轴的运动: ```cpp #include <esp_now.h> #include <WiFi.h> #include <Servo.h> #define SERVO_X_PIN 25 #define SERVO_Y_PIN 26 Servo servoX; Servo servoY; typedef struct struct_message { int x; int y; } struct_message; struct_message myData; void OnDataRecv(const uint8_t *mac, const uint8_t *incomingData, int len) { memcpy(&myData, incomingData, sizeof(myData)); int angleX = map(myData.x, -1, 1, 0, 180); // 映射为舵机角度 int angleY = map(myData.y, -1, 1, 0, 180); servoX.write(angleX); servoY.write(angleY); } void setup() { WiFi.mode(WIFI_MODE_STA); if (esp_now_init() != ESP_OK) { Serial.println("Error initializing ESP-NOW"); return; } esp_now_register_recv_cb(OnDataRecv); servoX.attach(SERVO_X_PIN); servoY.attach(SERVO_Y_PIN); } void loop() { // 不需要操作 } ``` ### 控制逻辑优化 为了提高控制的平滑性和响应速度,可以对摇杆数据进行滤波处理,例如使用移动平均滤波器: ```cpp int filterValue(int newValue, int oldValue) { return (oldValue * 0.8 + newValue * 0.2); } ``` 此外,可以增加死区判断,避免因摇杆漂移导致的误动作: ```cpp int deadZone(int value, int deadBand) { if (abs(value) < deadBand) return 0; else return value; } ``` ### 总结 通过上述步骤,可以实现基于 ESP32 的无线云台控制系统。该系统利用 ESP32 的 ADC 采集摇杆信号,通过 ESP-NOW 协议进行无线通信,并通过舵机控制云台的运动。此方案具有低延迟、高可靠性等优点,适用于遥控、无人机、安防等领域。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值