標(biāo)題: 我的移動(dòng)偵查小車(多圖附程序) [打印本頁(yè)]
作者: dagu 時(shí)間: 2014-12-27 01:40
標(biāo)題: 我的移動(dòng)偵查小車(多圖附程序)
在猶豫是做飛機(jī)還是小車很久以后,終于選擇做一個(gè)移動(dòng)機(jī)器人。原因有以下幾點(diǎn):1,飛機(jī)消耗太大。2,飛機(jī)空機(jī)無(wú)法DIY,少了樂(lè)趣。3,場(chǎng)地有限。4,和我的專業(yè)結(jié)合不緊密。5,輪式驅(qū)動(dòng)好控制。
生活少了許多自由的時(shí)間,所以擠擠晚上睡覺(jué)的時(shí)間花了大約3周基本實(shí)現(xiàn)了機(jī)器人的移動(dòng)控制,視頻傳輸。在以后會(huì)加上機(jī)械臂,各種傳感器,如果有可能還會(huì)弄弄視覺(jué)識(shí)別。
之所以說(shuō)是移動(dòng)機(jī)器人,是因?yàn)楸旧淼亩ㄎ槐容^高,我不希望用廉價(jià)的材料做出一個(gè)試驗(yàn)型的小車。我要做就做實(shí)用的,一步到位的。錢倒不是什么問(wèn)題,每個(gè)月的錢就夠買材料的。只是很多機(jī)械結(jié)構(gòu)沒(méi)有條件自己做,所以只好用成品。興趣是最好的老師,重在過(guò)程不在結(jié)果。
下面介紹我的車,由于做出來(lái)沒(méi)多久還有很多不足的地方,下一步就是要換一個(gè)更長(zhǎng)的地盤,用6輪驅(qū)動(dòng),換大輪。
下面是基本完成后的小車:

完成了視頻傳輸?shù)男≤,平板電腦里面可以看到小車攝像頭拍到的視頻。
下面是各個(gè)部件:
1,TP-LINK 路由器 刷固件后用來(lái)進(jìn)行圖傳和數(shù)傳。淘寶上價(jià)格在150左右,已經(jīng)刷好了固件。

2,S606高清攝像頭 USB接頭,淘寶價(jià)在80左右

3,裝好2自由度舵機(jī)云臺(tái)的攝像頭
4,裝好的小車底盤。85MM輪,37MM電機(jī),20X15CM底盤。

5,小車底盤和37金屬電機(jī)。金屬電機(jī)24元一個(gè),輪12元一個(gè)。

6,L298電機(jī)驅(qū)動(dòng)模塊

7,安裝好電池和保護(hù)板及充電電路。

8,九節(jié)18650鋰電形成的電池組。3并3串,11.2V

9,控制電路。采用STC89C52單片機(jī)。

10,上板前視圖。有四個(gè)LED大燈

11,RS232電平轉(zhuǎn)換模塊

12,整機(jī)仰視圖

13,上底板三層積木構(gòu)架

14,繼電器和限流降壓模塊。

15,整機(jī)圖
下面介紹一下小車的基本原理

