【DIY】超声波自动避障小车
【DIY】超声波自动避障小车
本文最后更新于337 天前,其中的信息可能已经过时,如有错误请发送邮件到273925452@qq.com
Avatar
这个项目是我大一参加学校的科创比赛做的,时间比较久了,整理一下把它分享出来给需要的人😀

大一做的记录视频

初次接触Aruino,c语言/第一次做的项目/
材料说明:Arduino UNO R3×1,L298N×1,超声波模块HC-SR04×3(小车左前右前2个),舵机×1,面包板×1, 12V锂电池×1,杜邦线若干。

Adruino程序部分

#include<Servo.h>

const byte ENB = 5;   //左边电机
const byte IN1 = 3;  //右后电机 
const byte IN2 = 6;  //右前电机
const byte IN3 = 9;  //左后电机
const byte IN4 = 11;  //左前电机

int TrigPin1 = 10;//左边超声波
int EchoPin1 = 2;
int TrigPin0 = 4;// 定义0超声波信号发出接口
int EchoPin0 = 7;// 定义0超声波信号接收口
int TrigPin2 = A0;//右边超声波
int EchoPin2 = A1;


int pos;    //舵机位置
int dis0;   //前方距离
int dis1;   //左边距离
int dis2;   //右边距离
int led1 = 8;
int led0 = A4;
int led2 = A2;



Servo myServo;     //舵机


void setup() {
  Serial.begin(9600);   //串口初始化
  delay(50);

  myServo.attach(12);   //舵机引脚初始化
  pinMode(ENB,OUTPUT);
  pinMode(IN1,OUTPUT);
  pinMode(IN2,OUTPUT);
  pinMode(IN3,OUTPUT);
  pinMode(IN4,OUTPUT);
  delay(100);
  //超声波控制引脚初始化
  pinMode(TrigPin0,OUTPUT);
  pinMode(EchoPin0,INPUT);
  pinMode(TrigPin1,OUTPUT);
  pinMode(EchoPin1,INPUT);
  pinMode(TrigPin2,OUTPUT);
  pinMode(EchoPin2,INPUT);
  pinMode(led1,OUTPUT);
  pinMode(led0,OUTPUT);
  pinMode(led2,OUTPUT);

 

}

void loop() {  
  
 digitalWrite(led0,HIGH);
 delay(50);
 Run(); 
 }

void Run(){
   myServo.write(90);

   int dis0 = getDistance0();//前方距离
   int dis11 = getDistance1();//左边距离
   int dis22 = getDistance2();//右边距离

   
   Serial.print(" dis0 = ");Serial.println(dis0);

   if(dis0 >= 20||dis0 == 0)
   {   
      ForWard();
      if(dis11<=6||dis22<=6)
      {
        STOP();
        autoTurn1();
        }                        
     }    
     else
   {
    STOP();
    autoTurn2();
   }



}
    
void autoTurn1()
{
     int dis11 = getDistance1();//左边距离
     int dis22 = getDistance2();//右边距离
    
   if (dis11 < dis22){
      Serial.println("TurnRight");
      TurnRight(); 
        digitalWrite(led2,HIGH);
        delay(90);
        digitalWrite(led2,LOW);            
      }
   else{
    Serial.println("TurnLeft");
    TurnLeft();
        digitalWrite(led1,HIGH);
        delay(90);
        digitalWrite(led1,LOW);     
    }
  
  
  }

void autoTurn2()  //控制舵机持续转向
{
  int pos;    //舵机位置
  int time1=3;
  for(pos = 90;pos <= 180;pos += 1 )
  {
      myServo.write(pos);//告诉舵机转到变量‘pos’中的位置
      delay(time1);         //等待舵机到达位置
      }
     delay(300);   
      int dis1 = getDistance0();//左边距离
     Serial.print("dis1 = ");Serial.println(dis1);
      
  for(pos = 180;pos >= 0;pos -= 1 )
  {
      myServo.write(pos);//告诉舵机转到变量‘pos’中的位置
      delay(time1);         //等待舵机到达位置
      }
    delay(300);
    dis2 = getDistance0();  //右边距离
    Serial.print("dis2 = ");Serial.println(dis2);
  for(pos = 0;pos <= 90;pos += 1 ){
      myServo.write(pos);//告诉舵机转到变量‘pos’中的位置
     delay(time1);         //等待舵机到达位置
      }
     delay(500);
      
    if(dis1 < dis2){
      Serial.println("TurnRight");
        TurnRight();
        digitalWrite(led2,HIGH);
        delay(100);
        digitalWrite(led2,LOW);
      }
   else
   {
        Serial.println("TurnLeft");
        TurnLeft();
        digitalWrite(led1,HIGH);
        delay(100);
        digitalWrite(led1,LOW);     
    }
  
}



void ForWard()       //前进
{
  Serial.println("ForWard");
  Leftshun();
  Rightshun();
  }

int ENAspeed = 80; //右车轮调速
int ENBspeed = 80; //左车轮调速



void Rightshun()     //右边车轮顺时针
 {
  analogWrite(IN1,ENAspeed);
  analogWrite(IN2,0);
  }

void Rightni()      //右边车轮逆时针
{
  analogWrite(IN1,0);
  analogWrite(IN2,ENAspeed);
  }

void Leftshun()     //左边车轮顺时针
  {
  analogWrite(ENB,ENBspeed);
  digitalWrite(IN3,HIGH);
  digitalWrite(IN4,LOW);      
  }

void Leftni()      //左边车轮逆时针
{
  analogWrite(ENB,ENBspeed);
  digitalWrite(IN3,LOW);
  digitalWrite(IN4,HIGH);        
  }


//调试:延迟÷旧度数*新度数
void TurnLeft()     //左转45
{
  Serial.println("TurnLeft");
  analogWrite(IN1,200);
  analogWrite(IN2,0);
  analogWrite(ENB,200);
  digitalWrite(IN3,LOW);
  digitalWrite(IN4,HIGH);  
  delay(90);
  } 
void TurnRight()     //右转45
{
  Serial.println("TurnRight");
  analogWrite(IN1,0);
  analogWrite(IN2,200);
  analogWrite(ENB,200);
  digitalWrite(IN3,HIGH);
  digitalWrite(IN4,LOW);  
  delay(90);
  }           

  

void STOP()       //停止
{
  Serial.println("STOP");
  digitalWrite(IN1,LOW);
  digitalWrite(IN2,LOW);
  digitalWrite(IN3,LOW);
  digitalWrite(IN4,LOW);
  delay(500); 
}

int getDistance0()
{
  int TrigPin0 = 4;   // 定义超声波信号发出接口
  int EchoPin0 = 7;   // 定义超声波信号接收口
  digitalWrite(TrigPin0, LOW); // 使发出发出超声波信号接口低电平2μs
  delayMicroseconds(2);
  digitalWrite(TrigPin0, HIGH); // 使发出发出超声波信号接口高电平10μs,这里是至少10μs
  delayMicroseconds(10);
  digitalWrite(TrigPin0, LOW); // 保持发出超声波信号接口低电平
  
  int distance0 = pulseIn(EchoPin0, HIGH);  // 读出脉冲时间
  distance0= distance0/58.0; // 将脉冲时间转化为距离(单位:厘米)
  
if (distance0 >=50)
  {
     //如果距离小于50厘米返回数据
    return 50;
  }  //如果距离小于50厘米小灯熄灭
  else
    return distance0;

}
//左边超声波测距模块
int getDistance1()
{
  int TrigPin1 = 10;   // 定义超声波信号发出接口1
  int EchoPin1 = 2;   // 定义超声波信号接收口1
  digitalWrite(TrigPin1, LOW); // 使发出发出超声波信号接口低电平2μs
  delayMicroseconds(2);
  digitalWrite(TrigPin1, HIGH); // 使发出发出超声波信号接口高电平10μs,这里是至少10μs
  delayMicroseconds(10);
  digitalWrite(TrigPin1, LOW); // 保持发出超声波信号接口低电平
  
  int distance1 = pulseIn(EchoPin1, HIGH);  // 读出脉冲时间
  distance1= distance1/58.0; // 将脉冲时间转化为距离(单位:厘米)
  
if (distance1 >=20)
  {
     
    return 20;
  } 
  else
    return distance1;

}
//右边超声波测距模块
int getDistance2()
{
  int TrigPin2 = A0;   // 定义超声波信号发出接口2
  int EchoPin2 = A1;   // 定义超声波信号接收口2
  digitalWrite(TrigPin2, LOW); // 使发出发出超声波信号接口低电平2μs
  delayMicroseconds(2);
  digitalWrite(TrigPin2, HIGH); // 使发出发出超声波信号接口高电平10μs,这里是至少10μs
  delayMicroseconds(10);
  digitalWrite(TrigPin2, LOW); // 保持发出超声波信号接口低电平
  
  int distance2 = pulseIn(EchoPin2, HIGH);  // 读出脉冲时间
  distance2= distance2/58.0; // 将脉冲时间转化为距离(单位:厘米)
  
if (distance2 >=20)
  {
     
    return 20;
  }  
  else
    return distance2;

}
💡商业转载请联系作者获得授权,非商业转载请注明出处。
协议(License):署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)。
使用这些免费资源的时候应遵守版权意识,切勿非法利用,售卖,尊重原创内容知识产权。未经允许严禁转载。

评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