51單片機(jī)四驅(qū)無線遙控小車制作詳解
小車參數(shù):控制鍵5個:前進(jìn)、后退、左轉(zhuǎn)、右轉(zhuǎn)、停止;有效距離200米;速度:
我想遙控小車大家都玩過,網(wǎng)上也有各種DIY小車的制作詳解,我做的這個遙控小車和其他的作品大同小異,但作為單片機(jī)設(shè)計,這次設(shè)計我主要強(qiáng)調(diào)單片機(jī)控制,就是說,這個小車是由單片機(jī)控制的,這次我把單片機(jī)按鍵發(fā)送程序、無線模塊使用、電機(jī)驅(qū)動作為本教程的核心內(nèi)容。
一 硬件組裝
1 小車運動部分
此圖是我?guī)煹芙M裝好的,請大家作為參考
所需工件:直流電機(jī)4個,L293D電機(jī)驅(qū)動模塊,蓄電池一塊,車身底盤
說明:車身底盤大家根據(jù)自己的購買力自行購買,蓄電池也是,至于L293D模塊,淘寶上賣的比較貴,不過我用的就是成品模塊,效果非常好,錢不多的同學(xué)可以自己買芯片,自制模塊,原理很簡單,官方資料是很詳細(xì)的;或者改為繼電器控制都可以,具體看自己的實際購買力。用模塊的好處是,模塊可以輸出5V電源給系統(tǒng)供電,詳細(xì)請參考淘寶網(wǎng)。
如果你買的是現(xiàn)成的底盤,那就和我的一樣了,組裝實在是沒啥可說的,把電機(jī)固定上去就是,不行?別開玩笑了,小學(xué)生都會的!至于想自己做底盤的,我想說,要搞結(jié)實點,咱這次的小車馬力是很足的,因為有電機(jī)驅(qū)動,速度比較快(不帶減速齒輪的底盤一定要小心,速度非常的快),后勁也足,不小心撞墻很正常,所以不好的底盤就得小心了!
組裝好后,就是電機(jī)和驅(qū)動模塊的接線了,下面我就詳細(xì)的說一下L293D模塊的使用:
L293D是專門的電機(jī)驅(qū)動芯片,工作電壓5V,驅(qū)動電壓輸入可達(dá)36V,輸出電流正負(fù)600ma,4個控制端,4個輸出端,原理如
圖:
其中A為輸出控制端,Y為輸出控制端,1A即控制1Y,以此類推。1,2EN 3,4EN需要短接,芯片最大工作電壓不得超過7V。
封裝圖:
Vcc1接工作電壓,5V,Vcc2接電機(jī)的驅(qū)動電源,一般來說,這個電壓要比5V高,我用的是12V蓄電池,就把12v的正極接到VCC2,要記住的是,芯片、單片機(jī)、蓄電池電源是需要共地的,不要覺得你電機(jī)是12V,單片機(jī)控制部分是5V就把電源完全獨立開來,正極是完全獨立的沒錯,但是GND(負(fù)極)都必須是接在一起的。
驅(qū)動芯片與電機(jī)的接法:
例:左邊前后輪:
1Y接電機(jī)紅線,2Y接電機(jī)黑線,左邊前輪電機(jī)
3Y接電機(jī)紅線,4Y接電機(jī)黑線,左邊后輪電機(jī)
前進(jìn)指令:1A=1(輸出12V),2A=0(輸出0V),3A=1(輸出12V),4A=0(輸出0V)
后退指令:1A=0(輸出12V),2A=1(輸出0V),3A=0(輸出12V),4A=1(輸出0V)
右邊的和左邊的接法是完全一樣的
注意:前進(jìn)和后退并不是絕對的,因為是直流電機(jī),不刻意的強(qiáng)調(diào)正負(fù)極,就看你電機(jī)是怎么接線的,結(jié)果完全可以與我的相反。不過一定要保證電機(jī)接線的統(tǒng)一性,不能隨意,不能說前輪接的是順時針線序,后輪是逆時針線序,如果買的電機(jī)連接線不帶顏色,一定要自己測好了那種接法是順時針的,哪種是逆時針,否則前輪前進(jìn)后輪后退,很摧殘電機(jī)的,或者左右邊的2對電機(jī)轉(zhuǎn)動方向不統(tǒng)一,導(dǎo)致編程麻煩。
芯片默認(rèn)輸出0V ,所以在沒有程序的時候,大家不需要擔(dān)心電機(jī)會轉(zhuǎn)動。一個芯片只能控制2個電機(jī),右邊的再接個芯片就可以了,網(wǎng)上賣的模塊都是2個驅(qū)動芯片的,剛剛好夠4個電機(jī)。買模塊的好處就是拿來可以直接接線,而且模塊上有標(biāo)號,不必?fù)?dān)心接錯,希望初學(xué)者還是買模塊,貴是貴了,但是速度有保證的!驅(qū)動模塊如圖:
接好之后,我就說下小車的轉(zhuǎn)動方式:前進(jìn)后退就是4個電機(jī)同時的正轉(zhuǎn)、反轉(zhuǎn);左轉(zhuǎn)彎和有轉(zhuǎn)彎有2種方式:A一邊轉(zhuǎn)動一邊不轉(zhuǎn),B一邊正向轉(zhuǎn)動一邊反向轉(zhuǎn)動,這兩種各有個的好處,各位可以根據(jù)自己的實際情況來確定轉(zhuǎn)彎的方式,不同車的底盤效果肯定是不一樣的,轉(zhuǎn)彎的方式是程序控制的,本程序是B種方式。
我的小車圖:
這種電機(jī)是減速的,所以不會很快,如果是直接電機(jī)帶動的輪子,再用12V電源的話,那速度就非??炝?,模塊的輸出直接連接電機(jī)電源線,輸出根據(jù)標(biāo)號或根據(jù)程序接入到單片機(jī)上
單片機(jī)的接線:
如圖:
這是我的最小系統(tǒng)板,全部引出IO,帶板載USB下載功能,P0口輸出接了8路流水燈(有選通開關(guān)),這樣設(shè)計板子是為了P0口做輸出時專門看輸出狀態(tài)的。板子是我們工作室自己設(shè)計的,我們所有的作品調(diào)試都是建立在它的基礎(chǔ)上,網(wǎng)上也有的賣這種USB下載板,40元左右吧!
我這個人比較懶,用的是電機(jī)驅(qū)動模塊,L293D的輸入是有標(biāo)號的,1——8直接按照順序接到P1.0——P1.7就可以了,說到這里,我不得不說一下,單片機(jī)的接線是非常自由的,因為是程序控制,無法就是改改端口而已,我只根據(jù)我的程序來說明接線,有基礎(chǔ)的可以自己設(shè)計!
驅(qū)動芯片和電機(jī)連接好后,就是要把線固定好,留出要與單片機(jī)連接的8跟控制線。也要注意給無線模塊留一個小空間。
無線模塊解說:
我們工作室一直使用的是433無線串口模塊,具體型號和價格我會附在清單表里,現(xiàn)在我說下它的性能、這種無線模塊最大的好處就是有較強(qiáng)的抗干擾性,2個模塊直接可以設(shè)置ID,只有在一個ID號下的個模塊才可以通信,而且可以實現(xiàn)一對多通信;而且這種模塊是無需編程的,直接把數(shù)據(jù)發(fā)送到串口即可,模塊會自動調(diào)制解調(diào),就目前使用的情況而言,還沒發(fā)現(xiàn)它有調(diào)制解調(diào)錯誤的時候,可以說,在數(shù)據(jù)傳輸上,這個模塊誤碼率還是極低的,不過需要注意的是,模塊2次接收(發(fā)送)之間的間隔要大于200ms,這是非常重要的一個參數(shù),如果想做高速數(shù)據(jù)傳輸?shù)呐笥颜埳髦剡x用?。ū径挝淖謥碓从谔詫氼5蠠o線模塊手冊,本人也已經(jīng)上傳,也請讀者尊重該店的著作權(quán))。
模塊的接線還是蠻簡單的,電源2根線,數(shù)據(jù)線2根:TX(接單片機(jī)RX)、RX(接單片機(jī)TX),關(guān)于無線模塊的設(shè)置方案,請參考淘寶睿迪無線XL02-232AP1型號的資料手冊。模塊在通電的一瞬間紅燈綠燈同時會閃一下,然后熄滅,此時進(jìn)入待機(jī)狀態(tài),模塊發(fā)送數(shù)據(jù)時,紅燈亮;接收數(shù)據(jù)時,綠燈亮。
組裝好之后的圖:
我用是12v蓄電池,接到驅(qū)動模塊后,模塊的5V輸出又可以直接給無線模塊和最小系統(tǒng)部分供電。雖然看起來比較笨重,但是12V的電源,與一般的小車在速度和耐力上,都有了本質(zhì)的提高!
遙控部分:
hex代碼,仿真提供16進(jìn)制文件
源代碼:
;接收程序
ORG 0 ;程序起始地址
SJMP STAR ;跳轉(zhuǎn)到主程序
ORG 30H ;串口中斷地址
sjmp loop ;跳轉(zhuǎn)到中斷服務(wù)程序
STAR:
MOV SP,#5FH ;設(shè)置堆棧
MOV SCON,#50H ;串行數(shù)據(jù)格式(詳情請參考51手冊)
MOV TMOD,#20H ;定時器工作方式(請參考51手冊)
MOV PCON,#0 ;波特率不倍速(請參考51手冊)
MOV TH1,#0fdH ;設(shè)置波特率在9600
MOV TL1,#0fdH ;設(shè)置波特率在9600
SETB EA ;開起中斷
clr ET1 ;關(guān)閉定時1中斷
SETB ES ;開起串口中斷
SETB TR1 ;啟動定時器1
mov a,#0 ;
mov p1,a ;設(shè)置初始值,即開機(jī)p1輸出00h小車不動作
main:
mov p1,a ;把a(bǔ)值給p1端口
sjmp main ;無限循環(huán)main程序
LOOP:
jnb ri,$ ;判斷接收位是否接收完
clr ri ;接收完后清空接收位
mov a,sbuf ;發(fā)送的數(shù)據(jù)給a
reti ;返回后,a的值就會給p1
END
;發(fā)送程序
ORG 0 ;程序起始地址
SJMP START ;跳轉(zhuǎn)到主程序
ORG 30H ;串口中斷地址
START:
MOV SP,#5FH ;設(shè)置堆棧
MOV TMOD,#20H ;定時器工作方式(請參考51手冊)
MOV PCON,#0 ;波特率不倍速(請參考51手冊)
MOV SCON,#50H ;串行數(shù)據(jù)格式(詳情請參考51手冊)
MOV TH1,#0fdH ;設(shè)置波特率在9600
MOV TL1,#0fdH
setb EA ;開起中斷
clr ET1 ;關(guān)閉定時1中斷
setb ES ;開起串口中斷
SETB TR1 ;啟動定時器1
main:
lcall kcs ;調(diào)用按鍵掃描程序
jnz key ;有鍵按下則跳轉(zhuǎn)到key程序段
sjmp main ;無限循環(huán)main程序
kcs:
mov p1,#0ffh ;p1給初值
mov a,p1 ;p1的數(shù)值給a
cpl a ;取反a
anl a,#0ffh ;與運算
ret
key:
lcall delay ;軟件延時程序,按鍵去抖
jb acc.0,send1
jb acc.1,send2
jb acc.2,send3
jb acc.3,send4
jb acc.4,send5
ret
DELAY:
MOV R5,#20
D1:MOV R6,#10
D2:MOV R7,#100
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
ret
send1:
mov r1,#10101010b ;前進(jìn)指令
sjmp send
send2:
mov r1,#01010101b ;后退指令
sjmp send
send3:
mov r1,#01011010b ;左轉(zhuǎn)指令
sjmp send
send4:
mov r1,#10100101b ;右轉(zhuǎn)指令
sjmp send
send5:
mov r1,#00h ;停止指令
sjmp send
send:
MOV SBUF,r1 ;指令給sbuf
JNB TI,$ ;判斷是否發(fā)送完
reti ;中斷返回
END