找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 16136|回復: 27
打印 上一主題 下一主題
收起左側(cè)

我的移動偵查小車(多圖附程序)

  [復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:70941 發(fā)表于 2014-12-27 01:40 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
       在猶豫是做飛機還是小車很久以后,終于選擇做一個移動機器人。原因有以下幾點:1,飛機消耗太大。2,飛機空機無法DIY,少了樂趣。3,場地有限。4,和我的專業(yè)結(jié)合不緊密。5,輪式驅(qū)動好控制。
生活少了許多自由的時間,所以擠擠晚上睡覺的時間花了大約3周基本實現(xiàn)了機器人的移動控制,視頻傳輸。在以后會加上機械臂,各種傳感器,如果有可能還會弄弄視覺識別。
之所以說是移動機器人,是因為本身的定位比較高,我不希望用廉價的材料做出一個試驗型的小車。我要做就做實用的,一步到位的。錢倒不是什么問題,每個月的錢就夠買材料的。只是很多機械結(jié)構(gòu)沒有條件自己做,所以只好用成品。興趣是最好的老師,重在過程不在結(jié)果。
下面介紹我的車,由于做出來沒多久還有很多不足的地方,下一步就是要換一個更長的地盤,用6輪驅(qū)動,換大輪。
下面是基本完成后的小車:


完成了視頻傳輸?shù)男≤嚕桨咫娔X里面可以看到小車攝像頭拍到的視頻。

下面是各個部件:

1,TP-LINK 路由器  刷固件后用來進行圖傳和數(shù)傳。淘寶上價格在150左右,已經(jīng)刷好了固件。


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


3,裝好2自由度舵機云臺的攝像頭


4,裝好的小車底盤。85MM輪,37MM電機,20X15CM底盤。


5,小車底盤和37金屬電機。金屬電機24元一個,輪12元一個。


6,L298電機驅(qū)動模塊


7,安裝好電池和保護板及充電電路。


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


9,控制電路。采用STC89C52單片機。


10,上板前視圖。有四個LED大燈


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


12,整機仰視圖


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


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



15,整機圖

下面介紹一下小車的基本原理



一,小車的圖傳和數(shù)傳原理:
本小車采用開源的無線路由器進行圖傳和數(shù)傳。圖傳主要是將攝像頭視頻通過路由器傳輸?shù)缴衔粰C上。數(shù)傳主要是用上位機軟件進行小車的控制,如行走,轉(zhuǎn)彎。
關(guān)于路由器的固件刷機,參照網(wǎng)址:http://www.wifi-robots.com/。
二,小車的下位機控制部分:
本著DIY的目的,采用了51單片機加L298電機驅(qū)動。具體采用了STC89C52單片機。具體C源程序在后面,已通過測試。
三,小車的底盤部分:
采用6061鋁,37MM金屬減速電機,85MM輪。采用四輪驅(qū)動。
四,小車電源部分:
采用9節(jié)18650鋰電。通過實際運行動力強勁,續(xù)航強。電池采用3X3連接,共11V輸出。電源部分設(shè)計了充電保護板和輸出保險設(shè)計。
五,大燈電路;
采用四個大功率LED,繼電器模塊和限流模塊。
,  設(shè)計了對講機電路
七,還未設(shè)計紅外避障,超聲波測距等

