临近电赛,前几天在调舵机,本来翻出一台总线舵机的云台想要调试一下,在网上搜了大半天只搜到寥寥总线舵机的控制资料,看来大家还是大多数喜欢PWM舵机......,但是搜集几天后还是有收获的,现将我搜集到的资料和编写的控制程序分享如下
我使用的云台是双U型梁的二维云台,搭配的是某尔的LD1501串行总线舵机,经过我一天的海搜资源,找到几款由MicroPython和STM32控制总线舵机的程序以及某尔总线舵机的通信协议(这个最重要)
某尔总线舵机是由串口进行驱动,了解过串行总线舵机的都知道,控制多个串行总线舵机只需要三根接线:VCC,GND以及信号线,我使用的这款总线舵机的信号线波特率为115200,额定电压为7.4V,驱动该舵机运行的指令包如下:
需要通信协议的uu我将下载链接放置到末尾,需要的自取。
U1S1,有了通信协议什么都好说,再根据网上的例程一会就可以调试完,以下是我调试使用的代码:
注:初始化头文件我不再给出,大家自行理解添加吧
#初始化串口3:P4:TXD,P3:RXD
uart = UART(3,115200) #定义串口3变量
uart.init(115200, bits=8, parity=None, stop=1)
#幻尔舵机通信协议:校检和
def checksum(buf):
# 计算校验和
sum = 0x00
for b in buf: # 求和
sum += b # 累加
sum = sum - 0x55 - 0x55 # 去掉命令开头的两个 0x55
sum = ~sum # 取反
return sum & 0xff # 取最低的一个字节
#与幻尔总线舵机进行通信:id,位置,时间
def Serial_Move_Servo(id=None,Position=None,Time=None):
buf = bytearray(b'\x55\x55')
buf.append(id)
buf.append(7)
buf.append(1)
buf.append(0xff & Position)
buf.append(0xff & (Position >> 8))
buf.append(0xff & Time)
buf.append(0xff & (Time >> 8))
buf.append(checksum(buf))
uart.write(buf);
#id在幻尔舵机调试程序已经设置好:x轴舵机为1,y轴舵机为2,也可以通过程序进行设置
def Set_Id_Servo(oldid=None,newid=None):
buf = bytearray(b'\x55\x55')
buf.append(oldid)
buf.append(4)
buf.append(13)
buf.append(0xff & newid)
buf.append(checksum(buf))
uart.write(buf);
对于我使用的这款串行总线舵机,它出厂的时候每一个ID号都默认是1,所以我一开始调试的时候对ID为1的舵机发送指令云台上的两个舵机都一起动....,因为我一开始在STM32上调试 的并且没有搜到通信协议,就一直没有办法修改ID,后来在某尔的官网搜索到了有总线舵机调试板这个东西,并且都说需要那个调试版才可以修改ID,但是在本人的不懈努力下,找到了修改总线舵机ID的3种方式:
在修改总线舵机ID的时候,注意不要将多个总线舵机的接线连接在一起,仅用串口连接一台总线舵机,一般是使用TXD(发送端)连接舵机的信号线,其余电源线和地线供电6-8v左右,注意电源要和串口共地。
第一种方式,也是我最先发现的方式:使用USB转TTL的TXD直接连接舵机的信号线,然后舵机正常供电,电源和USB转TTL共地,然后在某尔科技的官网下载这么一个软件
然后正常打开串口号设置就可以了,里面的设置界面非常简洁明了,还可以限制角度,供电电压,偏差等等,我就不再叙述了,如有不明白的地方可以s我
第二种方式:使用通信协议,从串口发送数据到舵机:
def Set_Id_Servo(oldid=None,newid=None):
buf = bytearray(b'\x55\x55')
buf.append(oldid)
buf.append(4)
buf.append(13)
buf.append(0xff & newid)
buf.append(checksum(buf))
uart.write(buf);
这里在刚刚的代码里也有,就不再多说了。
第三种方式:使用某尔科技的调试版
这个不多说了,如果资金充足可以冲(有钱人专享)
在这款舵机调试的过程中遇到的最大问题就是设置ID了,其控制方式和PWM有点偏差,总体来说感觉比PWM舵机更直接一些(毕竟是使用串口发送数据)
如果有什么问题欢迎大家指出!