电机 | [MG996R]笔记

1.参数规格:

重量:55g
尺寸:40.7×19.7×42.9mm
失速扭矩:9.4kg/cm (4.8v);11kg/cm (6.0v)

工作速度:0.19sec/60degree (4.8v);0.15sec/60degree (6.0v)
工作电压:4.8~6.6v
齿轮类型:金属齿轮
温度范围:0-55℃
伺服插头:JR(适合 JR 和 Futaba)
死区宽度:1us
伺服线长度:32cm
通用的“S”型连接器,适用于大多数接收器,包括 Futaba、JR、Hitec、GWS、Cirrus、Blue Bird、Blue Arrow、Corona、Berg、Spektrum。

棕色为接地线,红色为电源正极线,橙色为信号线。

详见:

Official Homepage : MG996R Robot servo 180° Rotation – Tower Pro

2.程序编写方面:

        控制信号周期是20MS的脉宽调制(PWM)信号,脉冲宽度0.5——2.5MS,对应的舵盘位置为0——180度。

0.5ms脉宽:0度        1ms脉宽:45度        1.5ms脉宽:90度        

2ms脉宽:135度        2.5ms脉宽:180度

arduino的话:

        调用库:#include <Servo.h>

        写入角度:myservo.write(pos); 

<think>好的,用户的问题是关于使用ESP32开发板配合PCA9685控制舵机,并通过游戏手柄控制六轴机械臂。需要详细的MicroPython代码,以及所需的库文件和硬件连接说明。首先,我需要明确用户的需求:用Thonny上传代码到ESP32,控制6个舵机(4个180度,2个360度),使用锂电池和LM2596降压,同时通过USB连接的游戏手柄控制。 首先,硬件方面,ESP32通过I2C连接PCA9685,PCA9685驱动舵机。LM2596用于将锂电池电压降到适合ESP32和舵机的电压。注意舵机电压是否匹配,可能需要额外电源。360度舵机实际上是连续旋转舵机,控制方式与普通舵机不同,需调整PWM占空比来控制速度和方向,而不是角度。 接下来是软件部分。用户使用MicroPython,需要PCA9685的驱动库。常见的adafruit_pca9685库可能不兼容,需改用MicroPython兼容的版本,比如使用micropython-pca9685库或者自己编写驱动。此外,需要读取游戏手柄的输入,可能需要使用pygame库在电脑端运行,或者ESP32直接读取USB HID设备。但考虑到ESP32可能无法直接处理复杂的USB主机功能,更可行的方案是电脑运行Python脚本读取手柄输入,然后通过串口发送指令到ESP32,ESP32解析指令并控制舵机。 因此,系统架构分为两部分:电脑端处理手柄输入并通过串口发送指令,ESP32接收指令并控制PCA9685。这样代码需要两个部分:电脑端的pygame脚本和ESP32的MicroPython代码。 需要确认用户是否希望在ESP32上直接读取手柄,但考虑到复杂性和兼容性,分体式设计更现实。因此,代码需要分为两个部分。但用户要求所有代码上传到ESP32,可能误解了可行性。需要澄清:ESP32作为从设备,接收来自电脑的指令,而电脑运行处理手柄的代码。或者,如果使用ESP32的蓝牙/WiFi功能,可能直接连接手柄,但需要相应的协议支持,这可能比较复杂。 综合考虑,采用电脑端处理手柄输入,通过USB串口发送指令到ESP32的方案更可行。因此,用户需要在电脑上运行一个Python脚本(使用pygame读取手柄输入),并通过串口发送控制命令到ESP32,ESP32上的MicroPython代码接收并解析这些命令,进而控制PCA9685驱动舵机。 接下来,需要编写代码。ESP32部分需要初始化I2C和PCA9685,设置舵机频率(通常50Hz),并映射角度或速度到PWM占空比。对于180度舵机,角度对应脉冲宽度500-2500微秒;360度舵机,脉冲宽度控制速度和方向,例如1500停止,1300反转,1700正转。 库方面,使用MicroPython的machine库的I2C和Pin模块,以及PCA9685的驱动。可能需要自定义PCA9685驱动,或者使用现有的MicroPython兼容库,例如从GitHub获取。 然后,编写ESP32的主循环,不断读取串口输入,解析指令,设置各个舵机的PWM值。同时,处理可能的异常,比如串口数据格式错误。 电脑端脚本需要使用pygame读取手柄的轴和按钮,将输入转换为舵机控制指令,通过串口发送。例如,手柄的摇杆控制某个舵机的角度或速度。 最后,用户需要安装必要的库:在ESP32上,需要pca9685.py驱动库;在电脑端,需要pygame和pyserial。 可能的问题包括:PCA9685的地址是否正确,I2C引脚是否正确连接(ESP32的默认I2C引脚是21和22),舵机接线是否正确,电源是否足够,以及手柄的轴和按钮映射是否正确。 总结步骤: 1. 连接硬件,确保PCA9685正确连接到ESP32的I2C,舵机连接到PCA9685的PWM通道,电源稳定。 2. 在ESP32上安装MicroPython固件。 3. 上传PCA9685的MicroPython驱动库到ESP32。 4. 编写ESP32的主程序,处理串口指令并控制舵机。 5. 在电脑上安装pygame和pyserial,编写脚本读取手柄并发送指令。 6. 测试各部分功能,调试可能出现的问题。 现在,需要将上述思考转化为具体的代码和步骤说明,确保用户能够按照指导进行操作,并处理可能的问题。</think>以下是实现该项目的详细步骤和代码: 1. 硬件连接: - ESP32 ↔ PCA9685:SDA(GPIO21), SCL(GPIO22), VCC(5V), GND - PCA9685 ↔ 舵机舵机信号线接PWM0-PWM5通道 - 锂电池 → LM2596 → 输出5V → 给PCA9685和舵机供电 - ESP32单独供电(建议) 2. 需要上传到ESP32的文件: - `pca9685.py` (MicroPython兼容驱动) - `main.py` (主程序) ```python # pca9685.py (MicroPython驱动) from machine import I2C class PCA9685: def __init__(self, i2c, address=0x40): self.i2c = i2c self.address = address self.reset() def reset(self): self.write(0x00, 0x00) # Mode1 register def freq(self, freq=None): if freq is None: return int(25000000 / (4096 * (self.read(0xFE) - 0.5))) prescale = int(25000000 / (4096 * freq)) - 1 old_mode = self.read(0x00) self.write(0x00, (old_mode & 0x7F) | 0x10) self.write(0xFE, prescale) self.write(0x00, old_mode) def pwm(self, index, on=0, off=0): self.write(0x06 + 4 * index, on & 0xFF) self.write(0x07 + 4 * index, on >> 8) self.write(0x08 + 4 * index, off & 0xFF) self.write(0x09 + 4 * index, off >> 8) def write(self, address, value): self.i2c.writeto_mem(self.address, address, bytearray([value])) def read(self, address): return self.i2c.readfrom_mem(self.address, address, 1)[0] ``` ```python # main.py (ESP32主程序) from machine import Pin, I2C, UART from pca9685 import PCA9685 import time # 初始化I2C和PCA9685 i2c = I2C(0, scl=Pin(22), sda=Pin(21), freq=400000) pca = PCA9685(i2c) pca.freq(50) # 舵机PWM频率 # 舵机通道映射 servo_channels = { 0: 0, # 关节1 (180度) 1: 1, # 关节2 (180度) 2: 2, # 关节3 (180度) 3: 3, # 夹爪 (180度) 4: 4, # 旋转关节1 (360度) 5: 5 # 旋转关节2 (360度) } def set_angle(channel, angle): pulse = int(angle * (2500 - 500) / 180 + 500) # 500-2500us set_pwm(channel, pulse) def set_speed(channel, speed): # 用于360度舵机 pulse = 1500 + speed * 400 # 1100-1900us set_pwm(channel, pulse) def set_pwm(channel, pulse_us): period = 20000 # 20ms duty = int(pulse_us * 4096 / period) pca.pwm(channel, 0, duty) # UART初始化 uart = UART(1, baudrate=115200, tx=17, rx=16) while True: if uart.any(): data = uart.readline().decode().strip() try: cmd = data.split(':') if len(cmd) == 3: servo_type = cmd[0] # 'A'角度舵机/'S'速度舵机 channel = int(cmd[1]) value = float(cmd[2]) if servo_type == 'A' and 0 <= value <= 180: set_angle(servo_channels[channel], value) elif servo_type == 'S' and -1 <= value <= 1: set_speed(servo_channels[channel], value) except Exception as e: print("Error:", e) ``` 3. 电脑端控制程序(使用PyGame): ```python # gamepad_control.py (电脑端运行) import pygame import serial import time # 初始化PyGame pygame.init() j = pygame.joystick.Joystick(0) j.init() # 串口配置 ser = serial.Serial('COM3', 115200) # 修改为ESP32的串口号 # 摇杆死区处理 DEADZONE = 0.1 # 舵机映射配置 controls = { 'axes': { 0: ('S', 4, 1.0), # 左摇杆X轴 → 旋转舵机4 1: ('S', 5, 1.0), # 左摇杆Y轴 → 旋转舵机5 2: ('A', 0, 90), # 右摇杆X轴 → 关节1 3: ('A', 1, 90) # 右摇杆Y轴 → 关节2 }, 'buttons': { 0: ('A', 2, 0), # A按钮 → 关节3归零 1: ('A', 3, 180) # B按钮 → 夹爪全开 } } try: while True: pygame.event.pump() # 处理摇杆输入 for axis in controls['axes']: a_type, channel, scale = controls['axes'][axis] value = j.get_axis(axis) if abs(value) < DEADZONE: continue if a_type == 'A': angle = (value * scale) + 90 cmd = f"{a_type}:{channel}:{angle:.1f}" elif a_type == 'S': cmd = f"{a_type}:{channel}:{value:.2f}" ser.write(cmd.encode() + b'\n') # 处理按钮输入 for btn in controls['buttons']: if j.get_button(btn): a_type, channel, value = controls['buttons'][btn] cmd = f"{a_type}:{channel}:{value}" ser.write(cmd.encode() + b'\n') time.sleep(0.05) except KeyboardInterrupt: j.quit() ser.close() ``` 使用步骤: 1. 将`pca9685.py`和`main.py`上传到ESP32 2. 安装电脑端依赖:`pip install pygame pyserial` 3. 运行电脑端程序:`python gamepad_control.py` 所需库: - ESP32端:仅需自带machine库 - 电脑端:pygame(手柄输入)、pyserial(串口通信)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yatingliu2019

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值