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