12078浏览
查看: 12078|回复: 1

arduino 如何写半双工 串口??

[复制链接]
首先 先说一下  有个  AR.Drone的电调 他的通信模式是 半双工的   


资料 如下
AR.DroneARM Linux飞控主板很强大, 但它与电调/电机之间的通信协议却一直是个迷.

最近我与rcgroups上的miru:
http://www.rcgroups.com/forums/showthread.php?t=1420951
一直在PM中讨论这个问题.Fenrir:
http://fenrir.naruoka.org/
的前期研究基础上, 搞清了AR.Drone电调通信协议.

AR.Drone电调上的CPUATmega8a.

AR.Drone的飞控主板与电调之间用5线连接, 串口PWM油门数据通信:
Pin 1: 12V
电源 (红线)
Pin 2: 5V
电源 (白线)
Pin 3: TTL
半双工串口(RXTX接在一起), 用于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字节: 4LED2bits
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 调试   

但是 不知道  半双工 的串口 用该如何写




1.png
2.png

mickey  NPC

发表于 2012-9-3 13:40:50

您可以参考我们的URM37V3.2超声波传感器与Arduino串口通讯程序。
  1. int USValue = 0;
  2. int timecount = 0;
  3. int ledpin =13;  //定义L灯作显示
  4. boolean flag=true;
  5. uint8_t DMcmd[4] = {0x22, 0x00, 0x00, 0x22}; //距离命令
  6. void setup() {
  7.   Serial.begin(9600);            
  8.   pinMode(ledpin,OUTPUT);  
  9.   digitalWrite(ledpin,LOW);
  10.   delay(200);
  11. }
  12. void loop()
  13. {
  14.   flag=true;
  15.   for(int i=0;i<4;i++)
  16.   {
  17.     Serial.print(DMcmd[i],BYTE);//发送超声波测距命令
  18.   }
  19.   delay(75); //一个延时
  20. while(flag)
  21. {
  22.     if(Serial.available()>0) //查询串口有无数据
  23.     {
  24.         int header=Serial.read(); //0x22开始接收距离数据
  25.         int highbyte=Serial.read();//距离数据高8位
  26.         int lowbyte=Serial.read();//距离数据低8位
  27.         int sum=Serial.read();//sum校验和
  28.       
  29.         if(highbyte==255)  //数据无效
  30.         {
  31.           USValue=65525;  //
  32.         }
  33.         else
  34.         {
  35.           USValue = highbyte*255+lowbyte;
  36.           if (USValue >=50)
  37.           {//如果距离大于50厘米小灯亮起
  38.              digitalWrite(ledpin,HIGH);
  39.           }//如果距离小于50厘米小灯熄灭
  40.          else
  41.            digitalWrite(ledpin,LOW);
  42.         }
  43.        Serial.print("Distance=");
  44.        Serial.println(USValue);//输出距离
  45.        flag=false;
  46.      }
  47.   }
  48.   delay(100); //
  49. }
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail