• 沒有找到結果。

遙控智能車的設計與實作

N/A
N/A
Protected

Academic year: 2021

Share "遙控智能車的設計與實作"

Copied!
23
0
0

加載中.... (立即查看全文)

全文

(1)
(2)

題目:遙控智能車的設計與實作 組員姓名:陳彥達 學號:B10002208 組 別:102C3

指 導 老 師:呂政修 老師

一、 摘要:

目的

透過手機與Arduino結合,可以達成互相通訊並可以通過手機或 感應器(Sensor)觸發事件,再讓微處理機決定相對應的處理方法,進 而操作其他輸出裝置來滿足使用者的需求。另外輔以raspberry pi 來 提供網路攝影,與手機一起連動形成迷你物聯網。

進行的方法

1. 閱讀相關書籍並查詢資料 2. 模擬並列出可能使用之感應器 3. 與會台大與台科大師資

4. 研究Wu裝置的開發方法(經驗汲取) 5. 持續對指導教授做每周報告

6. Arduino應用相關開發

7. 智慧型手機程式相關開發並了解過程與方法

成果

(3)

二、 簡介

研究動機

由於我偏好做”會動的東西”,所以我選了高職這條路,當時希望 能做出類似車子或直升機的東西。在大學3年的學習,我獲得到許多 不同的知識, 以及累積不少實作經驗。

而透過與台大ICS創新研究中心的合作,可以取得很多資源,像 是感應器和它們的資料,以及可以和不同的人學習不同的開發方式。

一邊,學習如何以學到的感應器多加應用,構思一個環境能讓它們組 合起來能發揮各式各樣的功能。然後就越來越知道自己有能力可以獨 立完成一台車子,不但可以自己走動偵測是否有人,也能和手機做溝 通並加以控制。

研究過程

當然一開始是甚麼都不知道的,要說的話只有碰過一些 Arduino的程式,但專題老師給了我一個機會到台大參與一個計畫,

與Arduino的開發甚是緊密,比如說程式的撰寫方法以及感應器的應 用等等。台大也列出了各式各樣的感應器來供我測試與組裝,在此期 間我也知道這些感應器可以怎麼用,用來幹甚麼。我開始注意某些元 件的連結性,不相容產生的Bug也有很多,我都會試著處理這些問 題,不管是上網找資料或問會的前輩,總是能有一個突破口。並且自 己整理出一份Manual可以給後進更輕鬆的學習怎麼使用他們的裝置。

邊做著ICS的同時,我開始想著該怎麼把我學到的東西做應用,

於是我選定了保全機器車,可以把我做過的東西都拿上去。當然有一 些別的東西,比如說驅動輪子的馬達驅動電路,光是查資料,去採買 零件就花了很多時間。買回來後實際插麵包板測試是可行的,不過除 此之外還有很多東西等著我去研究並解決問題。這過程中十分辛苦,

因為為了減少差錯,我都會一個步驟一個步驟去作,而且在每個步驟 中,我都會確保他們運作順暢才去下個步驟。就算在整合中出了差 錯,我也會一個一個去檢查與調整。

若將研究過程做成流程圖如下:

(4)

自走模式製作

操作模式製作

最後結合自走模式與操作模式並試跑。

Arduino背景知識 ICS實際操作測試

整合測試 機器車構想 研究、查資料階段

馬達部份實作與測試 測距離測試 車體制作 安裝馬達與 Ultrasound sensor

測試車子 測試警報器並安裝 製作 Arduino 行動電源 試跑

App Inventor 2學習 試用 ultra sound sensor 與手機互動 製作車子操作介面

測試前進功能 加上其他功能並測試 安裝藍芽到車體上

(5)

三、 製作過程 概念與架構

自走模式時(人不在家)保全機器車會到處移動,並以超音波感測器來測距避免 碰撞。

在感測到入侵者時(PIR感測器),可以發出警報,並回傳訊息給主人知道。

遙控模式可以做遠端監控。但目前是以藍芽為主要通訊,範圍只有8-10公尺。

車體架構:

自走模式

啟動警報器 如果 PIR 有感測到人在移動

沒人移動

隨機移動,

Ultrasound會感 測距離避免碰撞

遙控模式 藍芽連接(選擇自走模式或遙控模式)

