久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 16020|回復: 27
打印 上一主題 下一主題
收起左側

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

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


完成了視頻傳輸的小車,平板電腦里面可以看到小車攝像頭拍到的視頻。

下面是各個部件:

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


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


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


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


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


6,L298電機驅動模塊


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


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


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


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


11,RS232電平轉換模塊


12,整機仰視圖


13,上底板三層積木構架


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



15,整機圖

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



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

附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; //從串口接收的數據

  7. uint URTAReceivedCount=0,n=1;

  8. uchar data Tempdatatable[5],CommandDatatable[5];//數據包

  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計數 (實際是460.8,取整得461)
  13. uint code ms2_5Con=2304; //2.5ms計數


  14. bit key_stime_ok;
  15. sbit StatusLight=P3^6; //狀態燈
  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 (延時一毫秒的個數)
  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];//構建數據包
  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標志統計位
  63. }
  64. SBUF = *p; //發送
  65. while(!TI) //如果發送完畢,硬件會置位TI,等待發送完畢
  66. {
  67. _nop_();
  68. }
  69. p++;
  70. TI = 0;
  71. if(Send_Count == 2) //當統計到兩次出現0XFF,則認為一個數據包發送完畢,跳出循環
  72. {
  73. TI = 0;
  74. break;
  75. }
  76. }
  77. }
  78. /********************************************************************
  79. 協議規定:
  80. 包頭 類型位 數據位 數據位 結束位
  81. 0XFF 0X** OX** 0X** 0XFF
  82. 各命令說明:
  83. 類型位 數據位 數據位 功能

  84. 0X00 0X02 0X00 前進
  85. 0X00 0X01 0X00 后退
  86. 0X00 0X03 0X00 左轉
  87. 0X00 0X04 0X00 右轉
  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 數據 舵機8

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

  99. 0X03 雷達數據 發送雷達數據
  100. ***********************************************************************/
  101. /********************************************************************
  102. * 名稱 : Com_Int()
  103. * 功能 : 串口中斷子函數
  104. ***********************************************************************/
  105. void Com_Int(void) interrupt 4
  106. {
  107. uchar temp;
  108. ES=0; //關串口中斷
  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]); //發送組成的數據包回去
  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; //設置波特率 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啟動,都是前進,整車表現為前進。
  159. ***********************************************************************/
  160. void Moto_Forward()
  161. {
  162. P2= 0x55;
  163. Delay_1ms(100);
  164. }
  165. /********************************************************************
  166. * 名稱 :Moto_Backward()
  167. * 功能 : 電機1、2啟動,都是后退,整車表現為后退。
  168. ***********************************************************************/
  169. void Moto_Backward()
  170. {

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

  174. /********************************************************************
  175. * 名稱 :Moto_TurnLeft()
  176. * 功能 : 電機1后退,電機2前進,整車表現為左轉。
  177. ***********************************************************************/
  178. void Moto_TurnLeft()
  179. {
  180. P2= 0x69;
  181. Delay_1ms(100);
  182. }
  183. /********************************************************************
  184. * 名稱 :Moto_TurnRight()
  185. * 功能 : 電機1前進,電機2后退,整車表現為右轉。
  186. ***********************************************************************/
  187. void Moto_TurnRight()
  188. {
  189. P2= 0x96;
  190. Delay_1ms(100);
  191. }
  192. /********************************************************************
  193. * 名稱 :Moto_Stop()
  194. * 功能 : 電機1停止,電機2停止,整車表現為停止。
  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開關打開
  214. }
  215. /********************************************************************
  216. * 功能 : 舵機PWM中斷, //舵機控制函數 周期為20ms 一個循環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. * 功能 : 串口中斷接收數據
  254. ***********************************************************************/
  255. /*********************************************************************************
  256. ** 函數功能 : 主函數
  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]) //根據鍵值不同,執行不同的內容
  269. {
  270. case 0X00: //類型位0X00,表明是控制數據包,進入控制數據case
  271. switch(CommandDatatable[2]) //根據數據位的值來進行選擇執行不同的動作
  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,表明是舵機數據包,進入舵機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,表明是大燈數據包,進入大燈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 分享淘帖 頂 踩
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

這是我做的載人小車

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

我做的載人小車

我做的載人小車
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: av网址在线播放 | 国产精彩视频在线观看 | 亚洲视频免费 | 99成人在线视频 | 人人人人干 | 操到爽 | 久久精品国产一区二区电影 | 免费久久精品 | 亚洲国产网站 | 免费三级黄| 成人在线中文字幕 | 国精久久 | 亚洲久草| 99精品国产一区二区青青牛奶 | 国产精品亚洲一区二区三区在线 | 久久久久久久久久久高潮一区二区 | 国产一区高清 | 欧美日韩综合一区 | 精品国产一区二区三区久久久蜜月 | 午夜小电影 | 久久久久免费精品国产小说色大师 | 日韩不卡在线观看 | 久久久久久久一级 | 国产精品视频偷伦精品视频 | 亚洲中午字幕 | 自拍偷拍中文字幕 | 97色在线视频 | 高清国产午夜精品久久久久久 | 国产成人精品一区二区三区在线 | 久久婷婷国产麻豆91 | 国产乱码精品一区二区三区中文 | 国产一区二区三区在线视频 | 成人在线精品视频 | 成人av免费| 一级毛片大全免费播放 | 男女网站在线观看 | 久久大全| 国产伦精品一区二区三区在线 | 2023亚洲天堂 | 久久精品国产精品青草 | 羞羞视频免费观 |