📄 寻迹小车 followme.htm
字号:
读取轨迹采样所获取的信息,根据需求和策略输出相应的电机控制命令;将调试的相关功能也纳入此模块。</P>
<P>学会多模块编程是能进行嵌入式应用软件编写的重要标志。</P>
<H3>7.3 主控模块程序设计</H3>
<P>主控模块只负责初始化系统的硬件和软件,而且为了使各模块的相关功能更加内聚,将属于各模块的硬件、变量初始化也交给各功能模块处理,主控程序只负责初始化自用的变量。</P>
<P>此外,主控模块只负责根据消息调用相应模块的处理函数,具体如何处理这些消息由各功能模块中的对应函数决定。</P>
<P>这样设计主要是为了日后便于向使用RTOS(Real - Time Operating
System)过渡,因为一个略为复杂的应用如果需要程序可靠、可维护,最好使用RTOS。所以作为学习者有必要了解、掌握相关的知识。</P>
<H3>7.4 电机驱动模块程序设计</H3>
<P>因为驱动的H桥电路、码盘采样电路均未变,所以控制的逻辑也不用修改,只需完成:</P>
<P>a) 对应I/O口定义的修改,以适应新的MCU资源分配;<BR>b)
将两个电机的控制逻辑整合到一个MCU中。</P>
<P>主要工作是逻辑整合。</P>
<P>电机 1 的引脚控制逻辑关系:<BR>P2.0 - CTL 1, H 桥的左上臂,0 电平输出导通, 1
电平输出截止<BR>P2.1 - CTL 2, H 桥的左下臂,1 电平输出导通, 0
电平输出截止<BR>P2.2 - CTL 3, H 桥的右上臂,0 电平输出导通, 1
电平输出截止<BR>P2.3 - CTL 4, H 桥的右下臂,1 电平输出导通, 0 电平输出截止</P>
<P>电机1控制逻辑:</P>
<TABLE width="90%" border=1>
<TBODY>
<TR>
<TD rowSpan=2>引脚</TD>
<TD rowSpan=2>桥臂</TD>
<TD colSpan=2>单极性正转</TD>
<TD colSpan=2>单极性反转 </TD>
<TD colSpan=2>双极性</TD>
<TD rowSpan=2>惰行</TD>
<TD rowSpan=2>刹车</TD></TR>
<TR>
<TD>前半周</TD>
<TD>后半周</TD>
<TD>前半周</TD>
<TD>后半周</TD>
<TD>前半周</TD>
<TD>后半周</TD></TR>
<TR>
<TD>P2.3 </TD>
<TD>右下</TD>
<TD>1</TD>
<TD>1</TD>
<TD>0</TD>
<TD>0</TD>
<TD>1</TD>
<TD>0</TD>
<TD>0</TD>
<TD>1</TD></TR>
<TR>
<TD>P2.2</TD>
<TD>右上</TD>
<TD>1</TD>
<TD>1</TD>
<TD>0</TD>
<TD>1</TD>
<TD>1</TD>
<TD>0</TD>
<TD>1</TD>
<TD>1</TD></TR>
<TR>
<TD>P2.1</TD>
<TD>左下</TD>
<TD>0</TD>
<TD>0</TD>
<TD>1</TD>
<TD>1</TD>
<TD>0</TD>
<TD>1</TD>
<TD>&#160;</TD>
<TD>1</TD></TR>
<TR>
<TD>P2.0</TD>
<TD>左下</TD>
<TD>0</TD>
<TD>1</TD>
<TD>1</TD>
<TD>1</TD>
<TD>0</TD>
<TD>1</TD>
<TD>1</TD>
<TD>1</TD></TR></TBODY></TABLE>
<P>电机2 与电机1完全相同,只是映射在P2口的高4位。</P>
<P>前面所做的单个电机的控制程序,可以很方便的移植过来。</P>
<P>首先将所有与电机对应的变量改为2维数组,一维对应一个电机。</P>
<P>然后在程序中所有涉及电机变量的初始化和赋值的地方改为循环,有关的函数增加一个电机序号参数输入,函数中修改为根据序号处理相应的数组单元。</P>
<P>上述修改的关键在于变量的构建,合理的变量将大大减少程序的处理难度。</P>
<P>在电机输出及测速中断的处理中,没有使用下标变量方式来节省代码,因为需要速度,可以仔细比较使用下标变量时的目标代码与直接指定下标时的差别。</P>
<P>此部分功能暂未作任何改进和添加,只是将两个电机的驱动并入了一个MCU控制。</P>
<H3>7.5 轨迹采样模块程序设计</H3>
<P>轨迹采样器为4个反射式光电采样器,经缓冲后作背景光减除处理,之后放大送单片机AD转换。</P>
<P>此模块完成:<BR>1)采样器的输出AD转换;<BR>2)将AD结果转换为是否在轨迹上的逻辑值;<BR>3)进行预处理,输出轨迹偏移位置信息。</P>
<P>本来期望能按照国外那个桌面寻迹小车的处理方式对采样信号预处理的,但是仔细分析后发现,按目前所用的采样器及轨迹的关系(轨迹通常为
2cm 宽,而采样器距地面5 –
8mm)无法实现,因为采样器在黑色轨迹上移动时有一段时间不会有变化,所以没有办法得到一个连续的位置偏移信息(详细请看:<A
href="http://elm-chan.org/works/ltc/report.html"
target=_blank>http://elm-chan.org/works/ltc/report.html</A>)。<BR>为了便于日后过渡到这种模式,还是将采样器布置为一条直线,相互间距小于轨迹的宽度,而4个采样器的AD结果仍然转换成逻辑值后再作处理。<BR>4个采样器的布置如下:<BR>顶视:
左 —— 右<BR>采样器: 1号 2号 3号 4号<BR>I/O口: P10 P11 P12
P13<BR>采样值: 1 2 3 4 (PC调试界面中自左至右)</P>
<P>处理时先将采样的模拟值转换为逻辑值,之后将逻辑值转换为一个关于位置的数值,如下面系列图所示,注意光感的位置及PC界面中轨迹采样的数据。</P>
<P>居中(点击看大图):<BR><A
href="http://www.robotdiy.com/images/FollowMe_robot/InCenter.jpg"><IMG
height=116 src="寻迹小车 FollowMe.files/InCenter_Mini.jpg"
width=304 border=0></A></P>
<P>偏右程度1(点击看大图):<BR><A
href="http://www.robotdiy.com/images/FollowMe_robot/InRight01.jpg"><IMG
height=116 src="寻迹小车 FollowMe.files/InLeft01_mini.jpg"
width=304 border=0></A></P>
<P>偏右程度 2(点击看大图):<BR><A
href="http://www.robotdiy.com/images/FollowMe_robot/InRight02.jpg"><IMG
height=116 src="寻迹小车 FollowMe.files/InRight02_mini.jpg"
width=304 border=0></A></P>
<P>偏右程度3(点击看大图):<BR><A
href="http://www.robotdiy.com/images/FollowMe_robot/InRight03.jpg"><IMG
height=116 src="寻迹小车 FollowMe.files/InRight03_mini.jpg"
width=304 border=0></A></P>
<P>偏右程度4(点击看大图):<BR><A
href="http://www.robotdiy.com/images/FollowMe_robot/InRight04.jpg"><IMG
height=116 src="寻迹小车 FollowMe.files/InRight04_mini.jpg"
width=304 border=0></A></P>
<P>偏左程度1(点击看大图):<BR><A
href="http://www.robotdiy.com/images/FollowMe_robot/InLeft01.jpg"><IMG
height=116 src="寻迹小车 FollowMe.files/InLeft01_mini.jpg"
width=304 border=0></A></P>
<P>偏左程度2(点击看大图):<BR><A
href="http://www.robotdiy.com/images/FollowMe_robot/InLeft02.jpg"><IMG
height=116 src="寻迹小车 FollowMe.files/InLeft02_mini.jpg"
width=304 border=0></A></P>
<P>偏左程度3(点击看大图):<BR><A
href="http://www.robotdiy.com/images/FollowMe_robot/InLeft03.jpg"><IMG
height=116 src="寻迹小车 FollowMe.files/InLeft03_mini.jpg"
width=304 border=0></A></P>
<P>偏左程度4(点击看大图):<BR><A
href="http://www.robotdiy.com/images/FollowMe_robot/InLeft04.jpg"><IMG
height=116 src="寻迹小车 FollowMe.files/InLeft04_mini.jpg"
width=304 border=0></A> </P>
<P>通过上述图并结合程序,我想读者应当理解此处是如何处理轨迹采样数据的了。</P>
<H3>7.6 轨迹控制模块程序设计</H3>
<P>因为将前面所编写的电机调试功能纳入此模块,所以先将原来的程序移植过来,主要是修改了对应电机的一些变量,和电机驱动模块一样,也是将所有与电机对应的变量改为2维数组,一维对应一个电机。程序修改方法也类似。</P>
<P>因为两个电机的转速都在一个MCU中得到,所以修改了读转速的通讯协议:</P>
<P>0x55 0xAA 0x01(帧长) 0x04 (读转速命令) 校验和(1字节)</P>
<P>对应的返回帧为:<BR>0xAA 0x55 0x05(帧长) 0x84 (转速值返回)
电机1转速(2字节)电机2转速(2字节)校验和(1字节)</P>
<P>此外,为了支持走轨迹,增加了一条轨迹行走启动及停止命令,协议如下:</P>
<P>走轨迹控制命令: 0x05 . 命令参数 —— 1 启动, 0 停止,</P>
<P>命令帧为:<BR>0x55 0xAA 0x02 0x05 0x01 CS —— 启动命令<BR>0x55
0xAA 0x02 0x05 0x00 CS —— 停止命令</P>
<P>为了能够方便的检测一些工作变量,使程序调试更加直观,增加了一个内存读取命令:<BR>内存数据读取命令:0x06</P>
<P>命令帧为:<BR>0x55 0xAA 0x04 0x06 读数据低地址 读数据高地址 读数据长度
CS</P>
<P>返回帧为:<BR>0x55 0xAA 帧长 0x86 读数据低地址 读数据高地址 读数据长度 数据N字节
CS</P>
<P>增加了这样一个内存数据读出功能,将十分有效的帮助调试一些自身不带Debug功能的单片机,而且由于逐渐向贴片封装过渡,防真头方式的Debug工具也越来越受限制,所以学会在自己的程序中嵌入调试代码也是一个必须具备的功能,即便有JTAG调试功能的单片机,对于机器人这种移动型的应用,或是一些远程控制应用,还是无法发挥作用,必须依靠自己嵌入的调试代码检测程序的状态。</P>
<P>由于我做这个项目的目的不是为了弄出一个性能多么优越的产品或方案,帮助人参加竞赛,或是显示我的“实力”,我的目的是将这个过程记录下来,算是一种学习的途径,希望能给一些入门者以启示,从中能发现一些可以借鉴的方法,如:一些基本功能的程序如何编写,如何考虑硬件与软件的关系,如何借助于PC机调试等等。</P>
<P>所以,真正走轨迹该如何去控制,并非我所要做的重点,轨迹采样输出以作了那样的转换,对于走简单轨迹而言,我想控制方案应当不是问题,但是要走好,走的流畅还是要花一些功夫的,但这正是我希望大家能共同参与、讨论的内容,而非我的“一家之词”。将这个悬念留给大家吧!</P>
<H2>8、结语</H2>
<P>本来计划写8篇的,但写到此后觉得应当结束了,因为该交待的都交待了,下面如果要做就是程序和功能的优化,而这不应该是我来做,我希望能有人尝试,大家来共同讨论,实现一些自己满意的功能。</P>
<P>我所要做的是:再优化一下设计,看有无可能为大家提供一些不容易自制的零件,将这个项目培养起来,成为一个可以相互交流程序的平台,一个在上面扩充自己所期望的功能的平台。</P>
<P>我认为这一系列文章中已基本介绍了作为入门的大部分技能,主要侧重点是单片机控制程序的编写。希望这只是一块“砖”,能引来更好的“玉”!</P>
<P>由于自己还有一些其它事情打扰,中间的间隔过长,所以文章有些地方不够连贯、不够严谨,有散乱之感,望大家原谅!</P>
<P>感谢ROBOTDIY网站的支持,谢谢!也谢谢大家!</P>
<P>(全文完)</P>
<P>2006年10月15日星期日</P>
<H2>附件:</H2>
<P>1、 <A
href="http://www.robotdiy.com/images/FollowMe_robot/Final_Program.rar">修改后的程序</A><BR>2、
<A
href="http://www.robotdiy.com/images/FollowMe_robot/Final_hardware.rar">电原理图</A>(因为PCB是别人设计的,未经许可我不便公开)<BR>3、
<A
href="http://www.robotdiy.com/images/FollowMe_robot/MotorTest.exe">PC调试程序</A><BR>4、
<A
href="http://www.robotdiy.com/images/FollowMe_robot/Robot_FinalVideo.wmv">小车运动视频片断</A></P>
<H2>提醒:</H2>
<P>由于文章是分开多节上传到网站上,为了方便大家讨论,请把相关的问题集中在<A
href="http://www.robotdiy.com/phpbb2/viewtopic.php?p=48671"
target=_blank>这个帖子</A>上,这样可以方便作者回答大家的问题,谢谢!<BR></P>
<P></P></TD></TR>
<TR>
<TD class=type4 align=right>
<DIV align=right><A
href="http://www.robotdiy.com/friend.php?op=FriendSend&sid=271"><IMG
alt="Send this announcement to a friend"
src="寻迹小车 FollowMe.files/friend.gif" align=middle
border=0></A> | <A
href="http://www.robotdiy.com/article.php?op=Print&sid=271"><IMG
alt="Printable Version"
src="寻迹小车 FollowMe.files/print.gif" align=middle
border=0></A> </DIV></TD></TR></TD></TR></TBODY></TABLE><BR><BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -