尋跡自走車 - hsiuping university of science and...
TRANSCRIPT
-
修 帄 技 術 學 院 二 年 制 機 械 工 程 系
專題製作報告
尋跡自走車
指導教授:常元海
班級:二技機二甲
組長:鄭翔仁 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姚恩忠
由這次的專題報告,讓我們認識到許多的零件與材料,
雖然一開始大家對許多的零件與材料都不懂也很陌生,當中
也遇到了許多困難以及難題,但是這也是我們必須克服的。
這次專題也讓我遇到了很多的問題當中,最難的問題是
電路與接線,因為這種問題是我們比較少接觸到的,要是一
個不小心很容易把它燒壞的,如果接不對它也是不會動的,
所以我們經過無數次的研究與討論難題也被我們一一克服
了。
經過這次的專題報告,讓我了解到與人合作的重要也學
習到研究與討論重要,就算出了社會也會讓我們的經驗發揮
作用的。