|
|
很高興有這么個(gè)機(jī)會(huì)可以發(fā)帖子,這是我第一次在網(wǎng)絡(luò)上發(fā)帖子
這次的diy項(xiàng)目,是避障循跡小車。本人純屬個(gè)人愛(ài)好,沒(méi)有這方面的經(jīng)驗(yàn)。唯一占點(diǎn)優(yōu)勢(shì)的是,我是從事軟件開(kāi)發(fā)的。雖然沒(méi)接觸過(guò)c語(yǔ)言,但基本都懂。
前年做過(guò)一個(gè)8*8*8的光立方,雖然也能點(diǎn)亮燈。但是整體過(guò)程都是參考網(wǎng)上,就是照葫蘆畫(huà)瓢,最后的效果也是非常不理想。感覺(jué)沒(méi)什么意思。
做這個(gè)小車,也是蓄謀已久,終于狠下心開(kāi)始弄。因?yàn)閷?duì)這方面的不了解,包括買元件,買錯(cuò)好幾次,所以此次成本控制的非常不理想。希望我這個(gè)帖子可以幫助到一些想做的朋友。
進(jìn)入正題
此小車為四驅(qū)驅(qū)動(dòng) 車底盤(pán)網(wǎng)上買的現(xiàn)成的
使用stc89c52rc芯片
l298n電機(jī)驅(qū)動(dòng)模塊(網(wǎng)上買的現(xiàn)成的 當(dāng)時(shí)想自己做 但是看說(shuō)是有很多互相干擾的因素 沒(méi)敢嘗試)
四路紅外尋跡
超聲波避障
小車主要邏輯是檢測(cè)到黑線 按黑線行走 沒(méi)有黑線 轉(zhuǎn)到避障模式。
一、底盤(pán)
小車的底盤(pán),我是在網(wǎng)上買的現(xiàn)成的。 比較坑爹的是,因?yàn)槲业淖钚∠到y(tǒng)是自己焊接的。而且其他模塊也都是單獨(dú)購(gòu)買,因?yàn)椴皇呛偷妆P(pán)是一套的東西。所以看著底盤(pán)上的開(kāi)孔什么的非常多。
但是都和我設(shè)計(jì)的不一樣 所以我自己又借的電轉(zhuǎn)自己轉(zhuǎn)的眼。建議想做的朋友,如果動(dòng)手能力強(qiáng)就自己做個(gè)底盤(pán),然后買幾個(gè)電機(jī)和輪子。
二、焊接最小系統(tǒng)
這一塊基本了解一些,所以基本還可以。比較順利。我的焊接水平有限,大家勿噴
三、測(cè)試電機(jī)驅(qū)動(dòng)模塊
因?yàn)槲叶疾皇呛芏?所以每個(gè)階段都需要反復(fù)測(cè)試
電機(jī)驅(qū)動(dòng),我使用的網(wǎng)上現(xiàn)成的L298n模塊。使用了兩個(gè),一個(gè)模塊驅(qū)動(dòng)兩個(gè)電機(jī)。控制方式是一個(gè)模塊控制前兩個(gè)輪子,另外一個(gè)控制后兩個(gè)輪子。這塊的連線應(yīng)該還是比較容易的
網(wǎng)上搜索有一堆資料。這塊還是強(qiáng)調(diào)一下,要和單片機(jī)共地。 另外說(shuō)一嘴,電機(jī)的導(dǎo)線接的長(zhǎng)一點(diǎn)。我的驅(qū)動(dòng)因?yàn)榉旁诘讓拥牡妆P(pán),所以弄的短了些。當(dāng)時(shí)我手頭沒(méi)有104電容,所以電機(jī)也沒(méi)焊接
電容。但是還好,我沒(méi)遇到干擾的問(wèn)題。建議焊接上,具體什么作用,我就不大了解了,說(shuō)是濾波。
四、測(cè)試舵機(jī)
舵機(jī)這塊是我最撓頭的,調(diào)試時(shí)間最長(zhǎng)。程序調(diào)了好久,電路也調(diào)整好幾次。我一開(kāi)始連接到p0上了,怎么弄都不好用。后來(lái)查了一下,p0端口需要焊接上拉電阻(應(yīng)該沒(méi)叫錯(cuò)吧)。但是舵機(jī)各種神奇
的現(xiàn)象。要么一圈一圈的轉(zhuǎn)(正常180度),要么不動(dòng)。最后懷疑是不是舵機(jī)壞掉了。一狠心在網(wǎng)上又買了兩個(gè)。回來(lái)測(cè)試還是這樣。 然后又拿出一開(kāi)始的那個(gè),還是原來(lái)的電路,還是原來(lái)的程序,居然可以了。
應(yīng)該是我程序上控制了轉(zhuǎn)動(dòng)時(shí)候 不是完全的90度 不到90度就停下來(lái)(控制方波長(zhǎng)度)。正好在單位撿了一塊抽屜底下的小木板,就自己用壁紙刀切了一個(gè)舵機(jī)云臺(tái)。感覺(jué)還不錯(cuò)。哈哈
五、避障模式
電機(jī)驅(qū)動(dòng)、電機(jī)、舵機(jī)都拼到一塊。發(fā)現(xiàn)的電源根本帶不動(dòng),后來(lái)查了一下需要18650電池。原來(lái)查資料以為就是普通的五號(hào)電池。我這也不知道還有這種電池啊。就買了兩節(jié)。回來(lái)發(fā)現(xiàn)電機(jī)就是不動(dòng)。然后用12v的變壓器
測(cè)試都是正常的。測(cè)試兩節(jié)電池串聯(lián)電壓大約在7.4v,感覺(jué)應(yīng)該夠了。反正就還是不行。然后我就又買了兩節(jié)。用了三節(jié)電池都還是不行。然后就是拆開(kāi)整個(gè)小車,分析各個(gè)電路,就都是發(fā)現(xiàn)不了問(wèn)題。只要單片機(jī)供上電
電機(jī)就停止。當(dāng)時(shí)晚上鼓搗的,不知怎么鬼使神差的居然把芯片燒掉了。然后換個(gè)芯片,又燒掉了。后來(lái)發(fā)現(xiàn)應(yīng)該是有一個(gè)驅(qū)動(dòng)模塊穩(wěn)壓模塊壞了,輸出的電壓不是5v。直接變成高電壓了。最后的最后才發(fā)現(xiàn),最終的
損失不止兩個(gè)芯片一個(gè)驅(qū)動(dòng)模塊,居然連超聲波也燒壞了一個(gè)。沒(méi)辦法沒(méi)芯片了,又得等好幾天了。 然后后來(lái)發(fā)現(xiàn) 我電池還是得充電,未充滿。我tm也是醉了。 沒(méi)文化這可怕啊。最后的最后 實(shí)在是各種神經(jīng)問(wèn)題。
就采用單片機(jī)和驅(qū)動(dòng)單獨(dú)供電。兩節(jié)電池供電機(jī),一節(jié)電池供單片機(jī)。基本穩(wěn)定下來(lái)了。程序就比較容易了。我懂了機(jī)制,程序問(wèn)題不大。
六、循跡模式
我一開(kāi)始沒(méi)控制電機(jī)驅(qū)動(dòng)的通道使能。小車都是全速前進(jìn)的。在循跡這塊發(fā)現(xiàn)不行了,跑的太快了。小車都沖出跑道。唉 真心覺(jué)得不能偷懶 又都都拆開(kāi),重新接上杜邦線。這塊也發(fā)現(xiàn),因?yàn)槲覀(gè)人不算有潔癖,但還是希望
小車整體看起來(lái)利索點(diǎn)。所以驅(qū)動(dòng)和紅外模塊都放在底層底盤(pán)了。這個(gè)其實(shí)不是特別方便。因?yàn)樵谡{(diào)試的時(shí)候 看不到紅外模塊的指示燈。大家可以注意點(diǎn)。
調(diào)整程序 通過(guò)占空比 控制輪子轉(zhuǎn)速。這塊程序也比較順利 程序基本是一次性通過(guò)。
最終效果:
電路圖我沒(méi)有了 就是參考網(wǎng)上焊接的。程序放上來(lái) 可能不符合行業(yè)標(biāo)準(zhǔn) 大家別笑話。
這次瞎胡鬧,感覺(jué)結(jié)果還不錯(cuò),實(shí)現(xiàn)自己想要的功能了。滿滿的成就感。這里特別感謝一下網(wǎng)友,有個(gè)網(wǎng)友特別熱心,請(qǐng)教的問(wèn)題都是知無(wú)不言。
帖子就到這里 大家有什么問(wèn)題可以提出來(lái) 反正我也不一定會(huì)……哈哈
部分單片機(jī)源程序:
- #include <reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- /********常量聲明********/
- #define uint unsigned int
- /********方法聲明********/
- void Init();
- void Delay10us(); //@12.000MHz
- void Run();
- void ToLeft();
- void ToRight();
- void ToForward();
- void ToBack();
- void KeyScan();
- /********針腳聲明********/
- sbit Left_Lamp = P1^0; //左轉(zhuǎn)向燈
- sbit Right_Lamp = P1^1; //右轉(zhuǎn)向燈
- sbit Forward_Lamp = P1^2; //前進(jìn) 大燈
- sbit Back_Lamp = P1^3; //后退 大燈
- sbit Left_Switch = P1^4; //左轉(zhuǎn)向 按鍵 主要用于測(cè)試 控制左轉(zhuǎn) 左轉(zhuǎn)向燈變亮
- sbit Right_Switch = P1^5; //右轉(zhuǎn)向 按鍵 主要用于測(cè)試 控制右轉(zhuǎn) 右轉(zhuǎn)向燈變亮
- sbit Forward_Switch = P1^6; //前進(jìn) 按鍵 主要用于測(cè)試 控制前進(jìn) 前進(jìn)燈變亮
- sbit Back_Switch = P1^7; //后退 按鍵 主要用于測(cè)試 控制后退 后退燈變亮
- /********電機(jī)驅(qū)動(dòng)針腳********/
- sbit P2_0 = P2^0;
- sbit P2_1 = P2^1;
- sbit P2_2 = P2^2;
- sbit P2_3 = P2^3;
- sbit P2_4 = P2^4;
- sbit P2_5 = P2^5;
- sbit P2_6 = P2^6;
- sbit P2_7 = P2^7;
- /********電機(jī)動(dòng)作定義********/
- #define Left_Moto_Go {P2_0=1, P2_1=0, P2_2=1, P2_3=0;} //左邊兩個(gè)電機(jī)向前走
- #define Left_Moto_Back {P2_0=0, P2_1=1, P2_2=0, P2_3=1;} //左邊兩個(gè)電機(jī)向后轉(zhuǎn)
- #define Left_Moto_Stop {P2_0=0, P2_1=0, P2_2=0, P2_3=0;} //左邊兩個(gè)電機(jī)停轉(zhuǎn)
- #define Right_Moto_Go {P2_4=1, P2_5=0, P2_6=1, P2_7=0;} //右邊兩個(gè)電機(jī)向前走
- #define Right_Moto_Back {P2_4=0, P2_5=1, P2_6=0, P2_7=1;} //右邊兩個(gè)電機(jī)向前走
- #define Right_Moto_Stop {P2_4=0, P2_5=0, P2_6=0, P2_7=0;} //右邊兩個(gè)電機(jī)停轉(zhuǎn)
- uint Left_Switch_Flag = 0; //左轉(zhuǎn)向按下標(biāo)志
- uint Right_Switch_Flag = 0; //右轉(zhuǎn)向按下標(biāo)志
- uint Forward_Switch_Flag = 0; //前進(jìn)按下標(biāo)志
- uint Back_Switch_Flag = 0; //后退按下標(biāo)志
- /********主函數(shù)********/
- void main()
- {
- Init();
- while(1)
- {
- Run();
- }
- }
- /********系統(tǒng)初始化********/
- void Init()
- {
-
- }
- /********開(kāi)始運(yùn)行********/
- void Run()
- {
- KeyScan();
- if (Left_Switch_Flag)
- {
- ToLeft();
- }else
- {
- Left_Lamp = 1;
- }
- if (Right_Switch_Flag)
- {
- ToRight();
- }else
- {
- Right_Lamp = 1;
- }
- if (Forward_Switch_Flag)
- {
- ToForward();
- }else
- {
- Forward_Lamp = 1;
- }
- if (Back_Switch_Flag)
- {
- ToBack();
- }else
- {
- Back_Lamp = 1;
- }
- }
- /********按鍵判斷函數(shù)********/
- void KeyScan()
- {
- if (Left_Switch == 0) //左轉(zhuǎn)向按下
- {
- Delay10us();
- if (Left_Switch == 0)
- {
- while(Left_Switch==0); //等待按鍵抬起
- Left_Switch_Flag = !Left_Switch_Flag;
- Right_Switch_Flag = 0;
- Forward_Switch_Flag = 0;
- Back_Switch_Flag = 0;
- }
- }
-
- if (Right_Switch == 0) //右轉(zhuǎn)向按下
- {
- Delay10us();
- if (Right_Switch == 0)
- {
- while(Right_Switch==0); //等待按鍵抬起
- Left_Switch_Flag = 0;
- Right_Switch_Flag = !Right_Switch_Flag;
- Forward_Switch_Flag = 0;
- Back_Switch_Flag = 0;
- }
- }
-
- if (Forward_Switch == 0) //前進(jìn)按下
- {
- Delay10us();
- if (Forward_Switch == 0)
- {
- while(Forward_Switch==0); //等待按鍵抬起
- Forward_Switch_Flag = !Forward_Switch_Flag;
- Left_Switch_Flag = 0;
- Right_Switch_Flag = 0;
- Back_Switch_Flag = 0;
- }
- }
-
- if (Back_Switch == 0) //后退向按下
- {
- Delay10us();
- if (Back_Switch == 0)
- {
- while(Back_Switch==0); //等待按鍵抬起
- Back_Switch_Flag = !Back_Switch_Flag;
- Forward_Switch_Flag = 0;
- Left_Switch_Flag = 0;
- Right_Switch_Flag = 0;
- }
- }
- }
- /********小車向左 左轉(zhuǎn)向燈閃爍 右側(cè)電機(jī)正轉(zhuǎn)運(yùn)行 左側(cè)電機(jī)停止 ********/
- void ToLeft()
- {
- Right_Lamp = 1; //右轉(zhuǎn)向燈
- Forward_Lamp = 1; //前進(jìn) 大燈
- Back_Lamp = 1; //后退 大燈
-
- Left_Moto_Stop; //左側(cè)電機(jī)停止
- Right_Moto_Go; //右側(cè)電機(jī)前行
- Delay10us();
-
- Left_Lamp = ~Left_Lamp; //左轉(zhuǎn)向燈
- }
- /********小車向右 右轉(zhuǎn)向燈亮起 右側(cè)電機(jī)停止 左側(cè)電機(jī)正轉(zhuǎn)運(yùn)行********/
- void ToRight()
- {
- Left_Lamp = 1; //左轉(zhuǎn)向燈
- Forward_Lamp = 1; //前進(jìn) 大燈
- Back_Lamp = 1; //后退 大燈
- Left_Moto_Go; //左側(cè)電機(jī)前行
- Right_Moto_Stop; //右側(cè)電機(jī)停止
- Delay10us();
- Right_Lamp = ~Right_Lamp; //右轉(zhuǎn)向燈
- }
- /********小車前行 前行燈亮起 右側(cè)電機(jī)正轉(zhuǎn)運(yùn)行 左側(cè)電機(jī)正轉(zhuǎn)運(yùn)行********/
- void ToForward()
- {
- Left_Lamp = 1; //左轉(zhuǎn)向燈
- Right_Lamp = 1; //右轉(zhuǎn)向燈
- Forward_Lamp = 0; //前進(jìn) 大燈
- Back_Lamp = 1; //后退 大燈
-
- Left_Moto_Go; //左側(cè)電機(jī)前行
- Right_Moto_Go; //右側(cè)電機(jī)前行
- }
- /********小車后退 后退燈亮起 右側(cè)電機(jī)反轉(zhuǎn)運(yùn)行 左側(cè)電機(jī)反轉(zhuǎn)運(yùn)行********/
- void ToBack()
- {
- Left_Lamp = 1; //左轉(zhuǎn)向燈
- Right_Lamp = 1; //右轉(zhuǎn)向燈
- Forward_Lamp = 1; //前進(jìn) 大燈
- Back_Lamp = 0; //后退 大燈
- Left_Moto_Back; //左側(cè)電機(jī)后退
- Right_Moto_Back; //右側(cè)電機(jī)后退
- }
- /********小車停止 燈全滅掉 右側(cè)電機(jī)停止 左側(cè)電機(jī)停止********/
- void Stop()
- {
- Left_Lamp = 1; //左轉(zhuǎn)向燈
- Right_Lamp = 1; //右轉(zhuǎn)向燈
- Forward_Lamp = 1; //前進(jìn) 大燈
- Back_Lamp = 0; //后退 大燈
- Left_Moto_Stop; //左側(cè)電機(jī)停止
- Right_Moto_Stop; //右側(cè)電機(jī)停止
- }
- /********延時(shí)函數(shù)********/
- void Delay10us() //@12.000MHz
- …………
- …………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
|
|