一,小車的圖傳和數(shù)傳原理:
本小車采用開源的無(wú)線路由器進(jìn)行圖傳和數(shù)傳。圖傳主要是將攝像頭視頻通過(guò)路由器傳輸?shù)缴衔粰C(jī)上。數(shù)傳主要是用上位機(jī)軟件進(jìn)行小車的控制,如行走,轉(zhuǎn)彎。
關(guān)于路由器的固件刷機(jī),參照網(wǎng)址:http://www.wifi-robots.com/。
二,小車的下位機(jī)控制部分:
本著DIY的目的,采用了51單片機(jī)加L298電機(jī)驅(qū)動(dòng)。具體采用了STC89C52單片機(jī)。具體C源程序在后面,已通過(guò)測(cè)試。
三,小車的底盤部分:
采用6061鋁,37MM金屬減速電機(jī),85MM輪。采用四輪驅(qū)動(dòng)。
四,小車電源部分:
采用9節(jié)18650鋰電。通過(guò)實(shí)際運(yùn)行動(dòng)力強(qiáng)勁,續(xù)航強(qiáng)。電池采用3X3連接,共11V輸出。電源部分設(shè)計(jì)了充電保護(hù)板和輸出保險(xiǎn)設(shè)計(jì)。
五,大燈電路;
采用四個(gè)大功率LED,繼電器模塊和限流模塊。
六, 設(shè)計(jì)了對(duì)講機(jī)電路
七,還未設(shè)計(jì)紅外避障,超聲波測(cè)距等
附51單片機(jī)源程序:
- #include<reg52.h>
- #include<math.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar Buffer =0; //從串口接收的數(shù)據(jù)
- uint URTAReceivedCount=0,n=1;
- uchar data Tempdatatable[5],CommandDatatable[5];//數(shù)據(jù)包
- uchar serVal[2];
- uint pwm[]={1120,1190,1382,1382,1382,1382,1382,1382}; //初始90度,(實(shí)際是1382.4,取整得1382)
- uchar pwm_flag=0;
- uint code ms0_5Con=461; //0.5ms計(jì)數(shù) (實(shí)際是460.8,取整得461)
- uint code ms2_5Con=2304; //2.5ms計(jì)數(shù)
-
-
- bit key_stime_ok;
- sbit StatusLight=P3^6; //狀態(tài)燈
- sbit MainLight=P3^7; //主大燈
- sbit servo0=P0^0; //舵機(jī)控制
- sbit servo1=P0^1;
- sbit servo2=P0^2;
- sbit servo3=P0^3;
- sbit servo4=P0^4;
- sbit servo5=P0^5;
- sbit servo6=P0^6;
- sbit servo7=P0^7;
- /********************************************************************
- * 名稱 : Delay_1ms()
- * 功能 : 延時(shí)子程序,延時(shí)時(shí)間為 1ms * x
- * 輸入 : x (延時(shí)一毫秒的個(gè)數(shù))
- * 輸出 : 無(wú)
- ***********************************************************************/
- void Delay_1ms(uint i)//1ms延時(shí)
- {
- uchar x,j;
- for(j=0;j<i;j++)
- for(x=0;x<=148;x++);
- }
-
- void TurnOnStatusLight()
- {
- StatusLight=0;
- }
- /********************************************************************
- * 名稱 : Send_Data()
- * 功能 : 向上位機(jī)傳送字符
- * 輸入 : 無(wú)
- * 輸出 : 無(wú)
- ***********************************************************************/
- void Send_Data(uchar type,uchar cmd,uchar dat)
- {
- uchar data Buffer[5];//構(gòu)建數(shù)據(jù)包
- uchar *p;
- uint Send_Count=0;
- p = Buffer;
- Buffer[0]=0XFF;
- Buffer[1]=type;
- Buffer[2]=cmd;
- Buffer[3]=dat;
- Buffer[4]=0XFF;
- while(1)
- {
- if(*p==0XFF)
- {
- Send_Count++; //0XFF標(biāo)志統(tǒng)計(jì)位
- }
- SBUF = *p; //發(fā)送
- while(!TI) //如果發(fā)送完畢,硬件會(huì)置位TI,等待發(fā)送完畢
- {
- _nop_();
- }
- p++;
- TI = 0;
- if(Send_Count == 2) //當(dāng)統(tǒng)計(jì)到兩次出現(xiàn)0XFF,則認(rèn)為一個(gè)數(shù)據(jù)包發(fā)送完畢,跳出循環(huán)
- {
- TI = 0;
- break;
- }
- }
- }
- /********************************************************************
- 協(xié)議規(guī)定:
- 包頭 類型位 數(shù)據(jù)位 數(shù)據(jù)位 結(jié)束位
- 0XFF 0X** OX** 0X** 0XFF
- 各命令說(shuō)明:
- 類型位 數(shù)據(jù)位 數(shù)據(jù)位 功能
-
- 0X00 0X02 0X00 前進(jìn)
- 0X00 0X01 0X00 后退
- 0X00 0X03 0X00 左轉(zhuǎn)
- 0X00 0X04 0X00 右轉(zhuǎn)
- 0X00 0X00 0X00 停止
-
- 0X01 0X01 角度 舵機(jī)1
- 0X01 0X02 . 舵機(jī)2
- 0X01 0X01 . 舵機(jī)3
- 0X01 0X02 . 舵機(jī)4
- 0X01 0X01 . 舵機(jī)5
- 0X01 0X02 . 舵機(jī)6
- 0X01 0X01 . 舵機(jī)7
- 0X01 0X02 數(shù)據(jù) 舵機(jī)8
-
- 0X02 0X01 車燈亮
- 0X02 0X02 車燈滅
-
- 0X03 雷達(dá)數(shù)據(jù) 發(fā)送雷達(dá)數(shù)據(jù)
- ***********************************************************************/
- /********************************************************************
- * 名稱 : Com_Int()
- * 功能 : 串口中斷子函數(shù)
- ***********************************************************************/
- void Com_Int(void) interrupt 4
- {
- uchar temp;
- ES=0; //關(guān)串口中斷
- RI=0; //軟件清除接收中斷
- temp=SBUF;
- if(temp==0XFF && URTAReceivedCount<3)
- {
- Tempdatatable[0]==0XFF; //包頭
- URTAReceivedCount++;
- }
- else
- {
- Tempdatatable[n]=temp;
- n++;
- if(URTAReceivedCount==0&&n==2)
- n=1;
- }
-
- if(URTAReceivedCount==2)//包尾
- {
- Tempdatatable[0]=0XFF;
- Tempdatatable[4]=0XFF;
- n=1;
- URTAReceivedCount=0; //組包完畢
- temp="";
- // Send_Data(Tempdatatable[1],Tempdatatable[2],Tempdatatable[3]); //發(fā)送組成的數(shù)據(jù)包回去
- }
-
- CommandDatatable[0]=Tempdatatable[0];
- CommandDatatable[1]=Tempdatatable[1];
- CommandDatatable[2]=Tempdatatable[2];
- CommandDatatable[3]=Tempdatatable[3];
- CommandDatatable[4]=Tempdatatable[4];
-
- ES=1;//開串口中斷
-
-
- }
-
- /********************************************************************
- * 名稱 : Com_Init()
- * 功能 : 串口初始化,晶振11.0592,波特率9600,使能了串口中斷
- ***********************************************************************/
- void Com_Init(void)
- {
- TMOD = 0x21;
- PCON = 0x00;
- SCON = 0x50;
- TH1 = 0xFd; //設(shè)置波特率 9600
- TL1 = 0xFd;
- TR1 = 1; //啟動(dòng)定時(shí)器1
- ES = 1; //開串口中斷
- EA = 1; //開總中斷
- IT0=0;
- EX0=1;
- }
-
- /********************************************************************
- * 名稱 :Moto_Forward()
- * 功能 : 電機(jī)1、2啟動(dòng),都是前進(jìn),整車表現(xiàn)為前進(jìn)。
- ***********************************************************************/
- void Moto_Forward()
- {
- P2= 0x55;
- Delay_1ms(100);
- }
- /********************************************************************
- * 名稱 :Moto_Backward()
- * 功能 : 電機(jī)1、2啟動(dòng),都是后退,整車表現(xiàn)為后退。
- ***********************************************************************/
- void Moto_Backward()
- {
-
- P2= 0xaa;
- Delay_1ms(100);
- }
-
- /********************************************************************
- * 名稱 :Moto_TurnLeft()
- * 功能 : 電機(jī)1后退,電機(jī)2前進(jìn),整車表現(xiàn)為左轉(zhuǎn)。
- ***********************************************************************/
- void Moto_TurnLeft()
- {
- P2= 0x69;
- Delay_1ms(100);
- }
- /********************************************************************
- * 名稱 :Moto_TurnRight()
- * 功能 : 電機(jī)1前進(jìn),電機(jī)2后退,整車表現(xiàn)為右轉(zhuǎn)。
- ***********************************************************************/
- void Moto_TurnRight()
- {
- P2= 0x96;
- Delay_1ms(100);
- }
- /********************************************************************
- * 名稱 :Moto_Stop()
- * 功能 : 電機(jī)1停止,電機(jī)2停止,整車表現(xiàn)為停止。
- ***********************************************************************/
- void Moto_Stop()
- {
-
- P2= 0x00;
- Delay_1ms(100);
- }
- /********************************************************************
- * 功能 : 舵機(jī)PWM中斷初始化
- ***********************************************************************/
- void Timer0Init()
- {
- /*0度=0.5ms, 45度=1ms, 90度=1.5ms, 135度=2ms, 180度=2.5ms
- /.5 ms初始值 F700, (12n/11059200=2.5/1000, n=2304, X=65536-2304=63232 > F700)*/
- TMOD |= 0x01; //使用模式1,16位定時(shí)器,使用"|"符號(hào)可以在使用多個(gè)定時(shí)器時(shí)不受影響
- TH0=-ms2_5Con>>8; //給定初值,17ms中斷
- TL0=-ms2_5Con;
- EA=1; //總中斷打開
- ET0=1; //定時(shí)器0中斷打開
- TR0=1; //定時(shí)器0開關(guān)打開
- }
- /********************************************************************
- * 功能 : 舵機(jī)PWM中斷, //舵機(jī)控制函數(shù) 周期為20ms 一個(gè)循環(huán)20MS = 8*2.5ms
- ***********************************************************************/
- void SteeringGear() interrupt 1
- {
- switch(pwm_flag)
- {
- case 1: servo0=1; TH0=-pwm[0]>>8; TL0=-pwm[0]; break;
- case 2: servo0=0; TH0=-(ms2_5Con-pwm[0])>>8; TL0=-(ms2_5Con-pwm[0]); break;
- case 3: servo1=1; TH0=-pwm[1]>>8; TL0=-pwm[1]; break;
- case 4: servo1=0; TH0=-(ms2_5Con-pwm[1])>>8; TL0=-(ms2_5Con-pwm[1]); break;
- case 5: servo2=1; TH0=-pwm[2]>>8; TL0=-pwm[2]; break;
- case 6: servo2=0; TH0=-(ms2_5Con-pwm[2])>>8; TL0=-(ms2_5Con-pwm[2]); break;
- case 7: servo3=1; TH0=-pwm[3]>>8; TL0=-pwm[3]; break;
- case 8: servo3=0; TH0=-(ms2_5Con-pwm[3])>>8; TL0=-(ms2_5Con-pwm[3]); break;
- case 9: servo4=1; TH0=-pwm[4]>>8; TL0=-pwm[4]; break;
- case 10: servo4=0; TH0=-(ms2_5Con-pwm[4])>>8; TL0=-(ms2_5Con-pwm[4]); break;
- case 11: servo5=1; TH0=-pwm[5]>>8; TL0=-pwm[5]; break;
- case 12: servo5=0; TH0=-(ms2_5Con-pwm[5])>>8; TL0=-(ms2_5Con-pwm[5]); break;
- case 13: servo6=1;TH0=-pwm[6]>>8; TL0=-pwm[6]; break;
- case 14: servo6=0;TH0=-(ms2_5Con-pwm[6])>>8; TL0=-(ms2_5Con-pwm[6]); break;
- case 15: servo7=1;TH0=-pwm[7]>>8; TL0=-pwm[7]; break;
- case 16: servo7=0;TH0=-(ms2_5Con-pwm[7])>>8; TL0=-(ms2_5Con-pwm[7]); break;
- default: TH0=0xff; TL0=0x80; pwm_flag=0;
- }
- pwm_flag++;
- }
-
- void SetSteeringGear(uchar i, uchar val)
- {
- uint a = (val+46)*10;
- if(a<ms0_5Con)
- a=ms0_5Con;
- if(a>ms2_5Con)
- a=ms2_5Con;
- pwm[ i]=a;
- CommandDatatable[2]=0xff; //清除緩存
- }
-
- /********************************************************************
- * 功能 : 串口中斷接收數(shù)據(jù)
- ***********************************************************************/
- /*********************************************************************************
- ** 函數(shù)功能 : 主函數(shù)
- *********************************************************************************/
- void main()
- {
- MainLight=0;
- Delay_1ms(200);
- Com_Init();//串口初始化
- Timer0Init();//舵機(jī)PWM中斷初始化
- while(1)
- {
- if(CommandDatatable[0]==0XFF && CommandDatatable[4]==0XFF)
- {
- switch (CommandDatatable[1]) //根據(jù)鍵值不同,執(zhí)行不同的內(nèi)容
- {
- case 0X00: //類型位0X00,表明是控制數(shù)據(jù)包,進(jìn)入控制數(shù)據(jù)case
- switch(CommandDatatable[2]) //根據(jù)數(shù)據(jù)位的值來(lái)進(jìn)行選擇執(zhí)行不同的動(dòng)作
- {
- case 0X00:Moto_Stop();break;
- case 0X01:Moto_Forward();break;
- case 0X02:Moto_Backward();break;
- case 0X03:Moto_TurnLeft();break;
- case 0X04:Moto_TurnRight();break;
- default : break;
- }
- break;
- case 0X01: //類型位0X01,表明是舵機(jī)數(shù)據(jù)包,進(jìn)入舵機(jī)case
- switch(CommandDatatable[2])
- {
- case 0x01:SetSteeringGear(0,CommandDatatable[3]);break;
- case 0x02:SetSteeringGear(1,CommandDatatable[3]);break;
- case 0x03:SetSteeringGear(2,CommandDatatable[3]);break;
- case 0x04:SetSteeringGear(3,CommandDatatable[3]);break;
- case 0x05:SetSteeringGear(4,CommandDatatable[3]);break;
- case 0x06:SetSteeringGear(5,CommandDatatable[3]);break;
- case 0x07:SetSteeringGear(6,CommandDatatable[3]);break;
- case 0x08:SetSteeringGear(7,CommandDatatable[3]);break;
- default : break;
- }
- break;
- case 0X02: //類型位0X02,表明是大燈數(shù)據(jù)包,進(jìn)入大燈case
- switch(CommandDatatable[2])
- {
- case 0X01:MainLight=1;break;
- case 0X02:MainLight=0;break;
- default : break;
- }
- break;
- default : break;
- }
- }
- }
- }
復(fù)制代碼
作者: lingshi1029 時(shí)間: 2015-1-22 11:12
厲害!。。!
作者: meilidianzhi 時(shí)間: 2015-2-14 19:18
樓主能發(fā)個(gè)電路圖吧
minmin_6666@163.com
作者: 破力達(dá) 時(shí)間: 2015-2-16 11:21
這個(gè)我喜歡,頂一個(gè)
作者: 202305415 時(shí)間: 2015-3-1 22:23
看樣子很性 不錯(cuò)
作者: kvlhn 時(shí)間: 2015-3-14 10:52
動(dòng)力十足
作者: wangkuli 時(shí)間: 2015-4-19 13:29
牛 厲害
作者: yuxin 時(shí)間: 2015-4-21 10:35
牛逼。。。。。!
作者: yuxin 時(shí)間: 2015-4-21 10:36
牛逼,希望我也能做出
作者: 心宇(語(yǔ)) 時(shí)間: 2015-4-22 22:28
學(xué)習(xí)一下,謝謝!
作者: 好男人就是我 時(shí)間: 2015-4-23 14:32
感謝分享~。!
作者: yesonjob 時(shí)間: 2015-4-23 17:34
大神~
我的目標(biāo)也是自己制作一個(gè)大型點(diǎn)的小車。
作者: deka 時(shí)間: 2015-6-14 09:31
厲害 高手
作者: rich3524 時(shí)間: 2015-7-13 10:13
厲害 高手
作者: yxfx 時(shí)間: 2015-7-16 06:15
這才是真正的高手,學(xué)習(xí)中
作者: 騰飛的龍 時(shí)間: 2015-8-3 19:47
這只是下位機(jī)程序,上位機(jī)的APP呢?求解謝謝。
作者: 人生過(guò)客 時(shí)間: 2015-8-5 15:39
攝像頭還是大了點(diǎn)
作者: 騰飛的龍 時(shí)間: 2015-8-6 14:12
這是我做的載人小車
-
IMG_20150326_180402.jpg
(664.49 KB, 下載次數(shù): 232)
下載附件
2015-8-6 14:11 上傳
我做的載人小車
作者: 李文軍 時(shí)間: 2015-8-8 09:24
喜歡這些
作者: 騎著蝸牛游世界 時(shí)間: 2016-4-16 23:29
在這居然能碰到校友
作者: lxa0 時(shí)間: 2016-8-7 02:41
求更多載人小車的資料~~~~~~~~~~~~~~謝謝!
作者: sax_yang 時(shí)間: 2016-11-8 08:23
樓主厲害,追求完全DIY!和樓主探討一下,那就是用模型用的鋰電換下那個(gè)18650組成的電池組是否可行,體積可以減小不少,而且各種放電倍率可以根據(jù)需要來(lái)選擇,而且充電口也是標(biāo)準(zhǔn)的,可以很方便的使用充電器進(jìn)行平衡充放電。
作者: gww19940326 時(shí)間: 2016-11-15 17:16
不錯(cuò)不錯(cuò)
作者: qjyjack612510 時(shí)間: 2017-3-21 23:07
非常NB。。。。學(xué)習(xí)了
作者: cathy221 時(shí)間: 2017-3-23 16:17
很好的創(chuàng)意頂起!
作者: samking 時(shí)間: 2017-5-18 02:26
mark一下~
作者: 我一歲 時(shí)間: 2017-6-12 18:38
能具體說(shuō)一下攝像頭部分嗎 萬(wàn)分感謝 QQ1275171943
作者: 906875672 時(shí)間: 2017-9-22 10:40
能不能請(qǐng)教一下啊,51單片機(jī)處理視頻數(shù)據(jù)速度跟的上嗎
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |