製作會呼吸的WIFI機器人

轉載至http://www.guokr.com/article/319356/


首先需要解釋一下什麼是“Shy ”:

“Shy ”是一個採用LINUX開源系統-Openwrt製作的WIFI機器人,它支持PC端,android端,web端的無線控制和無線視頻傳輸,apple端的視頻傳輸,甚至還可以當作你的電腦高清免驅動攝像頭使用。

技術上來說,它大致分爲三個部分,首先是加載Openwrt系統的Liunx平臺,它連接攝像頭,並通過WIFI接收控制命令。然後此平臺通過串口連接單片機,再由單片機控制各種感應,驅動電路。你可以在手機上指揮它到處跑,然後拍下想要的照片。

值得注意的是,openwrt系統是開源的,我們可以在PC機上編譯自己的openwrt系統和自己的軟件,另外單片機的擴展應用成千上萬,因此這架機器人具有相當高的可玩性與非常廣泛的應用。

 
/gkimage/47/l6/yv/47l6yv.jpg
  • shy的原型來自於《star wars》中的R2D2。
 
/gkimage/lq/yc/mq/lqycmq.jpg
  • 機器人的主題是“呼吸”,緩慢變化的藍光使它們成爲你臥室中最酷的裝置。
 
/gkimage/t7/mh/of/t7mhof.png
 
/gkimage/kt/z0/y6/ktz0y6.png
 
/gkimage/nn/d9/ss/nnd9ss.png
 
 
 

1   Linux平臺:線路連接與攝像頭驅動

1.1   準備硬件

首先要選擇能夠加載Openwrt平臺的硬件設備,其實能加載LINUX系統的設備非常常見,比如我們家庭用的路由器。

這裏要注意的是路由器的選擇,首先,路由器要能夠加載openwrt系統,其次,要具有USB口以及TTL接口。

/gkimage/qt/in/5m/qtin5m.png
  • 一般來講,我們選擇的型號是DB120或者RG100A-AA,我選擇的型號是RG100A-AA。
 

1.2   刷系統

/gkimage/e0/fw/qj/e0fwqj.png
  • 得到路由器後,首先要做的事是給路由器換個系統,即通俗所說的“刷機”,關於網絡上RG100A-AA刷機的教程很多,這裏不再贅述,不過需要補充的是,對於擁有單片機的愛好者,大可不必專門購買USB-TTL線,我們手中的單片機的開發板就可以爲路由器與個人PC進行連接,下面給出開發板與路由器TTL線的連線圖,,路由器從左到右依次是:VCC ,GND ,TX ,RX,這裏注意一定不要接VCC線。
 
/gkimage/3w/wy/r7/3wwyr7.png
  • 我的系統是Openwrt backfire 10.03.1 RC6
 
/gkimage/yv/ah/3g/yvah3g.png
  • 測試單片機的開發板是否連接正確,可以通過PUTYY的串口連接方式進行連接,注意這裏的波特率是:115200

COM口的選擇要查看個人PC中的設備管理器,以連接的爲準。

 

1.3   設置局域網絡

/gkimage/hm/2a/f9/hm2af9.png
  • 刷完系統後,設置個人PC的網絡IP:192.168.1.X,以及子網掩碼255.255.255.0。這裏的X是除1之外的任意,當然不能大於255
 
/gkimage/gw/oj/fd/gwojfd.png
  • 然後連接個人PC與路由的LAN3口,用PUTYY進行SHH連接,輸入用戶名ROOT ,以及密碼ADMIN ,設置以及連接正確後進入。
 

1.4   安裝攝像頭

設置IP的目的是爲了上傳攝像頭的驅動文件,我採用的攝像頭是OV519芯片的SONY攝像頭,因此驅動文件爲:

kmod-video-gspca-ov519_2.6.32.27-1_brcm63xx.ipk

 
/gkimage/qy/dx/ww/qydxww.png
  • 運行winscp,將IPK包上傳到根目錄下,注意,這裏要選擇SCP方式。
 
/gkimage/f4/xe/ys/f4xeys.png
  • 成功連接後。

winscp非常方便,拖拽文件即可,跟FTP方式完全一樣。

 
/gkimage/wv/yl/ru/wvylru.png
  • 我的攝像頭。

上傳完畢後,運行PUTTY,進行安裝,安裝口令:opkg install xxx.ipk

安裝完畢後可以用dmesg命令進行查看是否安裝完成,或者直接在瀏覽器中輸入192.168.1.1以圖形化的方式進行查看。

