完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本次基于STC89C52的迷宫智能小车课程设计, 使用C语言进行软件编程, 实现迷宫小车前进, 转弯, 修正, 掉头的基本动作, 并且使用相关的数据结构: 数组, 栈, 队列和回溯, 广度优先等算法完成寻找终点, 遍历迷宫, 创建等高表, 计算出最短路径, 最后冲刺的课程任务。让我们了解软件设计和数据结构算法的思想, 以及硬件编程, 硬件焊接的方法等。
通过定时器2, 自动重装模式控制红外传感的发射和接收, 检测周围的墙体信息和路径信息, 来控制迷宫小车的行走轨迹; 迷宫i下小车使用步进电机驱动, 采用四相八拍的工作模式, 通过给P1 口赋值进行直接操作来控制两个电机的内部转子的转动来驱动迷宫小车。小车在行驶过程中时刻判断周围环境做出相关的反应。 小车在寻找终点和遍历的过程中, 使用迷宫数组记录迷宫格子信息, 使用回溯算法返回到上一个节点或者岔路口。遍历完成后, 使用深度优先法则, 创建等高表, 根据等高表将最短路径存储进入迷宫数组, 最后根据路径进行冲刺,完成所有任务。 整个课程设计的过程和结果非常的惊心动魄而又具有趣味, 硬件方面的知识更是深深吸引了我, 收获很多, 课程设计很享受。 关键词:C51单片机, 迷宫小车, 回溯BFS算法, 遍历冲刺 1、课程设计的目的及要求 1.1 课程设计目的 (1)了解并熟悉电子元器件焊接技术与方法45。 (2)了解并熟悉常用电子元器件工作原理和功能特性。 (3)掌握单片机对步进电机的控制、红外发射与接收的控制。 (4)熟练运用keil软件进行单片机的C语言编程。 (5)掌握回溯算法的基本设计思想。 1.2课程设计要求 (1)迷宫电老鼠在迷宫中能够正常修正, 转弯, 掉头, 自由行走。 (2)使用中右法则从指定起点开始在迷宫中行走到终点。 (3)从终点开始遍历回到起点, 中间需要判断路径是否被走过来选择未遍历过的路径以及回溯路径。 (4)返回到起点后, 根据遍历得到的迷宫地图使用广度优先算法BFS计算出等高表, 再根据等高表计算出最优路径,存储迷宫数组的高四位。 (5)根据最后产生的迷宫数组的高四位, 最后以此进行冲刺。 2、题目分析 2.1 功能分析 (1)迷宫小车能够在迷宫中进行前进, 转弯, 修正等基本动作。 (2)迷宫小车能够在迷宫中进行自由穿梭并且寻找到终点。 (3)迷宫小车能够在小车行驶过程中记录路径坐标信息, 周围墙体信息。 (4)迷宫小车能够回溯路径, 执行其他未遍历的路径方向。 (5)迷宫小车能够在遍历完成后建立等高表, 计算最短路径,最后冲刺。 2.2 性能需求分析 1、迷宫小车外形合理,符合8×8迷宫场地需求。 2、迷宫小车红外传感能够准确检测, 不会出现误判。 3、迷宫小车电机驱动的使用合理,安全, 不损坏电机性能。 4、迷宫小车运行稳定,能够正常在迷宫中随意穿行。 5、迷宫小车走到终点所需的时间越短越好,最长应不得超过2分钟。 6、迷宫小车寻找终点的过程尽量采用向心法则, 遍历迷宫尽量采用广度优先。 2.3 算法分析 (1)前进, 转弯, 修正等基本动作: ①前进, 转弯, 修正角度和节拍循环数的确定: 电机为四相八拍, 传动比为1 : 16 其中单个节拍使轮子前进的角度为 θ= 360/(8*8) = 5.625 度,但是由于传动比所以一个脉冲使轮子转过的的角度θ=5.625/16=0.351526, 而迷宫格子的距离为18cm ,计算可得经过 100 个8拍就可以行走。同理可得转弯和修正的节拍循环数。 ②传感中断定时器选用和初始值的确定: 红外传感是一组一组的发射和进行检测的, 需要循环一直发射和进行检测接收, 所以选择定时器2, 选择工作方式2, 设置中断溢出 5 ms 中断一次, 那么TH2 高位自动重装数值(65536 us)/256; 和计数器初值TL2 = (65536-us)%256。 (2)在迷宫中自由穿梭,寻找终点: ①相对方向与绝对方向的相互转换: 转弯后的绝对方向abs_direction = (当前绝对方向 + 转弯数值turn_value) % 4; 绝对方向转换为相对方向——> relative_direction = (abs_direction - 转弯)%4 , 但是如果出现负数那么就溢出了, 底层使用补码进行表示最高位为1了, 将结果+4就变负为正.得出正确结果。 ②迷宫小车在搜索过程中使用中右法则策略进行行进。 ③迷宫小车在寻找终点的过程中和遍历过程中使用回溯算法来记忆和回退到其他未走过的方向和路径。 (3)行驶过程中记录迷宫信息: ① 迷宫二维数组高四位记录小车来的方向, 低四位记录坐标位置的墙体状态信息。 ② 在迷宫小车前进过程中需要记录岔路口信息, 使用堆栈的思想记录岔路口坐标。 (4)迷宫小车能够回溯路径, 遍历未知路径: ①使用迷宫数组高四位记录当前迷宫格子是从哪个方向来的。 ②当前方无路可走的时候回溯到上一个格子,判断是否是栈顶元素, 然后进行出栈或者查看其周围格子是否又没有走过的路径, 然后遍历。 (5)遍历完成后根据路径信息创建等高表: ①采用广度优先BFS算法生成等高表: 迷宫小车需要进行冲刺,就需要计算得出最短路径, 这时就需要创建由起点到终点的step 步数的表, 即等高表(contour_table), 通过对当前节点的上下左右4个方向进行方向是否可以访问并且步数差1来讲对应的步数入队, 然后队首元素出队。 (6)迷宫小车根据创建的等高表寻找最优路径: ①想要将最优路径的信息保留下来, 就需要使用队列/数组 , 但是因为遍历完成后已经不需要迷宫数组的高四位,此时就可以使用迷宫数组的高四位来存储最短路径的信息。 ②以终点作为当前点, 循环扫描四个方向根据方向更新 Temp 节点,然后判断当前Temp 节点是否可以访问, 并且节点高度=当前节点的高度-1 ,如果满足条件将这个方向作为路径存储到迷宫数组的高四位。 (7)小车按照最优路径冲刺到终点: ①小车读取迷宫高四位信息进行冲刺: 因为最短路径已经在前面完成了, 并且信息被存储到了迷宫数组的高四位, 当小车从起点(0,0) 开始,前进到下一个格子时, 读取这个格子的高四位将要去往的方向, 然后根据当前的小车方向, 来判断转弯方向然后前进。 3、系统设计 3.1系统整体设计 3.1.1系统介绍 电脑鼠是一个具有人工智能的小型移动机器人,是多学科交叉结合的结晶,与多个学科关系紧密:它涉及到轮子安装稳定不颤动,保证高传动效率,又使车体轻巧美观的机械工程技术。电脑鼠是一个嵌入式系统,涉及信号处理、通信、微处理器应用和电机控制等知识。用于电脑鼠的信息反馈,如测试墙壁信息的红外传感器,使用霍尔传感器测试车轮转速以控制转速和测量路程等相关的传感与测试技术。 控制电脑鼠在迷宫中快速而准确地行走,同时传感器获取周围墙壁信息反馈给微处理器,微处理器获得墙壁信息并据此控制电机动作以带动轮子产生相应的动作,这整个构成一个大的自动控制系统。而在这个大系统内还可以包含其他的自动控制系统。小车搜索迷宫, 遍历, 寻优冲刺是一个人工智能化的流程体系。最重要的是为迷宫电老鼠设计高效率和高实时性的程序和算法保证电脑鼠的控制精度和灵敏度并且能够完成了目标任务。 3.1.2 系统整体设计原理 电脑鼠是一个精密控制体,足够的控制精度才能保证在高速行走的时候避免不必要的错误动作。迷宫电脑鼠很好的诠释了肢体、感官和脑的协调工作,如图3-1-2所示的电脑鼠机械结构示意图,其中第部分为传感器,通过传感器感知运行时的迷宫周围环境,就像电脑鼠的感官;第①部分为电机、轮子等,使电脑鼠可以在迷宫中行走,为电脑鼠的肢体;第②部分为处理器芯片,通过传感器反馈回来的信号对迷宫环境进行分析,并配合一定的算法,控制电脑鼠的行动,使电脑鼠的感官和肢体协调工作,完成走迷宫的任务,成为电脑鼠的大脑。 图3-1-2 电脑鼠示意图 电脑鼠各部分的选型和总体功能要求如下: (1) 处理器:可以选用51系列单片机,或其他处理器,如Cortex系列、ARM系列,不同处理器处理能力不同,处理方式不同。本次迷宫小车使用 STC89C52RC 贴片MCU。 (2) 传感器:红外传感器,也可以用其他传感器。 (3) 驱动装置:步进电机,或其他电机如伺服电机、编码电机等。 (4) 车身设计:可以按照自己的想象、爱好去设计;要求:短小灵巧,转动自如稳定。 (5) 软件设计:实现基本的迷宫的寻找终点, 遍历, 回溯, 创建等高表, 路径寻优,冲刺等算法。要求:完成需要的功能。 3.1.3系统总体架构 迷宫电脑鼠硬件部分主要包括微控制器、电源、传感器和电机,以及外围的显示器、蜂鸣器和操作按键,总体架构如图3-1-3所示。下面简单介绍各部分的功能及作用。 (1)微控制器 微控制器是电脑鼠的核心,可以选择单片机,若RAM需求量大或者算法复杂或者性能要求高时,需要使用ARM等高性能的微处理器。本书选定的微控制器为STC89C52单片机。并且带有64 kb 的存储空间。 (2)电源系统 电源用来为整个系统供电,由于是为系统中的每个模块供电,所以图中没有画出连线。选择哪种方式、使用哪种电池来供电,会将影响电路的设计。这里使用了升压供电方案,分别为红外传感和步进电机驱动进行升压。 (3)传感器及其驱动 传感器的作用是用来感知环境,探测电脑鼠的左、前、右是否有路可走。本设计中采用的是红外传感器,发射和接收分别受微控制器控制。共有5组传感器,分别设置在电脑鼠头部的前、左、右、左前、右前方,其中左、右、前三组传感器是用于探测电脑鼠在当前迷宫格左、右、前三个方向上是否有支路的,左前、右前两组传感器呈45度安装,用于电脑鼠行进过程中的姿态矫正,防止电脑鼠走偏而撞到迷宫墙。由于5组传感器需要分时检测,某一时刻只能一组传感器工作,同时为了减少单片机控制传感器的引脚数,因此使用了3-8译码器来进行分时控制。 图3-1-3 迷宫电脑鼠总体框架 (4)电机及其驱动电路 驱动电路的作用是根据微控制器发过来的指令来驱动电机正/反转,带动轮子行走,从而完成电脑鼠走迷宫。驱动电路与所用电机密切相关,本设计采用的是步进电机。 (5)蜂鸣器 当电脑鼠到达终点、或是返回到起点时,可以用蜂鸣器来提示,是电脑鼠的可选部分。 (6)显示器 显示器/数码管是用来显示当前位置等相关信息的,用于调试,控制等是电脑鼠的可选部分。 (7)操作键 电脑鼠上设计有操作按键,用于启动电脑鼠、对电脑鼠复位、控制充电等操作,是电脑鼠的可选部分。 3.1.4 系统主要模块 (1)硬件模块: ① 微控制器MCU 模块 : 微控制器是整个设计的核心。在选择微控制器的主要从单片机应用系统的花费、技术性、实用性和可开发性等方面来考虑。综合考虑,采用型号为STC89C52的单片机作为迷宫电脑鼠的微控制器。STC89C52。 ②迷宫小车复位模块: 单片机的RST引脚接收到2μs(2个机器周期以上,由于使用的是12M晶振,一个机器周期是1μs)以上的高电平信号即可复位。单片机有两种复位方式,第一种方式是在单片机上电时,在电容和电阻的作用下,会在单片机的RST端施加短暂的高电平,使单片机复位。第二种方式是单片机在工作过程中出现异常,需要人为按下复位按钮时使单片机复位。 ③时钟振荡电路模块: 迷宫小车在工作过程中时时刻刻都需要进行程序的运行, 硬件的操控等所以需要精确控制时钟的信号。STC89C52单片机的时钟频率范围为0-40MHz。在引脚XTAL1和XTAL2外接晶体振荡器(简称晶振)或陶瓷谐振器,就构成了内部振荡方式。 ④系统供电模块: 迷宫小车使用3.7V锂电池作为电源, 但是小车单片机的工作电压为3V, 步进电机的工作电压为 12V ,所以需要加入升压以及稳压的电路模块,,其中5V输出负责给单片机、传感器、数码管及外部扩展设备供电,12V输出负责给电机供电。单片机电源充电上选用基于TP4056的充电电路方案。 ⑤迷宫小车程序下载电路: 迷宫电脑鼠采用microUSB接口下载, STC89C52芯片可直接使用串口下载程序,然而现在多数电脑上已经没有串口,所以一般使用USB转串口芯片,目的是把电脑的USB口映射为串口使用。常用的USB转串口芯片有CH340、CP2102、PL2303、FT232等。这里采用CH340G芯片完成USB转串口功能。 ⑥红外传感模块:迷宫小车通过红外传感器来检测一定范围内是否有迷宫墙壁,这就需要一组传感器才能实现。每组传感器由红外发光Led和红外接收头两部分组成,分别用于发射和接收红外信号。红外发光Led发出红外光,遇到障碍物后红外光反射回来,再由红外接收头接收信号。 ⑦电机驱动模块: 迷宫小车需要完成的所有任务都是基于迷宫小车能够自由行走, 转弯, 修正的基础上, 所以小车需要选择合适的驱动电机。 (2)软件模块: ① 红外传感模块: 包括红外传感器组的选择, 红外的发射和接收, 以及红外传感标志的判断和赋值。 ②电机驱动模块: 电机驱动需要完成计算出步距角, 在迷宫中行走一格的距离, 进行转弯, 修正对应的外循环上限, 即为需要循环的多少个8节拍。对应的电机驱动接口P1 口的脉冲数组的计算等。 ③寻路遍历模块: 迷宫小车在迷宫中需要使用中右法则进行寻路, 遇到走过的路径或者走不通的路径需要回溯到上一个岔路口坐标,继续行走没有走过的方向, 寻找到终点后进行提示然后继续遍历完整个迷宫, 遍历完成后, 回到起点。在遍历过程使用迷宫数组的低四位记录迷宫墙体信息, 高四位记录来的方向。 ④等高表创建模块: 迷宫小车在遍历完成后使用广度优先算法创建等高表, 从起点开始向每次寻找当前坐标点的四个方向如果能够访问,并且步数差值为1, 就设置对应的等高表步数, 然后切换焦点坐标, 并且进行队首元素退队。 ⑤寻优冲刺模块: 根据已经创建的等高表 contour_table ,从终点开始寻找可以访问的并且高度少1 的迷宫格子, 然后将这个绝对方向的信息写入迷宫数组的高四位, 最后迷宫小车从起点根据计算得到的迷宫高四位路径进行冲刺。 3.2硬件设计 3.2.1 硬件结构设计 ① 迷宫小车的总体硬件模块结构: 如图3-2-1.1 所示 , 我们的迷宫电脑鼠主要是在MCU微处理器的控制下操控红外传感进行检测周围环境, 做出对应的处理, 然后调用驱动电机进行行走, 以及支持这些功能的供电模块, 程序下载模块和辅助模块,比如数码管, 蜂鸣器。 图3-2-1.1 电脑鼠总体硬件模块 ② 迷宫小车的最小系统: 和一般的单片机应用系统一样,迷宫电脑鼠最小系统由51单片机、复位电路、时钟振荡电路和电源组成,如图 3-2-1.2所示。其中P0 口作为多功能得 I/O 接口, 用于操纵数码管的显示,P1口用于驱动电机的脉冲输入等, P2 口主要用于红外传感接收器的接收引脚, 以及红外传感的发射引脚等 图3-2-1.2 电脑鼠最小系统 ③ 数码管电路模块: 数码管模块主要是在迷宫小车中其到调试和提示的作用, 调试红外传感, 显示迷宫作坐标等。在使用数码管的时候需要先进行数码管位选操作, 打开需要进行显示的数码管, 然后给P0 口进行位操作选择点亮那些断码值就可。此次使用的数码管是具有锁存功能的,赋值一次就可以一直显示, 不需要循环刷新。如图3-2-1-3 所示: 图3-2-1.3 电脑鼠数码管 ④ 复位电路结构: 电脑鼠复位电路如图3-2-1.3所示,由电容、电阻和复位按钮组成。 复位电路的作用:在上电或复位过程中,控制CPU的复位状态:这段时间内让CPU保持复位状态,而不是一上电或刚复位完毕就工作,防止CPU发出错误的指令、执行错误操作,也可以提高电磁兼容性能。单片机在启动时都需要复位,以使CPU及系统各部件处于确定的初始状态,并从初态开始工作。单片机系统的复位方式有:手动按钮复位和上电复位。如图3-2-1.4所示: 图3-2-1.4 单片机复位模块 ⑤ 时钟震荡电路: STC89C52单片机的时钟频率范围为0-40MHz。在引脚XTAL1和XTAL2外接晶体振荡器(简称晶振)或陶瓷谐振器,就构成了内部振荡方式。由于单片机内部有一个高增益反向放大器,当外接晶振后,就构成了自激振荡并产生振荡时钟脉冲。如图3-2-1.5 所示: ![在这里插入图片描述]() 图 3-2-1.5 时钟震荡电路 ⑥ 供电电路:单片机属于很容易受干扰的器件,提供给单片机的电源必须是稳定、纯净的。单片机需要的工作电压是5V,锂电池的电压在3.0V-4.2V区间。电池对电路板供电需要经过升压及稳压。使用两片外置升压板,分别为3.7V升5V、3.7V升12V,其中:5V输出负责给单片机、传感器、数码管及外部扩展设备供电;12V输出负责给电机供电。如图 3-2-1.6所示: 图3-2-1.6 供电电路 ⑦ 充电电路: TP4056是一款完整的单节锂离子电池采用恒定电流/恒定电压线性充电器。充电电流可达1000mA。如图 5-2-1.7 所示: 图3-2-1.7 供电电路及其芯片 ⑧ 下载电路: 因为目前电脑都没有了串口通信的功能, 所以只能采用USB 转串口的方式来进行程序下载, 这里就需要使用到USB转串口的芯片了。CH340G是一款USB总线的转接芯片,它是CH340系列芯片的一种,引脚图如图5-10所示。CH340G内置了独立的收发缓冲区,支持单工、半双工或者全双工异步串行通信。它可以用于实现USB转串口、USB转IrDA红外或者USB转打印口。其原理图和结构图如图 3-2-1.8和9 所示: 图3-2-1.9 下载电路电路图 图3-2-1.8 CH340G引脚图 3.2.2 传感器组设计 (1)传感器 迷宫小车在迷宫中行走需要判断周围的路径信息, 并且记录这些信息, 这就不得不要求我们的单片机迷宫小车带有必须的检测装置, 即传感装置。但是可以用来传递周围环境信息的传感器种类很多, 例如红外传感器, 超声波传感器等, 但是我们需要考虑到传感器的成本, 特性, 以及周围环境的特殊性, 课程目标等条件。由于我们的单片机小车的成本应尽量的低, 并且应该保证能够完成检测任务, 所以我们采用LED 的红外发射传感器, 它不仅简单方便, 价格合理, 而且受到环境干扰的因素相对较为稳定, 最重要的是选择红外传感器是最方便我们进行后续的调试和程序编程的。 红外传感器检测一定范围内是否有迷宫墙壁,需要一组传感器才能实现。每组传感器由红外发光Led和红外接收头HS0038两部分组成,分别用于发射和接收红外信号。红外发光Led发出红外光,遇到障碍物后红外光反射回来,再由红外接收头接收信号,如果接收到信号,说明在一定距离内有障碍物,否则没有障碍物。如 图3-2-2.1所示: 图3-2-2.1 每组传感器的发射和接收电路 普通工作模式下的红外传感会受到光线中的红色光的影响, 所以我们采用了红外调制技术来排除干扰,具体做法就是:让红外发射管以38kHz的频率“闪动”,而红外接收器则是只有在收到了38kHz频率闪烁的红外光时才会做出反应,这样就有效的规避了大部分的环境光线干扰。而且,采用的红外传感还有对应的电位器可以非常方便的调节它的红外距离。 (2)74HC138译码器 迷宫电脑鼠安装有5个传感器组,如果每组传感器都直接接入单片机,每组传感器有一个发送红外信号引脚和一个接收信号引脚,则5组传感器需要占用12个单片机引脚。由于单片机引脚有限,为了节约传感器使用的引脚数,采用74HC138译码器将单片机的三位二进制编码译码为8位控制线,使用其中的5位输出控制线分别控制5个传感器组的分时工作(采用分时检测传感器,主要为了防止多组传感器之间的相互干扰)。这样使用3个单片机引脚即可控制5组传感器的红外发送工作。如 图3-2-2.1所示: 图3-2-2.1 74HC138电路图 74HC138译码器可接受3位二进制加权地址输入(A0、A1和A2)。A0、A1、A2三个输入端直接连接到单片机的I/O口,Y0至Y4五个输出端分别连接到红外发光二极管的irT*端。这样就可以通过单片机的A0、A1、A2的输出来控制红外Led是否工作。 (3)传感器的调试 通过调节红外发光二极管电路中的可变电阻,即可改变加到红外二级管上的电压,控制二极管发射红外光的强弱,从而来调节红外传感器可检测障碍物的远近。电位器位于LED和电源之间,通过调节电位器的阻值,可以调节LED正极处的电压,从而达到调节LED发射光波的强弱。调节电位器时,按逆时针的方向调节,检测的距离变远;按顺时针调节,使检测的距离变近。 调节调试红外传感的要点是, 所有的传感器调节最好是在满电状态下使用专用的红外传感调试的 .hex 文件进行每组红外传感的单独调试。具体的需要让左右两组红外传感器能够检测到一个迷宫格子的距离, 前方的红外传感器检测到接近一个格子的距离; 最难的要点是需要将左前和右前量组红外传感器的灵敏度调节到但小车从正中间朝向两边偏离了一定的角度(这里有个要点就是刚好偏离你的一个修正的角度)就能都强烈的检测到。最后还有个要点就是很多人都忽略的,当把小车贴近两边时也应该能够让左前或者右前要检测到墙壁, 这样才能使小车在行驶的过程中贴墙/撞墙也能修正。 3.2.3 电机驱动电路设计 (1)步进电机: 电脑鼠要在迷宫中行走,需要电机驱动轮子转动。利用电机将电能转化为机械能带动电脑鼠向前行走,在实际制作时可根据实际需要选择直流电机、带减速的直流电机、步进电机、伺服电机等。不同的电机,其控制是不同的。可以根据不同的需要选择不同的电机。在各类迷宫电脑鼠的设计中,常用的是编码电机,但考虑到其对内部资源占用较多、成本较高、传动结构复杂等特性,我们所使用的迷宫电脑鼠选用了步进电机直驱大直径车轮的动力方案。 如图3-2-3.1所示,即为我们使用的28BYJ-48减速步进电机,该电机属于4相永磁式减速步进电机,驱动电压12V,传动比1:16, 步距角5.625/16, 采用四相八拍工作方式。 图3-2-2.1 步进电机外观 转子,位于中间,它上面有6个齿,分别标注为0~5,它是要转动的,转子的每个齿上都带有永久的磁性,这就是“永磁式”的概念。定子,位于外圈,它是保持不动的,实际上它是跟电机的外壳固定在一起的,它上面有8个齿,每个齿上都缠上了一个线圈绕组,正对着的2个齿上的绕组是串联在一起的,也就是说正对着的2个绕组总是会同时导通或关断的,如此就形成了4相,在图中分别标注为 A-B-C-D,这就是“4相”的概念。如图3-2-2.2所示: 图3-2-2.2 4相步进电机原理 (2)步进电机工作原理: 假定电机的起始状态如图3-2-2.2所示,逆时针方向转动,起始时是B相绕组的开关闭合,B相绕组导通,那么导通电流就会在正上和正下两个定子齿上产生磁性,这两个定子齿上的磁性就会对转子上的0和3号齿产生最强的吸引力,就会如图所示的那样,转子的0号齿在正上、3号齿在正下方而处于平衡状态;此时会发现,转子的1号齿与右上的定子齿也就是C相的一个绕组呈现一个很小的夹角,2号齿与右边的定子齿也就是D相绕组呈现一个稍微大一点的夹角,很明显这个夹角是1号齿和C绕组夹角的2倍,同理,左侧的情况也是一样的。 接下来,把B相绕组断开,而使C相绕组导通,那么很明显,右上的定子齿将对转子1号齿产生最大的吸引力,而左下的定子齿将对转子4号齿,产生最大的吸引力,在这个吸引力的作用下,转子1、4号齿将对齐到右上和左下的定子齿上而保持平衡,如此,转子就转过了起始状态时1号齿和C相绕组那个夹角的角度。 再接下来,断开C相绕组,导通D相绕组,过程与上述的情况完全相同,最终将使转子2、5号齿与定子D相绕组对齐,转子又转过了上述同样的角度。 那么很明显,当A相绕组再次导通,即完成一个B-C-D-A的四节拍操作后,转子的0、3号齿将由原来的对齐到上下2个定子齿,而变为了对齐到左上和右下的两个定子齿上,即转子转过了一个定子齿的角度。依此类推,再来一个四节拍,转子就将再转过一个齿的角度,8个四节拍以后转子将转过完整的一圈,在单四拍的每两个节拍之间再插入一个双绕组导通的中间节拍,组成八拍模式。这样就达到了电机转动/驱动的功能了。 (3)步进电机驱动电路: ULN2003D是一个单片高电压、高电流的达林顿晶体管阵列集成电路。可以驱动步进电机的一种芯片。左电机的连接方式如下图3-2-2.3所示。ULN2003D的7个输入口和7个输出口,提供反相输出,即输入高电平,输出低电平。 图3-2-2.3 电机驱动电路图 在使用过程中若想让步进电机正常转动,其实就只要对单片机的P1口进行相等时间间隔的连续赋值就可以了,在设计中,P1口的高四位和低四位分别各控制一台电机,单其中高四位控制右电机和低四位控制左电机赋值需要根据相序表, 使用8拍驱动,低电平导通即四相导通顺序为A–AB–B–BC–C–CD–D–DA, 而有对应的驱动赋值表,如下图所示: 图3-2-2.4 P1口电机驱动赋值表 3.3软件设计 3.3.1 迷宫小车正常行走程序设计 通过前面的红外传感和电机驱动的基础知识, 想要思想迷宫小车前进,转弯,修正等只需要让驱动电机转动起来就可以了, 通过给P1口赋值进行字节操作就可以直接操纵两个电机的旋转, 但是我们的电机的安装方向相反, 所以我们给左右电机的赋值是相反的, 通过控制左右电机的赋值可以实现电机前进, 掉头, 左转, 右转, 单轮修正, 双轮修正。对应的数组如图3-3-1.1: 图3-3-1.1 电机驱动数组 但是在迷宫中行走需要将电机驱动和传感控制以及周围的迷宫信息结合起来。在本次课程设计中我采用中右发法则, 采用中断,定时器来控制红外传感的发射和接收, 发射时通过direct变量来进行循环选择红外传感组, 接收时根据发射的组数来进行对应接收, 如果前方有障碍做出对应的转弯法则/掉头, 设置一个转弯数值turn_value和绝对方向abs_direction, 转弯时根据转弯赋值给turn_value 不同的值, 然后用(abs_direction + turn_value )%4 就能得到对应的绝对方向, 然后根据小车前进的方向和绝对方向, 建立的绝对坐标就就可以得到对应的迷宫坐标,如图 3-3-1.2和3-3-1.3所示: 图3-3-1.2 绝对方向刷新 图3-3-1.3 迷宫坐标的刷新### 3.3.2 迷宫小车信息处理方法 迷宫小车根据给定的寻路法则, 和传感得到的周围信息, 来进行朝着计算出来的方向前进, 如图3-3-1.4所示: 图3-3-1.4 迷宫小车行驶 3.3.2 迷宫小车信息处理方法 迷宫小车在迷宫中行驶, 通过上面的绝对方向和相对方向转换函数, 确定当前的方向, 并且可以通过当前方向和想要行走的方向计算出需要转弯的方向。小车在迷宫中行需要一直检测周围的环境信息, 走完一格后在信息记录函数中设置一个 wall_value = 0xf0 , 墙体信息变量, 然后进行循环检测获取当前方向的红外传感信息, 然后进行左移位对应的方向数, 然后和wall_value 进行或操作将当前方向的迷宫信息写入到wall_value 的低四位, 执行完四个方向后, 就得到了一格的墙体信息, 然后与迷宫数组进行与操作,将低四位写入迷宫宿主低四位, 这样就记录了一格迷宫格子的周围迷宫信息。然后再将绝对方向direction << 4得到0xX0 的高四位不为0, 低四位为0 的来的方向, 然后与 0x0f 进行或操作就可以将迷宫格子的来的方向写入迷宫数组的高四位。全过程如流程图3-3-2.1所示: 图3-3-2.1 迷宫小车记忆路径信息 迷宫小车在在行驶过程中不仅仅是简单的记录迷宫信息, 还需要记录小车走过的路径, 方向, 和岔路口等。迷宫小车在两种情况下要返回岔路口:一是发现走进死胡同,二是可行路径都已走过时,便要调头返回上一个岔路口。想要知道返回哪个岔路口,就必须在检测到岔路口时把当前岔路口坐标记录下来且返回的岔路口是最新记录的岔路口,这和堆栈的“先进后出,后进先出”程序思想一致,因此可以用堆栈。当到了一个岔路口,就把该路口的坐标压入堆栈,当迷宫小车满足返回的条件时,便可返回上一个岔路口,再选择未走过的路。堆栈是一种程序操作思想,也可以用数组来实现它。此处我们定义了Node迷宫节点结构体, 接着我们只需要定义一个人数组stack就可以记录岔路节点了。通过传感器检测四周围的路,当检测到没有走过的路的条数大于1时,便是岔路口,此时把当前坐标压入堆栈。 搜索迷宫最基本的思路就是当前面无路可走时,回退一格这便是回溯。要回退,就必须知道电脑鼠是从哪里到达当前位置的,此时的迷宫数组高四位还未使用, 我使用数组高四位记录当前迷宫是从哪个方向来的,但回退到上一格的时候。判断是是否是岔路口,如果是便搜索其余方向是否走过了,没走过,就向这些方向行走;若已经走过了,继续返回。如图3-3-2.2: 图3-3-2.2 迷宫小车回溯路径 3.3.3 迷宫小车找终点程序设计 有了前面的基础,根据所选的搜索策略结合回溯算法就可以进行迷宫遍历和寻找终点。程序流程如图3-3-3.1所示。无路可走的状态下,电脑鼠需要回溯,回溯过程我们可以每次只回退一格,然后与栈顶坐标比较是否相等,当当前点是终点的时候就完成了寻找终点任务流程, 此时按照一样的思想和方法可以遍历完整个迷宫 图3-3-3.1 迷宫小车寻找终点 3.3.4 迷宫小车遍历迷宫程序设计 有了前面的基础,根据所选的搜索策略结合回溯算法就可以进行迷宫遍历。程序流程如图3-3-4.1所示。无路可走的状态下,电脑鼠需要回溯,回溯过程我们可以每次只回退一格,然后与栈顶坐标比较是否相等,如上图所示。或者可以在已知的有限迷宫图中建立登高表,以当前坐标为起点,栈顶坐标为终点,计算最短路径,返回岔路 图3-3-4.1 迷宫小车遍历返回 3.3.4 寻找最优路径的程序设计 搜索完迷宫之后电脑鼠已经有了迷宫的地图了,利用这个地图就可以计算出从起点到终点的最短路径。电脑鼠从一个迷宫格走到临近的另一个迷宫格,且两个迷宫格是可达的,称距离为1或步数为1。迷宫遍历结束后,电脑鼠已经得到迷宫中所有可到达的迷宫格的墙信息此时电脑鼠不用动,通过计算得到最优路径,最后沿最优路径冲刺:建立等高表,寻找最优路径 。 使用队列先进先出的思想, 然后通过广度优先算法BFS: 如图3-3-4.1 所示: (1)初始化每个迷宫格的步数为空白;建立一个队列,将起点坐标(0,0)放入队列,初始化起点坐标的步数为0。 (2)队头坐标出队,找到与该迷宫格相邻且有通路、且步数为空白的迷宫格,将其设为当前迷宫格,设当前迷宫格步数为上一迷宫格中的步数+1,同时将当前迷宫格的坐标入队 (3)队头坐标出队,重复(2),直到所有的迷宫格的步数都计算完毕,队列为空。 图3-3-4.1 等高表生成算法流程 迷宫小车成功创建等高表后, 需要开始进行冲刺, 按照迷宫数组数组中记录的迷宫最短路径方向, 判断相邻的步数差1 的迷宫格子并且可以访问, 但是要完成这一目标还必须要寻找出最短路径并且将最短路径的信息存储到迷宫数组的高四位的方向中, 寻找最优路径,回溯到起点后,开始根据广度优先算法寻找最优路径, 如图3-3-4.2所示: (1)首先根据之前记录的迷宫数组建立等高表 (2)根据等高表反向记录最优路径 (3)将路径记录到迷宫数组的高四位,这样可以复用之前的结构,将小车引导至终点 4 系统调试和故障处理 4.1 所遇到的问题、故障及解决办法 迷宫小车的左前和右前的红外传感灵敏度过高, 出现的现象是: 在迷宫左右两边都有墙的时候迷宫小车的左前和右前两个红外感应良好, 没有问题, 修正一切都是正常的,但是当出现一边没有墙的时候, 小车前进过程中缺失的左右中的墙壁出现, 或者左右墙壁消失的时候, 左前和右前的红外传感异常灵敏, 会直接检测到左前和右前的墙壁柱切面, 然后进行大幅度,长时间的修正。 出现这种想象的原因, 目前的我也不是很清楚, 因为这个问题是在课程设计快要3/2 的时候才出现的, 而且在这之前我的红外传感是非常优秀的, 跑到没电都不需要手扶, 但是忽然间就出现了哪个问题, 推测出现问题的原因, 应该是我设置的车的速度过快,小车经常撞墙, 红外传感接收头被撞歪了, 或者是进行手动复原红外传感的时候间传感器接收头掰坏了,造成接收的时候出现问题。 解决方法其实是也很好理解也很简单, 但是这样解决后, 会出现小车的局限性。只需要增加小车修正的条件, 设置下车自由前方无障碍,且小车两边都有墙的时候才进行修正, 这样就可以解决问题。 4.2 心得体会 渐渐的不知道什么时候, 嵌入式课程设计开始了, 我们的目标是完成迷宫小车进行寻路,遍历, 冲刺等。最初, 对于在平时的嵌入式单片机课上本就稀里糊涂, 昏昏欲睡的我来说, 认为这个课程对我来是说一个有史以来最大的困难和挑战, 所以一开始我就拿出平时120 % 的精力和注意力,认真的仔细地看书, 将书上地每一个原理图, 引脚图, 数值的计算, 程序的设计代码反复观看推敲, 上课非常认真地听老师讲解知识, 分析原理, 设计代码。尽管上课看书时懂得了其中的道理, 也不敢沾沾自喜, 还是会下来再次朝花夕拾课程设计书上详细的描述, 询问助教, 很多的 ”疑难杂症” , 不敢轻易的开始写代码, 要心中完全理解后才敢去解决程序设计的问题。我很庆幸, 自己的愚钝, 让我更加珍惜每一个可以能够提升自己, 让自己全力以赴, 奋不顾身的机会, 让我可以一直热血以待任何困难和生活。 课程设计中最难, 最麻烦的问题。废话真多, 开始我的正题了, 我在课程中遇到最难的问题莫过于小车的等高表生成和最短路径的生成这个层面了, 但是这却不是我最为麻烦的问题, 因为我为了另一个问题在教室通宵来解决,调试它—— 小车红外传感。在等高表的建立过程中需要的基础步骤和知识点太多庞大, 其中的奥妙思想更是值得我反复品味, 包括四个怎么实现四个方向的循环检测, 将步数创建到等高表中, 而且在遇到多个方向等高的时候, 怎么进行每个方向的分别去计算步数; 以及建立好等高表后, 怎么通过从终点回退到起点, 将最短的路径的信息记录到迷宫数组中, 并且在到达起点后, 进行冲刺的时候直接按照已经记录好的迷宫路径信息进行冲刺。等等这些在最开始的时候对我来说都是巨大的挑战, 对于曾经没有接触过广度优先BFS算法的我, 在最开始的时候都毫无头绪。但是这些思想问题比起你有思路但是却无法做好的实际问题—— 小车的红外传感的调节而言都是不那么痛苦的。每次调节的小车总会因为不是满电, 多次撞墙发,触碰而改变了接收的效果而变得情况恶劣。 对于我们本次使用的迷宫小车的诟病确实也是很多的。首先在接手这辆 “兰博基尼” 豪华跑车后, 我就进行了全身的检测,试驾, 尤为感觉,小车的红外传感因为没有外壳的保护很容易变形, 其次小车的充电速度和续航能力堪比 “充电五小时开车10分钟” 的设定, 其次, 在激情感受小车的 “高端发动机” , 小车的轮胎上梁不正下梁歪, 发动机的使用发烫过度严重… 至于改进方面, 想要我们的跑车拥有一双 “靓丽美好坚强的眼睛” 建议红外传感增加稳定性, 在外面加个保护壳在, 然后小车的外界的导线能够少一些, 或者可以收拢。 软件编程中右很多的难题, 曾经一直困扰着我。最开始的时候一直使用完好的红外驱动检测程序, 但是却又Bug 一直会存在问题, 后面通过询问助教得到了优质解答; 接下来的迷宫小车驱动, 在战场中自由穿梭一帆风顺, 但是遇到了回溯, 广度优先, 等高表, 最优路径等问题上徘徊和困惑了很久。对于Java 迷宫课设没有使用BFS 和DFS 以及递归回溯算法, 而是采用了更加符合电脑机器学习, 也理解起来更加简单的 A* 算法可以很简单的寻路到终点, 便且不需要建立等高表, 能够走到的路径就是最短路径, 这样我就可以一直研究遍历迷宫这个奇妙的旅途了, 但是在实现A* 算法的过程中遇到了很多困难的问题, 克服了他们, 完成75% 的算法后, 却遇到了知识水平,逻辑思维无法扭转的问题, 放弃了(T_T) , 可是时间已经过去2/3 了, 中途只能去跟着别人的思路写完了回溯, BFS, 等高表, 最优路径的程序, 所以这是我最大的失落与痛苦, 造成后面的软件答辩不够自信, 思想没有完全领会。 在整个课程设计中的建议。纵观老夫在者课程设计中的经历和表现, 其实很想要老师/助教/学姐学长在以后的教学中为大家讲解下在 A* 算法, 因为后面做完了, 在博客上面看到了A* 思想的迷宫小车的算法。还有就是希望能够有机会想要进行硬件的设计和焊接, 因为我真的很喜欢自己动手搞硬件,设计, 制作(☆▽☆) 。 |
|
|
|
只有小组成员才能发言,加入小组>>
2445 浏览 0 评论
9166 浏览 4 评论
36846 浏览 19 评论
5040 浏览 0 评论
24835 浏览 34 评论
1557浏览 2评论
1790浏览 1评论
2228浏览 1评论
1585浏览 0评论
558浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-30 16:53 , Processed in 1.374641 second(s), Total 74, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号