<攝影 : greatway9999>

一、成果展示

(一)、需求描述

  1. 可偵測前方有障礙物。
  2. 遮右邊,則右轉 ; 遮左邊,則右轉。


二、關於程式碼

(一)、完整程式碼




備註 : 因程式碼較長,分3段截圖,故畫面可能有些許不協調,但不影響功能實現。

(二)、解題想法

要利用超音波感測器去實現避障的功能,因此關鍵在於控制超音波感測器的感測範圍。透過感測範圍的控制,讓角度伺服馬達可做出對應的動作,同時連續型伺服馬達也能夠實現預定功能 (遮左邊,轉右邊 ; 遮右邊,轉左邊)。

(三)、程式碼筆記

1.設定超音波感測器腳位

本處,trigger腳位接D3,echo角位接D2。並設定 60ms 的延遲時間。Delay Time設定的目的,除了讓超音波感測器有足夠的時間來進行打出訊號與接收訊號的動作,同時也可避免超音波感測器占用 MCU 資源,導致其他程式無法進行或出現預期外的錯誤。


2.設定遇到障礙物時的動作

如圖,我們將超音波感測器的值設置在 0 ~ 10 間,而此時在D7與D4腳位的連續型伺服馬達都處於停止狀態。

因為設置位於D8腳位的角度型伺服馬達的角度為140度,所以如果遇到障礙物,小車會先往左邊擺頭讀取超音波感測器的值,再往右邊讀取超音波感測器的值。

如果遮右邊,左邊的值大於右邊,則馬達正轉,往右邊旋轉。如果遮左邊,左邊的值小於右邊,則馬達反轉,往左邊旋轉。


(四)原始碼

#include <Servo.h>

int _ABVAR_1_Ultra = 0 ;
int ardublockUltrasonicSensorCodeAutoGeneratedReturnCM(int trigPin, int echoPin)
{
  long duration;
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(20);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  duration = duration / 59;
  if ((duration < 2) || (duration > 300)) return false;
  return duration;
}

Servo servo_pin_7;
Servo servo_pin_4;
Servo servo_pin_8;
int _ABVAR_2_Left = 0 ;
int _ABVAR_3_Right = 0 ;

void setup()
{
  digitalWrite( 3 , LOW );

  servo_pin_7.attach(7);
  servo_pin_4.attach(4);
  servo_pin_8.attach(8);
}

void loop()
{
  _ABVAR_1_Ultra = ardublockUltrasonicSensorCodeAutoGeneratedReturnCM( 3 , 2 ) ;
  delay( 60 );
  if (( ( ( _ABVAR_1_Ultra ) > ( 0 ) ) && ( ( _ABVAR_1_Ultra ) < ( 10 ) ) ))
  {
    servo_pin_7.write( 90 );
    servo_pin_4.write( 90 );
    servo_pin_8.write( 140 );
    delay( 1000 );
    _ABVAR_2_Left = ardublockUltrasonicSensorCodeAutoGeneratedReturnCM( 3 , 2 ) ;
    servo_pin_8.write( 40 );
    delay( 1000 );
    _ABVAR_3_Right = ardublockUltrasonicSensorCodeAutoGeneratedReturnCM( 3 , 2 ) ;
    servo_pin_8.write( 90 );
    if (( ( _ABVAR_2_Left ) > ( _ABVAR_3_Right ) ))
    {
      servo_pin_4.write( 0 );
      servo_pin_7.write( 0 );
      delay( 1000 );
    }
    else
    {
      if (( ( _ABVAR_2_Left ) < ( _ABVAR_3_Right ) ))
      {
        servo_pin_4.write( 180 );
        servo_pin_7.write( 180 );
      }
      delay( 1000 );
    }
  }
  else
  {
    servo_pin_7.write( 0 );
    servo_pin_4.write( 180 );
  }
}



#超音波避障 #伺服馬達


0 留言