Arduino 自動避障智能小車製做教程

Arduino 自動避障智能小車製做教程


材料:

  1. Arduino UNO r3
  2. L298N電機驅動模塊
  3. 小車底盤一個,萬向輪一個
  4. 2個電機及匹配的車輪
  5. 9V電池盒及6個1.5V電池
  6. 超聲波測距模塊及其支架
  7. 9G舵機一個及其支架
  8. 杜邦線若干

小車圖片:

小車俯視圖

連線說明:

  • Arduino UNOgit

    • 2 ---> Trlg
    • 3 ---> Echo

    右輪dom

    • 4 ---> IN4
    • 5 ---> IN3

    左輪函數

    • 6 ---> IN2
    • 7 ---> IN1
    • 9 ---> 舵機橙線(數字端口)
    • VIN ---> L298N模塊5V供電口
    • 5V ---> 舵機紅線、超聲波VCC
    • GNG ---> 超聲波GND、公共端COM、舵機棕線(接地)
  • L298N模塊oop

    • 12V供電 ---> 電源正極
    • COM公共端 ---> GND、電源負極
    • 5V供電 ---> VIN
    • 輸出A ---> 左側電機
    • 輸出B ---> 右側電機

小車代碼:

#include <Servo.h>

#define Trig 2                 //引腳控制超聲波發出聲波
#define Echo 3                 //引腳反應接收到返回聲波
#define LIN1 7                 //左側輪子
#define LIN2 6          
#define RIN1 5                 //右側輪子
#define RIN2 4          
//#define Steeringpin 9        //舵機控制端口

int S = 0;                     //初始化距離
Servo Steering;                //轉向舵機

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);          //設置比特率 
  pinMode(Trig, OUTPUT);        
  pinMode(Echo, INPUT);
  pinMode(LIN1, OUTPUT);
  pinMode(LIN2, OUTPUT);
  pinMode(RIN1, OUTPUT);
  pinMode(RIN2, OUTPUT);
//  pinMode(Steeringpin, OUTPUT);
  Steering.attach(9);           //定義舵機所用引腳
  Steering.write(90);           //初始化舵機角度
  delay(2000);                  //開機延時
}

void loop() {
  // put your main code here, to run repeatedly:
  Steering.write(90);
  Range();                      //測距函數
  if(S <= 5)      //距離太近不足以轉彎
  { 
    Back();                     //執行後退函數
    delay(300);                 //後退持續時間
  }
  else if(S >= 5 && S <= 15)   //距離中等能夠轉彎
  {
    Turn();                     //執行轉彎判斷函數
  }
  else                          //距離充足
  {
    Line();                     //執行直行函數
  }
}

void Range()                    //測距函數
{ 
  digitalWrite(Trig,LOW);       //測距
  delay(2);                     //延時2微秒
  digitalWrite(Trig,HIGH);
  delay(10);
  digitalWrite(Trig,LOW);
  float distance = pulseIn(Echo,HIGH); //讀取高電平時間
  S = float( distance * 17 )/1000;     //把值賦給S
  Serial.println(S);            //向串口發送S的值,能夠在顯示器上顯示距離
}

// float distance = pulseIn(Echo,HIGH);
// S = float( distance * 17 )/1000; 
// 將回波時間換算成cm
// 讀取一個引腳的脈衝(HIGH或LOW)。例如,若是value是HIGH,pulseIn()會等待引腳變爲HIGH,開始計時,再等待引腳變爲LOW並中止計時。
// 返回脈衝的長度,單位微秒。若是在指定的時間內無脈衝函數返回。
// 此函數的計時功能由經驗決定,長時間的脈衝計時可能會出錯。計時範圍從10微秒至3分鐘。(1秒=1000毫秒=1000000微秒)
// 接收到的高電平的時間(us)* 340m/s / 2 = 接收到高電平的時間(us) * 17000 cm / 1000000 us = 接收到高電平的時間 * 17 / 1000  (cm)

void Turn()                     //轉向函數
{ 
  Lull();                       //中止
  Steering.write(170);          //使舵機轉到170度(左側)
  delay(1000);                  //留時間給舵機轉向
  Range();                      //測距
  Steering.write(90);           //使舵機回覆原位
  delay(1000);
  if(S >= 15)                   //距離充足
  {
    turnLeft();                 //左轉彎後退
  }
  else                          //距離不足
  {
    Steering.write(10);         //使舵機轉到10度(右側)
    delay(1000);
    Range();
    Steering.write(90);         //使舵機回覆原位
    delay(1000);  
    if(S >= 15)                 //距離充足
    {
      turnRight();              //右轉彎後退
    }
    else 
    {
      Back();                   //後退
      int x = random(1);        //產生一個隨機數使小車隨機轉向
      if(x == 0)
        turnLeft();
      else
        turnRight();
    }
  }
}

void Back()                 //後退函數(使電機反轉)
{
  digitalWrite(LIN1, LOW);
  digitalWrite(LIN2, HIGH);
  digitalWrite(RIN1, HIGH);
  digitalWrite(RIN2, LOW);
}

void Line()                 //直線行駛函數(使電機正轉)
{
  digitalWrite(LIN1, HIGH);
  digitalWrite(LIN2, LOW);
  digitalWrite(RIN1, LOW);
  digitalWrite(RIN2, HIGH);
}

void turnLeft()             //小車左轉後退
{
  digitalWrite(LIN1, LOW);
  digitalWrite(LIN2, HIGH);
  digitalWrite(RIN1, LOW);
  digitalWrite(RIN2, LOW);
  delay(1000);
}

void turnRight()            //小車右轉後退
{
  digitalWrite(LIN1, LOW);
  digitalWrite(LIN2, LOW);
  digitalWrite(RIN1, HIGH);
  digitalWrite(RIN2, LOW);
  delay(1000);
}

void Lull()                 //中止 
{
  digitalWrite(LIN1, LOW);
  digitalWrite(LIN2, LOW);
  digitalWrite(RIN1, LOW);
  digitalWrite(RIN2, LOW);  
}

製做心得:

本身自己也是個小白,出於好玩嘗試作了一個,翻了不少教程都看得似懂非懂本身寫了一篇但願能對你們有所幫助,也方便我之後查閱
相關文章
相關標籤/搜索