Arduino学习笔记 超声波避障小车

    xiaoxiao2022-07-14  175

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

    先讲超声波避障部分吧!

    超声波避障,自然少不了超声波模块和舵机模块还有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; }

    以上就是对超声波避障小车的讲解了,下次讲解红外寻迹小车

    最新回复(0)