基本信息
源码名称:arduino 舵机控制 串口通信 超声波传感器
源码大小:2.29KB
文件格式:.zip
开发语言:C/C++
更新时间:2018-11-13
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):78630559
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
u8 buf[10]={217,217,00,01,02,03,07,02,231,231};//落下应答
u8 buf1[10]={217,217,00,01,02,03,07,17,231,231};//抬起应答
int C_C[3];
unsigned char C_[26];
int servopin = 8;//设置舵机驱动脚到数字口8
int servopin1 = 9;
int servopin2 = 10;
int myangle; //定义角度变量
int myangle1; //定义角度变量
int myangle2; //定义角度变量
int pulsewidth;//定义脉宽变量
int pulsewidth1;//定义脉宽变量
int pulsewidth2;//定义脉宽变量
unsigned int S; //距离存储
int trig=3; //发射信号
int echo=2; //接收信号
int val;
int val1;
int val2;
int j=0;
//要想使得舵机比较连续的旋转,可以改变方波占空比
void servopulse(int servopin,int myangle)/*定义一个控制一号舵机的脉冲函数,用来模拟方式产生PWM值*/
{
pulsewidth=(myangle*11) 500;//将角度转化为500-2480 的脉宽值
digitalWrite(servopin,HIGH);//将舵机接口电平置高
delayMicroseconds(pulsewidth);//延时脉宽值的微秒数
digitalWrite(servopin,LOW);//将舵机接口电平置低
delay(20-pulsewidth/1000);//延时周期内剩余时间,20可以改成4
}
void servopulse1(int servopin1,int myangle1)/*定义一个控制2号舵机脉冲函数,用来模拟方式产生PWM值*/
{
pulsewidth1=(myangle1*11) 500;//将角度转化为500-2480 的脉宽值
digitalWrite(servopin1,HIGH);//将舵机接口电平置高
delayMicroseconds(pulsewidth1);//延时脉宽值的微秒数
digitalWrite(servopin1,LOW);//将舵机接口电平置低
delay(10);//延时周期内剩余时间
}
void servopulse2(int servopin2,int myangle2)/*定义一个控制3号舵机的脉冲函数,用来模拟方式产生PWM值*/
{
pulsewidth2=(myangle2*11) 500;//将角度转化为500-2480 的脉宽值
digitalWrite(servopin2,HIGH);//将舵机接口电平置高
delayMicroseconds(pulsewidth2);//延时脉宽值的微秒数
digitalWrite(servopin2,LOW);//将舵机接口电平置低
delay(20-pulsewidth2/1000);//延时周期内剩余时间
}
void setup()
{
pinMode(servopin,OUTPUT);//设定舵机接口为输出接口
pinMode(servopin1,OUTPUT);
pinMode(servopin2,OUTPUT);
pinMode(trig,OUTPUT); //设置引脚模式
pinMode(echo,INPUT);
Serial.begin(9600);//设置波特率为9600
while(Serial.read()>= 0)
{}
}
void loop()
{
servopulse(servopin,val);
servopulse(servopin1,val1);
if (Serial.available() > 0)
{
delay(10); // 等待数据传完
int numdata = Serial.available();
for(int i=0;i<numdata;i )
{
C_[i]=Serial.read();
}
//for(int i=0;i<numdata;i )
//Serial.println(C_[i]);
if(C_[0]==217&C_[8]==231)
{
if(C_[1]==217&C_[9]==231)
{
j = 1; //变量用于发送应答的开关条件
for(int i=0;i<3;i )
{
C_C[i]=C_[2 4*i]*256*256*256 C_[3 4*i]*256*256 C_[4 4*i]*256 C_[5 4*i];
}
C_[0]==0; //帧头帧尾必须清零
C_[1]==0;
C_[8]==0;
C_[9]==0;
}
else
{
for(int i=0;i<numdata;i )
{
C_[i]=0;
}
}
}
/* else
{
for(int i=0;i<numdata;i )
{
C_[i]=0;
}}*/
for(int i=0;i<numdata;i )
Serial.println(C_[i]);//打印数据
Serial.println(numdata);
while(Serial.read()>=0)
{} //清空串口缓存
}
if(C_[7]==17)//落下
{
//Serial.println(C_[7]);
fun1();
if(j == 1)
{
j = 0;
Serial.write(buf, 10);
}
}
C_[12] =="";
//while(Serial.read()>=0){} //清空串口缓存
range(); //执行测距函数
if(S>23){
fun3();//空函数不写也中
range(); //执行测距函数
}
if(S<=23&&S>22){
fun4();//控制一号舵机旋转
range(); //执行测距函数
}
if(S<=22)
{
fun3();//空函数不写也中
range(); //执行测距函数
}
if(val1==50)
{
for(int i=0;i<10;i )
{
C_[i]=0;
}}
if(val==0&val1==0)
{
for(int i=0;i<10;i )
{
C_[i]=0;
}}
if(C_[7]==1)//抬起
{
// Serial.println(C_[7]);
fun2();
if(j ==1)
{
j = 0;
Serial.write(buf1, 10);
}
}
C_[12] =="";
if(C_[7] ==0 ) //归0
{
// Serial.println(comdata);
fun6();
}
C_[12] =="";
if(C_[7] ==2 ) //右归位
{
//Serial.println(comdata);
fun7();
}
C_[12] =="";
if(C_[7] ==3) //左转
{
//Serial.println(comdata);
fun8();
}
C_[12] =="";
if(C_[7] ==4 ) //左归位
{
//Serial.println(comdata);
fun9();
}
C_[12] =="";
if(C_[7] ==5 ) //右转
{
// Serial.println(comdata);
fun10();
}
C_[12] ="";
//while(Serial.read()>=0){} //清空串口缓存
}
void fun1()
{
/*for(val;val<=15;val =1)//val =3可以改变舵机转到指定角度的速度
{
for(int i=0;i<=5;i ) //产生PWM个数,等效延时以保证能转到响应角度
{
servopulse(servopin,val);//模拟产生PWM
}}
for(val;val<=30;val =1)//val =3可以改变舵机转到指定角度的速度
{
for(int i=0;i<=5;i ) //产生PWM个数,等效延时以保证能转到响应角度
{
servopulse(servopin,val);//模拟产生PWM
}}*/
for(val1;val1<=10;val1 =1)//val =5可以改变舵机转到指定角度的速度
{
for(int i=0;i<=5;i ) //产生PWM个数,等效延时以保证能转到响应角度
{
servopulse(servopin1,val1);//模拟产生PWM
}}
for(val1;val1<=30;val1 =3)//val =5可以改变舵机转到指定角度的速度
{
for(int i=0;i<=5;i ) //产生PWM个数,等效延时以保证能转到响应角度
{
servopulse(servopin1,val1);//模拟产生PWM
}}
for(val1;val1<=50;val1 =5)//val =5可以改变舵机转到指定角度的速度
{
for(int i=0;i<=5;i ) //产生PWM个数,等效延时以保证能转到响应角度
{
servopulse(servopin1,val1);//模拟产生PWM
}}
for(val1;val1<=70;val1 =1)//val =5可以改变舵机转到指定角度的速度
{
for(int i=0;i<=5;i ) //产生PWM个数,等效延时以保证能转到响应角度
{
servopulse(servopin1,val1);//模拟产生PWM
}}
}
void fun2()
{
/*for(val;val>=0;val-=1)//val-=5可以改变舵机转到指定角度的速度
{
for(int i=0;i<=5;i ) //产生PWM个数,等效延时以保证能转到响应角度
{
servopulse(servopin,val);//模拟产生PWM
}}*/
for(val1;val1>=0;val1-=1)
{
for(int i=0;i<=5;i ) //产生PWM个数,等效延时以保证能转到响应角度
{
servopulse(servopin1,val1);//模拟产生PWM
}}
}
void range()
{ //测距函数
digitalWrite(trig,LOW); //测距
delayMicroseconds(2); //延时2微秒
digitalWrite(trig,HIGH);
delayMicroseconds(20);
digitalWrite(trig,LOW);
int distance = pulseIn(echo,HIGH); //读取高电平时间
distance = distance/58; //按照公式计算
S = distance; //把值赋给S
Serial.println(S); //向串口发送S的值,可以在显示器上显示距离
}
void fun3()
{
}
void fun4()
{
for(val;val<=40;val =1)//val =3可以改变舵机转到指定角度的速度
{
for(int i=0;i<=5;i ) //产生PWM个数,等效延时以保证能转到响应角度
{
servopulse(servopin,val);//模拟产生PWM
}}
}
/*void fun5()
{
for(int i=0;i<numdata;i )
{
C_[i]=0;
}
}*/
void fun6()
{
for(val2;val2>=0;val2-=2)
{
for(int i=0;i<=5;i ) //产生PWM个数,等效延时以保证能转到响应角度
{
servopulse(servopin2,val2);
}}
}
void fun7()
{
for(val2;val2<=50;val2 =2)//val =5可以改变舵机转到指定角度的速度
{
for(int i=0;i<=5;i =1) //产生PWM个数,等效延时以保证能转到响应角度
{
servopulse(servopin2,val2);//模拟产生PWM
}}
for(val2;val2<=75;val2 =1)//val =5可以改变舵机转到指定角度的速度
{
for(int i=0;i<=5;i =1) //产生PWM个数,等效延时以保证能转到响应角度
{
servopulse(servopin2,val2);//模拟产生PWM
}}
}
void fun8()
{
for(val2;val2<=100;val2 =1)
{
for(int i=0;i<=5;i ) //产生PWM个数,等效延时以保证能转到响应角度
{
servopulse(servopin2,val2);
}}
}
void fun9()
{
for(val2;val2>=75;val2-=2)
{
for(int i=0;i<=5;i ) //产生PWM个数,等效延时以保证能转到响应角度
{
servopulse(servopin2,val2);
}}
}
void fun10()
{
for(val2;val2>=50;val2-=1)
{
for(int i=0;i<=5;i ) //产生PWM个数,等效延时以保证能转到响应角度
{
servopulse(servopin2,val2);
}}
}