|
本帖最后由 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板控制两路电机和两路舵机。此程序只是串口通讯数据包格式的框架,玩小车的朋友可以在此基础上任意修改。
|
|