标题：电脑鼠
概述
“电脑鼠”，英文名MicroMouse，是使用嵌入式微控制器、传感器和机电运动部件构成的一种智能行走装置（微型机器人），电脑鼠可以在不同“迷宫”中自动记忆和选择路径，采用相应的算法，快速地达到所设定的目的地。
国际电气和电子工程学会（IEEE）每年都要举办一次国际性的电脑鼠走迷宫竞赛，自举办以来参加国踊跃，为此许多大学还开设了“电脑鼠原理和制作”选修课程。真正的首场电脑鼠迷宫竞赛于1979年在纽约举行。1991年以来，每年都有世界级的比赛。
依照比赛规则，当电脑鼠放入起点，按下启动键之后，它就必须自行决定搜寻法则并且在迷宫中前进、转弯、记忆迷宫墙壁资料、计算最短路径、搜寻终点等功能。电脑鼠迷宫竞赛结合了机械、电机、电子、控制、光学、程序设计和人工智能等多方面的科技知识。
人类在科技的发展史上，一直在尝试着想要创造出一个具有肢体、感官、脑力等综合一体的智能机器人，而电脑鼠就是一个很能够用来诠释肢体、感官及脑力综合工作的基本实例，这也是当初电脑鼠被发明的理由，希望能够借助电脑鼠的创作来进而研究与发明更加复杂的机械。
  电脑鼠走迷宫一只电脑鼠是具有机电知识整合的基本架构，本身就像是一个智能的机器人。要在指定的迷宫中比赛，就像是一个人置身于竞赛中，必须要靠本身的判断力、敏捷动作及正确探查周边环境，来赢得胜利。一般来说，一只电脑鼠需具备有下列三件基本能力：
(1) 拥有稳定且快速的行走能力；
(2) 能正确判断能力；
(3) 记忆路径的能力。
行走能力指的就是电机，当电机收到讯号时，系统必须判断是否能同步行走，遇到转角时，转弯的角度是否得当，一个好的电机驱动程序，可以减少行走时所需要做的校正时间。判断能力的关键就在于传感器，它的地位如同人类的双眼，一个好的传感器驱动程序，可避免一些不必要的错误动作，如撞壁、行走路线的偏移等等。
而记忆能力就像是大脑，它的功能并没有因为看不见而遭到忽视，相反地，它的地位在整场比赛中是最重要的，他必须把所走过的路都能一一记下来，并将其资料送给系统，让系统整理出最佳路径以避开不必要的路段。
起源
1956年夏天，达特默斯人工智能会议在美国达特茅斯大学（Dartmouth）召开，会议首先提出了“人工智能”（Artificial Intelligence）这一术语，标志着人工智能（AI）作为一门新兴学科正式诞生。香农（信息论之父）参与发起了达特茅斯人工智能会议，成为这一新学科的开山鼻祖之一。他不仅率先把人工智能运用于电脑下棋方面，而且发明了一个能自动穿越迷宫的电子老鼠，以此证明计算机可以通过学习提高智能。
1972 年，机械设计杂志发起了一场比赛。在比赛中，仅由捕鼠器弹簧驱动的机械鼠不停地与其它参赛鼠竞赛，以判断哪个机械鼠能够沿着跑道跑出最长的距离。冠军是“mousemobile”，它跑了825.3 英尺。
1977 年，IEEE Spectrum 杂志提出电脑鼠的观念。电脑鼠是一个小型的由微处理器控制的机器人车辆，在复杂迷宫中具有译码和导航的功能和能力。1977 年5 月，Spectrum 宣布首场美国令人震惊的电脑鼠迷宫大赛在1979 年于纽约举行。在6000 个参赛作品中仅有15个电脑鼠比赛胜出。一些电脑鼠被报道为“大脑智障”（“brain failure”），另外一些则被宣布为电脑鼠“爆炸”（“blow up”）。当大家都非常关心这个话题时，智能电脑鼠的设计和制作显然就被证实比想象中的困难得多。
1979年，电子和电气工程师协会通过其Spectrum and Computer杂志发起了一场竞赛，比赛项目为制造出能够在短时间内自主走出迷宫的电脑鼠的人奖励1000美元。在6000个参赛作品中仅有15个电脑鼠比赛胜出，这是第一场真正的电脑鼠走迷宫的竞赛，标志着电脑鼠走迷宫竞赛的正式诞生。
1980 年，在伦敦Euromicro’80 举办了一场欧洲版的比赛，但是18 个参赛鼠都没能成功地完成这个迷宫赛。在比赛的观众当中，有五位来自日本新科学基金会的代表。他们将此比赛规则带回了东京，后来还在1980 年11 月举办了首场全日本电脑鼠比赛。
1985 年8 月，在日本Tsukuba 举行了首场世界电脑鼠大赛。电脑鼠来自整个欧洲和美国，使用的传感器有红外的、超声波的和CCD 的，驱动装置有步进电机的和DC 伺服电机的。所有最高奖项均由日本的电脑鼠Noriko-1 赢得，一举成为世界冠军。
1987 年，电机工程协会（IEE）在伦敦举办了一场电脑鼠锦标赛，13 个电脑鼠角逐冠军。来自美国麻省理工学院（MIT）的David Otten 带着他的两个参赛鼠Mitee Mouse I 和
Mitee MouseII 获得了一等奖和二等奖。比赛采用新的得分体制，以奖励那些能够智能、高效地解开迷宫的方案和能够独立运行的电脑鼠。
一位新加坡工程协会（IES）的议会成员在1986 年偶然发现了电脑鼠。因为他对电脑鼠以及电脑鼠的复杂程度和前景非常感兴趣，所以他觉得在新加坡举办一场国际电脑鼠大赛非常合适（IES 作为主要的赞助商）。
1987 年10 月，新加坡举行了第一届新加坡电脑鼠比赛。比赛的冠军MIR3+(来自Nanyang技术协会)是1988 年在伦敦举行的IEE UK 国际电脑鼠比赛的季军。
1989 年7 月，由第二届新加坡电脑鼠比赛的获胜者组成比较大的新加坡队参加了在伦敦举行的1989 年IEE UK 国际电脑鼠大赛。新加坡参赛者获得了最高8 个奖项中的6 个。
David Otten 的Mittee Mouse III 夺得了亚军，UK 某企业则获得了第五名。
在1989 年10 月21 日，IES 邀请澳大利亚、日本、台湾、UK 和美国最好的电脑鼠来参加新加坡首场国际电脑鼠大赛。来自美国和台湾的电脑鼠等待着复仇的时机，因为他们在7月份的伦敦大赛曾一度被新加坡打败。13 个来自当地的和外国的参赛者的电脑鼠在3 个小时的比赛中，表演出来的速度和敏捷程度使得观众叹为观止。新加坡获得第2 名、第4 名、第5 名和第7 名的事实出乎了很多人的意外。
1991 年，世界锦标赛在香港举行，这是继1985 年Tsukuba 世界锦标赛的又一场最大的国际盛会：来自13 个国家的21 位选手带着30 个电脑鼠来比赛。
自1991 年以来，世界级的比赛数目显著增加。原来一年举行5～6 场比赛，现在增加到100 场以上。
电脑鼠比赛在中国大陆还很少见，直到2007 年，由上海市计算机学会主办的IEEE 标准电脑鼠走迷宫邀请赛（长三角地区）在上海师范大学举行，有三十多所院校参加，反响强烈。
比赛规则
最新的电脑鼠比赛规则是2006 年国际电工和电子工程学会（IEEE）制定的电脑鼠走迷宫竞赛规则，这个规则将会对我们制作电脑鼠具体方案的设计提供依据。
电脑鼠比赛标准迷宫由广州周立功单片机发展有限公司设计和生产的电脑鼠比赛专用迷宫完全符合 IEEE 国际标准。针对不同的需求，目前共有两种可供选择的型号。
1. MicroMouse Maze 8×8：
四分之一迷宫，如图所示。即该迷宫是标准迷宫的四分之一大小。该迷宫底板的尺寸为1.48m×1.48m，上面共有8×8 个标准迷宫单元格。该迷宫可以用来初期调试学习使用，也可以用来做学校课程设计、毕业设计和内部竞赛的比赛迷宫。
  MicroMouse Maze 8×82.MicroMouse Maze 16×16：
标准迷宫，如图所示。该迷宫尺寸规格等完全符合IEEE 国际标准。迷宫底板的尺寸为2.96m×2.96m，上面共有16×16 个标准迷宫单元格。
  电脑鼠走迷宫如下图所示，MicroMouse615 是由广州致远电子设计生产的一款电脑鼠，它的微控制器是由Luminary 公司生产的Cortex-M3 内核的ARM 处理器——LM3S615，它具有以下一些特点：  MicroMouse615·体积小，宽度只有迷宫格的一半；
·五组可测距的红外线传感器，灵敏度方便现场调节；
·电机为步进电机，控制容易；
·电池为 2200mAh，7.4V 的可充电锂电池；
·支持电池的电压监测，避免电量不足带来的麻烦；
·一个按键，完全满足了实际需要；
·为用户预留了 6 个GPIO 口，一个串口，一个SPI 接口。配套的开发工具
如图所示，与MicroMouse615 配套的有充电器、LM LINK USB JTAG 调试器和SPI接口的键盘显示模块，使用户开发调试更为方便。
  MicroMouse615 及配套开发工具文档阅读说明
本文以广州致远电子有限公司生产的MicroMouse615 型电脑鼠作为硬件开发平台，从硬件原理到程序设计都做了详细分解。文中附了大量程序源代码，在程序设计过程中，为了便于阅读和编写，使用了一套变量的定义方法。
数据类型定义
如程序清单1.1 所示，重新定义几种常用的数据类型名。
//程序清单1.1 数据类型重定义
typedef unsigned char uint8; // 无符号8 位整型变量
typedef signed char int8; // 有符号8 位整型变量
typedef unsigned short uint16; // 无符号16 位整型变量
typedef signed short int16; // 有符号16 位整型变量
typedef unsigned int uint32; // 无符号32 位整型变量
typedef signed int int32; // 有符号32 位整型变量
typedef float fp32; // 单精度浮点数（32 位长度）
typedef double fp64; // 双精度浮点数（64 位长度）
2． 局部变量定义
局部变量名包含变量类型和变量描述两个部分，以局部变量Temp 为例，在不同类型下的定义如表1.1 所示。可以看出，在变量Temp 前加上了其类型的缩写。