安裝完驅動後,安裝MJPG-STREAMER,這是一個用於查看視頻IPK程序,可以直接在瀏覽器中查看攝像頭捕捉到的圖像,注意安裝完畢後要開啓服務,或者也可以設置爲自自動,這裏不再贅述。

 
/gkimage/f0/hz/t1/f0hzt1.png
  • 這裏我採用了網絡上研究智能機器人的前人Liuviking的程序來捕捉MJPG-STREAMER的圖像,運行此程序要先安裝,DOTNET3.5,運行後成功便如圖所示:

至此,攝像頭的安裝結束。

 

2   Linux平臺:安裝與串口調試

2.1   什麼是ser2net.ipk軟件包

首先解釋一下什麼是ser2net.ipk軟件包。

這是一個可以通過個人PC向路由的指定端口發送數據,然後路由原封不動的將數據發送到路由的TTL接口的程序。

當安裝完這個程序後,我們就可以通過編制的程序向路由的TTL口發送串行數據,意義在於:單片機就可以接受路由發送的串行數據進行各種控制。

 

2.2   安裝ser2net.ipk軟件包

下面簡略的講解如何在openwrt下進行軟件包ser2net.ipk的安裝

有兩種方法:

方法一是在路由已經聯結上互聯網的情況下,可以由網絡進行安裝。非常的方便,但我並未採用。

 
/gkimage/7s/g3/y4/7sg3y4.png

方法二是利用winscp連接上路由,上傳ser2net.ipk,然後運行putty,登陸路由執行

opkg update
opkg install 軟件包地址

同昨日安裝ov519驅動。

安裝完畢ser2net後,需要進行一定的設置,在命令行界面下輸入

cd /

進入路由根目錄,再輸入

cd etc

進入ect 目錄後執行

vi ser2net.conf (當安裝成功後纔會出現此設置文件)

找到

2001:raw:600:/dev/ttyS0:9600 NONE 1STOPBIT 8DATABITS XONXOFF LOCAL -RTSCTS

#2002:raw:600:/dev/ttyS1:9600 NONE 1STOPBIT 8DATABITS XONXOFF LOCAL -RTSCTS

注意,這裏"#"代表的是屏蔽,我們修改的是非屏蔽語句,可以看到,上位機發送的端口是2001,這就是我們需要發送的端口號,波特率是9600,其它的略。

 
/gkimage/x9/7x/v5/x97xv5.png

設置完畢後記得保存退出,然後這裏要執行一次ser2net,以開啓服務。

 
/gkimage/y2/qp/ce/y2qpce.png

一切設置妥當後,我們再次借用liuviking的程序進行串口通訊的測試,運行liuviking的程序,然後再運行“串口調試助手”,在程序中點擊發送串口數據,可以看到在“串口調試助手”,有正確的數據輸出,至此,Shy的串口連接部分設置完畢。

 

3   Linux平臺:openwrt系統中添加自啓動

添加自啓動項的目的是爲了在SHY啓動的時候能夠自動啓動更多的服務,配合UCI命令。

在/etc/init.d裏添加需要啓動的shell腳本,假設名字爲my-plugin。接下來模仿該目錄下其他啓動腳本的格式,添加你的代碼。

[cpp] view plaincopyprint?
1.   #!/bin/sh /etc/rc.common
2.   # /init.d/my-plugin
3.   START=50  #啓動順序
4.
5.   start() {
6.          #啓動項執行的代碼
7.   }
8.
9.   stop() {
10.           killall my-plugin
11.   }

之後還需要在rc.d目錄下做一個鏈接,啓動時系統會按順序啓動rc.d目錄下的腳本鏈接,對應執行init.d目錄下的啓動腳本。

鏈接命令如下:ln -s ../init.d/my-plugin /etc/rc.d/S50my-plugin

參考地址:

http://blog.csdn.net/dodolzg/article/details/6279986

附:

/etc/rc.d/init.d和/etc/init.d 聯繫區別

地址:http://www.cnblogs.com/balaamwe/archive/2012/01/16/2323665.html

 

4   單片機模塊

4.1   構建STC11F02E最小系統

我們選用STC11F02E單片機作爲SHY的控制芯片電路部分,關於STC11F02E的參數如下:

STC11F02E單片機爲增強型的8051內核,具有2KB的片內Flash程序存儲器、2KB的EEPROM存儲器和256KB的片內SRAM數據存儲器。

