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