找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 12638|回复: 18
收起左侧

避障循迹小车制作(有舵机)多图

  [复制链接]
ID:246103 发表于 2017-12-14 16:51 | 显示全部楼层 |阅读模式
       很高兴有这么个机会可以发帖子,这是我第一次在网络上发帖子
这次的diy项目,是避障循迹小车。本人纯属个人爱好,没有这方面的经验。唯一占点优势的是,我是从事软件开发的。虽然没接触过c语言,但基本都懂。
       前年做过一个8*8*8的光立方,虽然也能点亮灯。但是整体过程都是参考网上,就是照葫芦画瓢,最后的效果也是非常不理想。感觉没什么意思。
       做这个小车,也是蓄谋已久,终于狠下心开始弄。因为对这方面的不了解,包括买元件,买错好几次,所以此次成本控制的非常不理想。希望我这个帖子可以帮助到一些想做的朋友。
P71109-174347.jpg P71109-174345.jpg
进入正题
此小车为四驱驱动 车底盘网上买的现成的
使用stc89c52rc芯片
l298n电机驱动模块(网上买的现成的 当时想自己做 但是看说是有很多互相干扰的因素 没敢尝试)
四路红外寻迹
超声波避障

小车主要逻辑是检测到黑线 按黑线行走 没有黑线 转到避障模式。

一、底盘
小车的底盘,我是在网上买的现成的。 比较坑爹的是,因为我的最小系统是自己焊接的。而且其他模块也都是单独购买,因为不是和底盘是一套的东西。所以看着底盘上的开孔什么的非常多。
但是都和我设计的不一样 所以我自己又借的电转自己转的眼。建议想做的朋友,如果动手能力强就自己做个底盘,然后买几个电机和轮子。
1.jpg


二、焊接最小系统
这一块基本了解一些,所以基本还可以。比较顺利。我的焊接水平有限,大家勿喷

P71122-221510.jpg P71122-221502.jpg P71122-221459.jpg


三、测试电机驱动模块
因为我都不是很懂 所以每个阶段都需要反复测试
电机驱动,我使用的网上现成的L298n模块。使用了两个,一个模块驱动两个电机。控制方式是一个模块控制前两个轮子,另外一个控制后两个轮子。这块的连线应该还是比较容易的
网上搜索有一堆资料。这块还是强调一下,要和单片机共地。 另外说一嘴,电机的导线接的长一点。我的驱动因为放在底层的底盘,所以弄的短了些。当时我手头没有104电容,所以电机也没焊接
电容。但是还好,我没遇到干扰的问题。建议焊接上,具体什么作用,我就不大了解了,说是滤波。


P71111-190510.jpg P71111-190513.jpg P71111-190507.jpg


四、测试舵机
舵机这块是我最挠头的,调试时间最长。程序调了好久,电路也调整好几次。我一开始连接到p0上了,怎么弄都不好用。后来查了一下,p0端口需要焊接上拉电阻(应该没叫错吧)。但是舵机各种神奇
的现象。要么一圈一圈的转(正常180度),要么不动。最后怀疑是不是舵机坏掉了。一狠心在网上又买了两个。回来测试还是这样。 然后又拿出一开始的那个,还是原来的电路,还是原来的程序,居然可以了。
应该是我程序上控制了转动时候 不是完全的90度 不到90度就停下来(控制方波长度)。正好在单位捡了一块抽屉底下的小木板,就自己用壁纸刀切了一个舵机云台。感觉还不错。哈哈

P71125-104100.jpg


五、避障模式
电机驱动、电机、舵机都拼到一块。发现的电源根本带不动,后来查了一下需要18650电池。原来查资料以为就是普通的五号电池。我这也不知道还有这种电池啊。就买了两节。回来发现电机就是不动。然后用12v的变压器
测试都是正常的。测试两节电池串联电压大约在7.4v,感觉应该够了。反正就还是不行。然后我就又买了两节。用了三节电池都还是不行。然后就是拆开整个小车,分析各个电路,就都是发现不了问题。只要单片机供上电
电机就停止。当时晚上鼓捣的,不知怎么鬼使神差的居然把芯片烧掉了。然后换个芯片,又烧掉了。后来发现应该是有一个驱动模块稳压模块坏了,输出的电压不是5v。直接变成高电压了。最后的最后才发现,最终的
损失不止两个芯片一个驱动模块,居然连超声波也烧坏了一个。没办法没芯片了,又得等好几天了。 然后后来发现 我电池还是得充电,未充满。我tm也是醉了。 没文化这可怕啊。最后的最后 实在是各种神经问题。
就采用单片机和驱动单独供电。两节电池供电机,一节电池供单片机。基本稳定下来了。程序就比较容易了。我懂了机制,程序问题不大。


六、循迹模式
我一开始没控制电机驱动的通道使能。小车都是全速前进的。在循迹这块发现不行了,跑的太快了。小车都冲出跑道。唉 真心觉得不能偷懒 又都都拆开,重新接上杜邦线。这块也发现,因为我个人不算有洁癖,但还是希望
小车整体看起来利索点。所以驱动和红外模块都放在底层底盘了。这个其实不是特别方便。因为在调试的时候 看不到红外模块的指示灯。大家可以注意点。
调整程序 通过占空比 控制轮子转速。这块程序也比较顺利 程序基本是一次性通过。


最终效果:
P71125-102753.jpg P71124-234309.jpg P71124-234319.jpg P71125-102757.jpg


电路图我没有了 就是参考网上焊接的。程序放上来 可能不符合行业标准 大家别笑话。

这次瞎胡闹,感觉结果还不错,实现自己想要的功能了。满满的成就感。这里特别感谢一下网友,有个网友特别热心,请教的问题都是知无不言。
帖子就到这里 大家有什么问题可以提出来 反正我也不一定会……哈哈

部分单片机源程序:
  1. #include <reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char

  4. /********常量声明********/
  5. #define uint unsigned int

  6. /********方法声明********/
  7. void Init();
  8. void Delay10us();                //@12.000MHz
  9. void Run();
  10. void ToLeft();
  11. void ToRight();
  12. void ToForward();
  13. void ToBack();
  14. void KeyScan();

  15. /********针脚声明********/
  16. sbit Left_Lamp = P1^0;     //左转向灯
  17. sbit Right_Lamp = P1^1;    //右转向灯
  18. sbit Forward_Lamp = P1^2;  //前进 大灯
  19. sbit Back_Lamp = P1^3;     //后退 大灯

  20. sbit Left_Switch = P1^4;    //左转向 按键 主要用于测试 控制左转 左转向灯变亮
  21. sbit Right_Switch = P1^5;   //右转向 按键 主要用于测试 控制右转 右转向灯变亮
  22. sbit Forward_Switch = P1^6; //前进 按键 主要用于测试 控制前进 前进灯变亮
  23. sbit Back_Switch = P1^7;    //后退 按键 主要用于测试 控制后退 后退灯变亮

  24. /********电机驱动针脚********/
  25. sbit P2_0 = P2^0;
  26. sbit P2_1 = P2^1;
  27. sbit P2_2 = P2^2;
  28. sbit P2_3 = P2^3;
  29. sbit P2_4 = P2^4;
  30. sbit P2_5 = P2^5;
  31. sbit P2_6 = P2^6;
  32. sbit P2_7 = P2^7;

  33. /********电机动作定义********/
  34. #define Left_Moto_Go    {P2_0=1, P2_1=0, P2_2=1, P2_3=0;} //左边两个电机向前走
  35. #define Left_Moto_Back  {P2_0=0, P2_1=1, P2_2=0, P2_3=1;} //左边两个电机向后转
  36. #define Left_Moto_Stop  {P2_0=0, P2_1=0, P2_2=0, P2_3=0;} //左边两个电机停转
  37. #define Right_Moto_Go   {P2_4=1, P2_5=0, P2_6=1, P2_7=0;} //右边两个电机向前走
  38. #define Right_Moto_Back {P2_4=0, P2_5=1, P2_6=0, P2_7=1;} //右边两个电机向前走
  39. #define Right_Moto_Stop {P2_4=0, P2_5=0, P2_6=0, P2_7=0;} //右边两个电机停转

  40. uint Left_Switch_Flag = 0;      //左转向按下标志
  41. uint Right_Switch_Flag = 0;     //右转向按下标志
  42. uint Forward_Switch_Flag = 0;   //前进按下标志
  43. uint Back_Switch_Flag = 0;      //后退按下标志

  44. /********主函数********/
  45. void main()
  46. {
  47.         Init();

  48.         while(1)
  49.         {
  50.                 Run();       
  51.         }
  52. }

  53. /********系统初始化********/
  54. void Init()
  55. {
  56.        
  57. }

  58. /********开始运行********/
  59. void Run()
  60. {
  61.     KeyScan();
  62.         if (Left_Switch_Flag)
  63.         {
  64.                 ToLeft();               
  65.         }else
  66.         {
  67.                 Left_Lamp = 1;
  68.         }       

  69.         if (Right_Switch_Flag)
  70.         {
  71.                 ToRight();               
  72.         }else
  73.         {
  74.                 Right_Lamp = 1;
  75.         }

  76.         if (Forward_Switch_Flag)
  77.         {
  78.                 ToForward();               
  79.         }else
  80.         {
  81.                 Forward_Lamp = 1;
  82.         }

  83.         if (Back_Switch_Flag)
  84.         {
  85.                 ToBack();               
  86.         }else
  87.         {
  88.                 Back_Lamp = 1;
  89.         }         
  90. }

  91. /********按键判断函数********/
  92. void KeyScan()
  93. {
  94.         if (Left_Switch == 0)    //左转向按下
  95.         {
  96.                 Delay10us();
  97.                 if (Left_Switch == 0)
  98.                 {
  99.                         while(Left_Switch==0);  //等待按键抬起
  100.                         Left_Switch_Flag = !Left_Switch_Flag;
  101.                         Right_Switch_Flag = 0;       
  102.                         Forward_Switch_Flag = 0;       
  103.                         Back_Switch_Flag = 0;                                       
  104.                 }
  105.         }
  106.        
  107.         if (Right_Switch == 0)    //右转向按下
  108.         {
  109.                 Delay10us();
  110.                 if (Right_Switch == 0)
  111.                 {       
  112.                         while(Right_Switch==0);  //等待按键抬起       
  113.                         Left_Switch_Flag = 0;
  114.                         Right_Switch_Flag = !Right_Switch_Flag;
  115.                         Forward_Switch_Flag = 0;       
  116.                         Back_Switch_Flag = 0;
  117.                 }
  118.         }
  119.        
  120.         if (Forward_Switch == 0)    //前进按下
  121.         {
  122.                 Delay10us();
  123.                 if (Forward_Switch == 0)
  124.                 {
  125.                         while(Forward_Switch==0);  //等待按键抬起
  126.                         Forward_Switch_Flag = !Forward_Switch_Flag;
  127.                         Left_Switch_Flag = 0;
  128.                         Right_Switch_Flag = 0;
  129.                         Back_Switch_Flag = 0;       
  130.                 }
  131.         }
  132.        
  133.         if (Back_Switch == 0)    //后退向按下
  134.         {
  135.                 Delay10us();
  136.                 if (Back_Switch == 0)
  137.                 {
  138.                         while(Back_Switch==0);  //等待按键抬起
  139.                         Back_Switch_Flag = !Back_Switch_Flag;
  140.                         Forward_Switch_Flag = 0;
  141.                         Left_Switch_Flag = 0;
  142.                         Right_Switch_Flag = 0;       
  143.                 }
  144.         }       
  145. }

  146. /********小车向左 左转向灯闪烁 右侧电机正转运行 左侧电机停止 ********/
  147. void ToLeft()
  148. {
  149.     Right_Lamp = 1;    //右转向灯
  150.     Forward_Lamp = 1;  //前进 大灯
  151.     Back_Lamp = 1;     //后退 大灯       
  152.    
  153.         Left_Moto_Stop;    //左侧电机停止
  154.         Right_Moto_Go;           //右侧电机前行

  155.         Delay10us();
  156.        
  157.         Left_Lamp = ~Left_Lamp;     //左转向灯
  158. }

  159. /********小车向右 右转向灯亮起 右侧电机停止 左侧电机正转运行********/
  160. void ToRight()
  161. {
  162.         Left_Lamp = 1;           //左转向灯
  163.     Forward_Lamp = 1;  //前进 大灯
  164.     Back_Lamp = 1;     //后退 大灯       

  165.         Left_Moto_Go;           //左侧电机前行
  166.     Right_Moto_Stop;   //右侧电机停止

  167.         Delay10us();
  168.         Right_Lamp = ~Right_Lamp;     //右转向灯       
  169. }

  170. /********小车前行 前行灯亮起 右侧电机正转运行 左侧电机正转运行********/
  171. void ToForward()
  172. {
  173.     Left_Lamp = 1;           //左转向灯
  174.         Right_Lamp = 1;    //右转向灯
  175.     Forward_Lamp = 0;  //前进 大灯
  176.     Back_Lamp = 1;     //后退 大灯
  177.        
  178.         Left_Moto_Go;      //左侧电机前行
  179.         Right_Moto_Go;           //右侧电机前行       
  180. }

  181. /********小车后退 后退灯亮起 右侧电机反转运行 左侧电机反转运行********/
  182. void ToBack()
  183. {
  184.         Left_Lamp = 1;     //左转向灯
  185.         Right_Lamp = 1;    //右转向灯
  186.     Forward_Lamp = 1;  //前进 大灯
  187.     Back_Lamp = 0;     //后退 大灯

  188.         Left_Moto_Back;   //左侧电机后退
  189.         Right_Moto_Back;  //右侧电机后退
  190. }

  191. /********小车停止 灯全灭掉 右侧电机停止 左侧电机停止********/
  192. void Stop()
  193. {
  194.     Left_Lamp = 1;     //左转向灯
  195.         Right_Lamp = 1;    //右转向灯
  196.     Forward_Lamp = 1;  //前进 大灯
  197.     Back_Lamp = 0;     //后退 大灯
  198.     Left_Moto_Stop;           //左侧电机停止
  199.         Right_Moto_Stop;   //右侧电机停止
  200. }

  201. /********延时函数********/
  202. void Delay10us()                //@12.000MHz
  203. …………
  204. …………
  205. …………限于本文篇幅 余下代码请从51黑下载附件…………