回報

藍芽斷開

監看畫面

超音波測距 PIR感測器 揚聲器

馬達驅動板

輪子組

Arduino Raspberry pi mjpg-streamer

(6)

分別取Arduino和Raspberrypi的優點來實施應用。Arduino較為適合Sensor的搭 載和簡單的判斷式來控制訊號的輸出。相對的,Raspberry pi 較可以實施大量 的運算,比如說搭載Web cam 來得到影像,而這是Arduino無法作到的。

材料介紹

超音波感測器(Ultrasound sensor)

超音波感測器(老外好像把它叫作 PING))) sensor)是由超音波發射器、接 收器和控制電路所組成。當它被觸發的時候,會發射一連串 40 kHz 的聲波並 且從離它最近的物體接收回音。超音波是人類耳朵無法聽見的聲音,因為它的 頻率很高。

聲音在空氣中的傳播速度大約是每秒 340 公尺,傳播速度會受溫度影響,

溫度愈高,傳播速度愈快。假設以 340 公尺計算,1000000 / 340 * 100 = 29.4 microseconds,四捨五入後,可知聲音傳播 1 公分所需的時間為 29 microseconds (百萬分之一秒)。

由於超音波從發射到返迴是兩段距離,因此在計算時必須將結果除以 2 才 是正確的物體距離。所以我們可以利用底下的公式算出物體距離(距離單位為 公分,其中 timing 是測量得到的音波傳播時間):

timing / 29 / 2

超音波感測器主要應用在機器人或自走車避障、物體測距等。可以探測的距離 為 2cm-400cm,精度為 0.3 cm,感應角度為 15 度。

紅外線動作感測器(PIR motion sensor)

(7)

紅外線動作感測器 (PIR Motion Sensor) 或稱人體紅外線感測 器,是一種可以偵測物體移動的電子裝置。生活中很多東西 都會發射紅外線,例如燈泡、蠟燭、中央空調等,其實人體 也會發射紅外線,紅外線動作感測器的原理,便是利用人體 發射出來的紅外線的變化,來感應物體的移動。

紅外線感測器有分主動式和被動式兩種。主動式的紅外線感測器,感應器 本身會發射紅外線光束,當紅外線光束被物體擋住後,紅外線光束會反射,利 用這個紅外線反射原理可以做很多應用,例如廁所的自動沖水小便斗或感應式 水龍頭,它們用的就是主動式紅外線感測器。紅外線動作感測器 (PIR Motion Sensor) 是屬於被動式的紅外線裝置,感應器本身不會發射紅外線光束。PIR 是 Passive Infrared Sensor (被動式紅外線感測器) 的縮寫。

紅外線動作感測器一般用在防盜系統上,例如有人入侵屋內便響警報的紅 外線警報器,或是自動照明裝置,例如玄關、走廊、樓梯間或車庫門口不常有 人走動,將紅外線感應器和燈具裝在這些地方,只要有人就自動開燈照明,人 離開後就自動關燈省電。

喇叭(speaker)

喇叭與蜂鳴器都是發出聲響的零件,若只是想發出一些警告音,提醒音, 這二者其實都是可以使用的。

蜂鳴器分為電磁式及壓電式二大類,在耗電流,尺寸,頻率,驅動方式上有些不同, 但基本上都是將某一個頻點的音壓拉到最高,以期用最小的尺寸,就可以發出很高 的音壓,若不在諧振點的音壓就會很小,甚至會相差20dB以上,

且蜂鳴器的聲音,由於是用方波發出來的,人耳聽起來就比較刺耳一些,

小喇叭是以弦波推動,相較於蜂鳴器人耳聽起來會舒服許多,

但因為頻寬較寬,可用的頻率也較低,故在同尺寸時,音壓一定會小於蜂鳴器, 且需要音箱的輔助來增進低頻的響應,不然整體的聲音會很小.

我們將使用函式tone()發出聲音。

首先需要各音階的頻率。其中的NOTE_C5就是一般的中音Do(523Hz),

NOTE_D5是Re(587Hz),NOTE_E5是Mi(659Hz),NOTE_F5是Fa(698Hz),