附51單片機源程序:
  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度,(實際是1382.4,取整得1382)
  11. uchar pwm_flag=0;
  12. uint code ms0_5Con=461; //0.5ms計數(shù) (實際是460.8,取整得461)
  13. uint code ms2_5Con=2304; //2.5ms計數(shù)


  14. bit key_stime_ok;
  15. sbit StatusLight=P3^6; //狀態(tài)燈
  16. sbit MainLight=P3^7; //主大燈
  17. sbit servo0=P0^0; //舵機控制
  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. * 功能 : 延時子程序,延時時間為 1ms * x
  28. * 輸入 : x (延時一毫秒的個數(shù))
  29. * 輸出 : 無
  30. ***********************************************************************/
  31. void Delay_1ms(uint i)//1ms延時
  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. * 功能 : 向上位機傳送字符
  44. * 輸入 : 無
  45. * 輸出 : 無
  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標志統(tǒng)計位
  63. }
  64. SBUF = *p; //發(fā)送
  65. while(!TI) //如果發(fā)送完畢,硬件會置位TI,等待發(fā)送完畢
  66. {
  67. _nop_();
  68. }
  69. p++;
  70. TI = 0;
  71. if(Send_Count == 2) //當統(tǒng)計到兩次出現(xiàn)0XFF,則認為一個數(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. 各命令說明:
  83. 類型位 數(shù)據(jù)位 數(shù)據(jù)位 功能

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

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

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

  99. 0X03 雷達數(shù)據(jù) 發(fā)送雷達數(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; //啟動定時器1
  151. ES = 1; //開串口中斷
  152. EA = 1; //開總中斷
  153. IT0=0;
  154. EX0=1;
  155. }

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

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

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

  198. P2= 0x00;
  199. Delay_1ms(100);
  200. }
  201. /********************************************************************
  202. * 功能 : 舵機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位定時器,使用"|"符號可以在使用多個定時器時不受影響
  209. TH0=-ms2_5Con>>8; //給定初值,17ms中斷
  210. TL0=-ms2_5Con;
  211. EA=1; //總中斷打開
  212. ET0=1; //定時器0中斷打開
  213. TR0=1; //定時器0開關(guān)打開
  214. }
  215. /********************************************************************
  216. * 功能 : 舵機PWM中斷, //舵機控制函數(shù) 周期為20ms 一個循環(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();//舵機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ù)包,進入控制數(shù)據(jù)case
  271. switch(CommandDatatable[2]) //根據(jù)數(shù)據(jù)位的值來進行選擇執(zhí)行不同的動作
  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,表明是舵機數(shù)據(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ù)包,進入大燈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. }
復制代碼



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏9 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:56903 發(fā)表于 2015-1-22 11:12 | 只看該作者
厲害�。。。�!
回復

使用道具 舉報

板凳
ID:48413 發(fā)表于 2015-2-14 19:18 | 只看該作者
樓主能發(fā)個電路圖吧
minmin_6666@163.com
回復

使用道具 舉報

地板
ID:73684 發(fā)表于 2015-2-16 11:21 來自手機 | 只看該作者
這個我喜歡,頂一個
回復

使用道具 舉報

5#
ID:73964 發(fā)表于 2015-3-1 22:23 | 只看該作者
看樣子很性  不錯
回復

使用道具 舉報

6#
ID:16408 發(fā)表于 2015-3-14 10:52 | 只看該作者
動力十足
回復

使用道具 舉報

7#
ID:77329 發(fā)表于 2015-4-19 13:29 來自手機 | 只看該作者
牛  厲害
回復

使用道具 舉報

8#
ID:77579 發(fā)表于 2015-4-21 10:35 | 只看該作者
牛逼!�。。。。�!
回復

使用道具 舉報

9#
ID:77579 發(fā)表于 2015-4-21 10:36 | 只看該作者
牛逼,希望我也能做出
回復

使用道具 舉報

10#
ID:53925 發(fā)表于 2015-4-22 22:28 | 只看該作者
學習一下,謝謝!
回復

使用道具 舉報

11#
ID:77523 發(fā)表于 2015-4-23 14:32 來自手機 | 只看該作者
感謝分享~!��!
回復

使用道具 舉報

12#
ID:74245 發(fā)表于 2015-4-23 17:34 | 只看該作者
大神~
我的目標也是自己制作一個大型點的小車。
回復

使用道具 舉報

13#
ID:82808 發(fā)表于 2015-6-14 09:31 | 只看該作者
厲害  高手
回復

使用道具 舉報

14#
ID:61343 發(fā)表于 2015-7-13 10:13 | 只看該作者
厲害  高手
回復

使用道具 舉報

15#
ID:85059 發(fā)表于 2015-7-16 06:15 | 只看該作者
這才是真正的高手,學習中
回復

使用道具 舉報

16#
ID:79544 發(fā)表于 2015-8-3 19:47 | 只看該作者
這只是下位機程序,上位機的APP呢?求解謝謝。
回復

使用道具 舉報

17#
ID:52048 發(fā)表于 2015-8-5 15:39 | 只看該作者
攝像頭還是大了點
回復

使用道具 舉報

18#
ID:79544 發(fā)表于 2015-8-6 14:12 | 只看該作者
yesonjob 發(fā)表于 2015-4-23 17:34
大神~
我的目標也是自己制作一個大型點的小車。

這是我做的載人小車

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

我做的載人小車

我做的載人小車
回復

使用道具 舉報

19#
ID:87902 發(fā)表于 2015-8-8 09:24 | 只看該作者
喜歡這些
回復

使用道具 舉報

20#
ID:114460 發(fā)表于 2016-4-16 23:29 | 只看該作者
在這居然能碰到校友
回復

使用道具 舉報

21#
ID:74784 發(fā)表于 2016-8-7 02:41 | 只看該作者
騰飛的龍 發(fā)表于 2015-8-6 14:12
這是我做的載人小車

求更多載人小車的資料~~~~~~~~~~~~~~謝謝!
回復

使用道具 舉報

22#
ID:146651 發(fā)表于 2016-11-8 08:23 | 只看該作者
樓主厲害,追求完全DIY!和樓主探討一下,那就是用模型用的鋰電換下那個18650組成的電池組是否可行,體積可以減小不少,而且各種放電倍率可以根據(jù)需要來選擇,而且充電口也是標準的,可以很方便的使用充電器進行平衡充放電。
回復

使用道具 舉報

23#
ID:148074 發(fā)表于 2016-11-15 17:16 | 只看該作者
不錯不錯
回復

使用道具 舉報

24#
ID:177855 發(fā)表于 2017-3-21 23:07 | 只看該作者
非常NB。。。。學習了
回復

使用道具 舉報

25#
ID:182808 發(fā)表于 2017-3-23 16:17 | 只看該作者
很好的創(chuàng)意頂起!
回復

使用道具 舉報

26#
ID:101775 發(fā)表于 2017-5-18 02:26 來自手機 | 只看該作者
mark一下~
回復

使用道具 舉報

27#
ID:196216 發(fā)表于 2017-6-12 18:38 | 只看該作者
能具體說一下攝像頭部分嗎 萬分感謝 QQ1275171943
回復

使用道具 舉報

28#
ID:226003 發(fā)表于 2017-9-22 10:40 | 只看該作者
能不能請教一下啊,51單片機處理視頻數(shù)據(jù)速度跟的上嗎
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表