現已接受轉數快(FPS)付款, 付款更快捷方便!

智能小車 組裝教程

本次教程主要講解如何組裝避障自走車,實現前方感應,當越到障礙物時轉彎。

 

 

主要材料包括:

  1. MG90S / SG90 金屬齒輪
  2. HC-SR04 超聲波感測器
  3. Arduino UNO R3
  4. L298N 馬達驅動板
  5. 智能小車模組
  6. 9V電池
  7. 麵包板
  8. 杜邦線

 

 

 

超聲波感測器運作原理:

超聲波感測器主要是發射聲波信號及接收經物體反射返回的相同聲波信號,并記錄下所發射信號及接收信號的時間差T,然後根據聲波的傳遞速度,S=VT,可以計算小車與前方物體相距多遠。

 

 

避障小車運作原理:

通過arduino 板我們可以獲得超聲波感測器計算所得距離,然後我們可以設定一個危險的距離,當小車與前方物體相距小於某個距離,就指示小車停下,再後退一小段距離。然後我們就可以利用金屬齒輪轉動超聲波感測器檢測左方及右方的物距,然後在讓小車往物距大的方向轉動并繼續行駛,從而達至避障的效果。

一. 準備好避障車所需硬件:如圖

       

二.組裝智能小車底板

  1. 安裝萬向輪

       

  1. 測試馬達的轉動方向

      

  1.  根據馬達的正傳方向安裝馬達

      

  1. 先預好位置,將arduino板,麵包板和馬達驅動板

     

  1.  然後將MG90S和超聲波傳感器組裝并裝在車頭

        

  1. 鏈接Arduino UNO R3 和馬達驅動板

       

       Arduino UNO R3 連接 D8,D9,D10,D11

       L298連接 IN1,IN2,IN3,IN4

       對應A,B馬達的正轉和反轉

       OUT1,右車輪紅色  OUT2,右車輪黑色 OUT3,左車輪紅色  OUT4,左車輪黑色

  1. 在Arduino UNO R3 板上引出一條5V線和一條ground線到麵包板上

       

  1. 鏈接MG90S和arduino板

      

      MG90S-按照不同顏色對應

      深褐色: Gound 插入麵包板上ground線的那一行接腳

      紅色 :  Vcc 插入麵包板上Vcc線的那一行接腳

      橙色 :  信號插入Arduino UNO R3 D4接腳

  1. 鏈接超聲波傳感器與arduino板

      

      左邊黃色: arduino 5V 接腳                           右邊黃色:HC-SR04 5V 接腳

      左邊紅色: arduino pin 12 接腳                     右邊紅色:HC-SR04 Trin Pin 接腳

      左邊橙色: arduino pin 13 接腳                     右邊橙色:HC-SR04 Echo Pin 接腳

      左邊黑色: arduino GND接腳                        右邊黑色:HC-SR04 GND接腳     

  1. 接駁馬達驅動板電源

    

    鏈接9V電池的正極到馬達驅動板的12V接口,然後鏈接9V電池的負極到馬達驅動板的GND        接口,并接一條arduino 5V 線到驅動板的5V接口。

    避障車組裝完成!!!

    下面是示範程式:

 //defines pin numbers
  
  #include <Servo.h>

  Servo myservo;// 建立Servo物件,控制伺服馬達
  const byte TrigPin = 12; // 超音波模組的觸發腳
  const int EchoPin = 13; // 超音波模組的接收腳
  const int dangerdistance = 20; //設定小車檢測的危險距離 
  long distance;  // 暫存感應器接收高電位信號的持續時間

  
  const byte IN1 = 8;// 馬達A的正轉接腳
  const byte IN2 = 9;// 馬達A的反轉接腳
  const byte IN3 = 10;// 馬達B的正轉接腳
  const byte IN4 = 11;// 馬達B的反轉接腳

  long duration ()
   {// 超音波感測程式
    digitalWrite(TrigPin,HIGH); // 觸發腳設定成高電位
    delayMicroseconds(5); // 持續5微秒f
    digitalWrite(TrigPin,LOW); // 觸發腳設定成低電位

    return pulseIn(EchoPin,HIGH); // 測量高電位的持續時間(µs)
    }
      void stop() // 馬達停止
        {
         digitalWrite(IN1, LOW);
         digitalWrite(IN2, LOW); 
         digitalWrite(IN3, LOW); 
         digitalWrite(IN4, LOW); 
         }

         void forward() // 馬達轉向:前進
         {
          digitalWrite(IN1, HIGH);
          digitalWrite(IN2, LOW); 
          digitalWrite(IN3, HIGH); 
          digitalWrite(IN4, LOW); 
         }

         
         void backward() // 馬達轉向:後退
         {
          digitalWrite(IN1, LOW);
          digitalWrite(IN2, HIGH); 
          digitalWrite(IN3, LOW); 
          digitalWrite(IN4, HIGH); 
         }

         
         void turnLeft() // 馬達轉向:左轉
         {
          digitalWrite(IN1, HIGH);
          digitalWrite(IN2, LOW); 
          digitalWrite(IN3, LOW); 
          digitalWrite(IN4, HIGH);
          delay(300);
          forward(); 
         }

         void turnRight() // 馬達轉向:右轉
         {
          digitalWrite(IN1, LOW);
          digitalWrite(IN2, HIGH); 
          digitalWrite(IN3, HIGH); 
          digitalWrite(IN4, LOW);
          delay(300);
          forward();  
         }
       int lookRight() //超音波轉右感測程式
      {
        myservo.write(20);
        delay(500);
        int distance = duration();
        delay(100);
        myservo.write(90);
        return distance;
       }

       int lookLeft() //超音波轉左感測程式
       {
        myservo.write(160);
        delay(500);
        int distance = duration();
        myservo.write(90);
        return distance;
       }
void setup() 
{
  Serial.begin(9600);

  pinMode(TrigPin, OUTPUT); // 觸發腳設定成「輸出」
  pinMode(EchoPin, INPUT); // 接收腳設定成「輸入」
  pinMode(IN1, OUTPUT); // 馬達控制板的接腳全都設定成「輸出」
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
   myservo.attach(4); //模擬舵機的輸入腳
   myservo.write(90); //模擬舵機的置中角度
   delay(3000);

}

void loop() 
{
  distance = duration()*0.034/2; // 讀取障礙物的距離
  Serial.print("Distance:");
  Serial.println(distance);
  int distanceR = 0;
  int distanceL = 0;
  delay(40);
  if(distance>dangerdistance) // 如果距離大於20cm…
  {
    forward(); //前進
    }
    else
    { if(distance<=dangerdistance) // 如果距離小於或等於20cm…
   
      stop(); //暫停馬達0.1秒
      delay(100); 
      backward(); //馬達反轉0.3秒
      delay(300);
      stop(); //暫停馬達0.2秒
      delay(200);
      distanceR =lookRight(); 
      delay(200);
      distanceL =lookLeft();

      if(distanceR>distanceL) // 如果右方的距離大於左方的距離
      {
        turnRight(); //向加轉
        stop(); 
        }
        else //如果如果左方的距離大於右方的距離
        {
          turnLeft(); //向左轉
          stop();
        }
            
      distance = duration(); 
      }   
}
diy_arduino_kart
Next: MeArm v1.0 Laser Cut File (AI / PDF) 安裝說明

發表回覆

你的電郵地址並不會被公開。 必要欄位標記為 *