Arduino+魔法自走車控制
德霖技術學院 機械工程系助理教授 諶其騮
目錄
為魔法自走車裝上馬達控制器 (一)
於麵包版上裝上ARDUINO NANO與馬達驅動模組並確定安裝位置是否正確。
為魔法自走車裝上馬達控制器 (二)
依圖中的跳線方式將馬達驅動模組與ARDUINO NANO 連接,並接上麵包版上的電源。
B-IA
B-IB
VCC
GND
A-IA
A-IB
B-IA > D5
B-IB > D4
VCC > 3V
GND > GND
A-IA > D7
A-IB > D6
為魔法自走車裝上馬達控制器 (三)
將左右馬達的電源線(位於車身側邊)依圖接到馬達驅動模組端子台上,並用起子鎖固定。
左邊馬達
右邊馬達
為魔法自走車裝上馬達控制器 (四)
依圖插上電池電源。
注意請先確定3V馬達電源是關閉的(魔法自走車馬達電池座上有電源開關)
common gnd-gnd
兩顆電池3V
三顆電池4.5V
製作設定輸出指令
查看剛定義好的指令(WORDS)
於直譯模式中輸入WORDS,觀察剛剛我們定義了那些指令。
移除指令
如果不小心定義了錯誤的指令,可以利用FORGET 將錯誤的指令移除。
注意 ! FORGET 指令會將該指令以後宣告的指令皆移除掉 。
將已編寫的指令作「永久的儲存」
斷電或按RESET後,指令會失蹤。REMEMBER 指令可以儲存我們已編入字典的指令以便下次使用,於直譯模式下輸入REMEMBER即可,輸入完後按下ARDUINO NANO 上的RESET按鈕看看剛剛的指令是否還在。
RESET
試著讓左輪轉動
於直譯模式下輸入剛剛所定義的設定輸出指令接著輸入 5 PD HIGH 4 PD LOW 觀察輪子是否轉動,如果需要停下來只要輸入5 PD LOW即可。
試著讓右輪轉動
於直譯模式下輸入6 PD HIGH 7 PD LOW 觀察輪子是否轉動,如果需要停下來只要輸入6 PD LOW即可。
註:輸出設定只需一次即可。
製作左輪向前與向後轉的指令
控制左輪的腳位為PD4 與 PD5,如果PD5為高電位PD4為低電位的話馬達就會像前轉,如果相反的話馬達會向後轉,試著定義左輪向前與左輪向後的指令。
另命別名
「左輪向前」「左輪向後」這樣的指令打起來如果覺得太長,或不喜歡打中文,可以把剛定義的字,另命別名。命名只要不是空格,任何字母、數字、符號都可以。例如
: (^ 左輪向前 ;
: (v 左輪向後 ;
這樣 (^ 和 左輪向前 動作是同樣的,只是(^ 會多了呼叫 左輪向前的動作
製作右輪向前與向後轉的指令
控制右輪的腳位為PD6 與 PD7,如果PD6為高電位PD7為低電位的話馬達就會像前轉,如果相反的話馬達會向後轉,試著定義右輪向前與右輪向後的指令。
利用指令控制左輪向前向後轉
試著於直譯模式下輸入 左輪向前 指令讓輪子向前轉,如需停止請輸入 5 PD LOW。
您也可於直譯模式輸入 左輪向後 指令讓輪子向前後,如需停止請輸入 4 PD LOW。
如果沒有反應請於直譯模式輸入設定輸出或檢查接線是否正確。
利用指令控制右輪向前向後轉
試著於直譯模式下輸入 右輪向前 指令讓輪子向前轉,如需停止請輸入 6 PD LOW。
您也可於直譯模式輸入 右輪向後 指令讓輪子向前後,如需停止請輸入 7 PD LOW。
如果沒有反應請於直譯模式輸入設定輸出或檢查接線是否正確。
但是我們還希望能控制馬達出力的大小
前面的車輪(馬達)控制指令其實只有「開」和「關」。馬達不是全開,就是全關。
如果希望控制馬達出力的大小,那就要用到基本教材提過的 PWM 技術。它可以控制馬達平均的開啟時間比例,平均開啟時間的比例愈高,馬達的平均出力就愈大,車輪就轉得愈快。
首先,學習如何啟動 PWM 功能
PWM:Pulse Width Modulation (脈衝寬度調變)
(1) PWM 的功能要啟動才有效。
(2) 啟動之後,要透過參數來控制PWM的比例。
先是啟動,然後隨時可以透過參數來調整所要的PWM比例。最後不再需要時,要關閉PWM功能。
PWM 示意圖
PWM 為控制一個周期的開關比例,來模擬輸出的比例
為(左輪上的)PD5製作PWM的開關
PD5_PWM_IO ( f -- )
PD5_PWM_IO 會啟動或關閉PD 5的PWM功能。
PD5_PWM_IO 會從堆疊上取得一個數字,如果是0的話關閉 PD 5 的 PWM ,如果是1的話則會開啟PD 5 的PWM。
為(右輪上的)PD6製作PWM的開關
利用相同方法製作PD6的PWM開關。
利用PD6_PWM_IO ( f -- )製作一個啟動PWM的指令。
利用PWM 參數控制左輪前進的轉速
利用 PD5_PWM ( BYTE -- ) 指令使PD5送出PWM 控制馬達的轉速,PD5_PWM 會從堆疊上取得一個 0 - 255 間的參數來控制PWM輸出的比例大小。 0為不出力,255為最大出力。
試著以100的比例大小控制左輪的轉速。
使用前需用左輪PWM開指令開啟PWM功能,須停止時左輪PWM關來關閉PWM功能。
利用PWM參數 控制右輪前進的轉速
利用與控制左輪相同的方法,以 PD6_PWM 改變右輪的PWM參數。右輪的接線為PD6與PD7 ,如需停止請輸入右輪PWM關,切記 PD6_PWM 指令一定要於堆疊上輸入一個0-255間的參數。
製作一個PWM 控制左輪前進的指令
利用PD5_PWM與4 PD LOW定義一個指令,用來從堆疊上取一個0-255間的數字來控制左輪的轉速。
製作一個PWM 控制右輪前進的指令
利用PD6_PWM與7 PD LOW定義一個指令,用來從堆疊上取一個0-255間的數字來控制左輪的轉速。
製作一個PWM 控制左輪後退的指令
由於向後轉時馬達兩條電源線的極性與向前轉時相反,此時我們控制的是關閉的時間,所以PWM開與關的時間與正轉時呈倒數,輸入的數字須與255相減。但該程式中的減數是最後放入堆疊的,我們要利用SWAP指令將堆疊上層兩數字交換後再相減,才會得到所需要的差。
製作一個PWM 控制右輪後退的指令
用相同的方法試著製作一個控制右輪PWM向後的指令。
注意PD7的極性是與前進時相反的。
同樣,在前面左輪PWM向後的例子中,PD4的極性也是和左輪前進時相反。
製作讓左輪停止的指令
在非PWM模式(即PWM關閉)下,將PD4 與 PD5都設定為低電位的話,左輪就會停止轉動。
在PWM模式下,PD5腳位將不受HIGH與LOW指令的影響,所以我們必須利用 0 PD5_PWM_IO 指令來關閉PWM才能將左輪停止。暫時停止建議用 0 左輪PWM向前 ,不用再重新開啟PWM。
製作讓右輪停止的指令
利用相同方法將PD6與PD7的輸出訊號變成低電位使得馬達停止運轉,製作右輪停止指令。
切記PWM功能開啟時該腳位將不受IO控制指令的引響所以要先關閉。
自我練習
利用剛剛所定義的指令試著控制左右輪的動作。
設定輸出 \ 設定腳位狀態為輸出
( IO暫存器控制法)
左輪向前
左輪向後
( PWM控制法)
左輪PWM開 \ 啟動PWM功能
左輪PWM關 \ 關閉PWM功能
左輪PWM向前 ( BYTE -- )
左輪PWM向後 ( BYTE -- )
左輪停
右輪向前
右輪向後
右輪PWM開 \ 啟動PWM功能
右輪PWM關 \ 關閉PWM功能
右輪PWM向前 ( BYTE -- )
右輪PWM向後 ( BYTE -- )
右輪停
紅外線遙控原理實習(載波的功能)
日常周遭環境都有背景紅外線,有些相當強。
背景紅外線對紅外線通訊和遙控來說是為雜訊。
如何讓紅外線訊號和背景紅外線區隔 ?
常用的方式是把紅外線訊號搭載在38KHz的載頻上傳輸,只有38KHz的信號才會通過帶通濾波器被接收電路放大。這樣即使訊號/雜訊比很低,也可以把有用的訊號成功抽離出來。
接上一個紅外線解碼器
準備材料
1. 紅外線解碼器
2. 220Ω電阻一個
(紅紅棕金)
3. 單心線兩根(紅、藍)
4. 任何一個紅外線遙控器(如:冷氣、電視、音響 等)
製作一個收到38KHz紅外線就會熄的燈
先將PB5 點亮,利用BEGIN UNTIL 迴圈等一個PC0上的訊號,紅外先解碼器平時為高電位有訊號輸入時為低電位所以結束條件必須是低電位,結束時將PB5 的LED熄滅。
下載課堂用範例程式
利用NOTEPAD2事先編輯程式再傳入328eFORTH中,但切記如果 send 重複的定義指令要先FORGET舊指令,以避免浪費空間。
1. 下載課堂程式
2. 點選下載按鈕
用NOTEPAD2開啟檔案
對檔案按滑鼠右鍵選擇記事本開啟,將課堂程式貼入您的NOTEPAD2中。
如有安裝NOTEPAD2,可以直接用NOTEPAD2開啟
設定NOTEPAD2 為UTF-8
上面下拉式選單能列表中選擇
File > Encoding >UTF-8
我們328eFORTH系統中,中文指令為UTF-8格式
將檔案另存至指定資料夾中
按下鍵盤上方的F6鍵,將檔案存至
eforthKTTYS德霖上課用教材\328eforth
輸入檔案名稱快速的載入程式
輸入剛剛存檔的檔案名稱(本例為 CAR.F),按下send File 就可以快速地載入文字檔案。
傳送之前記得先將舊的指令移除喔!!
於sendCmd旁輸入 FORGET 設定輸出 即可
FORGET 指令會將 要移除的指令與之後的指令都移除掉。
讓車子一開機就直走5秒 (一)
試著在CAR.F中定義直走與停的指令,利用MS指令來控制時間。
\ 是註解 " \ " 以後的字不會被編譯使用,是給人看的
讓車子一開機就直走5秒 (二)
傳之前要移除與先前定義的(重複)指令以免空間不足。
將剛剛修改好的程式存檔再利用send File 功能傳給328eFORTH 。
第一步,移除重複指令
第二步,傳送新的指令
讓車子一開機就直走5秒 (三)
將已定義的指令一開機就走五秒變成開機執行指令。切記一定要用REMEMBER 指令儲存。
完成後將USB線拔掉將車子放在地上觀察看看 !
' (開機要執行的指令) 'BOOT !
REMEMBER
定義一個90度轉彎的動作
由於我們目前沒有使用感測器的輔助,所以行走距離或轉動角度都是依賴時間來控制。
試著讓車子左轉多久再停下來剛好等於轉彎90度。試著修改MS前面的數字(500)讓車子轉90度。
您可以先定義一個左轉N度的指令,來試試看要多少時間才是九十度。
500 左轉N度 看看車子會轉幾度
450 左轉N度 看看車子會轉幾度
讓車子走一個弧線
當兩輪速度不一致時車子就會走弧線,試著利用PWM指令控制兩輪的速度,讓兩輪速度不同。
定義不同的動作將他們組合起來 !
這個章節沒有範例~~ 同學們自由發揮組合出想要表現的動作。
: 我的舞步
(自由發揮組合) ;
讓車子收到38KHZ 紅外線開始跳舞
將剛剛定義的我的舞步前面加上之前實驗的等一個紅外線觸發,並製作成開機執行指令。
完成後按下RESET等燈亮起用遙控器啟動車子跳舞。
: 跳舞的車
設定輸出
等一個紅外線觸發
我的舞步
;
’ 跳舞的車 'BOOT ! REMEMBER