#include<ServoTimer2.h>//舵机驱动库文件
ServoTimer2 servoLev;//水平位置舵机控制
ServoTimer2 servoVcl;//竖直位置舵机控制
int AIN1 = 6;//AIN1
int AIN2 = 5;
int BIN1 = 10; //BIN1
int BIN2 = 9; //BIN2
int cmdData[4]; //定义一个数组用来存储串口接收到的数据,长度为 5
int tmpData; //存放数据的临时变量
int UARTDataCount = 0;
int n = 0;
#define MIDPULSE 1500 //500 表示舵机 0 度位置,1500 表示 90 度位置,2500 表示 180
/****************************************************************
舵机初使化函数,定义舵机连接引脚,上电归位等!
舵机 1(水平面):FF 01 01 舵机角度 FF 数字引脚:3
舵机 2(竖直面):FF 01 04 舵机角度 FF 数字引脚:11
****************************************************************/
void initServo()
{servoVcl.attach(11);//数字引脚:11 2
servoLev.attach(3);//数字引脚:3
servoLev.write(MIDPULSE);
servoVcl.write(MIDPULSE);
delay(200);
}
void setup()
{
pinMode(13,OUTPUT);//PIN 模式
pinMode(AIN1,OUTPUT);
pinMode(AIN2,OUTPUT);
pinMode(BIN1,OUTPUT);
pinMode(BIN2,OUTPUT);
Serial.begin(9600);//串口初使化
initServo();//舵机初使化
}
/********************************************************
向前指令:FF 00 01 00 FF
向后指令:FF 00 02 00 FF
向左指令:FF 00 03 00 FF
向右指令:FF 00 04 00 FF
停止指令:FF 00 00 00 FF
*********************************************************/
void loop()
{// put your main code here, to run repeatedly:
// void setMotor(int MOTORA,int MOTORB) ;
if(Serial.available())
{ tmpData=Serial.read();//读取来自串口的数据
if(tmpData == 0xFF && UARTDataCount <2)//检测包头是否为 0XFF
{ cmdData[0] = tmpData;
UARTDataCount++;
n = 1;
}
else
{ cmdData[n]=tmpData;
n++;
}
if(UARTDataCount == 2)
{ cmdData[0] = 0xFF;
cmdData[4] = 0xFF;
n = 1;
UARTDataCount = 0;
Serial.flush();//清缓冲区
}
}
if(cmdData[0]==0xFF && cmdData[4]==0xFF) //收到完整的数据包
{ switch(cmdData[1]) //判断数据类型
{
case 0x00://指令数据控制
switch(cmdData[2])
{
case 0x04: setMotor(255,255);break;
case 0x00: setMotor(0,0);break;
case 0x03: setMotor(-255,-255);break;
case 0x02: setMotor(-255,255);break;
case 0x01: setMotor(255,-255);break;
} break;
case 0x01://舵机数据控制
switch(cmdData[2])
{
case 0x01:
servoLev.write(cmdData[3]*13+500);break;
case 0x04:
servoVcl.write(cmdData[3]*13+500);break;
}
break;
}
}
}
void setMotor(int MOTORA,int MOTORB) //电机驱动函数
{
if(MOTORA>=0)
{
digitalWrite(AIN2,HIGH);
analogWrite(AIN1,255-MOTORA);
}
else
{
digitalWrite(AIN1,HIGH);
analogWrite(AIN2,MOTORA+255);
}
if(MOTORB>=0)
{
digitalWrite(BIN2,HIGH);
analogWrite(BIN1,255-MOTORB);
}
else
{
digitalWrite(BIN1,HIGH);
analogWrite(BIN2,255+MOTORB);
}
} |