沈阳微信网站开发推广软件是什么工作

0引言
在舵机品牌中,Dynamixel舵机是品质最好在机器人中使用最广泛的,最近由于蛇形机器人的项目需要用到这款舵机,发现网上关于它的中文资料比较少,于是找到了Dynamixel官网进行了学习,对学习内容做个总结.
在使用控制程序控制舵机或者平时自己写上位机控制普通电机的时候都会涉及到协议的问题,这里介绍的是Dynamixel官方针对其舵机制定的通讯协议,可以直接调用,对我们自己控制电机时写协议有很强的借鉴意义.
除了协议之外,预计还会写一个SDK软件开发工具包的使用,敬请期待吧( ˘ ³˘)♥
1概念
1.1数据包
主程序和舵机通过互相发送数据包来进行通信,数据包分为指令数据包(Instruction Packet)和状态数据包(Status Packet)两种.主程序向舵机发送指令数据包,舵机作出相应的动作并返回状态数据包.
1.2ID
通过ID可以指定控制哪一个舵机,舵机的ID是可以修改的,同一条总线上不同舵机的ID不可以相同,出厂ID默认设置为1.
1.3协议
Dynamixel采用8位异步串行通信,一个停止位,没有奇偶校验位
1.4半双工
数据可以在一个信号载体的两个方向传输,但是不能同时传输.这种方式经常被用在多个设备需要连接在同一个总线的场合.

1.5Tx,Rx
需要一个变量来表示串口的状态(UART_STATUS):
- TXD_BUFFER_READY_BIT:表明数据可以被加载到缓冲区
- TXD_SHIFT_REGISTER_EMPTY_BIT:当所有数据都离开CPU完成传输后设置
TxDByte(byte bData)
{while(!TXD_BUFFER_READY_BIT);//wait until data can be loadeddSerialTxDBuffer = bData;//data load to TxD buffer
}
当切换数据传输方向的时候,需要检查TXD_SHIFT_REGISTER_EMPTY_BIT
DIRECTION_PORT = TX_DIRECTION;
TxDByte(0xff);
TxDByte(0xff);
TxDByte(bID);
TxDByte(bLength);
TxDByte(bInstruction);
TxDByte(Parameter0);
TxDByte(Parameter1);...
DisableInterrupt();//interrupt should be disable
TxDByte(Checksum);//last TxD
while(!TXD_SHIFT_REGISTER_EMPTY_BIT);//wait untill last data bit has been sent
DIRECTION_PORT = RX_DIRECTION;//direction change to RxD
EnableInterrupt();//enable interrupt again
1.6字节之间的时间延迟检查
字节之间存在延迟时间,如果延迟时间大于100毫秒,那么舵机会认为产生了通信问题并且等待下一个数据包的开头(0xff 0xff).
2指令数据包
指令数据包由主控制程序发送给舵机,其格式如下(原本准备作个表格的,结果知乎文章编辑不支持,只能截个模糊的图了,哭唧唧):

2.1Header
一般都是FF
2.2ID
ID的范围:0~253(0x00~0xFD),总共有254个数字可以使用
广播ID:254(0xFE):使所有舵机都执行命令数据包
2.3Length
数据包的长度(instruction,Parameter,Checksum fields)长度=参数个数+2
2.4Instruction
这里列举了常见的一些指令,具体内容可见第四小节.

2.5Parameters
2.6Instruction Checksum
用来检查数据包是否损坏,其计算方法如下:
Instruction Checksum = ~(ID+Length+Instruction+Parameter1+...+ParameterN)
相加指定参数取最后两位后取反
3.状态数据包
状态数据包是舵机返回给主程序的数据,其格式如下

3.1Error
表达了可能出现的错误.

3.2状态检查(Status Checksum)
Status Checksum = ~(ID+Length+Error+Parameter1+...+ParameterN)4.指令细节
4.指令细节
由于第4部份用到了大量表格,知乎文章不支持,所以把完整内容放到了有道云笔记里面,感兴趣的可以参考:有道云笔记
5.更新日志
- 191204介绍了一些基本概念、指令数据包、状态数据包及指令细节.