找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 14627|回复: 27
收起左侧

我的移动侦查小车(多图附程序)

  [复制链接]
ID:70941 发表于 2014-12-27 01:40 | 显示全部楼层 |阅读模式
       在犹豫是做飞机还是小车很久以后,终于选择做一个移动机器人。原因有以下几点: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. }
复制代码



回复

使用道具 举报

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 来自手机 | 显示全部楼层
这个我喜欢,顶一个
回复

使用道具 举报

ID:73964 发表于 2015-3-1 22:23 | 显示全部楼层
看样子很性  不错
回复

使用道具 举报

ID:16408 发表于 2015-3-14 10:52 | 显示全部楼层
动力十足
回复

使用道具 举报

ID:77329 发表于 2015-4-19 13:29 来自手机 | 显示全部楼层
牛  厉害
回复

使用道具 举报

ID:77579 发表于 2015-4-21 10:35 | 显示全部楼层
牛逼!!!!!!!
回复

使用道具 举报

ID:77579 发表于 2015-4-21 10:36 | 显示全部楼层
牛逼,希望我也能做出
回复

使用道具 举报

ID:53925 发表于 2015-4-22 22:28 | 显示全部楼层
学习一下,谢谢!
回复

使用道具 举报

ID:77523 发表于 2015-4-23 14:32 来自手机 | 显示全部楼层
感谢分享~!!!
回复

使用道具 举报

ID:74245 发表于 2015-4-23 17:34 | 显示全部楼层
大神~
我的目标也是自己制作一个大型点的小车。
回复

使用道具 举报

ID:82808 发表于 2015-6-14 09:31 | 显示全部楼层
厉害  高手
回复

使用道具 举报

ID:61343 发表于 2015-7-13 10:13 | 显示全部楼层
厉害  高手
回复

使用道具 举报

ID:85059 发表于 2015-7-16 06:15 | 显示全部楼层
这才是真正的高手,学习中
回复

使用道具 举报

ID:79544 发表于 2015-8-3 19:47 | 显示全部楼层
这只是下位机程序,上位机的APP呢?求解谢谢。
回复

使用道具 举报

ID:52048 发表于 2015-8-5 15:39 | 显示全部楼层
摄像头还是大了点
回复

使用道具 举报

ID:79544 发表于 2015-8-6 14:12 | 显示全部楼层
yesonjob 发表于 2015-4-23 17:34
大神~
我的目标也是自己制作一个大型点的小车。

这是我做的载人小车

我做的载人小车

我做的载人小车
回复

使用道具 举报

ID:87902 发表于 2015-8-8 09:24 | 显示全部楼层
喜欢这些
回复

使用道具 举报

ID:114460 发表于 2016-4-16 23:29 | 显示全部楼层
在这居然能碰到校友
回复

使用道具 举报

ID:74784 发表于 2016-8-7 02:41 | 显示全部楼层
腾飞的龙 发表于 2015-8-6 14:12
这是我做的载人小车

求更多载人小车的资料~~~~~~~~~~~~~~谢谢!
回复

使用道具 举报

ID:146651 发表于 2016-11-8 08:23 | 显示全部楼层
楼主厉害,追求完全DIY!和楼主探讨一下,那就是用模型用的锂电换下那个18650组成的电池组是否可行,体积可以减小不少,而且各种放电倍率可以根据需要来选择,而且充电口也是标准的,可以很方便的使用充电器进行平衡充放电。
回复

使用道具 举报

ID:148074 发表于 2016-11-15 17:16 | 显示全部楼层
不错不错
回复

使用道具 举报

ID:177855 发表于 2017-3-21 23:07 | 显示全部楼层
非常NB。。。。学习了
回复

使用道具 举报

ID:182808 发表于 2017-3-23 16:17 | 显示全部楼层
很好的创意顶起!
回复

使用道具 举报

ID:101775 发表于 2017-5-18 02:26 来自手机 | 显示全部楼层
mark一下~
回复

使用道具 举报

ID:196216 发表于 2017-6-12 18:38 | 显示全部楼层
能具体说一下摄像头部分吗 万分感谢 QQ1275171943
回复

使用道具 举报

ID:226003 发表于 2017-9-22 10:40 | 显示全部楼层
能不能请教一下啊,51单片机处理视频数据速度跟的上吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表