arduino 如何写半双工 串口??
2012-08-241.6万
精华项目
AI 快速预览详细
本文详细介绍了AR.Drone电调的半双工串口通信协议,包括其连接方式、波特率和具体命令字。通过Arduino I/O小板子可以实现与普通电调的中转通信,从而提高无人机控制的灵活性。文章还提供了具体的引脚定义和命令字格式,帮助用户更好地理解和实现该通信协议。
|
首先 先说一下 有个 AR.Drone的电调 他的通信模式是 半双工的 资料 如下 AR.Drone的ARM Linux飞控主板很强大, 但它与电调/电机之间的通信协议却一直是个迷. 最近我与rcgroups上的miru: http://www.rcgroups.com/forums/showthread.php?t=1420951 一直在PM中讨论这个问题.在Fenrir: http://fenrir.naruoka.org/ 的前期研究基础上, 搞清了AR.Drone的电调通信协议. AR.Drone电调上的CPU为ATmega8a. AR.Drone的飞控主板与电调之间用5线连接, 串口PWM油门数据通信: Pin 1: 12V 电源 (红线) Pin 2: 5V 电源 (白线) Pin 3: TTL半双工串口(即RX与TX接在一起), 用于PWM油门数据发送等. 波特率115200. 详细见后. Pin 4: 电机报警(低电位: 正常, 高电位: 电机卡住或空转) Pin 5: 地 (黑线) 飞控主板发送给电调的串口数据前3bits为命令字: 001 油门量: 5字节数据, 后37bits为:8bits电机1油门量 + 0 +8bits电机2油门量 + 0 +8bits电机3油门量 + 0 +8bits电机4油门量 + 00 010 版本查 询: 1字节数据, 后5bits为:00000 011 LED电机灯控制: 2字节: 4个LED各2bits 100 状态查 询: 1字节数据, 后5bits为: 01 +3bits BLC# (0...3) 101 同步字节: 1字节数据, 后5bits为:00000 111 复位: 1字节数据, 后5bits为:00000 我们可以通过Arduino I/O小板子来与普通电调PWM进行中转通信, 这可用Arduino上的Servo库来简单实现: http://gaishi.vicp.net/#article_id_8 这样就可以使用市场上能买到的普通电调/电机, 乃至机架来作替代品. 所以说 现在 想 用 arduino 调试 一下 到时候 再用 flymaple 调试 但是 不知道 半双工 的串口 用该如何写 |





int timecount = 0;
int ledpin =13; //定义L灯作显示
boolean flag=true;
uint8_t DMcmd[4] = {0x22, 0x00, 0x00, 0x22}; //距离命令
void setup() {
Serial.begin(9600);
pinMode(ledpin,OUTPUT);
digitalWrite(ledpin,LOW);
delay(200);
}
void loop()
{
flag=true;
for(int i=0;i<4;i++)
{
Serial.print(DMcmd[i],BYTE);//发送超声波测距命令
}
delay(75); //一个延时
while(flag)
{
if(Serial.available()>0) //查询串口有无数据
{
int header=Serial.read(); //0x22开始接收距离数据
int highbyte=Serial.read();//距离数据高8位
int lowbyte=Serial.read();//距离数据低8位
int sum=Serial.read();//sum校验和
if(highbyte==255) //数据无效
{
USValue=65525; //
}
else
{
USValue = highbyte*255+lowbyte;
if (USValue >=50)
{//如果距离大于50厘米小灯亮起
digitalWrite(ledpin,HIGH);
}//如果距离小于50厘米小灯熄灭
else
digitalWrite(ledpin,LOW);
}
Serial.print("Distance=");
Serial.println(USValue);//输出距离
flag=false;
}
}
delay(100); //
}[/code]