標(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ī)源程序:
  1. #include<reg52.h>

  2. #include<math.h>

  3. #include<intrins.h>

  4. #define uchar unsigned char

  5. #define uint unsigned int

  6. uchar Buffer =0; //從串口接收的數(shù)據(jù)

  7. uint URTAReceivedCount=0,n=1;

  8. uchar data Tempdatatable[5],CommandDatatable[5];//數(shù)據(jù)包

  9. uchar serVal[2];
  10. uint pwm[]={1120,1190,1382,1382,1382,1382,1382,1382}; //初始90度,(實(shí)際是1382.4,取整得1382)
  11. uchar pwm_flag=0;
  12. uint code ms0_5Con=461; //0.5ms計(jì)數(shù) (實(shí)際是460.8,取整得461)
  13. uint code ms2_5Con=2304; //2.5ms計(jì)數(shù)


  14. bit key_stime_ok;
  15. sbit StatusLight=P3^6; //狀態(tài)燈
  16. sbit MainLight=P3^7; //主大燈
  17. sbit servo0=P0^0; //舵機(jī)控制
  18. sbit servo1=P0^1;
  19. sbit servo2=P0^2;
  20. sbit servo3=P0^3;
  21. sbit servo4=P0^4;
  22. sbit servo5=P0^5;
  23. sbit servo6=P0^6;
  24. sbit servo7=P0^7;
  25. /********************************************************************
  26. * 名稱 : Delay_1ms()
  27. * 功能 : 延時(shí)子程序,延時(shí)時(shí)間為 1ms * x
  28. * 輸入 : x (延時(shí)一毫秒的個(gè)數(shù))
  29. * 輸出 : 無(wú)
  30. ***********************************************************************/
  31. void Delay_1ms(uint i)//1ms延時(shí)
  32. {
  33. uchar x,j;
  34. for(j=0;j<i;j++)
  35. for(x=0;x<=148;x++);
  36. }

  37. void TurnOnStatusLight()
  38. {
  39. StatusLight=0;
  40. }
  41. /********************************************************************
  42. * 名稱 : Send_Data()
  43. * 功能 : 向上位機(jī)傳送字符
  44. * 輸入 : 無(wú)
  45. * 輸出 : 無(wú)
  46. ***********************************************************************/
  47. void Send_Data(uchar type,uchar cmd,uchar dat)
  48. {
  49. uchar data Buffer[5];//構(gòu)建數(shù)據(jù)包
  50. uchar *p;
  51. uint Send_Count=0;
  52. p = Buffer;
  53. Buffer[0]=0XFF;
  54. Buffer[1]=type;
  55. Buffer[2]=cmd;
  56. Buffer[3]=dat;
  57. Buffer[4]=0XFF;
  58. while(1)
  59. {
  60. if(*p==0XFF)
  61. {
  62. Send_Count++; //0XFF標(biāo)志統(tǒng)計(jì)位
  63. }
  64. SBUF = *p; //發(fā)送
  65. while(!TI) //如果發(fā)送完畢,硬件會(huì)置位TI,等待發(fā)送完畢
  66. {
  67. _nop_();
  68. }
  69. p++;
  70. TI = 0;
  71. if(Send_Count == 2) //當(dāng)統(tǒng)計(jì)到兩次出現(xiàn)0XFF,則認(rèn)為一個(gè)數(shù)據(jù)包發(fā)送完畢,跳出循環(huán)
  72. {
  73. TI = 0;
  74. break;
  75. }
  76. }
  77. }
  78. /********************************************************************
  79. 協(xié)議規(guī)定:
  80. 包頭 類型位 數(shù)據(jù)位 數(shù)據(jù)位 結(jié)束位
  81. 0XFF 0X** OX** 0X** 0XFF
  82. 各命令說(shuō)明:
  83. 類型位 數(shù)據(jù)位 數(shù)據(jù)位 功能

  84. 0X00 0X02 0X00 前進(jìn)
  85. 0X00 0X01 0X00 后退
  86. 0X00 0X03 0X00 左轉(zhuǎn)
  87. 0X00 0X04 0X00 右轉(zhuǎn)
  88. 0X00 0X00 0X00 停止

  89. 0X01 0X01 角度 舵機(jī)1
  90. 0X01 0X02 . 舵機(jī)2
  91. 0X01 0X01 . 舵機(jī)3
  92. 0X01 0X02 . 舵機(jī)4
  93. 0X01 0X01 . 舵機(jī)5
  94. 0X01 0X02 . 舵機(jī)6
  95. 0X01 0X01 . 舵機(jī)7
  96. 0X01 0X02 數(shù)據(jù) 舵機(jī)8

  97. 0X02 0X01 車燈亮
  98. 0X02 0X02 車燈滅

  99. 0X03 雷達(dá)數(shù)據(jù) 發(fā)送雷達(dá)數(shù)據(jù)
  100. ***********************************************************************/
  101. /********************************************************************
  102. * 名稱 : Com_Int()
  103. * 功能 : 串口中斷子函數(shù)
  104. ***********************************************************************/
  105. void Com_Int(void) interrupt 4
  106. {
  107. uchar temp;
  108. ES=0; //關(guān)串口中斷
  109. RI=0; //軟件清除接收中斷
  110. temp=SBUF;
  111. if(temp==0XFF && URTAReceivedCount<3)
  112. {
  113. Tempdatatable[0]==0XFF; //包頭
  114. URTAReceivedCount++;
  115. }
  116. else
  117. {
  118. Tempdatatable[n]=temp;
  119. n++;
  120. if(URTAReceivedCount==0&&n==2)
  121. n=1;
  122. }

  123. if(URTAReceivedCount==2)//包尾
  124. {
  125. Tempdatatable[0]=0XFF;
  126. Tempdatatable[4]=0XFF;
  127. n=1;
  128. URTAReceivedCount=0; //組包完畢
  129. temp="";
  130. // Send_Data(Tempdatatable[1],Tempdatatable[2],Tempdatatable[3]); //發(fā)送組成的數(shù)據(jù)包回去
  131. }

  132. CommandDatatable[0]=Tempdatatable[0];
  133. CommandDatatable[1]=Tempdatatable[1];
  134. CommandDatatable[2]=Tempdatatable[2];
  135. CommandDatatable[3]=Tempdatatable[3];
  136. CommandDatatable[4]=Tempdatatable[4];

  137. ES=1;//開串口中斷


  138. }

  139. /********************************************************************
  140. * 名稱 : Com_Init()
  141. * 功能 : 串口初始化,晶振11.0592,波特率9600,使能了串口中斷
  142. ***********************************************************************/
  143. void Com_Init(void)
  144. {
  145. TMOD = 0x21;
  146. PCON = 0x00;
  147. SCON = 0x50;
  148. TH1 = 0xFd; //設(shè)置波特率 9600
  149. TL1 = 0xFd;
  150. TR1 = 1; //啟動(dòng)定時(shí)器1
  151. ES = 1; //開串口中斷
  152. EA = 1; //開總中斷
  153. IT0=0;
  154. EX0=1;
  155. }

  156. /********************************************************************
  157. * 名稱 :Moto_Forward()
  158. * 功能 : 電機(jī)1、2啟動(dòng),都是前進(jìn),整車表現(xiàn)為前進(jìn)。
  159. ***********************************************************************/
  160. void Moto_Forward()
  161. {
  162. P2= 0x55;
  163. Delay_1ms(100);
  164. }
  165. /********************************************************************
  166. * 名稱 :Moto_Backward()
  167. * 功能 : 電機(jī)1、2啟動(dòng),都是后退,整車表現(xiàn)為后退。
  168. ***********************************************************************/
  169. void Moto_Backward()
  170. {

  171. P2= 0xaa;
  172. Delay_1ms(100);
  173. }

  174. /********************************************************************
  175. * 名稱 :Moto_TurnLeft()
  176. * 功能 : 電機(jī)1后退,電機(jī)2前進(jìn),整車表現(xiàn)為左轉(zhuǎn)。
  177. ***********************************************************************/
  178. void Moto_TurnLeft()
  179. {
  180. P2= 0x69;
  181. Delay_1ms(100);
  182. }
  183. /********************************************************************
  184. * 名稱 :Moto_TurnRight()
  185. * 功能 : 電機(jī)1前進(jìn),電機(jī)2后退,整車表現(xiàn)為右轉(zhuǎn)。
  186. ***********************************************************************/
  187. void Moto_TurnRight()
  188. {
  189. P2= 0x96;
  190. Delay_1ms(100);
  191. }
  192. /********************************************************************
  193. * 名稱 :Moto_Stop()
  194. * 功能 : 電機(jī)1停止,電機(jī)2停止,整車表現(xiàn)為停止。
  195. ***********************************************************************/
  196. void Moto_Stop()
  197. {

  198. P2= 0x00;
  199. Delay_1ms(100);
  200. }
  201. /********************************************************************
  202. * 功能 : 舵機(jī)PWM中斷初始化
  203. ***********************************************************************/
  204. void Timer0Init()
  205. {
  206. /*0度=0.5ms, 45度=1ms, 90度=1.5ms, 135度=2ms, 180度=2.5ms
  207. /.5 ms初始值 F700, (12n/11059200=2.5/1000, n=2304, X=65536-2304=63232 > F700)*/
  208. TMOD |= 0x01; //使用模式1,16位定時(shí)器,使用"|"符號(hào)可以在使用多個(gè)定時(shí)器時(shí)不受影響
  209. TH0=-ms2_5Con>>8; //給定初值,17ms中斷
  210. TL0=-ms2_5Con;
  211. EA=1; //總中斷打開
  212. ET0=1; //定時(shí)器0中斷打開
  213. TR0=1; //定時(shí)器0開關(guān)打開
  214. }
  215. /********************************************************************
  216. * 功能 : 舵機(jī)PWM中斷, //舵機(jī)控制函數(shù) 周期為20ms 一個(gè)循環(huán)20MS = 8*2.5ms
  217. ***********************************************************************/
  218. void SteeringGear() interrupt 1
  219. {
  220. switch(pwm_flag)
  221. {
  222. case 1: servo0=1; TH0=-pwm[0]>>8; TL0=-pwm[0]; break;
  223. case 2: servo0=0; TH0=-(ms2_5Con-pwm[0])>>8; TL0=-(ms2_5Con-pwm[0]); break;
  224. case 3: servo1=1; TH0=-pwm[1]>>8; TL0=-pwm[1]; break;
  225. case 4: servo1=0; TH0=-(ms2_5Con-pwm[1])>>8; TL0=-(ms2_5Con-pwm[1]); break;
  226. case 5: servo2=1; TH0=-pwm[2]>>8; TL0=-pwm[2]; break;
  227. case 6: servo2=0; TH0=-(ms2_5Con-pwm[2])>>8; TL0=-(ms2_5Con-pwm[2]); break;
  228. case 7: servo3=1; TH0=-pwm[3]>>8; TL0=-pwm[3]; break;
  229. case 8: servo3=0; TH0=-(ms2_5Con-pwm[3])>>8; TL0=-(ms2_5Con-pwm[3]); break;
  230. case 9: servo4=1; TH0=-pwm[4]>>8; TL0=-pwm[4]; break;
  231. case 10: servo4=0; TH0=-(ms2_5Con-pwm[4])>>8; TL0=-(ms2_5Con-pwm[4]); break;
  232. case 11: servo5=1; TH0=-pwm[5]>>8; TL0=-pwm[5]; break;
  233. case 12: servo5=0; TH0=-(ms2_5Con-pwm[5])>>8; TL0=-(ms2_5Con-pwm[5]); break;
  234. case 13: servo6=1;TH0=-pwm[6]>>8; TL0=-pwm[6]; break;
  235. case 14: servo6=0;TH0=-(ms2_5Con-pwm[6])>>8; TL0=-(ms2_5Con-pwm[6]); break;
  236. case 15: servo7=1;TH0=-pwm[7]>>8; TL0=-pwm[7]; break;
  237. case 16: servo7=0;TH0=-(ms2_5Con-pwm[7])>>8; TL0=-(ms2_5Con-pwm[7]); break;
  238. default: TH0=0xff; TL0=0x80; pwm_flag=0;
  239. }
  240. pwm_flag++;
  241. }

  242. void SetSteeringGear(uchar i, uchar val)
  243. {
  244. uint a = (val+46)*10;
  245. if(a<ms0_5Con)
  246. a=ms0_5Con;
  247. if(a>ms2_5Con)
  248. a=ms2_5Con;
  249. pwm[ i]=a;
  250. CommandDatatable[2]=0xff; //清除緩存
  251. }

  252. /********************************************************************
  253. * 功能 : 串口中斷接收數(shù)據(jù)
  254. ***********************************************************************/
  255. /*********************************************************************************
  256. ** 函數(shù)功能 : 主函數(shù)
  257. *********************************************************************************/
  258. void main()
  259. {
  260. MainLight=0;
  261. Delay_1ms(200);
  262. Com_Init();//串口初始化
  263. Timer0Init();//舵機(jī)PWM中斷初始化
  264. while(1)
  265. {
  266. if(CommandDatatable[0]==0XFF && CommandDatatable[4]==0XFF)
  267. {
  268. switch (CommandDatatable[1]) //根據(jù)鍵值不同,執(zhí)行不同的內(nèi)容
  269. {
  270. case 0X00: //類型位0X00,表明是控制數(shù)據(jù)包,進(jìn)入控制數(shù)據(jù)case
  271. switch(CommandDatatable[2]) //根據(jù)數(shù)據(jù)位的值來(lái)進(jìn)行選擇執(zhí)行不同的動(dòng)作
  272. {
  273. case 0X00:Moto_Stop();break;
  274. case 0X01:Moto_Forward();break;
  275. case 0X02:Moto_Backward();break;
  276. case 0X03:Moto_TurnLeft();break;
  277. case 0X04:Moto_TurnRight();break;
  278. default : break;
  279. }
  280. break;
  281. case 0X01: //類型位0X01,表明是舵機(jī)數(shù)據(jù)包,進(jìn)入舵機(jī)case
  282. switch(CommandDatatable[2])
  283. {
  284. case 0x01:SetSteeringGear(0,CommandDatatable[3]);break;
  285. case 0x02:SetSteeringGear(1,CommandDatatable[3]);break;
  286. case 0x03:SetSteeringGear(2,CommandDatatable[3]);break;
  287. case 0x04:SetSteeringGear(3,CommandDatatable[3]);break;
  288. case 0x05:SetSteeringGear(4,CommandDatatable[3]);break;
  289. case 0x06:SetSteeringGear(5,CommandDatatable[3]);break;
  290. case 0x07:SetSteeringGear(6,CommandDatatable[3]);break;
  291. case 0x08:SetSteeringGear(7,CommandDatatable[3]);break;
  292. default : break;
  293. }
  294. break;
  295. case 0X02: //類型位0X02,表明是大燈數(shù)據(jù)包,進(jìn)入大燈case
  296. switch(CommandDatatable[2])
  297. {
  298. case 0X01:MainLight=1;break;
  299. case 0X02:MainLight=0;break;
  300. default : break;
  301. }
  302. break;
  303. default : break;
  304. }
  305. }
  306. }
  307. }
復(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
yesonjob 發(fā)表于 2015-4-23 17:34
大神~
我的目標(biāo)也是自己制作一個(gè)大型點(diǎn)的小車。

這是我做的載人小車

IMG_20150326_180402.jpg (664.49 KB, 下載次數(shù): 232)

我做的載人小車

我做的載人小車

作者: 李文軍    時(shí)間: 2015-8-8 09:24
喜歡這些
作者: 騎著蝸牛游世界    時(shí)間: 2016-4-16 23:29
在這居然能碰到校友
作者: lxa0    時(shí)間: 2016-8-7 02:41
騰飛的龍 發(fā)表于 2015-8-6 14:12
這是我做的載人小車

求更多載人小車的資料~~~~~~~~~~~~~~謝謝!
作者: 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