你是否在新聞中見過各式各樣的遙控機(jī)器人?它們上天入地,排爆偵查,幾乎無所不能。給再土氣不過的無線路由換個“頭腦”,裝上“手腳”,它就能忠實(shí)執(zhí)行茫茫網(wǎng)海另一端的指令,為不能親身親臨的你拍下難得一見的場景。
?
首先需要解釋一下什么是“Shy ”:
“Shy ”是一個采用LINUX開源系統(tǒng)-Openwrt制作的WIFI機(jī)器人,它支持PC端,android端,web端的無線控制和無線視頻傳輸,apple端的視頻傳輸,甚至還可以當(dāng)作你的電腦高清免驅(qū)動攝像頭使用。
技術(shù)上來說,它大致分為三個部分,首先是加載Openwrt系統(tǒng)的Liunx平臺,它連接攝像頭,并通過WIFI接收控制命令。然后此平臺通過串口連接單片機(jī),再由單片機(jī)控制各種感應(yīng),驅(qū)動電路。你可以在手機(jī)上指揮它到處跑,然后拍下想要的照片。
值得注意的是,openwrt系統(tǒng)是開源的,我們可以在PC機(jī)上編譯自己的openwrt系統(tǒng)和自己的軟件,另外單片機(jī)的擴(kuò)展應(yīng)用成千上萬,因此這架機(jī)器人具有相當(dāng)高的可玩性與非常廣泛的應(yīng)用。
shy的原型來自于《star wars》中的R2D2。
?
機(jī)器人的主題是“呼吸”,緩慢變化的藍(lán)光使它們成為你臥室中最酷的裝置。
1???Linux平臺:線路連接與攝像頭驅(qū)動
1.1???準(zhǔn)備硬件
首先要選擇能夠加載Openwrt平臺的硬件設(shè)備,其實(shí)能加載LINUX系統(tǒng)的設(shè)備非常常見,比如我們家庭用的路由器。
這里要注意的是路由器的選擇,首先,路由器要能夠加載openwrt系統(tǒng),其次,要具有USB口以及TTL接口。
一般來講,我們選擇的型號是DB120或者RG100A-AA,我選擇的型號是RG100A-AA。
1.2???刷系統(tǒng)
得到路由器后,首先要做的事是給路由器換個系統(tǒng),即通俗所說的“刷機(jī)”,關(guān)于網(wǎng)絡(luò)上RG100A-AA刷機(jī)的教程很多,這里不再贅述,不過需要補(bǔ)充的是,對于擁有單片機(jī)的愛好者,大可不必專門購買USB-TTL線,我們手中的單片機(jī)的開發(fā)板就可以為路由器與個人PC進(jìn)行連接,下面給出開發(fā)板與路由器TTL線的連線圖,,路由器從左到右依次是:VCC ,GND ,TX ,RX,這里注意一定不要接VCC線。
我的系統(tǒng)是Openwrt backfire 10.03.1 RC6
測試單片機(jī)的開發(fā)板是否連接正確,可以通過PUTYY的串口連接方式進(jìn)行連接,注意這里的波特率是:115200
COM口的選擇要查看個人PC中的設(shè)備管理器,以連接的為準(zhǔn)。
1.3???設(shè)置局域網(wǎng)絡(luò)
刷完系統(tǒng)后,設(shè)置個人PC的網(wǎng)絡(luò)IP:192.168.1.X,以及子網(wǎng)掩碼255.255.255.0。這里的X是除1之外的任意,當(dāng)然不能大于255
然后連接個人PC與路由的LAN3口,用PUTYY進(jìn)行SHH連接,輸入用戶名ROOT ,以及密碼ADMIN ,設(shè)置以及連接正確后進(jìn)入。
1.4???安裝攝像頭
設(shè)置IP的目的是為了上傳攝像頭的驅(qū)動文件,我采用的攝像頭是OV519芯片的SONY攝像頭,因此驅(qū)動文件為:
kmod-video-gspca-ov519_2.6.32.27-1_brcm63xx.ipk
運(yùn)行winscp,將IPK包上傳到根目錄下,注意,這里要選擇SCP方式。
成功連接后。
winscp非常方便,拖拽文件即可,跟FTP方式完全一樣。
我的攝像頭。
上傳完畢后,運(yùn)行PUTTY,進(jìn)行安裝,安裝口令:opkg install xxx.ipk
安裝完畢后可以用dmesg命令進(jìn)行查看是否安裝完成,或者直接在瀏覽器中輸入192.168.1.1以圖形化的方式進(jìn)行查看。
安裝完驅(qū)動后,安裝MJPG-STREAMER,這是一個用于查看視頻IPK程序,可以直接在瀏覽器中查看攝像頭捕捉到的圖像,注意安裝完畢后要開啟服務(wù),或者也可以設(shè)置為自自動,這里不再贅述。
這里我采用了網(wǎng)絡(luò)上研究智能機(jī)器人的前人Liuviking的程序來捕捉MJPG-STREAMER的圖像,運(yùn)行此程序要先安裝,DOTNET3.5,運(yùn)行后成功便如圖所示:
至此,攝像頭的安裝結(jié)束。
2???Linux平臺:安裝與串口調(diào)試
2.1???什么是ser2net.ipk軟件包
首先解釋一下什么是ser2net.ipk軟件包。
這是一個可以通過個人PC向路由的指定端口發(fā)送數(shù)據(jù),然后路由原封不動的將數(shù)據(jù)發(fā)送到路由的TTL接口的程序。
當(dāng)安裝完這個程序后,我們就可以通過編制的程序向路由的TTL口發(fā)送串行數(shù)據(jù),意義在于:單片機(jī)就可以接受路由發(fā)送的串行數(shù)據(jù)進(jìn)行各種控制。
2.2???安裝ser2net.ipk軟件包
下面簡略的講解如何在openwrt下進(jìn)行軟件包ser2net.ipk的安裝
有兩種方法:
方法一是在路由已經(jīng)聯(lián)結(jié)上互聯(lián)網(wǎng)的情況下,可以由網(wǎng)絡(luò)進(jìn)行安裝。非常的方便,但我并未采用。
方法二是利用winscp連接上路由,上傳ser2net.ipk,然后運(yùn)行putty,登陸路由執(zhí)行
?
opkg update opkg install 軟件包地址?
同昨日安裝ov519驅(qū)動。
安裝完畢ser2net后,需要進(jìn)行一定的設(shè)置,在命令行界面下輸入
?
cd /?
進(jìn)入路由根目錄,再輸入
?
cd etc?
進(jìn)入ect 目錄后執(zhí)行
?
vi ser2net.conf (當(dāng)安裝成功后才會出現(xiàn)此設(shè)置文件)?
找到
2001:raw:600:/dev/ttyS0:9600 NONE 1STOPBIT 8DATABITS XONXOFF LOCAL -RTSCTS
#2002:raw:600:/dev/ttyS1:9600 NONE 1STOPBIT 8DATABITS XONXOFF LOCAL -RTSCTS
注意,這里"#"代表的是屏蔽,我們修改的是非屏蔽語句,可以看到,上位機(jī)發(fā)送的端口是2001,這就是我們需要發(fā)送的端口號,波特率是9600,其它的略。
設(shè)置完畢后記得保存退出,然后這里要執(zhí)行一次ser2net,以開啟服務(wù)。
一切設(shè)置妥當(dāng)后,我們再次借用liuviking的程序進(jìn)行串口通訊的測試,運(yùn)行l(wèi)iuviking的程序,然后再運(yùn)行“串口調(diào)試助手”,在程序中點(diǎn)擊發(fā)送串口數(shù)據(jù),可以看到在“串口調(diào)試助手”,有正確的數(shù)據(jù)輸出,至此,Shy的串口連接部分設(shè)置完畢。
3???Linux平臺:openwrt系統(tǒng)中添加自啟動
添加自啟動項(xiàng)的目的是為了在SHY啟動的時候能夠自動啟動更多的服務(wù),配合UCI命令。
在/etc/init.d里添加需要啟動的shell腳本,假設(shè)名字為my-plugin。接下來模仿該目錄下其他啟動腳本的格式,添加你的代碼。
?
[cpp] view plaincopyprint? 1. #!/bin/sh /etc/rc.common 2. # /init.d/my-plugin 3. START=50 #啟動順序 4. 5. start() { 6. #啟動項(xiàng)執(zhí)行的代碼 7. } 8. 9. stop() { 10. killall my-plugin 11. }?
之后還需要在rc.d目錄下做一個鏈接,啟動時系統(tǒng)會按順序啟動rc.d目錄下的腳本鏈接,對應(yīng)執(zhí)行init.d目錄下的啟動腳本。
鏈接命令如下:ln -s ../init.d/my-plugin /etc/rc.d/S50my-plugin
?
4???單片機(jī)模塊
4.1???構(gòu)建STC11F02E最小系統(tǒng)
我們選用STC11F02E單片機(jī)作為SHY的控制芯片電路部分,關(guān)于STC11F02E的參數(shù)如下:
STC11F02E單片機(jī)為增強(qiáng)型的8051內(nèi)核,具有2KB的片內(nèi)Flash程序存儲器、2KB的EEPROM存儲器和256KB的片內(nèi)SRAM數(shù)據(jù)存儲器。
這款單片機(jī)的UART(Universal Asynchronous Receiver/Transmitter,通用異步收發(fā)器)模塊的最大特點(diǎn)就是通過配置特殊功能寄存器AUXR1中的第7位UART_P1的狀態(tài)可以使UART模塊的兩個引腳(RXD、TXD)接到P3端口的P3.0、P3.1引腳,或者接到P1端口的P1.6、P1.7引腳,從而可以充當(dāng)兩個串口使用。
因?yàn)橹谱鱏HY需要的引腳并不是很多,所以我們只需要20引腳的單片機(jī)即可。這片STC11F02E
符合20引腳,小巧,作為增強(qiáng)型STC芯片,功耗小。
有兩個串口通訊接口,可一個用于下載,一個用于openwrt路由通訊。
從DATASHEET中得到STC11F02E 的芯片管腳圖
在這里,我們需要用到:
P1.7 作為串口的TX(transmit) 傳送 接口
P1.6 作為串口的RX(Recive) 接收 接口
P1.5 - P1.0 用于控制L298N驅(qū)動電路
P3.7 用于PWM控制LED燈
P3.6/RST 用于復(fù)位電路
XTAL2
XTAL1 用于11.0592MHZ晶振
RXD
TXD 用于在線下載線路
復(fù)位電路圖
RST保持兩個機(jī)器周期以上的高電平時自動復(fù)位
晶振,復(fù)位電路,VCC,GND,連接好后
至此,STC11F02E最小系統(tǒng)完成。
4.2???中斷方式接收串口數(shù)據(jù)
接收串口數(shù)據(jù)的目的是為了與openwrt路由完成通訊,STC11F02E要準(zhǔn)確無誤的辨識出openwrt路由發(fā)過來的指令,編制測試程序如下:
?
#include #include #define uchar unsigned char #define uint unsigned int unsigned char Receive(void) { unsigned char dat; while(RI==0); //只要接收中斷標(biāo)志位RI沒有被置“1” 當(dāng)接收完畢時,中斷標(biāo)志RI被置1 //等待,直至接收完畢(RI=1) RI=0; //為了接收下一幀數(shù)據(jù),需將RI清0 dat=SBUF; //將接收緩沖器中的數(shù)據(jù)存于dat return dat; } void main (void) { SCON = 0x50; //REN=1允許串行接受狀態(tài),串口工作模式2 TMOD|= 0x20; //定時器1工作方式2 TH1 = 0xFD; //baud /* 波特率9600、數(shù)據(jù)位8、停止位1。效驗(yàn)位無 (11.0592M) TL1 = 0xFD; TR1 = 1; REN=1; while(1) { if(Receive() == 'W') P1=~P1; } }?
以上程序有一個缺點(diǎn)是,并沒有使用串口中斷,其實(shí)在在這個程序上,用不用中斷處理程序?qū)τ趩纹瑱C(jī)都是一樣的,因?yàn)槭褂玫氖且粯拥拈_銷。但是,我們在前面提到過,完成Shy的一個目的是學(xué)習(xí),所以我們要使用串口中斷完成這個程序的編制 完成串口中斷的編寫,如下:
?
#include #include #define uchar unsigned char #define uint unsigned int void InitUART (void) { SCON = 0x50; TMOD|= 0x20; TH1 = 0xFD; TL1 = 0xFD; TR1 = 1; REN=1; ES=1; //允許串行口中斷 EA =1; //單片機(jī)中斷允許 } unsigned char Receive(void) { unsigned char dat; while(RI==0); RI=0; dat=SBUF; return dat; } void main (void) { InitUART(); while(1){} } void serial (void) interrupt 4 using 3 { if(Receive() == 'W') P1=~P1; }?
可以看到,程序被精簡,并且模塊化,主函數(shù)中幾乎沒有代碼。經(jīng)過測試,能夠正常使用。
在這里:
?
interrupt 0 指明是外部中斷0; interrupt 1 指明是定時器中斷0; interrupt 2 指明是外部中斷1; interrupt 3 指明是定時器中斷1; interrupt 4 指明是串行口中斷; using 0 是第0組寄存器; using 1 是第1組寄存器; using 2 是第2組寄存器; using 3 是第3組寄存器;?
51單片機(jī)的中斷編號如下:
51單片機(jī)的中斷功能號如下:
幾個比較重要的概念如下:
EA、EX0、ET0、EX1、ET1、ES、ET2
中斷名稱、中斷號、入口地址
中斷允許控制寄存器(interrupt enable)
中斷優(yōu)先級控制寄存器(interrupt priority)
SHY的中斷方式接收串口數(shù)據(jù)部分完畢。
4.3???PWM調(diào)光編程
正規(guī)的解釋如下:
脈沖寬度調(diào)制(PWM),是英文“Pulse Width Modulation”的縮寫,簡稱脈寬調(diào)制,是利用微處理器的數(shù)字輸出來對模擬電路進(jìn)行控制的一種非常有效的技術(shù),廣泛應(yīng)用在從測量、通信到功率控制與變換的許多領(lǐng)域中。
脈沖寬度調(diào)制是一種模擬控制方式,其根據(jù)相應(yīng)載荷的變化來調(diào)制晶體管柵極或基極的偏置,來實(shí)現(xiàn)開關(guān)穩(wěn)壓電源輸出晶體管或晶體管導(dǎo)通時間的改變,這種方式能使電源的輸出電壓在工作條件變化時保持恒定,是利用微處理器的數(shù)字輸出來對模擬電路進(jìn)行控制的一種非常有效的技術(shù)。
隨著電子技術(shù)的發(fā)展,出現(xiàn)了多種PWM技術(shù),其中包括:相電壓控制PWM、脈寬PWM法、隨機(jī)PWM、SPWM法、線電壓控制PWM等,而在鎳氫電池智能充電器中采用的脈寬PWM法,它是把每一脈沖寬度均相等的脈沖列作為PWM波形,通過改變脈沖列的周期可以調(diào)頻,改變脈沖的寬度或占空比可以調(diào)壓,采用適當(dāng)控制方法即可使電壓與頻率協(xié)調(diào)變化。可以通過調(diào)整PWM的周期、PWM的占空比而達(dá)到控制充電電流的目的。
可以看到,以上的解釋非常抽象。
在我的單片機(jī)開發(fā)板中,有PWM的示例程序,但不是以函數(shù)的形式,改寫為函數(shù)的形式如下:
?
unsigned int CYCLE=600,PWM_LOW=0;//PWM-定義周期并賦值 void PWM_LED (void) { LED0=1; Delay(60000); //特意加延時,可以看到熄滅的過程 for(PWM_LOW=1;PWM_LOW0;PWM_LOW--){ //與逐漸變亮相反的過程 LED0=0; Delay(PWM_LOW); LED0=1; Delay(CYCLE-PWM_LOW); } }
?
示例程序的流程圖
圖片來源:《LY-51S開發(fā)板說明書v1.1.pdf》
燒制入單片機(jī)后演示
此刻,在官方的解釋中“是利用微處理器的數(shù)字輸出來對模擬電路進(jìn)行控制的一種非常有效的技術(shù)”此句,是否以不再抽象?
基本上來說,在這個LED應(yīng)用中,是采用時分法,用時差來進(jìn)行電壓連續(xù)變化量的模擬。因?yàn)樵趩纹瑱C(jī)中,管腳的輸出不是1就是0
如何輸出一定電壓范圍的模擬量,PWM就是解決這個問題的一種方式。
此刻,相信我們已經(jīng)可以猜測到了,Shy呼吸燈的變幻方式。
5???電機(jī)驅(qū)動模塊
5.1???用L298N制作電機(jī)驅(qū)動電路
L298N的管腳圖。
L298N芯片是常用于驅(qū)動直流電機(jī)和步進(jìn)電機(jī)的一種芯片,我們用于驅(qū)動Shy的兩個直流減速電機(jī),在單片機(jī)的控制下完成前進(jìn),轉(zhuǎn)向,后退的操作。
從網(wǎng)絡(luò)上下載到L298N的線路連接圖。
但是這張圖是有光耦的線路連接圖,對于Shy目前來說并不需要用光耦進(jìn)行電氣上的隔離,我們需要的是一個簡單,高效的L298N電路連接。
圖中分析L298N可以看到,其實(shí)L298的電路非常簡單,只需要兩個濾波電路進(jìn)行電源濾波和八個IN4007防止電源回流,因此我們這里選擇自己繪制電路圖
打開DXP 2004,從元件庫中選擇出適當(dāng)?shù)脑P(guān)于L298N在DXP 2004中已經(jīng)帶有,因此只要搜索出即可,另外找出八個IN4007,兩個100uF的有極性電容,兩個104電容,如圖:
參照有光耦的L298N電路圖或者L298N的DATASHEET進(jìn)行線路連接,如圖,雖然線路比較簡單,但是盡量也不要出錯
連接完畢后參照此SCHDOC在元件箱中找出對應(yīng)的元件,這里我們用小面包板代替PCB板,一是小面包板比較容易連接,二是這種類型的小面包板可以幾個一起組合,在以后添加模塊的時候比較方便,不過面包板的缺點(diǎn)是可能連線不牢固,在這里我用了許多IN4007剪下的管腳進(jìn)行了連接
連接好了如圖所示,連接的時候先進(jìn)行電源的連接,再進(jìn)行管腳的連接,總之分成幾部分進(jìn)行連接,這樣若發(fā)生錯誤的時候能夠很快排錯
經(jīng)過測試,此L298N能夠正常工作。
6???功能演示
百聞不如一見,接下來的功能演示就上圖來解決吧。
?
?
?
評論