[转载]实验机器人“小强一号”制作过程
来源:互联网 发布:云计算对未来的影响 编辑:程序博客网 时间:2024/04/30 16:30
实验机器人“小强一号”制作过程 |
---|
作者:mindroid 文章来源:http://www.mindroid.com 更新时间:2008-5-22 19:47:10 从对机器人感兴趣开始,买了一堆书,也看了很多资料,决定先从最简单的车轮机器人开始做。普通电脑虽然强大,但是不能直接采集外界环境的物理数据,也不能直接控制电机。查找了下,虽然可以直接在电脑上接USB接口的数据采集器用于采集传感器的数据,也可以使用PCI的电机控制卡来驱动各种电机,不过成本有些高,暂时不考虑了。找了一圈,发现还是单片机方案廉价,顺便可以学习下单片机控制和作一些电路实验。于是最终决定实验方案采用单片机来做了。 零件下面是采购的零件: 8位单片机Atmega168开发板(Arduino)。 电路面包板和连线 用于驱动车轮的两个减速电机。没有找到合适的齿轮,自己也没有加工设备,图简单,所以直接用集成减速齿轮的电机代替了。 距离传感器,作为机器人的主要传感器,用来探测障碍物的距离。使用的是常用的红外距离传感器作为机器人的眼睛。 一堆零件:
实验接下来先搞清楚怎么用单片机。 Hello world 先让单片机跑起来再说。习惯了操作系统下编程,第一次用单片机还真有些不习惯,担心遇到问题,不过比较顺利。这个程序用来点亮单片机上的一个LED。 代码: int ledPin = 13; // LED connected to digital pin 13 void setup() { pinMode(ledPin, OUTPUT); // sets the digital pin as output }
{ digitalWrite(ledPin, HIGH); // sets the LED on delay(1000); // waits for a second digitalWrite(ledPin, LOW); // sets the LED off delay(1000); // waits for a second } 以间隔1000ms的时间把单片机的第13 个Pin脚循环输出高低电平,从而达到点亮和熄灭LED功能。很简单,就是验证下单片机是否可用。 控制舵机 舵机就是遥控模型上用来控制的,其实就是一个带闭环控制的电机,能转动到指定的角度。 工作原理是:控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获 得的直流偏置电压与电位器的电压比较,获得电压差输出。 最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动 电位器旋转,使得电压差为0,电机停止转动。
在程序中控制舵机的转动角度,就是生成不同脉宽的PWM就行了。 上面的代码简单的生成一个PWM 驱动舵机旋转,比较简单。 代码中用delay来实现延时,如果是同时控制多个舵机,用这样的代码是不行的,需要自己计算时间。因为用delay整个单片机都“休息”了,无法执行任何代码。在实际实现中,还需要不断的读取传感器输入和进行其他处理。 红外距离传感器传感器介绍: SHARP红外距离传感器,用于模型或机器人制作,可以用来测量距离。每个模块赠送一根15cm长PH2.0的单头排线. 技术规格: 探测距离:10-80cm 工作电压:4-5.5V 标准电流消耗:33-50 mA 输出量:模拟量输出,输出电压和探测距离成比例 int potPin = 2; 运行结果,led随着传感器距离的变化闪烁间隔也随着变化。 控制电机常用的直流电机使用L293D来控制,使用H293的电路如下: 不过在验证是发现,对于小电机,直接用单片机的PWM端子来输出不同电压的来控制速度也是可行的,虽然不太精确,但是对于实现运动特征是足够了。单片机无法输出真正的线性模拟电压,PWM是通过调整空占比间隔来模拟不同电压值的。 测量了电机在空载和负载情况下电流都只有几十毫安,所以先采取这种简单的办法验证。 直接把电机接到单片机的Gnd和 PWM Pin 9接口,然后在程序中直接向 Pin 9输出就可以让电机运转了。 int value = 0; 上面的程序用不同的输出值驱动电机,可以看到电机的旋转效果。单片机和主要部件的验证基本就完成了,下一步要开始程序设计了。 软件设计思路在进行代码编写之前,想找到一种简介的实现低级智能机器人的方式。目前的工业机器人采用的是精确控制的方法,在程序中固化每种处理逻辑。用程序员的思维来完成对机器人的操作。 如果要执行的动作和需要判断的情况很多,那么程序逻辑分支就比较复杂,扩展性也比较差,有没有更好的适合机器人软件设计的方法呢? 任务——机器人完成的一个期望目标,比如“在一个范围内收集地面上的垃圾”可以界定为一个机器人的任务。 软件结构小强一号结构非常简单,传感器只采用了个红外距离传感器作为机器人的“眼睛”,使用两个电机进行运动,距离传感器连接在一个舵机上,作为“头部”可以左右范围的转动。机器人的行为最简单的就是巡航行为,巡航行为就是给电机电流,电机转动而已。那么发生碰撞怎么办?在巡航行为中,不用考虑碰撞,否则又会变成复杂的判断逻辑。为了避免碰撞,设计一个独立的避免碰撞的“逃离”行为。逃离行为从距离传感器获取障碍物距离信息,简单的判断前方是否有障碍,进行避让。由于多个行为都可能控制电机,所以需要一个仲裁器根据优先级来判断到底执行那个逻辑部分输出的控制指令。下面用图来说明这种情况: 如果需要增加其他更加复杂的智能,那么只需要增加对应的行为单元就行了,不用修改已有的逻辑结构。每个行为单元只需要处理自己关心的传感器和需要控制的动作执行部分。这种方式的好处就是程序逻辑变得非常简单,功能单元之间不会存在互相影响的弊端。 下面的代码是“巡航”行为: class BhCruis:public Behavior 上面的代码很简单,就是让两个电机以同样的速度晕装,其他都不用考虑。对于某些行为,需要引入稍微复杂一些的处理,比如发现障碍物,首先要停下来,然后判断是应该往左还是往右,做出决定之后,再进行具体的动作。针对这种不能在一个时刻完成,要经过几个不同的状态才能处理完成的行为,可以用状态机来解决。下图是“逃离”行为的状态机: 对于行为实现自己的状态机,在行为实现的代码内部实现,而不影响其他行为。这种结构可以让每个行为子关心自己的实现方式,从而最大的降低软件复杂度,方便功能添加和修改。逃离行为状态机实现原型代码: void BhEscape::Run(){ 这种基于行为单元的实现方法比较类似生物的反射行为,完整的代码在下载专区进行下载。完成了基本的代码,下一部分需要构建机器人的机构和测试了。 结构和测试 实验机器人的结构就地取材,用了一个拼装玩具小车的零件,如下图: 为了安装电机和传感器,重新拼装了下,变成这个样子: 有了基本的结构,可以测试功能了,验证功能是否正常 功能测试完成,放到地上实际跑一下: 放在家里巡逻,有小偷进来就跟他火拼。 |
- [转载]实验机器人“小强一号”制作过程
- 小强机器人学习笔记(1)
- 小强爬行记----转载
- PVCBOT【1号】疯狂的小强--避障机器人
- NGUI小地图制作过程
- 九月一号java小练习
- 通过WiFi控制智能小车机器人制作过程详解
- 数据库存储过程的小实验
- 刚安装了一下QQ2004 Beta版,里面的“小强”机器人真历害!
- 小强ROS机器人教程(17)___利用ORB_SLAM2建立环境三维模型
- 小强ROS机器人教程(10)___使用kinect进行自主移动避障
- 转载:“北斗一号”监控圣火境内传递!!!
- android小程序计算器的制作过程
- 小强就是小强,强^
- 八月三十一号java小练习
- 机器人视觉实验开启
- 制作MSN机器人
- 制作MSN机器人 (转帖)
- Websharp 6 - 模板文件的查找与加载
- PHP ACCESS连接类-1
- 找回激情,拼吧~
- Asp.net Mvc Codeplex Preview 5 第一篇 Helper新特性
- 【独家透露!】让TD-SCDMA的USIM卡固定工作在GSM网络下的方法!
- [转载]实验机器人“小强一号”制作过程
- gameloop设计
- 【转载】开关电源的零件
- OperaTor v3.2
- 【转载】工业机器人操作机设计原则和设计方法
- 【转帖】史宾牌移动机器人—机器人制作教程
- c# dbcTransaction 类
- DNF外挂冲分,请帮忙
- 【转】基于AT89C51单片机设计的简易智能机器人