42
1 崑山科技大學 機械工程系 實務專題報告 自走車製作研究 指導教授: 吳向宸 實務專題組員:進修部四機四 C 謝承佐 學號:A010H311 宋育勛 A010H313 洪振嘉 A010H316 陳羿廷 A010H330 林弘倉 A010H338 曾廣彥 A010H326 中華民國 105 05 23

崑山科技大學 機械工程系 實務專題報告 自走車製作研究ir.lib.ksu.edu.tw/bitstream/987654321/25570/2/專題製作.pdf · Arduino,是一個開放原始碼的單晶片微控制器,它使用了Atmel

  • Upload
    others

  • View
    24

  • Download
    0

Embed Size (px)

Citation preview

  • 1

    崑 山 科 技 大 學

    機 械 工 程 系

    實 務 專 題 報 告

    自走車製作研究

    指導教授: 吳向宸

    實務專題組員:進修部四機四 C

    謝承佐 學號:A010H311

    宋育勛 A010H313

    洪振嘉 A010H316

    陳羿廷 A010H330

    林弘倉 A010H338

    曾廣彥 A010H326

    中華民國 105 年 05 月 23 日

  • 2

  • 3

    自走車製作研究

    謝承佐 宋育勛 洪振嘉

    陳羿廷 林弘倉 曾廣彥

    崑山科技大學機械工系

    摘要

    在本專題中,我們製作一輛具有循跡、避障與遙控等功能的自走

    車,此三功 能為獨立功能並可由遙控器做切換選擇。自走車的底盤

    部份由一圓形壓克力底 盤、2 個獨立主動輪與輔助輪組成,2 主動

    輪各自分別由一直流馬達帶動,直流 馬達由 L298N 馬達驅動板驅動。

    控制器部分則採用 Arduino Uno 控制板,循跡感測模組、自製的紅

    外線障礙物感測模組、或超音波測距模組。最後撰寫程式操控此自走

    車達到循跡、避障與遙控等功能。

  • 4

    目 錄

    頁數

    摘要 -------------------------------------------------------------------- 3

    目錄 -------------------------------------------------------------------- 4

    圖目錄 -------------------------------------------------------------------- 5

    一、 緒論-------------------------------------------------------------- 6

    二、 研究內容與方法----------------------------------------------- 7

    2.1 零件與介紹------------------------------------------------------ 8

    2.2. 成品---------------------------------------------------------------- 19

    三、 實驗部份------------------------------------------------------- 20

    3.1 程式------------------------------------------------------------ 21

    四、 結果與討論---------------------------------------------------- 40

    五、 結論-------------------------------------------------------- 41

    參考文獻 -------------------------------------------------------------------- 42

  • 5

    圖 目 錄

    頁數

    圖 1 底盤--------------------------------------------- 8

    圖 2 杜邦線------------------------------------------- 8

    圖 3 跨接線與伺服馬達---------------------------------- 9

    圖 4 超音波模組--------------------------------------- 10

    圖 5 N20金屬減速馬達與左右轉向輪---------------------- 12

    圖 6 L298N 馬達驅動板--------------------------------- 12

    圖 7 感測器擴展板------------------------------------- 13

    圖 8 Arduino(UNO) R3 控制板--------------------------- 15

    圖 9 萬向輪------------------------------------------- 16

    圖 10 2000MA 18650 充電電池與 18650 電池盒-------------- 16

    圖 11 尋線模組----------------------------------------- 17

    圖 12 手機藍芽控制模組--------------------------------- 17

    圖 13 銅柱 3.5MM 4 個、1.0MM 2 個、3MM 螺絲螺母-------- 18

    圖 14 成品--------------------------------------------- 19

  • 6

    一、緒論

    在當今工商業發達的這個時代,道路上不分日夜、不分假日與

    工作天,一年 三百六十五天,隨處都可以見到各式各樣的車子在路

    上行走,不管是機車、還是 汽車、貨車等等。我們生活周遭很多都

    是使我們生活更省力輕鬆的機器,但大家 是否想過,這些如此方便

    的機器,它們到底是怎麼出現在我們身邊的嗎?這些機 器,都是每

    一位傑出的研究人員經過長期思考與實驗,才能換來的成果,要不斷

    的創新,不斷的嘗試,才能得到一個偉大的成果,這是所有研究人員

    的精神。由 此可知,它們所開發的物品,都在驅使著我們進步,平

    時最常見到的汽車,最令 我好奇,一堆人也很難推動的大型物體,

    輕輕踩個油門就能往前進。

  • 7

    二、研究內容與方法

    由於我們平日在學校上的課程均與汽車相關,因此在專題製作方

    面,我們所 選擇的題目也與車子有關。然而,現在科技愈來愈進步,

    自動化設備愈來愈普遍, 我們相信終有一日汽車亦可達到自動化駕

    駛。當高科技自動化時代來臨,自走車 不僅可以為我們日常的生活

    增加不少便利,更可以替我們完成許多高度危險或是 達到節省人力

    的目的。基於這樣的興趣與原因,所以會讓我們很想看一看自走車 的

    奧妙呢,於是我們在想,從自走車開始做研究,自走車如何驅動?自

    走車能有 什麼功能?於是我們決定認真研討這個問題,並且創造出

    屬於自己、獨一無二的 自走車。我們的專題便朝智慧型自走車方向

    製作。跟遙控車比較的話,自走車是以寫程式的方式去控制它,並且

    使其做出我們 理想中動作的一種東西。我們希望製作出一輛多功能

    自走車,可以尋跡、避障、 遙控,而這些功能可以由遙控器來做切

    換。另外,由於目前智慧型手機愈來愈普 遍,因此我們亦嘗試使用

    智慧型手機來作為遙控器。

  • 8

    2.1零件與介紹

    圖 1底盤

    圖 2杜邦線

  • 9

    圖 3跨接線與伺服馬達

    伺服馬達的動作特性是進行位置定位控制和動作速度控制,其主

    要特點是 轉速可以精確控制,速度控制範圍廣,可以安定平順等速

    運轉之外,還可以根據需求隨時變更速度。在極低速度也可以穩定轉

    動。能迅速做出正轉與逆轉,也能迅速加減速。在由靜態改為動態運

    作或由動態改為靜態運作所需費時極短,而且即便有外力附加仍可以

    保持位置。並在額定容量範圍內瞬間產生大轉矩,輸出功率大且效率

    也高。

    https://zh.wikipedia.org/w/index.php?title=%E5%AE%9A%E4%BD%8D%E6%8E%A7%E5%88%B6&action=edit&redlink=1https://zh.wikipedia.org/w/index.php?title=%E9%80%9F%E5%BA%A6%E6%8E%A7%E5%88%B6&action=edit&redlink=1

  • 10

    圖 4超音波模組

    超音波感測器是由超音波發射器、接收器和控制電路所組成。當

    它被觸發的時候,會發射一連串 40 kHz 的聲波並且從離它最近的物

    體接收回音。超音波是人類耳朵無法聽見的聲音,因為它的頻率很

    高。

    如下圖所示,超音波測量距離的方法,是測量聲音在感測器與物

    體之間往返經過的時間:

  • 11

    在國中理化有教過,聲音在空氣中的傳播速度大約是每秒 340

    公尺,傳播速度會受溫度影響,溫度愈高,傳播速度愈快。假設以 340

    公尺計算,1000000 / 340 * 100 = 29.4 microseconds,四捨五入

    後,可知聲音傳播 1 公分所需的時間為 29 microseconds (百萬分

    之一秒)。

    由於超音波從發射到返迴是兩段距離,因此在計算時必須將結

    果除以 2 才是正確的物體距離。所以我們可以利用底下的公式算出

    物體距離(距離單位為公分,其中 timing 是測量得到的音波傳播時

    間)

    http://lh3.ggpht.com/-OM7Ra4hM_5s/UFYSMQ8v9tI/AAAAAAAAIak/F8ZAdS42-Q4/s1600-h/image[2].png

  • 12

    圖 5 N20金屬減速馬達與左右轉向輪

    圖 6 L298N 馬達驅動板

  • 13

    在馬達控制應用中,經常使用開關的包括繼電器與電晶體,而其

    中經由電子訊號 驅動的電晶體又比繼電器等機械式開關的速度快上

    許多。一般使用 4 個電晶體組成的 橋式電路來做為切換的開關,並

    控制馬達的正轉與反轉。本文使用的馬達驅動 IC 為 L298N 馬達模

    組,其原理主要將兩組橋式電路封裝成晶片,並加上穩壓 IC,能同

    時 驅動兩顆直流馬達或一顆步進馬達,並控制轉速。以下將介紹如

    何將 Arduino UNO 接上 L298N 馬達驅動板控制 12V 直流馬達。

    圖 7 感測器擴展板

  • 14

    在利用 Arduino製作各種互動作品的時候,經常會用到一些常用

    的感測器或者電路模組。對於那些熟悉電子電路的人來講,用麵包板

    或者萬能板搭建一些簡單的模組電路當然是可以的,但對於那些不太

    熟悉電路或者稍微複雜的電路來講,似乎就不那麼適合了。

    使用這一擴展板能夠很容易地與一些常用的模擬感測器相連,例如光

    線感測器。有了這一擴展板和相應電路模組的支援,我們只需要用專

    用的連接線把相應的感測器模組和 Arduino連接起來,電路部分就算

    完成了。由於具體的電路細節則都由相應的感測器模組來實現,因此

    我們需要考慮的只是如何在 Arduino中編寫相應的程式來讀取這些

    感測器傳過來的資料就可以了。

    此版本同樣採用可堆疊的設計,能夠與其他擴展板配合使用。同時還

    修改了數位感測器介面的線序,更方便各種感測器的連接,能夠直接

    連接伺服馬達。

  • 15

    圖 8 UNO R3 控制板

    Arduino,是一個開放原始碼的單晶片微控制器,它使用了 Atmel

    AVR單片機,採用了開放原始碼的軟硬體平台,建構於簡易輸出/輸

    入(simple I/O)介面板,並且具有使用類似 Java、C語言的

    Processing/Wiring 開發環境。

    https://zh.wikipedia.org/wiki/%E9%96%8B%E6%94%BE%E5%8E%9F%E5%A7%8B%E7%A2%BChttps://zh.wikipedia.org/wiki/%E5%96%AE%E6%99%B6%E7%89%87https://zh.wikipedia.org/wiki/%E5%96%AE%E6%99%B6%E7%89%87https://zh.wikipedia.org/wiki/Atmel_AVRhttps://zh.wikipedia.org/wiki/Atmel_AVRhttps://zh.wikipedia.org/wiki/Javahttps://zh.wikipedia.org/wiki/C%E8%AA%9E%E8%A8%80

  • 16

    圖 9萬向輪作為自走車平衡用途

    圖 10 2000MA 18650 充電電池與 18650 電池盒與自走車電源

  • 17

    圖 11 循線模組

    圖 11為利用反射式紅外線感測器達成循跡動作

    圖 12 手機藍芽控制模組

  • 18

    藍牙模組有「主控端」和「從端」兩種模式,在配對時,一定是

    由「主控端」主導,探索其他「從端」並與之配對連線;從端無法彼

    此互連。

    HC-06組可以透過 AT 命令,設定成「主控端(Master)」或「從

    端(Slave)」;HC-06 模組只能當「從端」。因此在配對連線實驗中,

    至少要有一個 HC-06組。

    每個藍牙模組都有一個唯一的位址,主控端模組可透過 AT+BIND

    命令(註:“bind”代表「繫結」)紀錄要配對的從端位址,設定好

    之後,它就能在通電(開機)時,自動探索並和指定位址的從端相連,

    這中間的過程,不需要 Arduino 介入,也就是不必寫任何程式碼。

    圖 13銅柱 3.5MM 4 個、1.0MM 2 個、3MM 螺絲螺母與固定自走車零件

  • 19

    2.2成品

    圖 14 製作完成之自走車成品

  • 20

    三、實驗部份

    車體結構簡介我們希望製作一輛小車,其具備(1)尋跡(2)避障(3)

    遙控等功能。此三個功能為獨立功能,並可以由遙控器選擇功能。目

    前我們已完成尋跡及避障功能製作,遙控功能則在嘗試中,我們將以

    藍芽來做無線通訊,並以 Android 智慧型手機來操控。車體結構部

    分我們採用雙主動輪外加輔助輪的模式,這 2 個主動輪可由控制器

    獨立操控其正反轉與轉速,因此主動輪分別由 2 個直流馬達來帶動。

    車體的左前端與右前端可放置循跡感測器或障礙物感測器,其中循跡

    感測器採用 CNY70 反射式光感測元件,並靠近地面約 1~2cm。障

    礙物感測模組則放置在車體上方,由一個紅外線發射元件和一個紅外

    線接收元件組成。這 2 個感測模組我們將自行製作。此外,在此我

    們最終所完的車體採用直徑約 12cm 的圓形底盤,與一開始的設計

    有點不同

  • 21

    3.1程式

    (1)L298N 馬達驅動實驗 #define MotorR_I1 8 //定義 I1 接腳

    #define MotorR_I2 9 //定義 I2 接腳

    #define MotorL_I3 10 //定義 I3 接腳

    #define MotorL_I4 11 //定義 I4 接腳

    #define MotorR_ENA 5 //定義 ENA (PWM 調速) 接腳

    #define MotorL_ENB 6 //定義 ENB (PWM 調速) 接腳

    void setup()

    {

    pinMode(MotorR_I1,OUTPUT);

    pinMode(MotorR_I2,OUTPUT);

    pinMode(MotorL_I3,OUTPUT);

    pinMode(MotorL_I4,OUTPUT);

    pinMode(MotorR_ENA,OUTPUT);

    pinMode(MotorL_ENB,OUTPUT);

    }

    void loop()

    {

    //直走

    analogWrite(MotorR_ENA,200); //設定馬達轉速

    analogWrite(MotorL_ENB,200);

    digitalWrite(MotorR_I1,HIGH); //馬達(右)順時針轉動

    digitalWrite(MotorR_I2,LOW);

    digitalWrite(MotorL_I3,HIGH); //馬達(左)逆時針轉動

    digitalWrite(MotorL_I4,LOW);

    delay(2000);

    //後退

    analogWrite(MotorR_ENA,200); //設定馬達轉速

    analogWrite(MotorL_ENB,200);

    digitalWrite(MotorR_I1,LOW); //馬達(右)逆時針轉動

    digitalWrite(MotorR_I2,HIGH);

    digitalWrite(MotorL_I3,LOW); //馬達(左)順時針轉動

  • 22

    digitalWrite(MotorL_I4,HIGH);

    delay(2000);

    //左轉

    analogWrite(MotorR_ENA,80); //設定馬達轉速

    analogWrite(MotorL_ENB,80);

    digitalWrite(MotorR_I1,HIGH); //馬達(右)順時針轉動

    digitalWrite(MotorR_I2,LOW);

    digitalWrite(MotorL_I3,LOW); //馬達(左)順時針轉動

    digitalWrite(MotorL_I4,HIGH);

    delay(2000);

    //右轉

    analogWrite(MotorR_ENA,80); //設定馬達轉速

    analogWrite(MotorL_ENB,80);

    digitalWrite(MotorR_I1,LOW); //馬達(右)逆時針轉動

    digitalWrite(MotorR_I2,HIGH);

    digitalWrite(MotorL_I3,HIGH); //馬達(左)逆時針轉動

    digitalWrite(MotorL_I4,LOW);

    delay(2000);

    //停止

    digitalWrite(MotorR_I1,HIGH); //馬達(右)停止轉動

    digitalWrite(MotorR_I2,HIGH);

    digitalWrite(MotorL_I3,HIGH); //馬達(左)停止轉動

    digitalWrite(MotorL_I4,HIGH);

    delay(2000);

    }

  • 23

    (2)智能車循線實驗 #define MotorR_I1 8 //定義 I1 接腳

    #define MotorR_I2 9 //定義 I2 接腳

    #define MotorL_I3 10 //定義 I3 接腳

    #define MotorL_I4 11 //定義 I4 接腳

    #define MotorR_ENA 5 //定義 ENA (PWM 調速) 接腳

    #define MotorL_ENB 6 //定義 ENB (PWM 調速) 接腳

    // 循線模組

    #define SensorLeft A0 //定義左感測器輸入腳

    #define SensorMiddle A1 //定義中感測器輸入腳

    #define SensorRight A2 //定義右感測器輸入腳

    intoff_track = 0; //宣告變數

    void setup()

    {

    Serial.begin(9600);

    pinMode(MotorR_I1, OUTPUT);

    pinMode(MotorR_I2, OUTPUT);

    pinMode(MotorL_I3, OUTPUT);

    pinMode(MotorL_I4, OUTPUT);

    pinMode(MotorR_ENA, OUTPUT);

    pinMode(MotorL_ENB, OUTPUT);

    pinMode(SensorLeft, INPUT);

    pinMode(SensorMiddle, INPUT);

    pinMode(SensorRight, INPUT);

    }

    void advance(int a) // 前進

    {

    digitalWrite(MotorR_I1,HIGH); //馬達(右)順時針轉動

    digitalWrite(MotorR_I2,LOW);

    digitalWrite(MotorL_I3,HIGH); //馬達(左)逆時針轉動

  • 24

    digitalWrite(MotorL_I4,LOW);

    delay(a * 100);

    }

    void turnR(int d) //右轉

    {

    digitalWrite(MotorR_I1,LOW); //馬達(右)逆時針轉動

    digitalWrite(MotorR_I2,HIGH);

    digitalWrite(MotorL_I3,HIGH); //馬達(左)逆時針轉動

    digitalWrite(MotorL_I4,LOW);

    delay(d * 100);

    }

    void turnL(int e) //左轉

    {

    digitalWrite(MotorR_I1,HIGH); //馬達(右)順時針轉動

    digitalWrite(MotorR_I2,LOW);

    digitalWrite(MotorL_I3,LOW); //馬達(左)順時針轉動

    digitalWrite(MotorL_I4,HIGH);

    delay(e * 100);

    }

    void stopRL(int f) //停止

    {

    digitalWrite(MotorR_I1,HIGH); //馬達(右)停止轉動

    digitalWrite(MotorR_I2,HIGH);

    digitalWrite(MotorL_I3,HIGH); //馬達(左)停止轉動

    digitalWrite(MotorL_I4,HIGH);

    delay(f * 100);

    }

    void back(int g) //後退

    {

    digitalWrite(MotorR_I1,LOW); //馬達(右)逆時針轉動

    digitalWrite(MotorR_I2,HIGH);

    digitalWrite(MotorL_I3,LOW); //馬達(左)順時針轉動

    digitalWrite(MotorL_I4,HIGH);

    delay(g * 100);

  • 25

    }

    void loop()

    {

    // 讀取感測器狀態

    int SL = digitalRead(SensorLeft);

    int SM = digitalRead(SensorMiddle);

    int SR = digitalRead(SensorRight);

    if((SM == LOW) && (SL == LOW) && (SR == LOW)) // 小車脫離黑線

    {

    analogWrite(MotorR_ENA,200); //設定馬達 (右) 轉速

    analogWrite(MotorL_ENB,200); //設定馬達 (左) 轉速

    // 小車有時會因為循線感測器誤判或黑線轉角太大, 認為脫離黑線了而停

    // 加上尋回黑線機制, 避免小車誤動作

    // 您可以修改程式讓循線/尋線機制更完美

    if(off_track< 3)

    {

    switch(off_track)

    {

    case 0:

    back(1);

    break;

    case 1:

    turnR(1);

    break;

    case 2:

    turnL(2);

    break;

    }

    off_track++;

    }

    else

  • 26

    {

    stopRL(0);

    }

    }

    else

    {

    off_track = 0;

    if(SM == HIGH) //中感測器在黑色區域

    {

    if((SL == LOW) && (SR == HIGH)) // 左白右黑, 車體偏右校正

    {

    analogWrite(MotorR_ENA,200); //設定馬達 (右) 轉速

    analogWrite(MotorL_ENB, 80); //設定馬達 (左) 轉速

    advance(0);

    }

    else if((SL == HIGH) && (SR == LOW)) // 左黑右白, 車體偏左校正

    {

    analogWrite(MotorR_ENA, 80); //設定馬達 (右) 轉速

    analogWrite(MotorL_ENB,200); //設定馬達 (左) 轉速

    advance(0);

    }

    else // 其他, 直走

    {

    analogWrite(MotorR_ENA,200); //設定馬達 (右) 轉速

    analogWrite(MotorL_ENB,200); //設定馬達 (左) 轉速

    advance(0);

    }

    }

    else // 中感測器在白色區域, 車體已大幅偏離黑線

    {

    if((SL == LOW) && (SR == HIGH)) // 左白右黑, 車體快速右轉

    {

    analogWrite(MotorR_ENA,200); //設定馬達 (右) 轉速

    analogWrite(MotorL_ENB,200); //設定馬達 (左) 轉速

    turnR(0);

    }

    else if((SL == HIGH) && (SR == LOW)) // 左黑右白, 車體快速左轉

  • 27

    {

    analogWrite(MotorR_ENA,200); //設定馬達 (右) 轉速

    analogWrite(MotorL_ENB,200); //設定馬達 (左) 轉速

    turnL(0);

    }

    }

    }

    }

  • 28

    (3)超音波避障實驗 #define MotorR_I1 8 //定義 I1 接腳

    #define MotorR_I2 9 //定義 I2 接腳

    #define MotorL_I3 10 //定義 I3 接腳

    #define MotorL_I4 11 //定義 I4 接腳

    #define MotorR_ENA 5 //定義 ENA (PWM 調速) 接腳

    #define MotorL_ENB 6 //定義 ENB (PWM 調速) 接腳

    // HC-SR04 超音波測距模組

    #define Sonico_Trig 13 //定義超音波模組 Trig 腳位

    #define Sonico_Echo 12 //定義超音波模組 Echo 腳位

    // 伺服馬達(舵機)

    #define Servo_Pin 3 // 定義伺服馬達輸出腳位(PWM)

    #define servo_delay 250 // 伺服馬達轉向後的穩定時間

    Servo myservo; // 宣告伺服馬達變數

    // 定義小車移動方向

    #define Fgo 8 // 前進

    #define Rgo 6 // 右轉

    #define Lgo 4 // 左轉

    #define Bgo 2 // 倒車

    void setup()

    {

    Serial.begin(9600);

    pinMode(MotorR_I1,OUTPUT);

    pinMode(MotorR_I2,OUTPUT);

    pinMode(MotorL_I3,OUTPUT);

    pinMode(MotorL_I4,OUTPUT);

    pinMode(MotorR_ENA,OUTPUT);

    pinMode(MotorL_ENB,OUTPUT);

    pinMode(Sonico_Trig, OUTPUT);

  • 29

    pinMode(Sonico_Echo, INPUT);

    myservo.attach(Servo_Pin);

    analogWrite(MotorR_ENA,200); //設定馬達 (右) 轉速

    analogWrite(MotorL_ENB,200); //設定馬達 (左) 轉速

    }

    void advance(int a) // 前進

    {

    digitalWrite(MotorR_I1,HIGH); //馬達(右)順時針轉動

    digitalWrite(MotorR_I2,LOW);

    digitalWrite(MotorL_I3,HIGH); //馬達(左)逆時針轉動

    digitalWrite(MotorL_I4,LOW);

    delay(a * 100);

    }

    void turnR(int d) //右轉

    {

    digitalWrite(MotorR_I1,LOW); //馬達(右)逆時針轉動

    digitalWrite(MotorR_I2,HIGH);

    digitalWrite(MotorL_I3,HIGH); //馬達(左)逆時針轉動

    digitalWrite(MotorL_I4,LOW);

    delay(d * 100);

    }

    void turnL(int e) //左轉

    {

    digitalWrite(MotorR_I1,HIGH); //馬達(右)順時針轉動

    digitalWrite(MotorR_I2,LOW);

    digitalWrite(MotorL_I3,LOW); //馬達(左)順時針轉動

    digitalWrite(MotorL_I4,HIGH);

    delay(e * 100);

    }

    void stopRL(int f) //停止

    {

    digitalWrite(MotorR_I1,HIGH); //馬達(右)停止轉動

  • 30

    digitalWrite(MotorR_I2,HIGH);

    digitalWrite(MotorL_I3,HIGH); //馬達(左)停止轉動

    digitalWrite(MotorL_I4,HIGH);

    delay(f * 100);

    }

    void back(int g) //後退

    {

    digitalWrite(MotorR_I1,LOW); //馬達(右)逆時針轉動

    digitalWrite(MotorR_I2,HIGH);

    digitalWrite(MotorL_I3,LOW); //馬達(左)順時針轉動

    digitalWrite(MotorL_I4,HIGH);

    delay(g * 100);

    }

    int detection() // 測量 3 個角度

    {

    intCar_Direction = 0;

    intF_Distance = 0;

    intR_Distance = 0;

    intL_Distance = 0;

    F_Distance = Check_Distance(90); // 讀取前方距離, 若超音波轉至正前方的角

    度有偏差, 請依實際狀況調整角度

    if(F_Distance< 10) // 假如前方距離小於 10 公分

    {

    stopRL(1);

    back(2);

    }

    if(F_Distance< 25) // 假如前方距離小於 25 公分

    {

    stopRL(1);

    R_Distance = Check_Distance(0); // 讀取右方距離, 請依實際狀況調整角度

    L_Distance = Check_Distance(180); // 讀取左方距離, 請依實際狀況調整角度

  • 31

    if ((L_Distance< 10) && (R_Distance< 10)) //假如左邊距離和右邊距離

    皆小於 10 公分

    {

    Car_Direction = Bgo; //向後走

    }

    else if(L_Distance>R_Distance) //假如左邊距離大於右邊距離

    {

    Car_Direction = Lgo; //向左走

    }

    else

    {

    Car_Direction = Rgo; //向右走

    }

    }

    else

    {

    Car_Direction = Fgo; //向前走

    }

    returnCar_Direction;

    }

    intCheck_Distance(intdir) // 測量距離

    {

    myservo.write(dir); // 調整超音波模組角度

    delay(servo_delay); // 等待伺服馬達穩定

    digitalWrite(Sonico_Trig, LOW); // 讓超聲波發射低電壓 2μs

    delayMicroseconds(2);

    digitalWrite(Sonico_Trig, HIGH); // 讓超聲波發射高電壓 10μs,這裡至少是 10μs

    delayMicroseconds(10);

    digitalWrite(Sonico_Trig, LOW); // 維持超聲波發射低電壓

    float distance = pulseIn(Sonico_Echo, HIGH); // 讀取時間差

    distance = distance / 5.8 / 10; // 將時間轉為距離距离(單位:

    公分)

    Serial.print("F distance:"); // 輸出距離(單位:公分)

    Serial.println(distance); // 顯示距離

  • 32

    return distance;

    }

    void loop()

    {

    switch(detection()) // 偵測並判斷要往哪一方向移動

    {

    case Bgo: // 倒車

    back(2); // 倒退(車)

    turnL(1); // 稍微向左方移動(防止卡在死巷裡)

    Serial.print(" Reverse "); // 顯示方向(倒退)

    break;

    case Lgo: // 左轉

    back(1); // 稍微倒退

    turnL(2); // 左轉

    Serial.print(" Left "); // 顯示方向(左轉)

    break;

    case Rgo: // 右轉

    back(1); // 稍微倒退

    turnR(2); // 右轉

    Serial.print(" Right "); // 顯示方向(右轉)

    break;

    case Fgo: // 前進

    advance(1); // 正常前進

    Serial.print(" Advance "); //顯示方向(前進)

    Serial.print(" ");

    break;

    }

    }

  • 33

    (4)紅外線遙控實驗 #define MotorR_I1 8 //定義 I1 接腳

    #define MotorR_I2 9 //定義 I2 接腳

    #define MotorL_I3 10 //定義 I3 接腳

    #define MotorL_I4 11 //定義 I4 接腳

    #define MotorR_ENA 5 //定義 ENA (PWM 調速) 接腳

    #define MotorL_ENB 6 //定義 ENB (PWM 調速) 接腳

    // IRremote

    #define IR_Recv 2 // 定義紅外線接收接腳

    IRrecvirrecv(IR_Recv); // 宣告 IRrecv 物件來接收紅外線訊號

    decode_results results; // 宣告解碼變數

    //

    // IR Code

    // 請務必先使用 IRremote_Test 抓出實際 IR Code 再定義下列指令參數

    //

    #define IR_Advence 0x00FF629D // 遙控器方向鍵 上, 前進

    #define IR_Back 0x00FFA857 // 遙控器方向鍵 下, 後退

    #define IR_Stop 0x00FF02FD // 遙控器 OK 鍵, 停止

    #define IR_Left 0x00FF22DD // 遙控器方向鍵 左, 左轉

    #define IR_Right 0x00FFC23D // 遙控器方向鍵 右, 右轉

    void setup()

    {

    Serial.begin(9600); // 開啟 Serial port, 通訊速率為 9600 bps

    pinMode(MotorR_I1,OUTPUT);

    pinMode(MotorR_I2,OUTPUT);

    pinMode(MotorL_I3,OUTPUT);

    pinMode(MotorL_I4,OUTPUT);

    pinMode(MotorR_ENA,OUTPUT);

    pinMode(MotorL_ENB,OUTPUT);

    irrecv.enableIRIn(); // 啟動紅外線解碼

  • 34

    analogWrite(MotorR_ENA,200); //設定馬達 (右) 轉速

    analogWrite(MotorL_ENB,200); //設定馬達 (左) 轉速

    }

    void advance(int a) // 前進

    {

    digitalWrite(MotorR_I1,HIGH); //馬達(右)順時針轉動

    digitalWrite(MotorR_I2,LOW);

    digitalWrite(MotorL_I3,HIGH); //馬達(左)逆時針轉動

    digitalWrite(MotorL_I4,LOW);

    delay(a * 100);

    }

    void turnR(int d) //右轉

    {

    digitalWrite(MotorR_I1,LOW); //馬達(右)逆時針轉動

    digitalWrite(MotorR_I2,HIGH);

    digitalWrite(MotorL_I3,HIGH); //馬達(左)逆時針轉動

    digitalWrite(MotorL_I4,LOW);

    delay(d * 100);

    }

    void turnL(int e) //左轉

    {

    digitalWrite(MotorR_I1,HIGH); //馬達(右)順時針轉動

    digitalWrite(MotorR_I2,LOW);

    digitalWrite(MotorL_I3,LOW); //馬達(左)順時針轉動

    digitalWrite(MotorL_I4,HIGH);

    delay(e * 100);

    }

    void stopRL(int f) //停止

    {

    digitalWrite(MotorR_I1,HIGH); //馬達(右)停止轉動

    digitalWrite(MotorR_I2,HIGH);

    digitalWrite(MotorL_I3,HIGH); //馬達(左)停止轉動

    digitalWrite(MotorL_I4,HIGH);

  • 35

    delay(f * 100);

    }

    void back(int g) //後退

    {

    digitalWrite(MotorR_I1,LOW); //馬達(右)逆時針轉動

    digitalWrite(MotorR_I2,HIGH);

    digitalWrite(MotorL_I3,LOW); //馬達(左)順時針轉動

    digitalWrite(MotorL_I4,HIGH);

    delay(g * 100);

    }

    void loop()

    {

    if(irrecv.decode(&results))

    {

    Serial.print("\r\nirCode: ");

    Serial.print(results.value, HEX); // 紅外線編碼

    switch(results.value)

    {

    caseIR_Advence:

    Serial.print(" Advance");

    advance(1);

    break;

    caseIR_Back:

    Serial.print(" Back");

    back(1);

    break;

    caseIR_Stop:

    Serial.print(" Stop");

    stopRL(1);

    break;

    caseIR_Left:

    Serial.print(" Left");

  • 36

    turnL(1);

    break;

    caseIR_Right:

    Serial.print(" Right");

    turnR(1);

    break;

    default:

    Serial.print(" Unsupported");

    }

    irrecv.resume(); // Receive the next value

    }

    }

  • 37

    (5)手機與 PC 遙控實驗 #define MotorR_I1 8 //定義 I1 接腳

    #define MotorR_I2 9 //定義 I2 接腳

    #define MotorL_I3 10 //定義 I3 接腳

    #define MotorL_I4 11 //定義 I4 接腳

    #define MotorR_ENA 5 //定義 ENA (PWM 調速) 接腳

    #define MotorL_ENB 6 //定義 ENB (PWM 調速) 接腳

    void setup()

    {

    Serial.begin(9600);

    pinMode(MotorR_I1,OUTPUT);

    pinMode(MotorR_I2,OUTPUT);

    pinMode(MotorL_I3,OUTPUT);

    pinMode(MotorL_I4,OUTPUT);

    pinMode(MotorR_ENA,OUTPUT);

    pinMode(MotorL_ENB,OUTPUT);

    analogWrite(MotorR_ENA,200); //設定馬達 (右) 轉速

    analogWrite(MotorL_ENB,200); //設定馬達 (左) 轉速

    }

    void advance(int a) // 前進

    {

    digitalWrite(MotorR_I1,HIGH); //馬達(右)順時針轉動

    digitalWrite(MotorR_I2,LOW);

    digitalWrite(MotorL_I3,HIGH); //馬達(左)逆時針轉動

    digitalWrite(MotorL_I4,LOW);

    delay(a * 100);

    }

    void turnR(int d) //右轉

    {

    digitalWrite(MotorR_I1,LOW); //馬達(右)逆時針轉動

  • 38

    digitalWrite(MotorR_I2,HIGH);

    digitalWrite(MotorL_I3,HIGH); //馬達(左)逆時針轉動

    digitalWrite(MotorL_I4,LOW);

    delay(d * 100);

    }

    void turnL(int e) //左轉

    {

    digitalWrite(MotorR_I1,HIGH); //馬達(右)順時針轉動

    digitalWrite(MotorR_I2,LOW);

    digitalWrite(MotorL_I3,LOW); //馬達(左)順時針轉動

    digitalWrite(MotorL_I4,HIGH);

    delay(e * 100);

    }

    void stopRL(int f) //停止

    {

    digitalWrite(MotorR_I1,HIGH); //馬達(右)停止轉動

    digitalWrite(MotorR_I2,HIGH);

    digitalWrite(MotorL_I3,HIGH); //馬達(左)停止轉動

    digitalWrite(MotorL_I4,HIGH);

    delay(f * 100);

    }

    void back(int g) //後退

    {

    digitalWrite(MotorR_I1,LOW); //馬達(右)逆時針轉動

    digitalWrite(MotorR_I2,HIGH);

    digitalWrite(MotorL_I3,LOW); //馬達(左)順時針轉動

    digitalWrite(MotorL_I4,HIGH);

    delay(g * 100);

    }

    void loop()

    {

    intcmd = Serial.read(); // 讀取藍芽指令

    switch(cmd) // 執行藍芽指令

  • 39

    {

    case 'S': // 倒車

    back(5);

    break;

    case 'A': // 左轉

    turnL(5);

    break;

    case 'D': // 右轉

    turnR(5);

    break;

    case 'W': // 前進

    advance(5);

    break;

    case 'Q': // 停止

    stopRL(5);

    break;

    case 'T': // 自我檢測

    break;

    case 'J': // 舞蹈

    break;

    case 'N': // 超音波測距查詢

    break;

    }

    }

  • 40

    四、結果與討論

    自走車涵蓋了電子電路、感測器、機械構件等知識。從一開始的

    構思找資料,其中遇到許多挫折與問題,經過多次的測試,找出問題

    所在並解決使得此專題得以完成。畢竟是第一次碰這些東西,在一一

    解決障礙後也學到不少相關知識與經驗,在過程中發生了不少突發事

    件,如:忘記降壓而導致 LED 瞬間焦黑、配線接電源錯腳位使 IC 燒

    掉…等等。回想起剛開始做專題時,一切都是從零開始,一步一步的

    做起,中間曾經遇過許多的困難,也曾經有過一段時間沒進度的時候

    停滯期,不過我們都一一的克服了,看著自走車從無到有,從不能動

    到能動,那種感動的心情還真不可言喻啊! 真有成就感!!製作過程雖

    然辛苦,但只要堅持下去就會成功,焊接電路那部份,我們曾一度遇

    到瓶頸,但最後還是完成了。非常謝謝組員們的陪伴和老師的指導。

    在這個資訊化的時代裡,很多產品的生產都走向了自動化的趨勢。

    而車輛也是這樣,它是在一般的模型車加上了晶片、程式控制等等使

    得車子可以做出特定動作的一種車子,如果運用得當,是能夠在工廠

    中自動化的生產線中派上用場的。除此之外,因為它會依程式的規定

    動作,也能夠作為一種另類的機器人應用在我們的日常生活中來使我

    們的行動變的更加方便。譬如說自走車能夠給殘障人士在無障礙空間

    中能夠更為方便的行動,能夠藉由自走車來到達想去的地方。

  • 41

    五、結論

    製作專題的過程中,遭遇到許多問題,我們的步驟是先做感測

    器的部分, 一開始把感測器焊上去的時候,由於接觸不良,導致有

    時候有反應有時候沒反 應,所以在感測器部分花了不少時間,使我

    們知道用銀絲線是不太適合的,因為 它太脆弱容易掉,所以我們改

    用單芯線來做。 後來,我們測試馬達轉動的時候,又發現轉速太快

    容易跑出軌道,所以我們 在程式上做了一些修改,便有效的控制馬

    達,使他跑的更穩定,還有我們只使用 3 個感測器,偶爾會感應不

    到感光條,所以學弟妹們,如果明年也要做自走車的 話,建議用 5

    個感測器來做比較好。 總而言之,我們在這次的專題中,雖然表面

    上只有幾組主要的電路,但是實 際上我們所學到的絕對不止這些,

    而這些如果沒有實際上動手做,是很難發現的。 做完這次專題之後,

    使我們知道,許多事情,真的要實際去動手去做,光是 書本上的理

    論數據,還是不夠的,還要有實際上去動手做的精神,這樣除了會發

    現許多書本上面沒有辦法發現的問題和知識,在實際上做出成功之後,

    所獲得的 成就,也是書本上得不到的。

    自走車防撞設計對人類生活上都有很大幫助,本論文加上晶片

    控制,讓自走車的自主性控制得以更靈敏,可讓自走車自動避障,且

    自動校正繼續循跡行駛,讓自走車可以在行駛中自我避開危險,真正

  • 42

    落實於實務系統中,若能引入汽車行駛中,相信對汽車的操控性安全

    駕駛有相當的助益。汽車業的多功能性一直提升,從傳統的機械變速

    一直到現在的電子式控制變速,顯示科技的進步與改善;但是汽車行

    駛的安全性一直是重要課題,汽車在高速行駛下只要稍不留神,會造

    成相當大的傷亡,因此若能將本研究觀念落實於汽車行駛控制中,對

    駕駛或其他乘客有相當的保障,且再加入定速器的功能,對目前的交

    通事故會有相當大的改善。

    六、參考文獻

    1. 循跡自走車(NTD) 全日本機器人競賽之行前紀錄

    https://www.youtube.com/watch?v=6ENIiMv7LvM

    2. 自走車設計與實作

    http://www.tnu.edu.tw/ee/upimages/file/Std-102/3003/

    08-Reference%20material.html

    https://www.youtube.com/watch?v=6ENIiMv7LvMhttp://www.tnu.edu.tw/ee/upimages/file/Std-102/3003/08-Reference%20material.htmlhttp://www.tnu.edu.tw/ee/upimages/file/Std-102/3003/08-Reference%20material.html