各个厂家不一样,甚至优必选自己的舵机协议也稍有不同。
现在优必选的串口协议已经被找的差不多了,can口的协议也有流出,某宝上的can口舵机视频看,已经能驱动了。
阿尔法和jimu机器人的参考:
const byte UBT_SERVO_CMD[] = {0xFA, 0xAF,0x00,0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0xED};
const byte JIMU_VERSION[] = {0xFC, 0xCF,0x00,0xAA,0x41, 0x16, 0x51, 0x01, 0x00, 0xED};
网搜索上能找到详细的协议,开源控制板也有人研究出来了。
这是个简单转180度的例子,可以试试(烧了舵机和板子不要怪我哈,我的是正常的)
需要1、uno板下载SoftHalfDuplexSerial库用pin8模拟半双工;2、单独电源;3、电源和uno共地。
详细可搜索alicedodo 的源程序。
#include <SoftHalfDuplexSerial.h>
uint8_t checksum(uint8_t* buf, uint8_t sz)
{
uint16_t sum = 0;
for(uint8_t i=0; i<sz; i++)
sum += buf[i];
return (uint8_t)(sum&0xff);
}
static uint8_t cmd[10] = { 0xFA, 0xAF, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0xED };
//servoID=0为广播模式。
uint8_t readString[64];
int nByte;
softHalfDuplexSerial hdSerial(8); // using pin 8 see lib for limitations
void setup() {
Serial.begin(115200);
while (!Serial) {
}
hdSerial.begin(115200); // Starting half Duplex communication at 57600 bps
nByte = 0;
}
void loop() {
nByte = 0;
//转到0度:
cmd[4]=0;
cmd[8] = checksum(&cmd[2], 6);
hdSerial.flushRx();
hdSerial.write (cmd, 10);
delay(1000);
//转到239度
cmd[4]=239;
cmd[8] = checksum(&cmd[2], 6);
hdSerial.flushRx();
hdSerial.write (cmd, 10);
nByte = 0;
delay(1000);
//半双工读舵机返回信息
while(hdSerial.available())
{
readString[nByte] = hdSerial.read();
nByte += 1;
}
for (int i=0; i<nByte; i++)
Serial.print(readString[i]);
Serial.println();
}
现在优必选的串口协议已经被找的差不多了,can口的协议也有流出,某宝上的can口舵机视频看,已经能驱动了。
阿尔法和jimu机器人的参考:
const byte UBT_SERVO_CMD[] = {0xFA, 0xAF,0x00,0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0xED};
const byte JIMU_VERSION[] = {0xFC, 0xCF,0x00,0xAA,0x41, 0x16, 0x51, 0x01, 0x00, 0xED};
网搜索上能找到详细的协议,开源控制板也有人研究出来了。
这是个简单转180度的例子,可以试试(烧了舵机和板子不要怪我哈,我的是正常的)
需要1、uno板下载SoftHalfDuplexSerial库用pin8模拟半双工;2、单独电源;3、电源和uno共地。
详细可搜索alicedodo 的源程序。
#include <SoftHalfDuplexSerial.h>
uint8_t checksum(uint8_t* buf, uint8_t sz)
{
uint16_t sum = 0;
for(uint8_t i=0; i<sz; i++)
sum += buf[i];
return (uint8_t)(sum&0xff);
}
static uint8_t cmd[10] = { 0xFA, 0xAF, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0xED };
//servoID=0为广播模式。
uint8_t readString[64];
int nByte;
softHalfDuplexSerial hdSerial(8); // using pin 8 see lib for limitations
void setup() {
Serial.begin(115200);
while (!Serial) {
}
hdSerial.begin(115200); // Starting half Duplex communication at 57600 bps
nByte = 0;
}
void loop() {
nByte = 0;
//转到0度:
cmd[4]=0;
cmd[8] = checksum(&cmd[2], 6);
hdSerial.flushRx();
hdSerial.write (cmd, 10);
delay(1000);
//转到239度
cmd[4]=239;
cmd[8] = checksum(&cmd[2], 6);
hdSerial.flushRx();
hdSerial.write (cmd, 10);
nByte = 0;
delay(1000);
//半双工读舵机返回信息
while(hdSerial.available())
{
readString[nByte] = hdSerial.read();
nByte += 1;
}
for (int i=0; i<nByte; i++)
Serial.print(readString[i]);
Serial.println();
}