光学传感器的智能玩具小车设计
智能机器人在当今社会的应用越来越广泛。从普通的玩具机器人到工业控制机器人,从能够炒菜的机器人到可以进行太空探测的机器人,可以预见今后智能机器人的应用将更加广泛。 普通的无线遥控车大家都很熟悉,任天堂的电玩WII大家也都觉得很神奇。熟悉的不好玩,神奇的又玩不起,可能是很多人遇到的共同问题。
系统总体设计 智能小车系统原理是,将三维坐标传感器安装在小车上,小车即具有智能感知功能,就会随着目标物的前后左右移动而跟着移动。系统主要有3个组件:一为三维坐标光感传感器(ETOMS-ET21X111),用于采集目标物的移动坐标,该传感器使用非常简单;二为MCU(EMC-EM78P156),读取传感器数据控制马达转动,EM78P156是市面上常见的MCU,使用简单,价格便宜;三是马达,马达选用普通直流马达即可,采用PWM控制。系统整体框架如图1所示。
图1 系统整体框架 该设计的整体功能简单概括起来就是:让小车能够跟着人(或是目标物)走。分开来讲需要实现以下3个小功能:传感器能够正确读取X、Y、Z的坐标值,这是首要条件。MCU能够正确判断X、Z坐标值的大小变化,这是关键。可能有人会有疑问,为什么不判断Y坐标变化呢?那是因为小车不能上下跳跃(上下方为Y轴)。MCU根据坐标值的大小变化控制马达转向及马达PWM的时间,这是结果。
硬件系统设计 1传感器周边电路设计 ETOMS-ET21X111是一款高性能具有X、Y、Z坐标资料输出功能的光感传感器。具有如下特点:高速资料输出,每秒钟输出坐标资料高达75frame;低电压工作,电压范围2.7~3.5V;采用标准RS232串行资料输出格式输出坐标值;使用外部晶振,范围0.5~12MHz,通常采用3.58MHz;具有可控制曝光接口EO4~EO7。 EO4~EO7这四个接口是用于曝光控制的,既可以用软件进行控制,也可以用硬件的方式进行控制。根据自己的需要选择合适的即可。本设计采用硬件的方式将这四个接口全部置为高电平。 传感器周边详细的接口电路如图2所示,从图2中可知EO4~EO7为高,这是曝光设置为硬件拉高,也可以在软件中设置。IC正常工作时,坐标数据由RS232端口输出。注意图2中的4个LED为红外LED。IC工作电压是3.3V,系统采用5V供电。IC采用3.58MHz外接晶振,上电自动复位后即可正常工作。
图2 传感器接口电路2MCU接口电路设计
MCU周边控制电路详细设计如图3所示。图3中L、L+控制左边路马达PWM,R、R+控制右路马达PWM。RS232接收传感器坐标数据输入。IC工作于3.3V电压,上电后自动复位。系统时钟采用4MHz外接晶振。 图3 MCU接口电路
3左路马达控制电路 左路马达控制电路如图4所示。右路马达控制电路同左路的一样,图中Q3、Q4采用PNP管,L和L+不可同时为LOW,以免造成短路。 图4 左路马达控制电路
软件系统设计 系统上电后,首先进行初始化,对EMC78P156的寄存器进行设置,使能中断标志寄存器,等待中断。图5是主程序流程图。 图5主程序流程图 中断产生时进入中断处理子程序,首先要关闭中断标志且保护好现场,然后读取并解析XYZ坐标值,分成以下几种情况。 (1)判断X轴变化,如果X值在大于14小于等于17时,马达不左右转动,然后再判断Z轴坐标值的变化,如果Z值也在大于14小于等于17时,马达不前后转动。 (2)如果X轴坐标值大于17,判断Z轴坐标,若Z值大于17,则反转右马达,之后左右马达后转;若Z值小于14,则正转左马达,之后左右马达前转;否则马达不转动。 (3)如果X轴坐标值小于14,判断Z轴坐标,若Z值大于17,则反转左马达,之后左右马达后转;若Z值小于14,则正转右马达,之后左右马达前转;否则马达不转动。
中断处理子程序的流程如图6所示。 图6 中断处理子程序流程
设计技巧 1传感器的设计技巧 ET21X111对红外线的光谱响应最好,但自然光中含有大量的红外线,所以强烈的自然光会影响传感器的数据,导致输出的坐标与实际坐标有较大的偏差,解决方法是加滤光片,但这也只能起到衰减作用,具体应用视情况而定。 2马达控制电路设计技巧 设计控制马达正反转的电路时要注意:因MCU在上电的时候,I/O的状态是不确定的,所以程序在一开始就要将Q3、Q4的两个I/O设成HI(Q3、Q4为PNP管,如果为NPN管则I/O设成LOW),以防止在上电的时候两个I/O都为LOW,使Q3、Q4导通形成短路。另外需要注意的是在同一时间Q3、Q4只能有一个是导通的。 3MCU设计技巧 在电刷直流马达启动或转动的时候,会产生很大的电源毛刺。这对MCU的工作非常不利,所以加入此LCπ型滤波电路,如图7所示。 图7 滤波电路
4程序设计技巧 智能小车在运行的过程中,需要一边读取传感器传过来的坐标数据,一边控制马达的PWM输出。传感器会每12ms输出一次坐标资料,所以最好的方式是采用中断来读传感器资料,而在没有资料输出的时间做PWM输出的动作。
|