這款單片機的UART(Universal Asynchronous Receiver/Transmitter,通用異步收發器)模塊的最大特點就是通過配置特殊功能寄存器AUXR1中的第7位UART_P1的狀態可以使UART模塊的兩個引腳(RXD、TXD)接到P3端口的P3.0、P3.1引腳,或者接到P1端口的P1.6、P1.7引腳,從而可以充當兩個串口使用。

因爲製作SHY需要的引腳並不是很多,所以我們只需要20引腳的單片機即可。這片STC11F02E

  1. 符合20引腳,小巧,作爲增強型STC芯片,功耗小。
  2. 有兩個串口通訊接口,可一個用於下載,一個用於openwrt路由通訊。
/gkimage/m7/ah/au/m7ahau.png
  • 從DATASHEET中得到STC11F02E 的芯片管腳圖

在這裏,我們需要用到:

P1.7 作爲串口的TX(transmit) 傳送 接口
P1.6 作爲串口的RX(Recive) 接收 接口
P1.5 - P1.0 用於控制L298N驅動電路
P3.7 用於PWM控制LED燈
P3.6/RST 用於復位電路
XTAL2
XTAL1 用於11.0592MHZ晶振
RXD
TXD 用於在線下載線路
 
/gkimage/b5/3q/iv/b53qiv.png
  • 復位電路圖

關於復位電路的解釋

RST保持兩個機器週期以上的高電平時自動復位

 
/gkimage/8f/sm/y1/8fsmy1.png
  • 晶振,復位電路,VCC,GND,連接好後

至此,STC11F02E最小系統完成。

 

4.2   中斷方式接收串口數據

接收串口數據的目的是爲了與openwrt路由完成通訊,STC11F02E要準確無誤的辨識出openwrt路由發過來的指令,編制測試程序如下:

#include 
#include 
#define uchar unsigned char
#define uint unsigned int
unsigned char Receive(void)
{
unsigned char dat;
while(RI==0);        //只要接收中斷標誌位RI沒有被置“1” 當接收完畢時,中斷標誌RI被置1
                           //等待,直至接收完畢(RI=1)
RI=0;                  //爲了接收下一幀數據,需將RI清0
dat=SBUF;        //將接收緩衝器中的數據存於dat
return dat;
}
void main (void)
{
SCON = 0x50;        //REN=1允許串行接受狀態,串口工作模式2
TMOD|= 0x20;       //定時器1工作方式2
TH1 = 0xFD;        //baud  /*  波特率9600、數據位8、停止位1。效驗位無 (11.0592M)
TL1 = 0xFD;
TR1  = 1;
REN=1; while(1)
  {
    if(Receive() == 'W') P1=~P1;
  }
}

以上程序有一個缺點是,並沒有使用串口中斷,其實在在這個程序上,用不用中斷處理程序對於單片機都是一樣的,因爲使用的是一樣的開銷。但是,我們在前面提到過,完成Shy的一個目的是學習,所以我們要使用串口中斷完成這個程序的編制 完成串口中斷的編寫,如下:

#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;                //單片機中斷允許
}
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;
}

可以看到,程序被精簡,並且模塊化,主函數中幾乎沒有代碼。經過測試,能夠正常使用。

在這裏:

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單片機的中斷編號如下:

/gkimage/ux/bg/bm/uxbgbm.png
 

51單片機的中斷功能號如下:

/gkimage/h8/qk/pl/h8qkpl.png

幾個比較重要的概念如下:

EA、EX0、ET0、EX1、ET1、ES、ET2
中斷名稱、中斷號、入口地址
中斷允許控制寄存器(interrupt enable)
中斷優先級控制寄存器(interrupt priority)

SHY的中斷方式接收串口數據部分完畢。

 

4.3   PWM調光編程

正規的解釋如下:

脈衝寬度調製(PWM),是英文“Pulse Width Modulation”的縮寫,簡稱脈寬調製,是利用微處理器的數字輸出來對模擬電路進行控制的一種非常有效的技術,廣泛應用在從測量、通信到功率控制與變換的許多領域中。

脈衝寬度調製是一種模擬控制方式,其根據相應載荷的變化來調製晶體管柵極或基極的偏置,來實現開關穩壓電源輸出晶體管或晶體管導通時間的改變,這種方式能使電源的輸出電壓在工作條件變化時保持恆定,是利用微處理器的數字輸出來對模擬電路進行控制的一種非常有效的技術。

