学习完了诸多模块,终于可以把它们凑在一起撺一台超声笔避障寻迹小车了
那咱们就先将超声波避障和红外线寻迹分成两个部分来讲!

<>先讲超声波避障部分吧!

超声波避障,自然少不了超声波模块和舵机模块还有TB6612FNG的使用,在此再讲了,之前的博客已经较为详细具体讲解过这三个模块了,有需要的可以再看一看复习。
直接上代码,拿代码来讲!(完整代码见文章末尾)

<>1.要探测不同方向,自然就要用到舵机所以第一步要先调用函数

而且为了方便描述小车进行何种运动,所以事先用几个宏定义来描述
#include<Servo.h> #define STOP 0 #define GO 1 #define RIGHT 2 #define LIFT 3
#define BACK 4
将前进,后退,左转,右转,停止宏定义

<>2.接下来就是马达,超声波模块,舵机模块的接口定义了
//马达转动 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;
<>3.第三步就是steup了
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); }
<>4.让车动起来!(移动函数)

就拿直行做例子吧,当使用这个函数的时候,收到两个参数,一个就是控制运动状态的,另一个是控制车轮转速的,开始先定义两个轮子的转速,然后使用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 } }
<>5.超声波接收信号

这是基本的超声波接收信号操作,在超声波模块进行过讲解,就不多做解释了
int superread()//超声波读取数据 { digitalWrite(superout,LOW); delayMicroseconds(2);
digitalWrite(superout,HIGH); delayMicroseconds(10); digitalWrite(superout,LOW);
int date=pulseIn(superin,HIGH)/58; return date; }
<>6.最后一步整合代码
#include<Servo.h> #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 && cm1<cm3) //如果右前方较空旷 move1(RIGHT,250); //右转 if(cm2>cm3
&& 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; }
以上就是对超声波避障小车的讲解了,下次讲解红外寻迹小车

技术
©2020 ioDraw All rights reserved
【2020最牛小程序:你想要的各种资源都能搜的到?】C语言简易学生成绩管理系统运维工作梳理韭菜的愤怒:谷歌删除近10万条对Robinhood的负面评论Tampermonkey(油猴)的获取方法【技巧】简单几招解决Mac磁盘空间不足的问题惹什么猫都别惹熊猫!「功夫熊猫」20年对人类拿下4血为什么保持代码整洁如此重要?玩转指针重难点(1) 如何用SSL减少网站不必要的漏洞