复制代码


P71111-001550.jpg
P71111-151713.jpg
P71111-001553.jpg
P71111-151715.jpg
P71111-190518.jpg
P71111-190520.jpg
P71121-065727.jpg
P71121-065734.jpg
P71122-221509.jpg
P71123-210628.jpg
P71123-210630.jpg
P71123-210639.jpg
P71123-221451.jpg
P71123-221454.jpg
P71124-211824.jpg
P71124-221123.jpg
P71124-233811.jpg
P71124-233814.jpg
P71124-233827.jpg
P71124-233832.jpg
P71125-104107.jpg
P71128-190643.jpg
P71202-112731.jpg
P71202-112737.jpg
P71203-202109.jpg
P71210-181339.jpg
P71210-181347.jpg
P71210-181355.jpg
P71213-181808.jpg
P71213-181812.jpg
P71213-182110.jpg
0.jpg

StubbornSmallTaurus.zip

53.26 KB, 下载次数: 111, 下载积分: 黑币 -5

回复

使用道具 举报

ID:246103 发表于 2017-12-14 17:23 | 显示全部楼层
视频地址
回复

使用道具 举报

ID:246103 发表于 2017-12-15 08:20 | 显示全部楼层
回复

使用道具 举报

ID:246103 发表于 2017-12-15 08:22 | 显示全部楼层
回复

