前言
上述視頻中講述的是一個循跡送餐機器人,而喜歡電子設計的朋友,完全可以用幾十塊錢製作一個這樣的機器人模型:循跡小車,製作過程相當簡單。打好基礎後,可以以此為跳板製作一個智能送餐機器人、搬運機器人拿去參加各類比賽。
對於電子相關專業的朋友來說,最好自己動手做一些小項目,可以加深對專業知識的理解,就不會覺得模電、數電等專業特別難了。循跡小車並不是很難,非常適合初學者鍛鍊電子設計的綜合能力,下面整體分析一下關鍵的技術要點:
(1)作為一輛小車必須有可以行走的輪子,即可以正常行走的小車,這是小車的框架。
(2)要求智能,即可以通過CPU控制小車自由移動,那麼必須有控制輪子的驅動,一般輪子的驅動用電機製作,可為直流電機或步進電機,因此這部分內容包括CPU控制電機實現小車前後移動,左拐、右拐,調速;必須有一個CPU處理器,使用單片機、ARM等處理器晶片都可以;電機驅動電路,實現電機正反轉、調速。
(3)循跡,必須確定軌跡模型,才能有針對性的選擇傳感器,比如要求小車按地上的黑線軌跡行走,確定軌跡是地上的黑線之後,選擇傳感器用於識別地上的黑線,用什麼檢測地上的黑線呢?最簡單的是使用紅外接收對管,通過黑色吸收光線最強的原理判別小車是否在軌道上。當然也可以使用其他傳感器識別軌跡,比如攝像頭等,不過對於初學者來說沒必要整得這麼複雜。
(4)思路清晰之後,接下來就是設計原理圖製作印製板(可以購買現成的最小系統板和電機驅動板自己組裝接線),組裝小車,包括電機、輪子,印製板、電源,甚至傳感器的位置,最後就是編寫程序,識別軌跡,控制小車動作。後期主要就是不斷修改代碼,整體調試,直到成功為止。
製作循跡小車的前期準備:了解C語言基礎語法,接觸過Arduino。
Arduino是一款很容易入手的單片機,很適合初學者DIY自己想要的作品。
如果沒有學過C語言、單片機,可以先閱讀電子書。Arduino等單片機必備軟體、電子書資源連結可在本公眾號功能菜單獲取。
材料
帶四個電機的小車、Arduino、2節3.7V鋰電池、若干杜邦線、三路循跡模塊、L298N電機驅動模塊、麵包板、螺絲刀
步驟
一、連線
L298N的一種接法:
1、OUT1、OUT2接左路電機,OUT3、OUT4接右路電機。
2、IN1~IN4接arduino的4個引腳(數字和模擬皆可),IN1、IN2控制左路電機正反轉,IN3、IN4控制右路電機的正反轉。
3、12V接電池正極(建議用兩節3.7V的鋰電池,這樣串聯電壓為7.4V,不要超過12V,否則電壓過大晶片會發燙燒壞)。
4、5V接arduino的VIN引腳,用來給arduino供電。也即:電池給L298N供電的同時,L298N又給arduino供電。
5、GND同時接電池負極、arduino的GND引腳。
因為L298N只能控制兩路電機,如果有四個電機怎麼辦呢?那就將小車左邊兩個電機並聯為一個左路,右邊兩個電機並聯為一個右路(可以自己焊一塊板或者用麵包板實現)。
以下為小編的接線引腳:
1、L298N的IN1~IN4分別接arduino的數字3/5/6/9引腳
2、三路循跡從左到右的信號引腳分別接arduino的A0/A1/A2
小編剛接觸小車的時候,走了很多彎路,所以在這裡小編講一下大家可能會遇到的疑惑點:
問題1:為什麼我用arduino的引腳接入電機(馬達),分別給電機的兩根線輸出高電平和低電平,電機不會轉?而我用電池卻可以?
答:arduino直接控制電機,電機不會動,原因是arduino的數字或模擬引腳的輸出電流很小,小編親測,arduino直接接入電機時只有20mA的電流,這顯然是不足以驅動電機轉動的。所以想讓arduino控制電機轉動的正確做法是:引入L298N電機驅動模塊。
問題2:為什麼我用L298N電機驅動模塊控制電機,電機還是不會動?
答:先檢查是否正確使用了L298N,L298N其實有兩種用法,其中一種可以參考淘寶賣家的商品描述,而小編用的是另一種用法,下面再講。其次檢查L298N是否與arduino共地(其實我們在用單片機控制各種傳感器遇到的莫名其妙的問題,很多情況都是忘了兩者之間共地)。
二、代碼
思路:
1、定義接線引腳
2、在setup函數裡pinMode各引腳,pinMode的意思是將arduino的引腳設置為輸入或者輸出模式
3、編寫小車前進、左轉、右轉等函數,這裡用analogWrite函數,可控制速度。轉彎:左右電機正反轉實現
4、在loop函數裡讀取紅外循跡模塊的值
5、根據從循跡模塊讀入的值判斷小車是左偏還是右偏
原始碼請看:
int leftMotor1 = 3;int leftMotor2 = 5;int rightMotor1 = 6;int rightMotor2 = 9;int motorSpeed = 100; int irPin1 = A0; int irPin2 = A1; int irPin3 = A2; int irVal1;int irVal2;int irVal3; void setup(){ pinMode(leftMotor1, OUTPUT); pinMode(leftMotor2, OUTPUT); pinMode(rightMotor1, OUTPUT); pinMode(rightMotor2, OUTPUT); pinMode(irPin1, INPUT); pinMode(irPin2, INPUT); pinMode(irPin3, INPUT);} void loop() { irVal1 = digitalRead(irPin1); irVal2 = digitalRead(irPin2); irVal3 = digitalRead(irPin3);}if(irVal1 == 1) { left();} else if(irVal2 == 1) { forward();} else if(irVal3 == 1) { right();}void forward() { analogWrite(leftMotor1, motorSpeed); analogWrite(leftMotor2, 0); analogWrite(rightMotor1, motorSpeed); analogWrite(rightMotor2, 0);}void left() { analogWrite(leftMotor1, 0); analogWrite(leftMotor2, motorSpeed); analogWrite(rightMotor1, motorSpeed); analogWrite(rightMotor2, 0);}void right() { analogWrite(leftMotor1, motorSpeed); analogWrite(leftMotor2, 0); analogWrite(rightMotor1, 0); analogWrite(rightMotor2, motorSpeed);}
其中motorSpeed是電機速度,可以根據自己的需求來定義,但analogWrite只支持0~255的值,所以motorSpeed最大為255。
在loop函數裡的if判斷代碼顯然有幾個漏洞,比如:如果小車走出了黑線,三路循跡都沒檢測到黑線(即 irVal1、irVal2和irVal3的值都為0),不進入if語句裡面,那麼小車就會一直保持著走出黑線前的狀態(如果走出黑線前小車是左轉,但因為小車反應不及,沒來得及左轉,三路循跡都走出了黑線,那麼小車就會一直保持左轉)。如果是轉彎的時候走出黑線,那麼因為原狀態反而還能順利回到黑線跑道,但是如果直線的時候走出黑線,那麼小車就會脫離黑線跑道。
單純看文字讀者可能不明所以,但如果親自測試一下就會明白小編想要表達的意思。
使用以上代碼,可以初步達到循跡小車的效果,但如果小車直線走出黑線,就要人工將小車放回黑線跑道,讀者盡可試試。如果想要實現小車走出黑線也能夠自主回到黑線跑道的功能,甚至360度轉彎,請看下一篇文章:用Arduino實現循跡小車(進階)
小車走出黑線後就沒有了「目標」「茫然無措」.
結尾
製作過程如果有技術問題,可以加群交流:點擊右上方的分享按鈕,將這篇文章分享到朋友圈,保留24小時,過後截圖發給創客公眾號後臺,小編審核後就給你進群方式,屆時會有經驗豐富的老司機們給你解答。
小編實驗室有相關器材,如果囊中羞澀,又想親自實戰,可以將本公眾號推薦給10個對電子設計感興趣的朋友關注,並把他們的暱稱發到後臺,小編審核後會聯繫你,不僅有免費的器材借你實戰,還會有老司機給你指導,可以少走很多彎路哦~僅限廣師大校本部學生。
喜歡這篇文章可以分享給朋友哦~
點擊閱讀原文,在電腦上閱讀更省心~