学习完了诸多模块,终于可以把它们凑在一起撺一台超声笔避障寻迹小车了
那咱们就先将超声波避障和红外线寻迹分成两个部分来讲!
超声波避障,自然少不了超声波模块和舵机模块还有TB6612FNG的使用,在此再讲了,之前的博客已经较为详细具体讲解过这三个模块了,有需要的可以再看一看复习。
直接上代码,拿代码来讲!(完整代码见文章末尾)
而且为了方便描述小车进行何种运动,所以事先用几个宏定义来描述
#include
#define STOP 0
#define GO 1
#define RIGHT 2
#define LIFT 3
#define BACK 4
将前进,后退,左转,右转,停止宏定义
//马达转动
int lift1=2;
int lift2=3;
int right1=4;
int right2=7;
int liftpwmA =5;
int rightpwmB=6;
//超声波
int superout=10;
int superin= 11;
float cm1;//第一次测得的距离
float cm2;//第二次测得的距离
float cm3;//第三次测得的距离
//控制舵机
Servo myservo;
void setup()
{
Serial.begin(9600); //设置波特率
myservo.attach(12); //舵机的信号控制针脚为十二号针脚
//设置超声波
pinMode(superout, OUTPUT); //设置超声波接口为输出
pinMode(superin, INPUT); //设置另一个超声波接口为输入
//设置马达
pinMode(lift1,OUTPUT);
pinMode(lift2,OUTPUT);
pinMode(right1,OUTPUT);
pinMode(right2,OUTPUT);
pinMode(liftpwmA ,OUTPUT);
pinMode(rightpwmB,OUTPUT);
}
就拿直行做例子吧,当使用这个函数的时候,收到两个参数,一个就是控制运动状态的,另一个是控制车轮转速的,开始先定义两个轮子的转速,然后使用switch case,当运动模式为直行时,让两个轮子都正转,完成直行,其他运动模式可以自行推导。【例:左转左轮不动(或反转)右轮正转】
void move1(int kind,int speed1)//移动,参数:1.运动模式,2.速度
{
analogWrite(liftpwmA ,speed1); //左轮转速
analogWrite(rightpwmB,speed1); //右轮转速
switch(kind)
{
case GO:
Serial.println("向前");
digitalWrite(lift1,HIGH);
digitalWrite(lift2,LOW);
digitalWrite(right1,HIGH);
digitalWrite(right2,LOW);
break;
case RIGHT:
break;
case LIFT:
break;
case BACK:
break;
default://STOP
}
}
这是基本的超声波接收信号操作,在超声波模块进行过讲解,就不多做解释了
int superread()//超声波读取数据
{
digitalWrite(superout,LOW);
delayMicroseconds(2);
digitalWrite(superout,HIGH);
delayMicroseconds(10);
digitalWrite(superout,LOW);
int date=pulseIn(superin,HIGH)/58;
return date;
}
#include
#define STOP 0
#define GO 1
#define RIGHT 2
#define LIFT 3
#define BACK 4
//马达转动
int lift1=2;
int lift2=3;
int right1=4;
int right2=7;
int liftpwmA =5;
int rightpwmB=6;
//超声波
int superout=10;
int superin= 11;
float cm1;//第一次测得的距离
float cm2;//第二次测得的距离
float cm3;//第三次测得的距离
Servo myservo;//控制舵机
void setup()
{
Serial.begin(9600); //设置波特率
myservo.attach(12);//舵机的信号控制针脚为九号针脚
//设置超声波
pinMode(superout, OUTPUT); //设置超声波接口为输出
pinMode(superin, INPUT); //设置另一个超声波接口为输入
//设置马达
pinMode(lift1,OUTPUT);
pinMode(lift2,OUTPUT);
pinMode(right1,OUTPUT);
pinMode(right2,OUTPUT);
pinMode(liftpwmA ,OUTPUT);
pinMode(rightpwmB,OUTPUT);
}
void loop()
{
servo(90); //让舵机转到90°
supermove();//超声波行驶
}
void move1(int kind,int speed1)//移动,参数:1.运动模式,2.速度
{
analogWrite(liftpwmA ,speed1);
analogWrite(rightpwmB,speed1);
switch(kind)
{
case GO:
Serial.println("向前");
digitalWrite(lift1,HIGH);
digitalWrite(lift2,LOW);
digitalWrite(right1,HIGH);
digitalWrite(right2,LOW);
break;
case RIGHT:
Serial.println("右转");
digitalWrite(lift1,HIGH);
digitalWrite(lift2,LOW);
digitalWrite(right1,LOW);
digitalWrite(right2,HIGH);
break;
case LIFT:
Serial.println("左转");
digitalWrite(lift1,LOW);
digitalWrite(lift2,HIGH);
digitalWrite(right1,HIGH);
digitalWrite(right2,LOW);
break;
case BACK:
Serial.println("后退");
digitalWrite(lift1,LOW);
digitalWrite(lift2,HIGH);
digitalWrite(right1,LOW);
digitalWrite(right2,HIGH);
break;
default:
Serial.println("停"); //输出状态
digitalWrite(lift1, LOW);
digitalWrite(lift2, LOW);
digitalWrite(right1, LOW);
digitalWrite(right2, LOW);
break;
}
}
void servo(int x)//舵机
{
myservo.write(x);//让舵机直接转到x°
delay(200);
}
void supermove()//超声波行驶
{
move1(GO,200);//前进
servo(90);
cm1=superread(); //让超声波探测正前方的距离
if(cm1<=30) //如果距离小于30cm停止运动
{
move1(STOP,0);
while(1)
{
cm1=superread();
Serial.println(cm1);
if(cm1<=50) //距离小于50cm持续后退
move1(BACK,200);//后退
else
break;
}
servo(30); //让超声波探测左前方的距离
cm2=superread();
delay(100);
servo(150); // 让超声波探测右前方的距离
cm3=superread();
delay(100);
servo(90); //让超声回到正面
if(cm2<=cm3 && cm1cm3 && cm2>cm1) //如果左前方较空旷
move1(LIFT,250); //左转
}
}
int superread()//超声波读取数据
{
digitalWrite(superout,LOW);
delayMicroseconds(2);
digitalWrite(superout,HIGH);
delayMicroseconds(10);
digitalWrite(superout,LOW);
int date=pulseIn(superin,HIGH)/58;
return date;
}
以上就是对超声波避障小车的讲解了,下次讲解红外寻迹小车