NOTE_G5是So(784Hz),NOTE_A5是La(880Hz),NOTE_B5是Si(988Hz),而 NOTE_C6是高音Do(1047Hz)。不過只要警報音的話,任意取兩個音階來重複播 放就可以了。

(8)

馬達驅動設計與製作

由於需要讓馬達可以正負反轉,我採用雙軸直流馬達。不用步進馬達是因 為步進馬達是以步階方式來進行分段移動,而直流馬達通常都是採用連續移動 的類比控制方式。比較適合輪子轉動的連續性,而且控制也很方便,只要兩邊 送入不同電壓就會正反轉。而為了要讓馬達在讓 Arduino 的控制下可以驅動 (Arduino供給電流低),我設計了馬達驅動電路,是採用 H 橋電路如下:

(使用 Circuitlab 繪製 https://www.circuitlab.com)

這個電路下,Arduino 只要輸出高電位給 A 點或 B 點,便能控制 MOSFET 開關並 產生電壓差給馬達,此時馬達就會轉動。

(9)

若馬達測試可以直接用電壓接上 A,B 兩點來測試。B 點輸入高電位時,Q1 導 通,T1(P 通道)的閘極接地,使 T1 導通提供電壓差給馬達使之轉動。

A點接上的場合,T1 閘極高電位不導通,T2(N 通道)閘極高電位導通提供電壓差 給馬達使之轉動。如此一來馬達就能依 Arduino 所給的訊號來正負反轉。

(10)

接著就去採買零件,並插在麵包板上測試 ok 後,就製作電路版如右上圖,同樣 的電路板要製作兩塊。製作完後接上電源與馬達測試無誤後便進入下個階段。

車體製作

老實說,車體的材料一度是我最頭痛的,我的預想是車體要夠大,而且拆 裝版子方便還可以鑽孔而不會破裂。木製盒、塑膠盒等等我都有考慮過,但都 沒預想的大小,也很勉強買了一個黑色裝置盒,想說之後再說。沒想到有一天 我想到,高職時作的音樂盒,我找出來發現這實在太完美了,不但可以方便的 安裝線材和裝置,上面還留有現成的開關和揚聲器。於是我把原本的音樂電路 及線全拆光,並鑽洞打孔安上馬達,前面還安裝了萬向輪,除了穩定車體外,

也可以任意轉動,不會妨礙後輪的前進。於是變成這樣:

(11)

Arduino 有兩種供電方式,一種是使用 USB Cable 連接 PC 透過 USB 供 電,另一種是使用外部電源。為了要讓 Arduino 可以跟著車子移動,我製作了 9V的行動電源。具體是買了 2.1mm 的電源插頭以及一個 9V 電池扣,再將電池 扣的紅線 (正極) 跟電源插頭的內圈焊接起來,電池扣的黑線 (負極) 跟電源插 頭的外圈焊接起來,當然中間有隔了一個開關方便控制車子電源,除此之外從 負極還得拉出一條線和板子共同接地,至於焊接段我直接用絕緣膠布綁好我總 共黏了 3 個魔鬼氈在車體上,分別放置 2 個馬達驅動電路和 Arduino 板子,除了 拆拔方便,也可以避免接點碰到金屬表面發生接觸短路。

(12)

Arduino 程式

配腳

由於供電與接地腳位不夠的關係,有些腳位設計程高電位或低電位

Ultrasound: Signal-D2 / 5V-D8 /GND-D12 PIR: Signal-D3 / 5V-5V / GND-GND

Motor: leftA-D7 / leftB-D6 / rightA-D5 / rightB-D4 Speaker: pospin-D9 / negpin-GND

Blue-Tooth: TX-D10 / RX-D11 / Vcc-5V / GND-GND 車子的動作

車的動作分為前進、後退、左轉、右轉、停止五個狀態等。我們可以透過 Arduino輸送不同的電壓來使馬達正負逆轉-順時針轉(clockwise)或逆時針轉 (counter_clockwise)

給個別的馬達不同狀態代號:HALT,CLOCKWISE,

COUNTERCLOCKWISE來輸入不同的電位

(13)

車子的狀態

監控模式

移動

監控模式(Monitor) 隨機轉動 前進並測距

如果發生碰撞 1.後退 2.回到監控模式

使用 PIR 來偵測是否有人入侵,

若有人入侵(PIR 值讀到 1) 1. 傳送訊號給手機端。

2. 設定 alarmtimeout。

3. Speaker依據給定聲音發出警 報。

4. 倒數 alarmtimeout,結束就會 跳出迴圈。

在 turnInRandomDirection 裡用到 random函數,用來隨機取限定範 圍內的數值,再給 left 作延遲(隨 機的時間),這樣就能隨機轉動。

(14)

藍芽通訊

1. 使用<SoftwareSerial.h>和<Wire.h>兩個函式庫 2. 設定 PIN10 及 PIN11 分別為 RX 及 TX 腳位 3. 設定藍芽鮑率為 9600

訂定 PING ultrasound 的運作模式-輸 入脈衝後計算間隔的時間,最後得出 距離。

1. 若距離太近,發出倒退音並後退 2. 回到監控模式

1. 先用 I2CBT.read()來讀取藍芽收到 的值

2. 判斷從手機傳送來的訊號,並採取 對應的動作

(15)

Raspberry pi & mjpg-streamer

mjpg-streamer是用來將視訊網路串流化,透過mjpg裡面的解碼器,可以讓影像 擷取速率以及畫質有良好的表現。可以截取 camera 影像的套件, 將每幅影像 壓成 jpg, 並且起一個 server 將影像輸出, 好處是跨瀏覽器、編解碼容易、運 算能力需求低, 缺點是即時性差(在高解析的影像更是明顯)

準備編譯環境

首先要準備好編譯所需的環境,登入 Raspberry PI 以後,執行底下的安裝指令 安裝一些必要的 packages:

sudo apt-get update

sudo apt-get install subversion sudo apt-get install libjpeg8-dev sudo apt-get install imagemagick

抓 source 並編譯

接著我們利用 SVN 將 MJPG-streamer 的 source 抓回來,執行底下的指令:

svn co https://mjpg-streamer.svn.sourceforge.net/svnroot/mjpg-streamer mjpg- streamer

source 抓回來後,切換到裡面並開始進行編譯,依序執行底下的指令:

cd mjpg-streamer/mjpg-streamer make

如果編譯成功,目錄中應該會多出類似:mjpg_streamer , input_uvc.so , output_http.so ...,其中的 mjpg_streamer 是主程式,而那些

input_xxxx.so 、output_xxxx.so 則是輸出、輸入的 plugins。有了這些檔案,我 們就可以將 Webcam 插入 Raspberry PI 的 USB 插槽中來測試了。

(16)

接著我們在剛剛編譯程式的目錄中執行底下的指令:

./mjpg_streamer -i "./input_uvc.so" -o "./output_http.so -w ./www"

如果出現的訊息是像我這樣:

MJPG Streamer Version: svn rev: 3:172 i: Using V4L2 device.: /dev/video0 i: Desired Resolution: 640 x 480 i: Frames Per Second.: 5

i: Format...: MJPEG

Unable to set format: 1196444237 res: 640x480 Init v4L2 failed !! exit fatal

i: init_VideoIn failed

有類似「Unable to set format: 1196444237 res: 640x480」這行的訊息,表示 Webcam 不支援輸出 MJPEG 的格式,那就在指令裡加個「-y」的參數,讓它 改用 YUYV 的格式。指令變成:

./mjpg_streamer -i "./input_uvc.so -y" -o "./output_http.so -w ./www"

如果 stream server 正常啟動的話,應該會在最後面看到底下的訊息:

o: www-folder-path...: ./www/

o: HTTP TCP port...: 8080 o: username:password.: disabled o: commands...: enabled

如何看 Webcam 抓到的影像呢?我們可以利用由 MJPG-streamer

output_http.so plugin 所提供的 HTTP server ,用網頁瀏覽器來當 client,以底 下的網址觀看 Demo 的網站(假設 Raspberry PI 的 IP 為 192.168.2.1):

http://192.168.2.1:8080/

(17)

在這個 MJPG-streamer Demo Pages 中,我們可以看到它示範靜態影像的顯示、

stream、Java、Javscript ... 的語法,可以依需求選用。

另外,我們也可以用類似 VLC 這種有支援 Motion JPEG Video (MJPG) 編碼的播 放器來看,觀看的網址如下:

http://192.168.2.1:8080/?action=stream 服務啟動了卻看不到影像

如果 streamer server 好像啟動了,卻仍然看不到影像,只好像我一樣,把解析 度降低。

先按「Ctrl + C」中止服務程式,然後再加入「-r」的參數,例如,將啟動指令改 為:

./mjpg_streamer -i "./input_uvc.so -y -r QSIF -f 15" -o "./output_http.so -w ./www"

這樣,影像解析度變為 160x120 (QSIF) ,程式回應的訊息如下:

MJPG Streamer Version: svn rev: 3:172 i: Using V4L2 device.: /dev/video0 i: Desired Resolution: 160 x 120 i: Frames Per Second.: 15 i: Format...: YUV i: JPEG Quality...: 80

-r 的參數後面可以使用底下的關鍵字:

QSIF QCIF CGA QVGA CIF VGA SVGA XGA

(18)

SXGA

也可以使用數字來自訂解析度: ??? x ??? (例如:240x200),基本上如果影像出 不來,可以改變 -r 和 -f ,將數字減小一點試試。

最後我使用 QVGA 來進行傳輸。比較不會 lag。

其它參數

輸入的 plugin input_uvc.so 除了前面提過的 -y 、-r 參數以外,還有其它可設 定,例如:

-d : 用來指定要使用哪一個 Webcam,預設是使用 /dev/video0

-f : 用來設定每秒鐘要抓多少 frames,預設是 5 frames/sec。

-q : 用來設定 JPEG 的品質(百分比),預設是 80。

輸出的 plugin 除了前面指令中用的 -w 參數以外,還可以使用底下的參數來自 訂組態:

-w : 指定 MJPG-streamer HTTP server 網頁儲存的目錄名稱。

-p : 指定 HTTP server 要在哪一個 TCP port 提供服務,預設為 8080

-c : 設定 client 連線時要經過帳號密碼驗證過才可以觀看影像,例如 -c abc:123

-n : 不包含讓 client 透過 HTTP 來控制 Webcam 參數的功能。

App 開發(使用 APP Inventor 2)

App Inventor 原是Google實驗室(Google Lab)的一個子計畫,由一群 Google工程師與勇於挑戰的Google使用者共同參與。Google App Inventor是 一個完全線上開發的Android程式環境,拋棄複雜的程式碼而使用樂高積木式 的堆疊法來完成Android程式。我採用他是因為寫法簡單易懂,只要有強大的 邏輯觀念就能拼湊出一個App程式,不需要記很繁複的指令,算是很人性化的 介面,缺點其實也有,就是無法像在Java平台開發程式可以比較靈活,APP

(19)

Inventor 所提供的”積木”也不會比Java平台的多,但是既然要寫一個藍芽互傳 程式,使用這軟體可以幫助我清楚的了解架構以及觸發的事件來源,之後在更 深入研究時可以以此為基底撰寫更靈活的程式。

我先練習使用ultrasound sensor 與藍芽互丟資料的程式

手機程式會先跟藍芽裝置連接,再來手機就會不斷讀取 Ultra sound sensor 偵測的值。待這步驟成功之後,接著就先作單方面操縱車子的程式,結果如下:

這就是以藍芽清單選擇裝置,先進行連接後,再來以按鈕送出 1byte 的信

(20)

息,等被控制端接收後,再根據不同信息採取對應的動作

最後要把兩個模式結合在一起,為了使模式不衝突,開啟一個自走模式後不能 選擇前進後退,開啟遙控模式才可選擇車子的動作。並且當手機收到 Arduino 端傳來的藍芽訊號時,底下會顯示警告。然後就進入遙控模式來追蹤監控。

(21)

自走模式時開啟 clock,當 clock 運作時,每 0.1 秒會送出一個識別信號,同時 檢測車子是否有發出警告信號,如果開始警告了,clock 本身關閉。遙控模式送 出一個識別訊號並使 clock 關閉。

還有一個 disconnect block,按下之後藍芽關閉,全部的按鈕(除了藍芽清單)都 會 disable,並將訊息全都初始化。

基本功能做好後,將整個使用介面作美化,並加入 WebViewer元件,並設定在遙控模式時能夠開啟特定 網頁,以這個 case 來說的話就是 192.168.1.8:8080 的 javascript頁面,所以能夠在手機監看畫面。

(22)

四、 討論

馬達性能不一

由於我兩顆馬達在跑動時,一個快一個慢,所以前進時像是在左轉,

偏差十分的大。上網研究發現,只要將輸入電壓調低,就能使馬達變 慢。但馬達所接的腳是digital腳,所以改成如下:

只要digital腳上有”~”標記,代表這是可以類比輸出的。類比輸出範 圍是0~255,對應數位腳0和1。我們只需要在其中取值並測試,便能確 保馬達都能保持在相同的速度。

車子誤動作

有時車子在自走模式會無法切換至遙控模式,考慮以旗標(flag)的設立 來判斷是否要下個動作。

還有一點,有時燒出來沒有辦法知悉馬達的腳位,我都會先用模擬程 式來確認馬達有往預期的方向轉動。

五、 未來發展

遙控模式還沒有辦法真正有抓壞人的貢獻,預計以後會加裝 camera 來照 相或錄影。而且現在藍芽只能用於測試用,因為它傳輸距離十分有限,我考慮 為了能遠距離傳輸,要使用 Wifi 模組來使照片或錄像來上傳到網路平台供我們 監看。就算不能使用網路也沒關係,可以先存至內部記憶體,後面可以使用 NFC-近場通訊來交換資料,感覺 NFC 目前十分的有可塑性,我想我會持續的來 研究了解這些新興科技的原理與應用。

又或者,我有另外想法,我希望我能將我所學不斷套用到新的想法上並 以新的知識改良她,比如說寵物餵食器可以結合視訊功能讓主人遠遊在外能在 寵物吃飯時與他們說說話,也可以遠端設定今天要給寵物吃得飼料等等。

(23)

六、 參考資料

Coopermaa-使用 9V 電池對 Arduino 供電

http://coopermaa2nd.blogspot.tw/2011/01/9v-arduino.html

德源科技

http://twarm.com/commerce/product_info.php?products_id=2340&sid=d7cdba23913a76cc 7998066c60bb137d

雄-Arduino : 用 Android 遙控藍芽科學魔法車

http://gsyan888.blogspot.tw/2014/03/arduino-s4a-app-inventor-bluetooth-car.html

cavedu 部落格http://blog.cavedu.com/

app inventor 中文學習網http://www.appinventor.tw/ai2

Coopermaa blog http://coopermaa2nd.blogspot.tw/

Gasolin ,Android手機程式應用入門,台北,松崗(民102年)

翁卓立,Ubuntu12.04從入門到精通,台北,電腦人文化(2012)

Simon Monk,15 Dangerously Mad Projects For The Evil Genius(2013)

趙英傑,超圖解Arduino互動設計入門,台北,旗標(2013)

Raspberry PI : Webcam + MJPG-streamer 變 Webcam Streamer

http://gsyan888.blogspot.tw/2013/04/raspberry-pi-webcam-mjpg-streamer.html

參考文獻

相關文件

SPCE061A 的開發是通過線上調試器 PROBE 實現的。它既

可程式控制器 (Programmable Logic Controller) 簡稱 PLC,是一種具有微處理機功能的數位電子 設備

表 6.3.2 為不同電壓下,驅動整個系統運作所需電流。圖 6.3.2 為 測試情形。其中紅燈代表正常工作。結果證明只要太陽能板能夠提供

(A)受器 感覺神經元 聯絡神經元 運動神經元 動器 (B)動器 運動神經元 聯絡神經元 感覺神經元 受器 (C)動器 感覺神經元 聯絡神經元 運動神經元 受器 (D)受器 運動神經元

之意,此指依照命令動作的意義。所謂伺服 系統,就是依照指示命令動作所構成的控制

請繪出交流三相感應電動機AC 220V 15HP,額定電流為40安,正逆轉兼Y-△啟動控制電路之主

(2) 讚美︰小明是個電腦程 式設計愛好者。最近他參 加義工活動,為安老院設 計了一款自動開門感應

(2) 被動式 RFID Tag(Passive):被動式 RFID Tag 不含電池,其能量是 感應自 RFID Reader 所發射過來的 RF 無線電波能量,當 RFID