隨着電子技術的發展,出現了多種PWM技術,其中包括:相電壓控制PWM、脈寬PWM法、隨機PWM、SPWM法、線電壓控制PWM等,而在鎳氫電池智能充電器中採用的脈寬PWM法,它是把每一脈衝寬度均相等的脈衝列作爲PWM波形,通過改變脈衝列的週期可以調頻,改變脈衝的寬度或佔空比可以調壓,採用適當控制方法即可使電壓與頻率協調變化。可以通過調整PWM的週期、PWM的佔空比而達到控制充電電流的目的。

以上參考地址:http://baike.baidu.com/view/168039.htm

可以看到,以上的解釋非常抽象。

在我的單片機開發板中,有PWM的示例程序,但不是以函數的形式,改寫爲函數的形式如下:

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);
}
}
/gkimage/gk/75/51/gk7551.png
  • 示例程序的流程圖

圖片來源:《LY-51S開發板說明書v1.1.pdf》

 

燒製入單片機後演示

此刻,在官方的解釋中“是利用微處理器的數字輸出來對模擬電路進行控制的一種非常有效的技術”此句,是否以不再抽象?

基本上來說,在這個LED應用中,是採用時分法,用時差來進行電壓連續變化量的模擬。因爲在單片機中,管腳的輸出不是1就是0

如何輸出一定電壓範圍的模擬量,PWM就是解決這個問題的一種方式。

此刻,相信我們已經可以猜測到了,Shy呼吸燈的變幻方式。

 

5   電機驅動模塊

5.1   用L298N製作電機驅動電路

/gkimage/9l/5v/27/9l5v27.png
  • L298N的管腳圖。

L298N芯片是常用於驅動直流電機和步進電機的一種芯片,我們用於驅動Shy的兩個直流減速電機,在單片機的控制下完成前進,轉向,後退的操作。

 
/gkimage/n3/e7/rb/n3e7rb.png
  • 從網絡上下載到L298N的線路連接圖。
 

但是這張圖是有光耦的線路連接圖,對於Shy目前來說並不需要用光耦進行電氣上的隔離,我們需要的是一個簡單,高效的L298N電路連接。

圖中分析L298N可以看到,其實L298的電路非常簡單,只需要兩個濾波電路進行電源濾波和八個IN4007防止電源迴流,因此我們這裏選擇自己繪製電路圖

/gkimage/yw/zh/hc/ywzhhc.png
  • 打開DXP 2004,從元件庫中選擇出適當的元件,關於L298N在DXP 2004中已經帶有,因此只要搜索出即可,另外找出八個IN4007,兩個100uF的有極性電容,兩個104電容,如圖:

參照有光耦的L298N電路圖或者L298N的DATASHEET進行線路連接,如圖,雖然線路比較簡單,但是儘量也不要出錯

連接完畢後參照此SCHDOC在元件箱中找出對應的元件,這裏我們用小麪包板代替PCB板,一是小麪包板比較容易連接,二是這種類型的小麪包板可以幾個一起組合,在以後添加模塊的時候比較方便,不過麪包板的缺點是可能連線不牢固,在這裏我用了許多IN4007剪下的管腳進行了連接

連接好了如圖所示,連接的時候先進行電源的連接,再進行管腳的連接,總之分成幾部分進行連接,這樣若發生錯誤的時候能夠很快排錯

經過測試,此L298N能夠正常工作。

以下內容是關於部分電子元件說明,均來自互聯網

關於直流中的濾波電容

濾波電容的選擇

 

文中用到的 程序打包下載

 

6   功能演示

百聞不如一見,接下來的功能演示就上圖來解決吧,還附帶精美視頻哦~

/gkimage/z2/0e/f8/z20ef8.jpg
 
/gkimage/86/xh/0l/86xh0l.jpg
 
/gkimage/if/gl/my/ifglmy.jpg
 
/gkimage/2c/vv/s5/2cvvs5.jpg
 
編輯提醒:請勿用於偷窺,法律責任自負!
 

7   DIYer簽到處

 

果殼DIY站QQ羣:132647923, 2羣:179240860,3羣:155086317(加入時請報上你在果殼的個人主頁地址,以防廣告ID)

果殼DIY站微博: http://t.sina.com.cn/guokrdiy

顯示所有評論

你的評論

登錄 發表評論

sfwersfwer GEEKER

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章