小R科技-WIFI机器人网·机器人创意工作室

 找回密码
 立即注册
查看: 29241|回复: 49

Arduino串口通讯协议

[复制链接]
发表于 2012-4-20 09:06:55 | 显示全部楼层 |阅读模式
本帖最后由 robotStudio 于 2012-4-20 10:47 编辑

#include <Servo.h>
Servo servo1;
Servo servo2;
int E1 = 5;  
int E2 = 6;
int M1 = 4;
int M2 = 7;   
void stop(void)
        {
          digitalWrite(E1,LOW);   
          digitalWrite(E2,LOW);      
        }
        
void advance_r(int x)
        {
          analogWrite(E1,x);
          digitalWrite(M1,HIGH);   
        }  
        
void advance_l(int x)   
       {
          analogWrite(E2,x);   
          digitalWrite(M2,HIGH);
        }
void back_off_r(int x)
        {
          analogWrite(E1,x);
          digitalWrite(M1,LOW);   
        }  
        
void back_off_l(int x)   
       {
          analogWrite(E2,x);   
          digitalWrite(M2,LOW);
        }

void setup()
{
  int i;
  for(i=4;i<=7;i++)
  pinMode(i, OUTPUT);
  servo1.attach(9);//定义舵机控制口
  servo2.attach(10);
  Serial.begin(19200);//设置波特率
}
void loop()
{
  int dataLen = 0;    //数据长度
  int start_flag = 0; //起动标志位
  int data_index=0;
  int com_index=0;    //索引初始化  
  int temp_char1;
  int temp_char0;
  int i,unm,x,y;
  int state;          //帧状态
  int SUM1,SUM2;      //效验和
  int MOTO[7],RC[9];  //电机控制寄存器和舵机控制寄存器
  int L_ir,C_ir,R_ir; //红外线寄存器  
  int Serial_flag,Serial_unm;
  
  while(1)
  {
    int val,temp;
    temp_char1 = Serial.read();     //读取串口数据
    if(temp_char1!=-1)    //如果串口有数         
    {   
      Serial_flag=1;     //启动标志位置1
      Serial_unm=0;      //     
      if(start_flag == 0)     //等待数据头 0X55,0XAA
      {
           if( temp_char1  == 170 )  // 0XAA
           {
               if(temp_char0  == 85)  //0X55
               {
                   start_flag = 1;  //收到数据头,表示一个数据包传送开始
                   MOTO[0]=85;
                   MOTO[1]=170;
                   RC[0]=85;
                   RC[1]=170;                              
                   data_index = 0;
                   com_index = 0;   
               }
           }else temp_char0 = temp_char1;  //170
      }else if( com_index < 2)
      {
         switch(com_index)   
         {
             case 0 :    MOTO[2] = temp_char1;  //MOTO[2]=170
                         RC[2] = temp_char1;    //RC[2]=170
                         dataLen = temp_char1;  //dataLen=170
                         break;  
             case 1 :    MOTO[3] = temp_char1;
                         RC[3] = temp_char1;  //第2个数据,读取命令字                       
                         break;
         }
         com_index++;    //com_index=1
      }else if(data_index < dataLen && MOTO[3]==2)
      {
            MOTO[data_index+4] = temp_char1;
             data_index ++;
      }else if(data_index < dataLen && RC[3]==1)
      {
            RC[data_index+4] = temp_char1;
            data_index ++;
      }
      else
      {
            MOTO[6] = temp_char1;
            RC[8] = temp_char1;
            state=1;   // 一帧接收完毕
            start_flag = 0;
      }                  
    }
   
   /*******一帧接收完毕,开始执行*******/  
   if(state==1)
    {     
     state=0;     
     if(MOTO[3]==2)
       {
         SUM1=0;  
         for(i=0; i<6; i++)SUM1+=MOTO;
         
SUM1%=256;
         if(SUM1==MOTO[6])
          {
            if(MOTO[4]==128&&MOTO[5]==128)stop();
            if(MOTO[4]>128)back_off_l(200);//
            else if(MOTO[4]<128)advance_l(200);//
            if(MOTO[5]>128)back_off_r(200);//
            else if(MOTO[5]<128)advance_r(200);//
            delay(80);
          }  
       }  
     if(RC[3]==1)
       {
         SUM2=0;
         for(i=0; i<8; i++)SUM2+=RC;
         SUM2%=256;     
         if(SUM2==RC[8])
          {  
            if(RC[4]>=150)x=150;
            else if(RC[4]<=30)x=30;
            else x=RC[4];     
            if(RC[6]>=150)y=150;
            else if(RC[6]<=30)x=30;           
            else y=RC[6];           
            servo1.write(x);
            servo2.write(y);           
          }
       }      
     }
   }
}
PS此程序可以实现Arduino板控制两路电机和两路舵机。此程序只是串口通讯数据包格式的框架,玩小车的朋友可以在此基础上任意修改。
回复

使用道具 举报

发表于 2012-4-20 10:38:22 | 显示全部楼层
我记住你了。。。两个金钱。。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-4-20 10:48:30 | 显示全部楼层
1214144823 发表于 2012-4-20 10:38
我记住你了。。。两个金钱。。。。

不好意思刚才不小心设置了金钱,已取消。支持开源,知识共享。
回复 支持 反对

使用道具 举报

发表于 2012-4-20 19:23:02 | 显示全部楼层
先感谢楼主开源,但不太明白可否加注释让初学者下,还有控制小车各方向行走的协议是多少
回复 支持 反对

使用道具 举报

发表于 2012-4-21 01:49:23 | 显示全部楼层
arduino的代码封装得挺好的,很适合初学者调用,我们今后也仿照这个来开源,以方便他人使用为目的。
回复 支持 反对

使用道具 举报

发表于 2012-4-23 02:25:17 | 显示全部楼层
这个好,学习啦。改造一下试试。
回复 支持 反对

使用道具 举报

发表于 2012-5-6 08:55:08 | 显示全部楼层
好东西 赞一个
回复 支持 反对

使用道具 举报

发表于 2012-5-7 17:44:07 | 显示全部楼层
帮顶帮顶帮顶












挖学网-培训机构免费注册发布课程
挖学网图库/资料/需求/商城/培训/考证/论坛/课程
http://www.waxue.com/
回复 支持 反对

使用道具 举报

发表于 2012-5-29 15:32:56 | 显示全部楼层
arduino好东西,没有多少基础,也基本上能看明白
回复 支持 反对

使用道具 举报

发表于 2012-5-29 22:44:58 | 显示全部楼层
不明白,先收下了
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

新品特惠推荐上一条 /2 下一条

QQ|QQ技术咨询1|QQ技术咨询2|商务合作微信1:xiaorgeek001|商务合作微信2:XiaoRGEEK|诚聘英才|Archiver|手机版|小R科技-WIFI机器人网·机器人创意工作室 ( 粤ICP备15000788号-6 )

GMT+8, 2024-3-29 04:24 , Processed in 1.100751 second(s), 18 queries .

Powered by XiaoR GEEK X3.4

© 2014-2021 XiaoR GEEK

快速回复 返回顶部 返回列表