修帄技術學院二年制機械工程系 專題製作報告 尋跡自走車 指導教授:常元海 班級:二技機二甲 組長:鄭翔仁 AA97014 組員: 黃明宏 AA97004 林政男 AA97005 林永祥 AA97006 王偉杰 AA97007 張光佑 AA97045 姚恩忠 AA97048 中 華 民 國 九十八年 十二 月 二十三 日
修 帄 技 術 學 院 二 年 制 機 械 工 程 系
專題製作報告
尋跡自走車
指導教授:常元海
班級:二技機二甲
組長:鄭翔仁 AA97014
組員:
黃明宏 AA97004 林政男 AA97005
林永祥 AA97006 王偉杰 AA97007
張光佑 AA97045 姚恩忠 AA97048
中 華 民 國 九十八年 十二 月 二十三 日
摘要
本文主要以單晶片(89S51) 控制軌道型無人自走車,令
其依照地陎上的黑色軌道行走。尋跡自走車藉由紅外線感測
器(CNY70)測得地陎上黑色軌道之狀況,經由單晶片判讀黑
色軌道所在位置,啟動馬達驅動電路以控制此自走車行進方
向,並同時啟動LED 指示燈電路,以顯示目前自走車行進方
向。目的在設計出一台以單晶片為控制核心的小型軌道型無
人自走車,其主要架構有單晶片(89S51)主控電路、電源電
路、感測電路、馬達驅動電路,LED 指示燈電路。
自走車可以提供多樣化的應用,如日常用品的搬運。它
可成為個人的日常生活上的好幫手。我們以發展「無人控制
的自走車」為目標,透過團隊合作的方式,達到系統整合所
需的相關技術,進而應用在其它不同目的的系統上。
目錄
摘要 PI
目錄 PII
圖目錄 PIV
第一章 前言
1-1 研究動機與目標 P1
1-2 主要材料 P2
1-3 其他材料 P4
第二章 零件介紹
2-1 MCS-51介紹 P5
2-2 89S51 概述 P8
2-3 89S51 相對於 89C51 增加的新功能 P10
2-4 步進馬達簡介 P12
2-5 步進馬達之應用 P14
2-6 步進馬達的運轉原理 P17
2-7 感測電路 P20
第三章 尋跡自走車電路動作說明
3-1 尋跡自走車電路動作 P22
3-2 電源及單晶片電路說明 P23
3-3 步進馬達驅動迴路說明 P24
3-4 光藕合感測迴路說明 P25
3-5 遙控迴路與狀態指示迴路說明 P26
第四章 製作過程
4-1 製作流程 P27
第五章 程式說明
5-1 程式發展流程 P29
5-2 尋跡自走車程式碼 P31
第六章 心得感想
AA97014 鄭翔仁 P39
AA97004 黃明宏 P40
AA97005 林政男 P41
AA97006 林永祥 P42
AA97007 王偉杰 P43
AA97045 張光佑 P44
AA97048 姚恩忠 P45
圖目錄
圖 2-1 MCS-51內部基本結構圖 P5
圖 2-2 MCS-51開發流程圖 P7
圖 2-3 正常工作之基本電路 P11
圖 2-4 8x51 各接腳的名稱 P11
圖 2-5 步進馬達控制等效電路 P16
圖 2-6 四相式進馬達的基本構造圖 P17
圖 2-7 步進馬達的種類 P18
圖 2-8 一相刺激磁順序 P18
圖 2-9 二相激磁順序 P19
圖 2-10 一、二相激磁順序 P19
圖 2-11 CNY70的內部結構元件圖 P21
圖 3-1 自走車主要電路 P22
圖 4-1 電路板焊好完成圖 P28
圖 4-2 尋跡自走車完成圖 P28
圖 5-1 程式發展流程 P30
第一章 前言
1-1 研究動機與目標
由於現在的科技越來越發達,很多的東西都必需要使用
到電腦來控制,漸漸地,人力都被電腦所取代,產業自動化
與生活品質逐漸提昇擴張,因此自走車或智慧型機器人的研
究及相關技術都運用得相當廣泛。
小從機械手臂,無人搬運車,探險機器人…等等,其最
終目的就是希望能取代人力,使人類免於身處危險的環境,
並且能快速達成指定的任務,所以我們選擇對車子方陎來做
研究,雖然我們所研究的車子是小小的自走車,跟現在在路
上所看到的車還相差很大,但是我們相信只要再深入研究的
話,小小的車子也有極大的可能可以變成像路上一樣的車子,
進而取代現在的各式各樣的車種。
自走車還有個好處,就是不需要加任何的油料,只需要
在沒電的時候換電池或充電即可再度使用,這樣子不會產生
任何的空氣汙染,能做到保護地球的觀念,所以希望我們所
做的小小研究對以後的科技發展能有所幫助。
1-2 主要材料
材料名稱 數量
CNY 70(感測器) 3
電阻 1k 1/8W 9
電阻 10k 1/8W 9
電阻 100k 1/8W 1
電阻 47k 1/8W 3
電阻 470k 1/8W 4
電阻 330k 1/8W 3
電阻 4.7k 2
步進馬達 DC12V 2
電解電容 10U/16V 1
電解電容 47U/16V 1
電解電容 1000U/16V 2
陶瓷電容 33P 2
LED 紅色 5mm 5
單排針 6P 2
電晶體 2SA1015 8
電晶體 2SD882 8
遙頭開關 1P3T PCB 型 1
AT89S51 1
TC4584BP 1
7850CT 1
12MHz 1
40 Pin IC 座 1
14 Pin IC 座 1
電池座 UM-3 x 4 2
電路板 AUTO-CAR 1
電路板 AUTO-CAR-S 1
1-3 其他材料
材料名稱 數量
車體主板 1
車體右側板 1
車體左側板 1
車體輔助輪固定板 1
後輔助輪 1
橡膠輪 2
銅柱 10mm 4
圓頭螺絲 3mm 24
螺絲 2mm 4
螺絲母 3mm 24
螺絲母 2mm 4
小 L 鐵片 2
第二章 零件介紹
2-1 MCS-51介紹
『89S51』源自 Intel 公司 MCS-51系列,而目前所採用
的 8x51,並不限於 Intel 公司所生產的,反倒是以其它廠商
所發行的相容晶片為主,如Atmel公司的89C51/89S51系列,
其價格便宜(低於 NT$50 元)、品質穩定、發展工具齊全,早
為學校或訓練機構所歡迎。
圖 2-1 MCS-51內部基本結構圖
在此先介紹 8x51的基本架構,包括基本規格、接腳、
基本電路及 51族系等,其中很多資料最好要『記』在腦裡,
筆者也要提供許多快速背記的技巧,讓讀者能在極短的時間
裡,記住 40 支接腳、基本電路等。
MCS-51 系列單晶片的主要功能及特性如下所示:
1.8 位元微電腦控制晶片
2.4KB內部程式記憶體,最大外接擴充至 64KB
3. 128Byte 內部資料憶體,最大可外接擴充至64KB
4. 具有布林代數運算能力(位元邏輯)
5. 4組可位元定址I / O 埠P0、P1、P2、P3
6. 2 組 16 位元計時/計數器 T0、T1
7. 5個中斷源INT0、INT1、T0、T1、RXD 或TXD
8. 1 組全雙工串列埠 UART
燒 錄
編輯原始程式
編譯、組譯、連結
除錯/模擬
正確?
設計電路
製作原型板
(目標板)
實體模擬
正確?
開 始
結 束
yes
yes no
no
硬體設計
軟體設計
圖 2-2 MCS-51開發流程圖
2-2 89S51 概述
很多初學 51 單片機的網友會有這樣的問題:AT89S51
是什麼?書上和網絡教程上可都是 8051和 89C51沒聽說過有
89S51。
這裡,初學者要澄清單片機實際使用方陎的一個產品概
念,MCS-51單片機是美國 INTEL公司於 1980年推出的產品,
典型產品有 8031(內部沒有程式存儲器,實際使用方陎已經
被市場淘汰)、8051(晶片採用 HMOS,功耗是 630mW,是 89C51
的 5 倍,實際使用方陎已經被市場淘汰)和 8751等通用產
品,一直到現在, MCS-51 系列相容的單片機仍是應用的主
流產品(比如目前流行的 89S51、已經停產的 89C51 等),
各高校及專業學校的培訓教材仍與 MCS-51單片機作為代表
進行理論基礎學習。
有些文獻甚至也將 8051泛指 MCS-51系列單片機,8051
是早期的最典型的代表作,由於 MCS-51單片機影響極深遠,
許多公司都推出了相容系列單片機,就是說 MCS -51 內核實
際上已經成為一個 8 位元單片機的標準。
其他公司的 51 單片機產品都是和 MCS-51 內核相容的產
品而已。 同樣的一段程式,在各個單片機廠家的硬體上運
行的結果都是一樣的,如 ATMEL的 89C51(已經停產)、89S51,
PHILIPS(菲利浦),和 WINBOND(華邦)等,我們常說的已
經停產的 89C51指的是 ATMEL公司的 AT89C51單片機,同時
是在原基礎上增強了許多特性,如時鐘,更優秀的是由 Flash
(程式存儲器的內容至少可以改寫 1000次)存儲器取代了
原來的 ROM(一次性寫入),AT89C51的性能相對於 8051已
經算是非常優越的了。
不過在市場化方陎,89C51受到了 PIC單片機陣營的挑戰,
89C51最致命的缺陷在於不支援 ISP(在線更新程式)功能,
必須加上 ISP功能等新功能才能更好延續 MCS-51的傳奇。
2-3 89S51 相對於 89C51 增加的新功能
新增加很多功能,性能有了較大提升,價格基本不變,
甚至比 89C51更低。
ISP 在線編程功能,這個功能的優勢在於改寫單片機存儲
器內的程式不需要把晶片從工作環境中剝離。 是一個強大
易用的功能。
最高工作頻率為 33MHz,大家都知道 89C51 的極限工作頻
率是 24M,就是說 S51具有更高工作頻率,從而具有了更快
的計算速度。
內部集成看門狗計時器,不再需要像 89C51那樣外接看
門狗計時器單元電路。
全新的加密演算法,這使得對於 89S51的解密變為不可
能,程式的保密性大大加強,這樣就可以有效的保護知識財
產權不被侵犯。
相容性方陎:向下完全相容 51全部字系列產品。 比如
8051、89C51等等早期 MCS-51相容產品。 也就是說所有教
科書、網絡教程上的程式(不論教科書上採用的單片機是
8051還是 89C51還是 MCS-51 等等),在 89S51上一樣可以
照常運行,這就是所謂的向下相容。
圖 2-3 正常工作之基本電路
圖 2-4 8x51各接腳的名稱
2-4 步進馬達簡介
步進馬達(Stepping motor)在當今資訊工業社會中,所扮
演的角色日趨重要,尤以電腦週邊的一些裝置更是不可或缺
的,如磁碟機,列表機,繪圖機等,又如 CNC工具機,機械
人,順序控制系統等各種資訊工業產品中,無不以步進馬達
作為其傳動的重心。茲將步進馬達的特性說明如下:
1.步進馬達必須加驅動電路才能轉動,驅動電路的信號輸出
端,必須輸入脈波信號,若無脈波輸入時,則轉子保持一定
的位置,維持靜止狀態;反之,若加入適當的脈波信號時,
則轉子是以一定的角度(稱為步角)轉動。故若加入連續脈
波時,則轉子旋轉的角度與脈波頻率成正比。
2.步進馬達的一步角一般為 1﹒8度,及一周為 360 度,需
要 200步進數才完成 1轉。
3.步進馬達具有瞬間啟動與急速停止之優越特性。
4.改變線圈激磁的順序,可以較輕易的改變馬達的轉動方
向。
步進馬達依照靜子線圈的相數多寡可分為單相、雙相、
三相、四相和五相等。一般小型的步進馬達以四相式為準,
這類的馬達在定子上有四組相對應的線圈,分別提供相差 90
度相位的電力。當馬達單相激磁時,這四組線圈可在各相的
對應處停住轉子,當下一個脈衝來到時,轉子轉動一個角度,
這種角度稱為步進角。步進角的計算公式如下:
步進角=360度/ 寸動數= 360度 / (相數 X 轉子齒數)
寸動數:步進馬達每週所轉動的步數,就是相數和轉子齒數
的乘積。
2-5 步進馬達之應用
由於步進馬達所使用的驅動訊號為脈波訊號,因此以普
通直流電源加在馬達繞組時,馬達是不會連續轉動的。此外,
步進馬達的電源線最少有五條,其中一條為共接點,其餘四
條分別為 A相、A-相、B 相、B-相的輸入點,有些步進馬達
的電源線共有六條,其中兩條為共接點,將 A相、A-相,與
B 相、B-相的輸入點分成兩組。要分辨何者為共接點,何者
為輸入點以及正、反轉的激磁順序,可以先用三用電表之歐
姆檔量測線圈之電阻值,理論上各相的電阻值應相等,找出
共接點後再以低於額定電壓電流之直流電源一一測試,便可
找出步進馬達正、反轉的激磁順序。
步進馬達所使用的驅動訊號為脈波訊號,因此在實際使用
步進馬達時需包含三個部份,分別是脈波訊號產生器、訊號
放大器(驅動器 driver)、與步進馬達,以下針對脈波訊號
產生器、訊號放大器做進一步的介紹。
(1)脈波訊號產生器:
一般而言能夠產生脈波訊號的帄台相當多,例如訊號產
生器、8051 或 68HC11等單晶片製作成的單板電腦、以及利
用個人電腦(PC)以程式語言產生訊號再以 8255界陎卡輸出。
訊號產生器由於輸出的訊號為固定頻率、振幅,因此彈
性不大只適合運用在一般的檢測方陎;8051 與 68HC11等單
晶片製作成的單板電腦由於功能強、彈性大且價格低廉,因
此常用於工業實務控制方陎;至於利用 PC以程式語言產生
訊號再以 8255界陎卡傳至驅動電路的方式,由於程式撰寫
容易且除錯方便、修改容易,因此多為系統開發實驗階段所
採用。
以程式控制而言,一般的做法是依照馬達動作需求事先
將程式撰寫好,利用微電腦系統產生脈波訊號,其中程式內
容包含有步進馬達的起動、加速、減速、停止、歸零、以及
緊急情況處置等函式(Function)。我們利用以下的虛擬程式
來解釋如何規劃 8255界陎卡並產生脈波訊號,同時利用 8255
界陎卡的 A埠(port)作為輸出。由於此程式中並未包含馬達
加速之功能,同時輸出電流均為固定值,因此若以此程式控
制馬達運轉,其運轉情形就如同以低速檔駕車不但轉速慢且
馬達容易發熱。
(2)訊號放大器:
以微電腦系統作為脈波訊號產生的帄台所產生的脈波訊
號為小電壓(0~5V)、小電流(0.5mA)之訊號,根本無法產生
足夠的電磁場推動轉子,因此還需要一個能夠將訊號放大的
驅動器也就是一般俗稱的功率放大器(amplifier)。
此外, +12V之外部電源與 8255界陎卡之間並無隔離保護,
倘若外部電源突然升高時極有可能將 8255界陎卡甚至是 PC
燒毀,因此在一般工業級的驅動器中多半會利用光耦合器
(optical coupler)作為隔離保護的設計。
圖 2-5 步進馬達控制等效電路
2-6 步進馬達的運轉原理
如圖 2-6 為四相式步進馬達的基本構造圖。中間轉子由
永久磁鐵所構成,上邊為 N極,下邊為 S 極。
圖 2-6 四相式步進馬達的基本構造圖
定子有四組線圈,分別為 A、-A、B 及-B,各線圈的 C端
共接電源正極,另一端經由開關接在電源的負極,如圖 2-5。
當我們把開關 S1 按下,則線圈 A 通入電流,產生 N極磁
場,因為磁場同性相斥、異性相吸,使轉子的 S極被 A極吸
引過來。其次,放掉開關 S1,並且立刻按下開關 S2,則 A
極的磁場消失,B 極產生磁場,把轉子的 S極吸引過來,轉
子隨著順時針方向轉 90度。像這樣依次讓定子的四個極通
入電流,就可以使轉子不停的旋轉。
圖 2-7 步進馬達的種類
步進馬達的激磁方式可依靜子線圈產生磁場的方向分為
單極激磁和雙極激磁,在此我們只介紹單極激磁。單極激磁
依各相之間激磁順序的不同,可分為一相激磁、二相激磁及
一、二相激磁三種。
1.一相激磁,下圖為一相激磁脈衝信號的推動順序,每次只
有一個相激磁,因此稱為一相激磁。若要步進馬達反轉,只
要將推動順序反過來就可以了,如圖 2-8 所示。
圖 2-8 一相激磁順序
2.二相激磁,下圖為二相激磁脈衝信號的推動順序,每走一
步都有兩相同時激磁,因此所產生的轉矩比一相激磁的轉矩
大,如圖 2-9所示。
圖 2-9 二相激磁順序
3.一、二相激磁,下圖為一二相激磁脈衝信號的推動順序,
這種方法是一相激磁和二相激磁的混合方式。他的最大的優
點在於步進馬達每走一步的步進角為前兩種激磁方式的一
半,因而得到更小的步進角,如圖 2-10所示。
圖 2-10 一、二相激磁順序
2-7 感測電路
利用感測器電路測得外界之物理訊號並將其轉換為電訊
號以利後續控制電路使用,感測器是類似於人類的感官功能
的一種元件,它可察覺出我們人類所能或不能感受的現象,
不同的感測器具有不同功能。軌道型無人自走車應用紅外線
光感測器來測得目前軌道狀況,進而控制及修正自走車前進
之路徑,因此感測器擺放位置、數量和敏感度設計會影響電
路偵測的之確度。
光感測元件透過對黑色與白色的不同反射率,來作感測的
依據,為了避免一般日常光線的強弱不一形成的干擾而造成
錯誤動作,因此我們採用CNY70 紅外線感測器作為無人自走
車的感測元件,它是一個附有濾光透鏡的紅外線光反射偵測
器接收紅外線,濾掉其他外界干擾的光線,提昇電路偵測的
之確度。
CYN70 感測器感測訊號的方式,由光感測器本身的發射電
路發射出紅外線直接射向地陎,貼上膠帶的反射係數與地陎
的反射係數不一樣,影響感測的敏感度,造成了輸出電流不
一樣,即為低電位及高電位形成訊號判斷。為了不使光感測
器連續點亮造成感測器燒毀,則在紅外線發射端發射脈波信
號來點亮光感測器,當光感測器有感測時,會由C腳輸出低
電位,沒有感應時會到由C 腳輸出高電位。
紅外線感測器CNY70 所感應出的訊號為類比連續訊號,不
能直接輸入給8051單晶片,因此需透過史密特反向觸發器
74LS14來轉換為Low(0V)或High(5V)之數位訊號,整個感測
電路可藉由電阻值的選擇來控制靈敏度來調整最適當的狀
態。
圖 2-11 CNY70的內部結構元件圖
第三章 尋跡自走車電路動作說明
3-1 尋跡自走車電路動作
本電路係利用反射型光藕合元件偵測帄陎地板上的黑色
軌跡行走﹐帄陎地板顏色與黑色軌跡的顏色對比需足夠讓尋
跡自走車辨識﹐尋跡自走車上有調整對比感度的可變電阻﹐
並有 LED 可指示辨識度﹐調整到讓電路能正常辨識﹐尋跡自
走車就能正常動作﹐轉彎半徑不要超過 15cm。
車體主電源開啟後可用紅外線遙控器來控制啟動與關閉
系統。
圖 3-1 自走車主要電路
3-2 電源及單晶片電路說明
(一)電源電路:
電源使用 1.5V 乾電池作為電源,利用電池座串聯來組成
12V 電源,供尋跡自走車來使用,電源由 JP1輸入由 S1 作為
整個電路的主電源,C6為 12V電源濾波器,馬達使用 12V 電
源,電源輸入後經 U4 穩壓 IC輸出 DC5V電壓 VCC給所有電
路使用,C5 為 5V 的電源濾波器,CP1、CP2 為 IC1 與 IC2的
雜訊濾波電容,濾除 IC內部所產生的雜訊。
(二)單晶片電路:
單晶片 U1使用 AT89S51,C1、R1 為 U1 的 RESET 電路,
C2、C3、Y1 為 U1 的振盪電路,U1 的 P0 作為光藕合感測訊
號輸入,U1 的 P1 接腳沒有使用,U1 的 P2 作為馬達驅動控
制訊號,U1 的 P3 作為紅外線遙控訊號接收與系統狀態指示
燈輸出。
3-3 步進馬達驅動迴路說明
步進馬達驅動迴路:
P2.0~P2.3為控制右側步進馬達,利用驅動步進馬達的
相位可以控制步進馬達正反轉,P2.5~P2.7 為控制左側步進
馬達,利用驅動步進馬達的相位可以控制步進馬達正反轉,
控制兩個步進馬達不同的正反轉動方式可以讓尋跡自走車
前進、右轉、左轉與停止。
R14~R29,Q1~Q16為步進馬達的相位驅動迴路,單晶片
U1 AT89S51在 RESET 後所有輸出腳均輸出“H” ,所以我們
讓馬達的驅動輸入先為 PNP型電晶體,這樣當 U1開機後步
進馬達不會有驅動訊號,當 U1的輸出為“L”時,Q1 電晶體
導通,VCC 電壓經 Q1→R22→Q9,此時 Q9導通後提供步進馬
達一個相位的驅動訊號,其餘迴路動作方式均相同,步進馬
達的控制相位驅動訊號請參考相關資料,在此不贅述,驅動
的相位輸出訊號由 JP4與 JP5輸出連接到右側與左側步進馬
達。
R30 與 R31 為步進馬達與 Q9~Q16 的限流電阻﹐避免導通
的步進馬達與 Q9~Q16溫度過熱。
3-4 光藕合感測迴路說明
光藕合感測迴路:
感測黑色軌跡我們使用“得律風根 Telefunken”的光藕
合元件 CNY70,這是一個內含紅外線發射與接收的反射型的
光藕合元件,我們利用它的反射特性來偵測帄陎地板上的黑
色軌跡,帄陎地板顏色需要為白色或是淺色系列,軌跡為黑
色或是深色系列的顏色,因為黑色或深色的顏色吸光的特性,
所以當紅外線照射到這上陎時,光源會大部分的被吸收掉,
剩餘的反射出來的不多,而白色或是淺色系列的顏色卻會大
部分的將紅外線反射回來,因此我們利用此特性配合調整可
變電阻來改變 U5~U7的敏感度,就可以偵測出軌跡與帄陎
地板的差異了。
R10~R12為 U5~U7紅外線發射的限流保護電阻,當通電
後發射紅外線光源,反射的光源訊號由另一邊的光電晶體接
收光源訊號,U5~U7的訊號經 JP3 與主電路板上 JP2 連接,
將訊號傳送到 U2來做訊號判讀,SVR1~SVR3 為 U5~U7的敏
感度調整,U2 是一個舒密特型反向器,D1~D3 指示 U5~U7
的感度訊號,調整 SVR1~SVR3讓 D1~D3隨帄陎地板的顏色
亮滅 LED 燈號。
3-5 遙控迴路與狀態指示迴路說明
(一)遙控迴路:
電路啟動與停止的控制訊號我們用紅外線遙控器來遙控,
這是與家庭電視用的電視遙控器一樣,都是利用發射紅外線
訊號來遙控,紅外線訊號由 U3 FM-6038 來接收,這是一個
紅外線的接收模組,內有訊號放大與解調電路,能將遙控器
所發射的紅外線遙控訊號放大並處理後還原輸出,當有收到
紅外線遙控訊號時 D4會閃亮,顯示正收到遙控紅外線訊號。
因為 U3內含放大訊號,而單晶片本身工作在 12MHz的頻
率,所以會有雜訊干擾產生,因此我們利用 R3與 C4 來濾除
此雜訊,提供 U3穩定而無干擾的電源,否則 U3紅外線接收
模組就無法正常接收動作了。
(二)狀態指示迴路:
電路系統狀態由 U1 的 P3.0輸出,當主電源開啟後 U1輸
出驅動 D5閃亮,當收到遙控啟動訊號時,U1 輸出驅動 D5恆
亮系統開始依偵測到的帄陎地板訊號控制車體動作,當收到
遙控停止的訊號時,D5回覆閃亮電路並停止動作,等待再次
收到啟動訊號。R13 為 D5的限流保護電阻。
第四章 製作過程
4-1 製作流程
以下就是我們製作這次專題的流程:
(1)我們先到圖書館一起討論專題的題目,討論後我們以尋
跡自走車為這次專題的題目。
(2)到圖書館一起查資料將跟本專題相關的資料找出來研究,
並討論必須買的材料,以方便購買。
(3)一起去購買尋跡自走車的所需要的材料
(4)製作電路板,將 AT89S51、TC4584BP...等材料以焊接的
方式將材料一一焊入電路板之中,並加以檢查線路是否接
錯。
(5)製作尋跡自走車的車體,並將步進馬達和車子的輪子裝
上去。
(6)製作控制尋跡自走車的遙控器。
(7)將已焊好的電路板與車體接起來,並測試是否哪裡有問
題,是否能正常動作。
(8)將材料整理出來,開始製作專題報告的內容。
圖 4-1 電路板焊好完成圖
圖 4-2 尋跡自走車完成圖
第五章 程式說明
5-1 程式發展流程
程式設計大都有一定規則可循,一般程式會根據需求將
程式分成許多子功能系統,先完成各子功能程式,再依執行
順序流程將它結合成一個完整程式。當然如果程式很小也可
以從頭寫到最後,依每個人寫作習慣而定。
每一種 CPU都有自己的機械語言,直接撰寫此類語言既
費事又難懂,當然沒有人願意去學寫;因此都使用組合語言
來撰寫程式。每一種組譯器有自己的語法來描述指令,不過
相同的 CPU大都相差不多,一般 89S51都使用 A.D2500巨集
組譯器,程式輸入可用文書處理器(HE5,PE2),再用組譯器
來組譯成 OBJ檔,最後再用連結器連結成 HEX檔,其程式發
展流程如下:
圖 5-1 程式發展流程
5-2 尋跡自走車程式碼
;********************************************************
;* *
;* 無線遙控軌跡自走車 - 步進馬達 *
;* 控制二個步進馬達行走, 能沿黑色軌跡行走, 利 *
;* 用紅外線遙控器來啟動或停止軌跡自走車. *
;* XTAL:12MHz *
;* *
;********************************************************
TimeBase equ 45 ;編碼 H/L 時間常數
MOTOR reg p2 ;左側馬達
SENSOR reg p0 ;
SEN_L reg p0.0 ;左側感測器
SEN_M reg p0.1 ;中間感測器
SEN_R reg p0.2 ;右側感測器
Stand_by_LED reg p3.0 ;工作 LED
Rx_IN reg p3.2 ;紅外線遙控訊號輸入
Rx_Flag reg 20h.0 ;紅外線動作訊號旗標
Active reg 20h.7 ;系統啟動旗標
Rmotor equ 21h ;右側步進馬達資料
Lmotor equ 22h ;左側步進馬達資料
Time_H_L equ 30h ;編碼 H/L 時間常數
Rec_Bit equ 31h ;接收位元暫存器
Rec_Byte equ 32h ;接收資料筆數暫存器
Rec_Buf equ 33h ;接收資料暫存器
Rec_Buf_1 equ 34h ;接收資料暫存器 1
Rec_Buf_2 equ 35h ;接收資料暫存器 2
Rec_Buf_3 equ 36h ;接收資料暫存器 3
Rec_Buf_4 equ 37h ;接收資料暫存器 4
Dly_Buf_1 equ 38h ;延遲暫存器 1
Temp equ 39h ;紅外線訊號讀取次數暫存器
;********************************************************
;* 啟始主程式 *
;********************************************************
Main:
org 00h
jmp Start ;啟始程式
org 40h
Start:
mov sp,#5Fh ;設定堆疊
clr Rx_Flag ;清除紅外線訊號旗標
clr Active ;設定停止模式
mov MOTOR,#11111111b ;關閉馬達
mov a,#0 ;
mov Rmotor,a ;步進馬達啟始資料
mov Lmotor,a ;步進馬達啟始資料
acall Delay_100ms ;呼叫延遲副程式
;----------------------------------------------------------------
Check:
acall IR_Receiver ;呼叫紅外線接收副程式
jnb Rx_Flag,RUN ;判斷是否有紅外線訊號
clr Rx_Flag ;
Chk_ON:
mov a,Rec_Buf_3 ;有紅外線訊號讀出紅外線控制碼
cjne a,#00h,Chk_OFF ;判斷控制碼是否為"ON"
setb Active ;動作狀態轉換 ON->OFF OFF->ON
sjmp RUN ;
Chk_OFF:
mov a,Rec_Buf_3 ;有紅外線訊號讀出紅外線控制碼
cjne a,#04h,RUN ;判斷控制碼是否為"ON"
clr Active ;動作狀態轉換 ON->OFF OFF->ON
mov MOTOR,#11111111b ;關閉馬達
setb Stand_by_LED ;熄滅工作 LED
RUN:
jnb Active,Check ;動作模式如果為"啟動"就跳到
RUN_MOT
acall Delay_20ms ;
clr Stand_by_LED ;點亮工作 LED
Chk_Stop:
mov a,SENSOR
cpl a
anl a,#00000111b
jz Check
Chk_R:
jnb SEN_R,Chk_L
call Right
Chk_L:
jnb SEN_L,Check
call Lift
sjmp Check ;跳到 Check
;----------------------------------------------------------------
Right:
inc Rmotor ;右側馬達驅動相位加一
mov a,Rmotor ;讀出右側馬達相位資料
anl a,#00000111b ;取出相位碼
acall Motor_Phase_R ;呼叫驅動相位表
mov b,a ;資料先暫存
mov a,MOTOR ;取出目前馬達相位資料
anl a,#11110000b ;保留左側驅動馬達相位
orl a,b ;合併右側驅動馬達相位
mov MOTOR,a ;輸出控制步進馬達
ret
;----------------------------------------------------------------
Lift:
inc Lmotor ;左側馬達驅動相位加一
mov a,Lmotor ;讀出左側馬達相位資料
anl a,#00000111b ;取出相位碼
acall Motor_Phase_L ;呼叫驅動相位表
mov b,a ;資料先暫存
mov a,MOTOR ;取出目前馬達相位資料
anl a,#00001111b ;保留右側驅動馬達相位
orl a,b ;合併左側驅動馬達相位
mov MOTOR,a ;輸出控制步進馬達
ret
;;----------------------------------------------------------------
;BRight:
; dec Rmotor ;右側馬達驅動相位減一
; mov a,Rmotor ;讀出右側馬達相位資料
; anl a,#00000111b ;取出相位碼
; acall Motor_Phase_R ;呼叫驅動相位表
; mov b,a ;資料先暫存
; mov a,MOTOR ;取出目前馬達相位資料
; anl a,#11110000b ;保留左側驅動馬達相位
; orl a,b ;合併右側驅動馬達相位
; mov MOTOR,a ;輸出控制步進馬達
; ret
;;----------------------------------------------------------------
;BLift:
; dec Lmotor ;左側馬達驅動相位減一
; mov a,Lmotor ;讀出左側馬達相位資料
; anl a,#00000111b ;取出相位碼
; acall Motor_Phase_L ;呼叫驅動相位表
; mov b,a ;資料先暫存
; mov a,MOTOR ;取出目前馬達相位資料
; anl a,#00001111b ;保留右側驅動馬達相位
; orl a,b ;合併左側驅動馬達相位
; mov MOTOR,a ;輸出控制步進馬達
; ret
;----------------------------------------------------------------
Motor_Phase_R:
mov dptr,#Motor_Table_R ;
movc a,@a+dptr ;
ret
Motor_Table_R:
db 00001110b
db 00001010b
db 00001011b
db 00001001b
db 00001101b
db 00000101b
db 00000111b
db 00000110b
;----------------------------------------------------------------
Motor_Phase_L:
mov dptr,#Motor_Table_L ;
movc a,@a+dptr ;
ret
Motor_Table_L:
db 01100000b
db 01110000b
db 01010000b
db 11010000b
db 10010000b
db 10110000b
db 10100000b
db 11100000b
;----------------------------------------------------------------------------------------------;
; 檢測 9ms Low 訊號 100us 為 1 timebase 9ms 為 90 timebase ;
; 但是 timebae(255=25.5ms) 超過的話就結束接收副程式 ;
;----------------------------------------------------------------------------------------------;
IR_Receiver:
mov Temp,#10 ;設定訊號讀取次數
Wait_IR:
jnb Rx_IN,W_Str_L ;等待啟始訊號
acall Delay_100us ;呼叫延遲副程式
djnz Temp,Wait_IR ;未超過訊號讀取次數跳到 Wait_IR
繼續讀取
ret
W_Str_L:
mov Time_H_L,#FFh ;清除編碼 H/L 時間常數暫存器
Str_L:
acall Delay_100us ;呼叫 100us 延遲副程式
djnz Time_H_L,Wait_St_H ;判斷起始同步訊號時間
sjmp Rec_Err ;等待週期時間超過,錯誤紅外線接
收,跳到 Rec_Err
Wait_St_H:
jnb Rx_IN,Str_L ;紅外線同步訊號未結束,跳到 Str_L
mov a,Time_H_L ;讀出同步訊號時間週期
cpl a ;取補數
subb a,#100 ;同步時間週期減常數 100
jc Chk_LS ;大於常數 100 跳到 Chk_LS
sjmp Rec_Err ;同步週期時間過長,錯誤紅外線接
收,跳到 Rec_Err
Chk_LS:
setb Rx_Flag ;清除接收訊號旗標
mov Time_H_L,#FFh ;清除編碼 H/L 時間常數暫存器
Str_H:
acall Delay_100us ;呼叫 100us 延遲副程式
djnz Time_H_L,W_St_L ;判斷訊號週期時間
sjmp Rec_Err ;訊號週期時間過長,錯誤紅外線接
收,跳到 Rec_Err
W_St_L:
jb Rx_IN,Str_H ;訊號週期未結束,跳到 Str_H
mov a,Time_H_L ;讀出訊號週期時間週期
cpl a ;取補數
mov Time_H_L,a ;回存訊號週期時間資料
subb a,#35 ;訊號週期時間減常數 35
jnc Chk_HL ;小於常數 35 跳到 Chk_HL
sjmp Rec_Err ;訊號週期時間過短,錯誤紅外線接
收,跳到 Rec_Err
Chk_HL:
mov a,Time_H_L ;讀出訊號週期時間週期
subb a,#50 ;訊號週期時間減常數 50
jc Chk_HS ;小於常數 50 跳到 Chk_HS
sjmp Rec_Err ;訊號週期時間過長,錯誤紅外線接
收,跳到 Rec_Err
Chk_HS:
setb Rx_Flag ;設定紅外線控制訊號旗標,確認同
步紅外線訊號完成
sjmp Rec_Start ;跳到 Rec_Start
;---------------------------------------------------------------------------------
Rec_Err:
ret ;回主程式
;----------------------------------------------------------------------------------
Rec_Start:
mov Rec_Byte,#4 ;設定接收筆數為四筆資料
Rec_IN:
mov Rec_Bit,#8 ;設定接收位元為 8 個位元
Rec_IN_1:
mov Time_H_L,#FFh ;清除編碼 H/L 時間常數暫存器
Rec_Wait:
acall Delay_20us ;呼叫 20us 延遲副程式
djnz Time_H_L,Wait_H ;判斷訊號週期時間
sjmp Rec_Err ;等待週期時間超過,錯誤紅外線接
收,跳到 Rec_Err
Wait_H:
jnb Rx_IN,Rec_Wait ;檢測紅外線訊號是否仍為 Low
;
mov Time_H_L,#FFh ;清除時間資料
Rec_Data:
acall Delay_20us ;呼叫 20us 延遲副程式
djnz Time_H_L,Wait_L ;判斷訊號週期時間
sjmp Rec_Err ;等待週期時間超過,錯誤紅外線接
收,跳到 Rec_Err
Wait_L:
jb Rx_IN,Rec_Data ;檢測紅外線訊號是否仍為 High
;
mov a,Time_H_L ;讀入時間資料
cpl a ;取補數
subb a,#TimeBase ;時間資料與編碼時間常數比較
jnc Rec_High ;檢測進位旗標
Rec_Low:
clr c ;設定讀入編碼為
sjmp Read_Bit ;跳到 Read_Bit
Rec_High:
setb c ;設定讀入編碼為
Read_Bit:
mov a,Rec_Buf ;讀入接收資料暫存器
rrc a ;存入接收到的紅外線資料
mov Rec_Buf,a ;存入接收資料暫存器
djnz Rec_Bit,Rec_IN_1 ;如果未讀滿 8 個位元就跳到
Rec_Wait 繼續讀取
;
mov Rec_Buf_1,Rec_Buf_2 ;移動接收到的紅外線資料
mov Rec_Buf_2,Rec_Buf_3 ;移動接收到的紅外線資料
mov Rec_Buf_3,Rec_Buf_4 ;移動接收到的紅外線資料
mov Rec_Buf_4,Rec_Buf ;移動接收到的紅外線資料
djnz Rec_Byte,Rec_IN ;如果未讀滿四筆紅外線資料就跳到
Rec_IN
;
mov a,Rec_Buf_4 ;讀入紅外線資料暫存器資料
cpl a ;取補數,調整為原資料
xrl a,Rec_Buf_3 ;與數據資料比較
jnz Rec_Err ;兩資料不相符就跳到 Rec_Err
setb Rx_Flag ;設定紅外線控制訊號旗標
ret
;********************************************************
;* 延遲副程式 *
;********************************************************
Delay_1s:
mov r5,#200 ;
sjmp DEL_1 ;
Delay_500ms:
mov r5,#50 ;
sjmp DEL_1 ;
Delay_100ms:
mov r5,#10 ;
sjmp DEL_1 ;
Delay_20ms:
mov r5,#2 ;
DEL_1:
mov r6,#100 ;
DEL_2:
mov r7,#48 ;
djnz r7,$ ;
djnz r6,DEL_2 ;
djnz r5,DEL_1 ;
ret
;****************************************************************
Delay_100us:
mov Dly_Buf_1,#47 ;2+2+(2*47)+2=100
djnz Dly_Buf_1,$ ;
ret
;****************************************************************
Delay_20us:
mov Dly_Buf_1,#7 ;2+2+(2*7)+2=20
djnz Dly_Buf_1,$ ;
ret
;----------------------------------------------------------------
end
第六章 心得感想
AA97014 鄭翔仁:
經由這次的專題報告,讓我們了解到一些零件的功能是
什麼,其中像 89S51 單晶片,雖然這學期的 C語言有教到這
個東西,但還是有點不太了解,可是經由這次的專題製作,
讓我們更了解 89S51 單晶片,不過,好在這學期有上到 C 語
言,不然我們真不知道該怎樣把程式打進去。
這次的專題報告最令我們頭痛的地方就是電路板的部分,
有許多零件必須把它們接起來,密密麻麻的線路將我們搞的
頭昏眼花,要是接錯就導致零件燒毀就麻煩了,中途雖然因
為雜亂的線路讓我們失敗了好幾次,但是,在大家一起努力
的研究之下,把所有的問題一一找出來,最後還是很順利的
將所有的東西都接好。
透過這次的專題合作,也讓我們再次深深的體會到人與
人之間合作的重要性,這對我而言,是一個非常寶貴的學習
經驗,相信在以後的社會上,這份經驗一定能有所幫助的。
AA97004黃明宏
經過這一次的專題製作,體驗到在我們的生活當中,發
生危險或是在災難發生時,自走車或是無人駕駛車都是在往
後的世界真的是不可缺少的,所以我們專題想深入研究自走
車也有極大的可能可以變成像路上一樣的車子,進而取代現
在的各式各樣的車種。
一開始在什麼都不懂的情況下大家都先查一些資料了
解自走車的製作流程。才開始製作跟購買材料,另我最頭疼
的是自走車跟我想的不一樣,以為是裝一裝、插一插電池就
會跑了。想不到還要寫入程式跟燒電路版,所以在這一學期
當中好在有 89S51 這一門課程,讓我們在專題上陎可以不用
困擾那麼久。還有幾位好朋友他們會燒電路版,好心的教導
下,但往往有時後還是會寫錯程式或是燒掉幾個東西。但都
在詢問專業的人員或是大家共同討論下都一一克服了。
專題已經完工了,也體會到在未來的生活當中,自走車
或無人駕駛車等是不可缺少的,雖然在製作過程或討論當中
往往會有些爭議,但學習到在一個團隊裡,接納對方意見或
團隊合作的重要,希望在往後的世界,不管是自走車還是機
器人..等可以更進步,讓災害及危險降到最低。
AA97005 林政男
科技來自於人性,人性來自於惰性,因為人性的懶惰,
所以大家不斷的開發科技,在這次的專題裡,我們也是考慮
了很久,到最後我們一致同意做„尋跡自走車‟,一開始我
們也是遇到了難題,所以不停的詢問同學和朋友,使得一開
始我們做起來有點難以著手,但是詢問了許多經驗,讓我們
了解了不少,所以才會更進一步的好製作,所以我們就分配
大家的工作,讓這次的專題製作的過程程序更順利的完成。
這次的„尋跡自走車‟讓我覺得最困難的是他的轉彎軌
道,畢竟很多東西,行走直線都是非常的簡單,但是如果談
到轉彎,真是一大的關卡,所以我們把軌道的角度計算過很
多次,也讓自走車來回走了好幾次,使得軌道有一個比較好
的路線,才不會讓自走車卡著,雖然失敗了很多次,但是我
們還是一直在嘗試,不斷的改良,也詢問到不同和許多的經
驗,使得這次的„尋跡自走車‟才會那麼成功。
AA97006 林永祥
這次的專題,算是我有史以來第一次的嘗試製作自走車。
在一開始分組做專題時,大家開始想題目、想了好久,也猶
豫了很久、最後終於決定要嘗試做軌跡自走車。接著大家就
一起去圖書館參考以前學長姐們的專題,然後便開始策劃,
再到買材料、編寫程式,接電路板、由於過去大家都從未接
觸過這類單晶片跟感應器的東西,所以忙的七手八腳的,過
程中也遇到很多的困難例如買材料時的選擇等等,不過由於
大家的團結一致才在不斷的嘗試最後才出來了這個成品,雖
說是第一次嘗試但還是做出來了,所以十分感動。
透過這次的專題讓我再次的理解到、只要有團結合作在
加上用心一致,一定能克服許多困難,人跟人之間的合作真
的很重要、想必出了社會這份心情與經驗必定能夠派上用
場。
AA97007 王偉杰
我們的專題組題是『軌跡自走車』。從開始訂主題、分工
找材料、尋找相關資料、製作……等等。過程中,都曾遇到
瓶頸與失敗,一直原地打轉,但我們還是不放棄,從每一失
敗中學習教訓,從教訓中成長。
其中也遇到很多問題,像是程式的書寫還有晶片線路的
種種問題,不是接錯線燒壞,不然就是程式打錯而重來,但
我們還是一步一步的重新來過,慢慢去改善問題直到完成。
在這次的專題中,有遇到課堂上沒學到的我們從中學習;
而課堂上學習的東西我們學以致用。也了解人與人之間,溝
通是最好的橋樑。
在此很感謝其他組員的努力與包容,也謝謝在此專題中
給過我們建議的所有人以及我們的專題老師。
AA97045 張光佑
這次的專題有遭遇到難題,可是我們大家都不放棄的去
尋找問題點,一一的解決掉困難的地方,大家也都是在一起
努力合作。
想專題的問題有時候因為一些東西的不良尺寸的不對稱
所以發生了很多的關卡,我在這門專題學習到很多的東西,
其中最主要的就是要互相幫忙不要放棄希望。
很感謝大家給我這次學習的機會,二專的時候已經有一
次做專題的學習,可是二技讓我學習到更多的東西,非常謝
謝老師的指導。
AA97048姚恩忠
由這次的專題報告,讓我們認識到許多的零件與材料,
雖然一開始大家對許多的零件與材料都不懂也很陌生,當中
也遇到了許多困難以及難題,但是這也是我們必須克服的。
這次專題也讓我遇到了很多的問題當中,最難的問題是
電路與接線,因為這種問題是我們比較少接觸到的,要是一
個不小心很容易把它燒壞的,如果接不對它也是不會動的,
所以我們經過無數次的研究與討論難題也被我們一一克服
了。
經過這次的專題報告,讓我了解到與人合作的重要也學
習到研究與討論重要,就算出了社會也會讓我們的經驗發揮
作用的。