循迹小车
循跡小車,顧名思義就是沿著已定的線路跑的小車,循跡小車在可以代替人工進行固定地點的搬運、傳遞信息等…
一個循跡小車主要有以下幾個模塊組成:
- 電機驅動模塊
- PWM調速模塊
- 紅外循跡模塊
剩下的就是在主函數中對這幾個模塊進行相互配合,讓小車能夠在紅外尋跡模塊的反饋下,通過PWM模塊的調速,使電機驅動, 尋跡小車的大體運作過程就是這樣,接下來詳細說明一下幾個模塊的配合。
電機驅動模塊
電機驅動模塊是L293D,只要將相應接口使用杜邦線連接在單片機上,再由程序控制相應接口的電平高低,就可以控制倆個電機的轉動,實現小車前進、后退、左轉、右轉等動作。
如下是電機驅動模塊頭文件,利用六根杜邦線連接電機與單片機,控制相應引腳的電平輸出就可以控制電機的轉動。
下面是具體實現小車前進、后退、左轉、右轉的函數:
/* 小車前進:左右電機同時前進 */ void Forward(void) {Left_forward();Right_forward(); }/* 小車后退:左右電機同時倒轉 */ void Back(void) {Left_back();Right_back(); }/* 小車左轉:右電機前進,左電機不轉 */ void Left_motor_go(void) {Left_stop();Right_forward(); }/* 小車右轉:左電機前進,右電機不轉 */ void Right_motor_go(void) {Right_stop();Left_forward(); }然后就是再程序中直接調用這些,小車的驅動函數即可。
PWM調速模塊
關于PWM調速的內容之前的博客中已經做了詳細的介紹,鏈接:PWM調速
在此程序中對電機調速至關重要,因為如果電機產生的扭矩不夠的話,小車可能停止不前,如果電機轉速過快的話,小車可能失去控制
解釋一下pwm_t和pwm_k的含義(簡稱t、k):t是計數,計滿255(從0開始)為一個周期,k大小代表占空比大小,256/t就是占空比,k越大電機轉速越快,但k小于70時電機難以維持正常轉動。
紅外循跡模塊
首先了解一下紅外循跡的原理:
紅外循跡是通過判斷黑白線來完成的,利用了紅外光的反光特性,當紅外光遇到黑色不反光物體時,反射回的紅外光大大減少,同理,當紅外光遇到白色反光物體時,反射會的紅外光較多。紅外循跡的傳感器就是利用這個特性,判斷反射回紅外光的多少來判斷,小車下面是黑線還是地面。從而反饋給程序,程序會依據返回的數據進行調整小車的下一步行動。
利用杜邦線連接相應的引腳,使傳感器將信息傳回單片機:
(左右各有一個紅外傳感器)
要使小車沿著黑線走,只要小車偏離黑線紅外傳感器就會傳回1,所以在程序中要不斷的檢測紅外傳感器的狀態。當小車在黑線路線上時,就直走;當小車向左偏時,讓小車右轉;當小車向右偏時,讓小車左轉;當小車踩到黑線上時,讓小車后退。 實現代碼如下:
最后附上主函數:
int main(void) {TMOD |= 0x02;//8位自動重裝模塊TH0 = 220;TL0 = 220;//11.0592M晶振下占空比最大比值是256,輸出100HZTR0 = 1;//啟動定時器0ET0 = 1;//允許定時器0中斷EA = 1;//總中斷允許while(1){if((1==Left_led)&&(1==Right_led)){Back();Forward();}if((0==Left_led)&&(1==Right_led)){Right_motor_go();}if((1==Left_led)&&(0==Right_led)){Left_motor_go();}if((0==Left_led)&&(0==Right_led)){Forward();}} }代碼親測可以運行
有需要的朋友可以聯系博主
qq:2723808286
有完整的循跡小車、紅外遙控、各種傳感的模塊
總結
- 上一篇: wpd小波包分解_基于奇异值分解和小波包
- 下一篇: java输入输出流实例代码