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

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

先讲超声波避障部分吧!

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

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

  • 27
    点赞
  • 167
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值