使用道具 举报

ID:243552 发表于 2017-12-20 09:19 来自手机 | 显示全部楼层
走了不少弯路,成功来之不易,学习
回复

使用道具 举报

ID:265916 发表于 2018-1-20 15:42 | 显示全部楼层
请问楼主能给个联系方式吗,我也在做这个,碰到问题话可以向您请教,麻烦啦!
回复

使用道具 举报

ID:246103 发表于 2018-1-24 15:51 | 显示全部楼层
2281070217 发表于 2018-1-20 15:42
请问楼主能给个联系方式吗,我也在做这个,碰到问题话可以向您请教,麻烦啦!

2969305900
回复

使用道具 举报

ID:290278 发表于 2018-3-11 09:28 来自手机 | 显示全部楼层
只能说成功来之不易,给你个赞,值得我学习
回复

使用道具 举报

ID:286457 发表于 2018-3-18 14:23 | 显示全部楼层
学习学习 和你一样在娱乐中摸索
回复

使用道具 举报

ID:322147 发表于 2018-5-9 18:30 | 显示全部楼层
最近也在做这个  不会编程序正疯狂找程序  谢谢楼主了
回复

使用道具 举报

ID:243501 发表于 2018-5-18 18:36 | 显示全部楼层
请问有原理图吗?
回复

使用道具 举报

ID:471352 发表于 2019-3-10 21:26 | 显示全部楼层
请问下这是用摄像头做的循迹么?不是传感器吧?能用传感器做么?
回复

使用道具 举报

ID:246103 发表于 2019-4-19 16:36 | 显示全部楼层
狼狈的色鬼 发表于 2019-3-10 21:26
请问下这是用摄像头做的循迹么?不是传感器吧?能用传感器做么?

不是摄像头啊
回复

使用道具 举报

ID:471632 发表于 2019-4-25 09:25 | 显示全部楼层
元件清单能列一下吗?想弄一个试试
回复

使用道具 举报

ID:431514 发表于 2019-5-1 13:52 | 显示全部楼层
想弄一个试试,谢谢楼主分享
回复

使用道具 举报

ID:526072 发表于 2019-5-2 18:33 | 显示全部楼层
大神可以加一下qq吗,我最近也在弄一个同样的项目,碰到问题想要请教一下你,我的qq号:3136230793
回复

使用道具 举报

ID:526072 发表于 2019-5-2 18:34 | 显示全部楼层
狼狈的色鬼 发表于 2019-3-10 21:26
请问下这是用摄像头做的循迹么?不是传感器吧?能用传感器做么?

超声波
回复

使用道具 举报

ID:431514 发表于 2019-5-7 17:09 | 显示全部楼层
楼主加个qq。
回复

使用道具 举报

ID:531049 发表于 2019-5-8 21:31 | 显示全部楼层
能看一下原理图嘛
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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