|
很高兴有这么个机会可以发帖子,这是我第一次在网络上发帖子
这次的diy项目,是避障循迹小车。本人纯属个人爱好,没有这方面的经验。唯一占点优势的是,我是从事软件开发的。虽然没接触过c语言,但基本都懂。
前年做过一个8*8*8的光立方,虽然也能点亮灯。但是整体过程都是参考网上,就是照葫芦画瓢,最后的效果也是非常不理想。感觉没什么意思。
做这个小车,也是蓄谋已久,终于狠下心开始弄。因为对这方面的不了解,包括买元件,买错好几次,所以此次成本控制的非常不理想。希望我这个帖子可以帮助到一些想做的朋友。
进入正题
此小车为四驱驱动 车底盘网上买的现成的
使用stc89c52rc芯片
l298n电机驱动模块(网上买的现成的 当时想自己做 但是看说是有很多互相干扰的因素 没敢尝试)
四路红外寻迹
超声波避障
小车主要逻辑是检测到黑线 按黑线行走 没有黑线 转到避障模式。
一、底盘
小车的底盘,我是在网上买的现成的。 比较坑爹的是,因为我的最小系统是自己焊接的。而且其他模块也都是单独购买,因为不是和底盘是一套的东西。所以看着底盘上的开孔什么的非常多。
但是都和我设计的不一样 所以我自己又借的电转自己转的眼。建议想做的朋友,如果动手能力强就自己做个底盘,然后买几个电机和轮子。
二、焊接最小系统
这一块基本了解一些,所以基本还可以。比较顺利。我的焊接水平有限,大家勿喷
三、测试电机驱动模块
因为我都不是很懂 所以每个阶段都需要反复测试
电机驱动,我使用的网上现成的L298n模块。使用了两个,一个模块驱动两个电机。控制方式是一个模块控制前两个轮子,另外一个控制后两个轮子。这块的连线应该还是比较容易的
网上搜索有一堆资料。这块还是强调一下,要和单片机共地。 另外说一嘴,电机的导线接的长一点。我的驱动因为放在底层的底盘,所以弄的短了些。当时我手头没有104电容,所以电机也没焊接
电容。但是还好,我没遇到干扰的问题。建议焊接上,具体什么作用,我就不大了解了,说是滤波。
四、测试舵机
舵机这块是我最挠头的,调试时间最长。程序调了好久,电路也调整好几次。我一开始连接到p0上了,怎么弄都不好用。后来查了一下,p0端口需要焊接上拉电阻(应该没叫错吧)。但是舵机各种神奇
的现象。要么一圈一圈的转(正常180度),要么不动。最后怀疑是不是舵机坏掉了。一狠心在网上又买了两个。回来测试还是这样。 然后又拿出一开始的那个,还是原来的电路,还是原来的程序,居然可以了。
应该是我程序上控制了转动时候 不是完全的90度 不到90度就停下来(控制方波长度)。正好在单位捡了一块抽屉底下的小木板,就自己用壁纸刀切了一个舵机云台。感觉还不错。哈哈
五、避障模式
电机驱动、电机、舵机都拼到一块。发现的电源根本带不动,后来查了一下需要18650电池。原来查资料以为就是普通的五号电池。我这也不知道还有这种电池啊。就买了两节。回来发现电机就是不动。然后用12v的变压器
测试都是正常的。测试两节电池串联电压大约在7.4v,感觉应该够了。反正就还是不行。然后我就又买了两节。用了三节电池都还是不行。然后就是拆开整个小车,分析各个电路,就都是发现不了问题。只要单片机供上电
电机就停止。当时晚上鼓捣的,不知怎么鬼使神差的居然把芯片烧掉了。然后换个芯片,又烧掉了。后来发现应该是有一个驱动模块稳压模块坏了,输出的电压不是5v。直接变成高电压了。最后的最后才发现,最终的
损失不止两个芯片一个驱动模块,居然连超声波也烧坏了一个。没办法没芯片了,又得等好几天了。 然后后来发现 我电池还是得充电,未充满。我tm也是醉了。 没文化这可怕啊。最后的最后 实在是各种神经问题。
就采用单片机和驱动单独供电。两节电池供电机,一节电池供单片机。基本稳定下来了。程序就比较容易了。我懂了机制,程序问题不大。
六、循迹模式
我一开始没控制电机驱动的通道使能。小车都是全速前进的。在循迹这块发现不行了,跑的太快了。小车都冲出跑道。唉 真心觉得不能偷懒 又都都拆开,重新接上杜邦线。这块也发现,因为我个人不算有洁癖,但还是希望
小车整体看起来利索点。所以驱动和红外模块都放在底层底盘了。这个其实不是特别方便。因为在调试的时候 看不到红外模块的指示灯。大家可以注意点。
调整程序 通过占空比 控制轮子转速。这块程序也比较顺利 程序基本是一次性通过。
最终效果:
电路图我没有了 就是参考网上焊接的。程序放上来 可能不符合行业标准 大家别笑话。
这次瞎胡闹,感觉结果还不错,实现自己想要的功能了。满满的成就感。这里特别感谢一下网友,有个网友特别热心,请教的问题都是知无不言。
帖子就到这里 大家有什么问题可以提出来 反正我也不一定会……哈哈
部分单片机源程序:
- #include <reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- /********常量声明********/
- #define uint unsigned int
- /********方法声明********/
- void Init();
- void Delay10us(); //@12.000MHz
- void Run();
- void ToLeft();
- void ToRight();
- void ToForward();
- void ToBack();
- void KeyScan();
- /********针脚声明********/
- sbit Left_Lamp = P1^0; //左转向灯
- sbit Right_Lamp = P1^1; //右转向灯
- sbit Forward_Lamp = P1^2; //前进 大灯
- sbit Back_Lamp = P1^3; //后退 大灯
- sbit Left_Switch = P1^4; //左转向 按键 主要用于测试 控制左转 左转向灯变亮
- sbit Right_Switch = P1^5; //右转向 按键 主要用于测试 控制右转 右转向灯变亮
- sbit Forward_Switch = P1^6; //前进 按键 主要用于测试 控制前进 前进灯变亮
- sbit Back_Switch = P1^7; //后退 按键 主要用于测试 控制后退 后退灯变亮
- /********电机驱动针脚********/
- sbit P2_0 = P2^0;
- sbit P2_1 = P2^1;
- sbit P2_2 = P2^2;
- sbit P2_3 = P2^3;
- sbit P2_4 = P2^4;
- sbit P2_5 = P2^5;
- sbit P2_6 = P2^6;
- sbit P2_7 = P2^7;
- /********电机动作定义********/
- #define Left_Moto_Go {P2_0=1, P2_1=0, P2_2=1, P2_3=0;} //左边两个电机向前走
- #define Left_Moto_Back {P2_0=0, P2_1=1, P2_2=0, P2_3=1;} //左边两个电机向后转
- #define Left_Moto_Stop {P2_0=0, P2_1=0, P2_2=0, P2_3=0;} //左边两个电机停转
- #define Right_Moto_Go {P2_4=1, P2_5=0, P2_6=1, P2_7=0;} //右边两个电机向前走
- #define Right_Moto_Back {P2_4=0, P2_5=1, P2_6=0, P2_7=1;} //右边两个电机向前走
- #define Right_Moto_Stop {P2_4=0, P2_5=0, P2_6=0, P2_7=0;} //右边两个电机停转
- uint Left_Switch_Flag = 0; //左转向按下标志
- uint Right_Switch_Flag = 0; //右转向按下标志
- uint Forward_Switch_Flag = 0; //前进按下标志
- uint Back_Switch_Flag = 0; //后退按下标志
- /********主函数********/
- void main()
- {
- Init();
- while(1)
- {
- Run();
- }
- }
- /********系统初始化********/
- void Init()
- {
-
- }
- /********开始运行********/
- void Run()
- {
- KeyScan();
- if (Left_Switch_Flag)
- {
- ToLeft();
- }else
- {
- Left_Lamp = 1;
- }
- if (Right_Switch_Flag)
- {
- ToRight();
- }else
- {
- Right_Lamp = 1;
- }
- if (Forward_Switch_Flag)
- {
- ToForward();
- }else
- {
- Forward_Lamp = 1;
- }
- if (Back_Switch_Flag)
- {
- ToBack();
- }else
- {
- Back_Lamp = 1;
- }
- }
- /********按键判断函数********/
- void KeyScan()
- {
- if (Left_Switch == 0) //左转向按下
- {
- Delay10us();
- if (Left_Switch == 0)
- {
- while(Left_Switch==0); //等待按键抬起
- Left_Switch_Flag = !Left_Switch_Flag;
- Right_Switch_Flag = 0;
- Forward_Switch_Flag = 0;
- Back_Switch_Flag = 0;
- }
- }
-
- if (Right_Switch == 0) //右转向按下
- {
- Delay10us();
- if (Right_Switch == 0)
- {
- while(Right_Switch==0); //等待按键抬起
- Left_Switch_Flag = 0;
- Right_Switch_Flag = !Right_Switch_Flag;
- Forward_Switch_Flag = 0;
- Back_Switch_Flag = 0;
- }
- }
-
- if (Forward_Switch == 0) //前进按下
- {
- Delay10us();
- if (Forward_Switch == 0)
- {
- while(Forward_Switch==0); //等待按键抬起
- Forward_Switch_Flag = !Forward_Switch_Flag;
- Left_Switch_Flag = 0;
- Right_Switch_Flag = 0;
- Back_Switch_Flag = 0;
- }
- }
-
- if (Back_Switch == 0) //后退向按下
- {
- Delay10us();
- if (Back_Switch == 0)
- {
- while(Back_Switch==0); //等待按键抬起
- Back_Switch_Flag = !Back_Switch_Flag;
- Forward_Switch_Flag = 0;
- Left_Switch_Flag = 0;
- Right_Switch_Flag = 0;
- }
- }
- }
- /********小车向左 左转向灯闪烁 右侧电机正转运行 左侧电机停止 ********/
- void ToLeft()
- {
- Right_Lamp = 1; //右转向灯
- Forward_Lamp = 1; //前进 大灯
- Back_Lamp = 1; //后退 大灯
-
- Left_Moto_Stop; //左侧电机停止
- Right_Moto_Go; //右侧电机前行
- Delay10us();
-
- Left_Lamp = ~Left_Lamp; //左转向灯
- }
- /********小车向右 右转向灯亮起 右侧电机停止 左侧电机正转运行********/
- void ToRight()
- {
- Left_Lamp = 1; //左转向灯
- Forward_Lamp = 1; //前进 大灯
- Back_Lamp = 1; //后退 大灯
- Left_Moto_Go; //左侧电机前行
- Right_Moto_Stop; //右侧电机停止
- Delay10us();
- Right_Lamp = ~Right_Lamp; //右转向灯
- }
- /********小车前行 前行灯亮起 右侧电机正转运行 左侧电机正转运行********/
- void ToForward()
- {
- Left_Lamp = 1; //左转向灯
- Right_Lamp = 1; //右转向灯
- Forward_Lamp = 0; //前进 大灯
- Back_Lamp = 1; //后退 大灯
-
- Left_Moto_Go; //左侧电机前行
- Right_Moto_Go; //右侧电机前行
- }
- /********小车后退 后退灯亮起 右侧电机反转运行 左侧电机反转运行********/
- void ToBack()
- {
- Left_Lamp = 1; //左转向灯
- Right_Lamp = 1; //右转向灯
- Forward_Lamp = 1; //前进 大灯
- Back_Lamp = 0; //后退 大灯
- Left_Moto_Back; //左侧电机后退
- Right_Moto_Back; //右侧电机后退
- }
- /********小车停止 灯全灭掉 右侧电机停止 左侧电机停止********/
- void Stop()
- {
- Left_Lamp = 1; //左转向灯
- Right_Lamp = 1; //右转向灯
- Forward_Lamp = 1; //前进 大灯
- Back_Lamp = 0; //后退 大灯
- Left_Moto_Stop; //左侧电机停止
- Right_Moto_Stop; //右侧电机停止
- }
- /********延时函数********/
- void Delay10us() //@12.000MHz
- …………
- …………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
|
|