智能玩具小车设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

项目编号:T03010007
上海交通大学
PRP学 生 研 究 论 文
项目名称:智能玩具小车设计
论文题目:智能玩具小车设计报告
学生姓名:陈俊全
学生学号: 5040309472
所在院(系):电子信息与电气工程学院
指导教师:张士文
承担单位:电工电子实验中心
智能玩具小车设计报告
作者信息:
学生学院电子信息与电气工程学院
学生姓名小组成员陈俊全邱靖邦王凌云鲁国起吕越
指导教师所在学院电子信息与电气工程学院
指导教师姓名张士文
摘要:
智能小车是各类电子竞赛的经典题目。

本项目在现有的玩具小车的基础上加装各类传感器及微处理器,实现对路况的识别及小车的控制,并最终实现智能小车电路板的开发设计,完成一套完整的自设计智能小车体系。

本论文主要叙述 1.)智能玩具小车控制板的电机驱动模块的原理图设计及调试。

电机驱动控制模块是整个控制板的核心内容,主要涉及到电机方向控制单元和速度控制单元两大部分。

方向控制单元负责小车电机的正转、反转和停止三态控制,速度控制单元是扩展单元,是为了适应不同的场合需求而设置的。

2.)着重讨论智能小车辅助设备的原理与运用,包括摄像头设备(ET21X111),霍尔传感器(A3144),光电对管(TCRT5000),LCD液晶屏幕(RT1602C)等。

3.)本文主要论述智能玩具小车控制板的无线通信模块的原理图设计及调试。

无线通信模块是智能玩具小车得以实现智能化的重要因素,电脑通过架设在场地上的摄像头,处理得到的数据,同时把控制小车的指令通过无线通信模块传送给小车,达到控制小车的目的。

4.)智能玩具小车控制的总后台,即电脑的图象处理程序。

图象处理是整个控制的核心内容,主要涉及到小车方向控制和速度控制两大部,它首先判断小车和目标的相对位置,然后通过无限芯片发送不同的指令来控制小车的行动路线。

关键词:
智能玩具小车,电机驱动模块,方向控制,速度控制,摄像头,霍尔传感器,光电对管,LCD 液晶屏幕,无线通信,图象处理
ABSTRACT:
Intellectual vehicle is one of the most typical topics that various kinds of electronic competitions hold. This program is to add up different kinds of sensors and MPU onto a ready-made toy vehicle, and to realize road condition checking as well as automatical control. And we’ll finally work out a complete system of intellectual vehicle that is fully self-made. This essay is to focus on 1.)the designing and
debugging of the motor of the intellective car. The motor, which includes the orientation control part and the speed control part, is the core part of the whole control board. The orientation control part is used for the manipulation of the three moving sates, including moving in the positive direction, moving in the opposite direction as well as the stop. The speed control part is an patulous part, which is designed for the various need in various application circumstance. 2.)auxiliary devices, about how they work and how they are utilized. It includes camera setting (ET21X111), Hall sensor (A2144), reflective optical sensor (TCRT500), and LCD display (RT1602C). 3.)the designing and debugging of the wireless communication part of the intellective car . The communication part is a key factor for the intellective car to have the ability to adapt to the environment automatically. Through the camera allocated in the ground where the car is moving ,which is connected to the computer, the computer can dispose these data received from the camera, and then transmit the order which is to manipulate the car to the car. 4.)computer image processing. Image processing is the core content control, mainly related to the control and direction of the car speed control two departments, It first judgment car and the relative position of the object. Chip then sent through different directions unlimited line of action to control the car.
KEY WORDS:
intellective car, motor control part, orientation control, speed control, Camera, Hall Sensor, Reflective Optical Sensor, LCD Display,wireless communication, image processing
1. 系统总述
1.1 系统组成
图1.1.1 智能玩具小车系统组成示意图
2. 系统的主要功能
2.1 单片机子系统
通过无线传输设备接收电脑输出的命令并执行;连接电动机进行简单转速控制运算;进行小范围内路线自动控制;输出当前状态至LCD显示。

本系统采用ATS9852芯片。

2.2 电动机驱动子系统
采用两步进电机,接收来自单片机信号,通过电机前后转动组合实现小车前向、后向以及左右运动。

2.3 路线/转速检测子系统
利用光电对管对小车进行自动路线纠正;利用霍尔传感器进行小车速度检测并反馈到单片机内进行小范围内速度调控。

2.4 LCD显示子系统
从单片机获取当前小车动态数据以数字形式在LCD屏幕显示,方便实时监控小车状态并检测调试。

本系统采用RC1602C LCD屏幕显示。

2.5 无线传输子系统
接收来自电脑处理所得的命令并发送到单片机。

本系统采用ET13X330/ET3X340无限发送接收模块。

2.6 电脑处理子系统
接收摄像头路况图像并进行处理,将处理后命令通过无线模块发送至单片机执行。

2.7 路况检测子系统
利用连接到电脑上的摄像头进行路况摄像,所得图像经电脑处理成为小车控制命令。

本系统采用ET21X111摄像头。

3. 主系统的硬件设计
3.1 主要功能及设计目标
将电动机驱动电路以及单片7机控制电路整合在同一电路中,实现单片机对小车的基本操作,包括前后运动以及左右转向。

3.2 电路设计方案
图3.2.1 电路设计方案图
4. 电动机驱动电路的设计
4.1 H桥电路简介
下面详细地介绍一下H桥的工作原理: 众所周知H桥有四个臂分别为B1、B2、B3、B4,分别对应图 4.1.1中的Q2、Q3、Q7、Q8。

四个臂分为两组Q2、Q3和Q7、Q8,每一组的两个臂都是同时导通,同时关断的。

如果让Q2、Q3导通Q7、Q8关断,电流会流经Q3、负载、Q2组成的回路,加在负载Load两端的电压左正右负,如图 4.1.2所示,此时电机正转;如果让Q7、Q8导通Q2、Q3关断,电流会流经Q8、负载、Q7组成的回路,加在负载Load两端的电压为左负右正,此时电机反转,对应图 4.1.3所示。

另外如果让Q2、Q3关断Q7、Q8也关断,负载Load两端悬空,此时电机停转。

这样就实现了电机的正转、反转、停止三态控制。

图4.1.1 图 4.1.2 由于Q2、Q3,Q7、Q8的导通和关断是通过Q1、Q6控制,而Q1、Q6的导通和关断又是通过MOT1(IOB10)、MOT2(IOB11)控制的,所以电机的状态还是通过I/O端口来控制的。

表 2.1描述了IOB10和IOB11所控制电机运行状态与端口数据的对应关系
注意:由 H桥的工作原理可知,H桥的四个臂不能同时导通,一旦四个臂同时导通会出现类似短路的现象,在H桥的每一个臂上都会有很大的电流流过。

如图 4.1.3,Q2、Q3、Q7、Q8同时导通时,就会形成Q3、Q7回路和Q2、Q8回路,就会有很大的电流经过这4个三极管,严重时会烧毁三极管甚至引起电源爆
图4.1.3
以上分析的是两个H桥电路的其中之一,另外一个H桥的电路结构和工作原理是完全一样,在这里就不再赘述。

小车的运动是靠轮子带动的,而轮子的转动是靠电机带动的,所以在确定了电机的运行状态之后就能够推断出小车的运行状态。

下面是小车运行状态与61板端口数值对照表(表 2.2):
4.2 H桥电路的保护电路设计
为了避免出现上述情况,我们设计了以下逻辑电路(图4.1.4),从而避免了出现四个臂同时导通的情况。

图4.1.4
4.3 最终电路图设计
最终电路图设计如下:
5. 摄像头设备的原理及使用
5.1 主要功能以及设计目标
进行实时图像采集并将采集数据通过电脑处理后向小车发送操作命令。

本部分利用ET21X111摄像头通过RS232串口与电脑连接。

5.2 ET21X111摄像头基本工作原理
5.2.1 摄像头原理框图
图5.2.1.1 摄像头原理框图
5.2.2 摄像头像素构成
摄像头由32*32矩阵组成。

最外围有一圈保护圈,为无效方块。

摄像头矩阵如下
图5.2.2.1 摄像头矩阵图
5.2.3 摄像头数据流读取
数据流读取顺序为
Dummy STR -> (0,0) -> (0,1) -> ……(0,30) -> (0,31) ->
Dummy STR -> (1,0) -> (1,1) -> ……(1,30) -> (1,31) ->
……………………………………………………………
Dummy STR -> (31,0) -> (31,1) -> ……(31,30) -> (31,31) -> stop
摄像头数据流时序图如下
图5.2.3.1 摄像头数据流时序图
5.2.4 摄像头感光系统
摄像头靠像素单元对光敏感程度所产生的相对电平高低来判断吸收光的颜色。

摄像头像素单元对光敏感程度见下图
图5.2.4.1 摄像头像素单元对光敏感程度对照图
可见光波长范围是380nm至780nm,故在可见光范围内摄像头基本能够清除辨认颜色。

5.2.5 摄像头芯片及其外围引脚
图5.2.5.1 摄像头芯片图
5.3 摄像头的应用
5.3.1 摄像头外围设备连接
利用LED在物体上反射光进入摄像头成像,通过RS232串行端口将数据传输进电脑进行处理。

图5.3.1.1 摄像头外围设备连接框图 5.3.2 摄像头外围电路布局
图5.3.2.1摄像头外围电路布局图
5.3.3 摄像头电路及RS232电路实物图
图5.3.3.1 摄像头电路实物图
图5.3.3.2 RS232电路实物图
图5.3.3.3 RS232与摄像头接口连接图
GND GND 5V 5V NC SEN_EN RS232
interface
RS232 to PC COM port
RS2322接口
摄像头
Sensor + lens
IR LED
GND GND 5V 5V NC NC RS232 Frame signal
interface
6. 霍尔传感器的原理及应用
6.1 主要功能以及设计目标
利用霍尔传感器直接反馈到小车上单片机进行简单运算,实现小车自动微速调节以及前后轮平衡运作。

本系统采用A3144元件。

6.2 霍尔传感器工作原理
如图5.2.1所示,在一块通电的半导体薄片上,加上和薄片表面垂直的电场B,在薄片的横向两侧会出现一个电压,如图中V H,这种现象以1879年发现这种现象的科学家爱德华·霍尔命名为霍尔效应。

图6.2.1 霍尔传感器工作原理图
6.3 A3144工作原理
图6.3.1 A3144基本构造图
其中A44E集成霍尔开关属于单稳态型,其特性曲线如下
图6.3.2 A44E集成霍尔开关特性曲线图 6.4 霍尔传感器的使用
霍尔传感器可按照以下电路进行连接使用
电平输出(接单片机)
图6.4.1 霍尔传感器外部电路连接图
7. 光电对管的原理及应用
7.1 主要功能以及设计目标
利用光电对管实现对路况的简单判断,并将反馈数据直接输入单片机处理,对小车路线进行微调正。

本系统采用TCRT5000元件。

7.2 光电对管原理
光电对管由发光二极管以及光敏三极管组成。

三极管依靠二级管发射的光经地面反射以后的光形成相应大小的电流。

由此电流即可判断出地面黑白情况。

在赛道上有指定路径情况下,小车可按照赛道路径进行自动微调。

光电对管俯瞰图如下
图7.2.1 光电对管俯瞰图
7.3 光电对管的使用
在使用光电对管的时候,可以用下面的电路进行测试
图7.3.1 光电对管测试电路图
在实际使用的时候,在二级管上串联一适合大小的电阻,并将三极管与另外的电阻串联形成分压电路即可。

其电流转移特性如下
图7.3.2 光电对管电流转移特性
8. LCD屏幕(RT1602C)的原理及应用
8.1 RT1602C LCD屏幕介绍
RT1602C可以显示字母、数字符号、中文字型及图形,具有绘图及文字画面混合显示功能。

提供三种控制接口,分别是8位微处理器接口,4位微处理器接口及串行接口(OCMJ4X16A/B无串行接口)。

所有的功能,包含显示RAM,字型产生器,都包含在一个芯片里面,只要一个最小的微处理系统,就可以方便操作模块。

内置2M-位中文字型ROM (CGROM) 总共提供8192 个中文字型(16x16 点阵),16K-位半宽字型ROM (HCGROM) 总共提供126 个符号字型(16x8 点阵),64 x 16-位字型产生RAM (CGRAM),另外绘图显示画面提供一个64x256点的绘图区域(GDRAM),可以和文字画面混和显示。

提供多功能指令:画面清除(Display clear)、光标归位(Return home)、显示打开/关闭(Display on/off)、光标显示/隐藏(Cursor on/off)、显示字符闪烁(Display character blink)、光标移位(Cursor shift)显示移位(Display shift)、垂直画面旋转(Vertical line scroll)、反白显示(By_line reverse display)、待命模式(Standby mode)。

8.2 RT1602C指令/数据传输时序图
RT1602C有8位指令/数据口,本系统中均采用并行传输,其开启时序各有不同。

RT1602C指令传输时序图如下
图8.2.1 RT1602C指令传输时序图
RT1602C数据传输时序图如下
图8.2.2 RT1602C数据传输时序图
8.3 RT1602C基本操作程序
//LCD初始化程序
void LCD_INIT (void) {
OUTI (0X38); //设接口数据位数(DL),显示行数(L),及字型(F)
d elay (60);
O UTI (0X38); //设接口数据位数(DL),显示行数(L),及字型(F)
d elay (50);
O UTI (0X38); //设接口数据位数(DL),显示行数(L),及字型(F)
d elay (50);
O UTI (0X38); //设接口数据位数(DL),显示行数(L),及字型(F)
d elay (50);
O UTI (0X0F); //设整体显示开关(D),光标开关(C),及光标位的字符闪耀(B)
d elay (50);
O UTI (0X01); //清屏指令
d elay (50);
O UTI (0X06); //设光标移动方向并指定整体显示是否移动
d elay (50);
O UTI (0X80); //设DDRAM地址,设置后DDRAM数据被发送和接收
d elay (50);
}
//重定义std库内putchar,以printf调用
char putchar (char c) {
static unsigned char flag = 0;
if (!flag || c == 255) {
OUTI (0x80);
flag = 0;
if (c == 255) { return c; }
}
if (flag == 16) {
OUTI (0x80 + 0x40);
}
OUTD (c); // 送一个字符显示
_nop_ ();
flag++; // increment the line flag
if (flag >= 32) { flag = 0; } // 显示完之后清除 return(c); }
//时延函数
void delay (unsigned char time) {
unsigned char i;
for (; time > 0; time--) {
for (i = 0; i<=100;i++) _nop_ ();
}
}
//命令执行命令
void BWriteCommand () {
pc8255 = 0x00;//写命令
pc8255 = 0x04;//读忙,E为1
_nop_ ();
pc8255 = 0x00;//读入数据,执行命令
}
//数据写入命令
void BWriteData () {
pc8255 = 0x01;//写数据
pc8255 = 0x05;//读入数据,执行命令
_nop_ ();
pc8255 = 0x01;//读忙,E为1
}
//命令行输出
void OUTI (unsigned char oi) {
pb8255 = oi;
BWriteCommand ();
_nop_ ();
_nop_ ();
pc8255 = 0x02;//读忙
}
//数据行输出
void OUTD (unsigned char od) { pb8255 = od;
BWriteData ();
_nop_ ();
_nop_ ();
pc8255 = 0x02;//读忙
}
9. ET13X330无线通信芯片的原理与使用
2.1.1 功能描述
The ET13X330 is a CMOS integrated circuit intend for use as a low-cost AM/ASK receiver. The device is provided in 24-pin SSOP package and is designed to provide a phased locked frequency source for use in local oscillator or transmitter applications. The chip integrated VCO, phase detector, percale, LNA,MIXER,IF amplifier, peak detector data decision and reference oscillator require only the addition of an external crystal to provide a complete phase-locked loop.
The ET13X330 is a of low-power RF receiver IC’s that was developed for wireless data communication devices operating in the European 433MHZ ISM bands or U.S.315MHZ ISM band. The ET13X330 realize a highly integrated, single-conversion ASK/OOK receiver with the addition of a reference crystal, and a few passive components. The LNA input of the chip is easily matched to a front-end filter or antenna by means of a DC blocking capacitor and reactive components . The local oscillator generated by an internal VCO.PLL and phase detector, loop filter and VCO resonator components and external reference crystal. The receiver IF section is optimized with external 10.7MHZ ceramic 10.7MHZ,where , after external band-pass filtering, most of the amplification is done, The IF outputs is driven by a source-follower, based to create a driving impedance of 3300 to interface with an off-chip 3300 10.7MHZ ceramic IF filter.
2.1.2 芯片框图
2.2无线通信模块部分调试程序源代码
#include <REGX51.H>
sbit m1=P1^0;
sbit m2=P1^1;
sbit m3=P1^2;
sbit m4=P1^3;
unsigned char recv = 'c';
unsigned int buf1;
unsigned int buf2;
void play()
{
m1 = 1;
m2 = 1;
f or( buf1 = 0;buf1 < 255;buf1 ++ )
{
for( buf2 = 0;buf2 < 255;buf2 ++ )
{
}
}
m1 = 0;
m2 = 0;
f or( buf1 = 0;buf1 < 255;buf1 ++ )
{
for( buf2 = 0;buf2 < 255;buf2 ++ )
{
}
}
}
void main()
{
S M0 = 0;
S M1 = 1;
R EN = 1;
P CON=PCON&0x7f;
T MOD = 0x20;
T H1 = 0xA0;
T L1 = 0xA0;
T R1 = 1;
m1 = 0;
m2 = 0;
m3 = 0;
m4 = 0;
p lay();
p lay();
p lay();
w hile(1)
{
SBUF = 'K';
RI = 0;
while( RI == 0 );
recv = SBUF;
if( recv == 'a' )
{
m1 = 0;
m2 = 0;
m3 = 0;
m4 = 0;
}
if( recv == 'b' )
{
m1 = 1;
m2 = 1;
m3 = 1;
m4 = 1;
}
if( recv == 'c' )
{
m1 = 0;
m2 = 1;
m3 = 0;
m4 = 1;
}
if( recv == 'd' )
{
m1 = 1;
m2 = 0;
m3 = 1;
m4 = 0;
}
/*
TI = 0;
SBUF = recv;
while( TI == 0 ); */
}
}
10. 图像处理技术的原理和应用
10.1图象处理简介
下面详细地介绍一下图象处理程序的设计原理:
首先,我们要通过摄像头获取图象,然后才能处理图象,Matlab中能够非常容易的实现图象的获取:
vidobj = videoinput('winvideo', 1, 'RGB24_320X240');
preview(vidobj);
pause(1);% make the image more clear
background=getsnapshot(vidobj);
建立一个视频流对象后vidobj,应用getsnapshot()函数就能获取 当前视频的画面,并以图象的形式存储到了background中,以便对图象进行处理。

其次,我们要识别小车,就要检测其边缘并提取轮廓,因此下面用一些例子简要分析一下图象的边缘检测与轮廓提取原理以及方法。

1.边沿检测:
这种程序就是一种边沿检测器,它在数学上的涵义是一种基于梯度的滤波器,又称边沿算子,你没有必要知道梯度的确切涵义,只要有这个概念就可以了。

梯度是有方向的,和边沿的方向总是正交(垂直)的,例如,对于图象,边是水平方向的,我们
可以用梯度是垂直方向的模板 检测它的边沿,这里矩阵作为模板其实是实现了一个离散函数的梯度计算,在Matlab中可以方便的实现矩阵的运算,这也是我们选择matlab 作为开发软件的原因之一。

Sobel算子
在边沿检测中,常用的一种模板是sobel 算子。

有两个,一个是检测水平边沿的 .一个是检测竖直平边沿的 。

与 和 相比,sobel算子对于像素的位置的影响做了加权,因此效果更好。

Sobel算子另一种形式是Isotropic Sobel算子,也有两个,一个是检测水平边沿的 , 一个是检测竖直平边沿的。

Isotropic Sobel算子又称各向同性的Sobel算子。

和普通Sobel算子相比,它的位置加权系数更为准确,在检测不同方向的边沿时梯度的幅度一致。

图10.1. 原图
图10.2 普通Sobel算子处理后的结果图
图10.3 各向同性Sobel算子处理后的结果图
上面的几幅图中,图1为原图,图2为普通Sobel算子处理后的结果图,图3为各向同性Sobel算子处理后的结果图,可以看出Sobel算子确实把图象中的边沿提取了出来。

高斯拉普拉斯算子
由于噪声点(灰度与周围点相差很大的点)对边沿检测有一定的影响,所以效果更好的边沿检测器是高斯拉普拉斯(LOG)算子。

先平滑掉噪声,再进行边沿检测,所以效果会更好。

常用的LOG算子是5*5的模板,如下所示 。

到中心点的距离与位置加权系数的关系用曲线表示为:
图10.4 LOG到中心点的距离与位置加权系数的关系曲线
是不是很象一顶墨西哥草帽?所以,LOG又叫墨西哥草帽滤波器。

下图为图5用LOG滤波器处理后的结果。

图10.5用LOG滤波器处理后的结果图
2. 轮廓提取
轮廓提取如下图所示:
图10.6 原图
图10.7 轮廓提取
轮廓提取的算法非常简单,就是掏空内部点:如果原图中有一点为黑,且它的8个相邻点都是黑色时(此时该点是内部点),则将该点删除。

要注意的是,我们处理的虽然是二值图,但实际上是256级灰度图,不过只用到了0和255两种颜色。

3. 轮廓跟踪
轮廓跟踪,顾名思义就是通过顺序找出边缘点来跟踪出边界。

图10.6经轮廓跟踪后得到的结果如图10.8所示
图10.8 轮廓跟踪后的结果
一个简单二值图象闭合边界的轮廓跟踪算法很简单:首先按从上到下,从左到右的顺序搜索,找到的第一个黑点一定是最左上方的边界点,记为A。

它的右,右下,下,左下四个邻点中至少
有一个是边界点,记为B。

从开始B找起,按右,右上,上,左上,左,左下,下,右下的顺序找相邻点中的边界点C。

如果C就是A点,则表明已经转了一圈,程序结束。

否则从C点继续找,直到找到A为止。

判断是不是边界点很容易:如果它的上下左右四个邻居都是黑点则不是边界点,否则是边界点。

上述三个图象处理步骤描述了图象处理的基本过程,我们在调试中用的是小车撞击乒乓÷球,因此我们只需要识别小车与乒乓球,同时为了简化程序,我们还在小车上装设了标志,用来识别小车。

并且在图象处理程序中我们首先进行了滤波,消除干扰因素,然后正确判断小车与乒乓球的相对位置。

我们一共用到如下的几个函数:
FindLastRed:用来找到小车上的标记的坐标的函数
Isroundred:用来进一步确认真正的标记的函数(考虑到干扰因素)
FindLastYellow:用来找到乒乓球的坐标的函数
Isround:用来进一步确认真正的乒乓球坐标的函数(考虑到干扰因素)
Position:用来根据小车标记和乒乓球的坐标给出相应的位置信息的函数。

Travel:相当于主函数,用来实时的从视频流获取图象并调用子函数处理图象,返回控制信息的函数。

10.2 图像处理算法软件实现
最终程序如下:
function [ox,oy,r] =FindFirstRed(x,x1,x2,y1,y2)
ax1=0;
ax2=0;
ay=0;
for i=x1:x2;
for j=y1:y2;
a=x(i,j,1);
b=x(i,j,2);
c=x(i,j,3);
if(a>150&&b<150&&c<90);
ax1=i;
ay=j;
ax2=FindLastRed(x,ax1+1,x2,ay);
ax=(ax1+ax2)/2;
oy=ay;
ox=round(ax);
r=round(abs(ax2-ax1)/2);
if(Isroundred(x,ox,oy,r)==1);
return;
end;
end;
end;
end;
ox=0;
oy=0;
r=0;
function ox=FindLastRed(x,x1,x2,y)
for i=x1:x2;
a=x(i,y,1);
b=x(i,y,2);
c=x(i,y,3);
if(a<=150||b>=150||c>=90);
ox=i;
return;
end;
end;
ox=0;
function [ox,oy,r] =FindFirstYellow(x,x1,x2,y1,y2) ax1=0;
ax2=0;
ay=0;
for i=x1:x2;
for j=y1:y2;
a=x(i,j,1);
b=x(i,j,2);
c=x(i,j,3);
if(a>150&&b>100&&c<90);
ax1=i;
ay=j;
ax2=FindLastYellow(x,ax1+1,x2,ay);
ax=(ax1+ax2)/2;
oy=ay;
ox=round(ax);
r=round(abs(ax2-ax1)/2);
if(Isround(x,ox,oy,r)==1);
return;
end;
end;
end;
end;
ox=0;
oy=0;
r=0;
function ox=FindLastYellow(x,x1,x2,y)
for i=x1:x2;
a=x(i,y,1);
b=x(i,y,2);
c=x(i,y,3);
if(a<=150||b<=100||c>=90);
ox=i;
return;
end;
end;
ox=0;
function y=Isroundred(x1,ox,oy,r)
y=0;
a=round(r/2);
if(ox+a>240||oy+a>320||ox-a<1||oy-a<1);
return;
end;
if(x1(ox,oy+a,1)>150&&x1(ox,oy+a,2)<150&&x1(ox,oy+a,3)<90);
if(x1(ox,oy-a,1)>150&&x1(ox,oy-a,2)<150&&x1(ox,oy-a,3)<90);
if(x1(ox+a,oy+a,1)>150&&x1(ox+a,oy+a,2)<150&&x1(ox+a,oy+a,3)<90);
if(x1(ox-a,oy+a,1)>150&&x1(ox-a,oy+a,2)<150&&x1(ox-a,oy+a,3)<90); if(x1(ox-a,oy-a,1)>150&&x1(ox-a,oy-a,2)<150&&x1(ox-a,oy-a,3)<90);
if(x1(ox+a,oy-a,1)>150&&x1(ox+a,oy-a,2)<150&&x1(ox+a,oy-a,3)<90);
y=1;
end;
end;
end;
end;
end;
end;
function y=Isround(x1,ox,oy,r)
y=0;
a=round(r/2);
if(x1(ox,oy+r-5,1)>150&&x1(ox,oy+r-5,2)>100&&x1(ox,oy+r-5,3)<90);
if(x1(ox,oy-r+5,1)>150&&x1(ox,oy-r+5,2)>100&&x1(ox,oy-r+5,3)<90); y=1;
end;
end;
function [s,r] =Position(dx,dy)
s=0;
r=(dx^2+dy^2)^0.5;
if(dx==0&&dy==0);
return;
end;
if(dy==0&&dx>0);
s=0;
return;
end;
if(dy==0&&dx<0);
s=180;
return;
end;
if(dx==0&&dy>0);
s=90;
return;
end;
if(dx==0&&dy<0);
s=270;
return;
end;
q=dx/dy;
temp=acot(q)*180/pi;
if(dx<0&&dy<0);
s=temp+180;
return;
end;
if(dx>0&&dy>0);
s=temp;
return;
end;
if(dx<0&&dy>0);
s=temp+180;
return;
end;
if(dx>0&&dy<0);
s=temp+360;
return;
end;
%disp(mq);
%a=3;
%b=4;
%c=(a^2+b^2)^0.5
function travel(action)
%TRAVEL Traveling salesman problem demonstration.
% This demo animates the solution of the
% so-called "Traveling Salesman" problem.
% The problem is to form a closed circuit of a
% number of cities while traveling the shortest
% total distance along the way.
%
% The algorithm this demo uses is very simple,
% and so the emphasis here is more on the
% animation than on rapid, efficient solution.
%
% Use the "Cities" popup menu to determine the
% number of cities to be visited. The "Start"
% and "Stop" buttons control the animation. Cities
% are chosen completely at random.
% Ned Gulley, 6-21-93
% Copyright 1984-2003 The MathWorks, Inc.
% $Revision: 5.21.4.2 $ $Date: 2004/04/10 23:25:50 $
% Information regarding the play status will be held in
% the axis user data according to the following table:
play= 1;
stop=-1;
if nargin<1,
action='initialize';
end;
switch action
case 'initialize',
oldFigNumber=watchon;
figNumber=figure( ...
'Name','Travel: The Traveling Salesman Problem', ...
'NumberTitle','off', ...
'Visible','off', ...
'DoubleBuffer','on', ...
'Color', [0.9 0.9 0.9], ...
'BackingStore','off');
axes( ...
'Units','normalized', ...
'Position',[0.05 0.05 0.75 0.90], ...
'Visible','off', ...
'NextPlot','add');
text(0,0,'Press the "Start" button to see the edge detection and begin image processing', ...
'HorizontalAlignment','center');
axis([-1 1 -1 1]);
%===================================
% Information for all buttons
labelColor=[0.8 0.8 0.8];
yInitPos=0.90;
xPos=0.85;
btnWid=0.10;
btnHt=0.10;
% Spacing between the button and the next command's label
spacing=0.05;
%====================================
% The CONSOLE frame
frmBorder=0.02;
yPos=0.05-frmBorder;
frmPos=[xPos-frmBorder yPos btnWid+2*frmBorder 0.9+2*frmBorder]; h=uicontrol( ...
'Style','frame', ...
'Units','normalized', ...
'Position',frmPos, ...
'BackgroundColor',[0.50 0.50 0.50]);
%====================================
% The START button
btnNumber=1;
yPos=0.90-(btnNumber-1)*(btnHt+spacing);
labelStr='Start';
cmdStr='start';
callbackStr='travel(''start'');';
% Generic button information
btnPos=[xPos yPos-spacing btnWid btnHt];
startHndl=uicontrol( ...
'Style','pushbutton', ...
'Units','normalized', ...
'Position',btnPos, ...
'String',labelStr, ...
'Interruptible','on', ...
'Callback',callbackStr);
%====================================
% The CITIES popup button
btnNumber=2;
yPos=0.90-(btnNumber-1)*(btnHt+spacing);
textStr='Points';
popupStr=reshape(' 15 20 25 30 35 40 45 50 ',4,8)';
% Generic button information
btnPos1=[xPos yPos-spacing+btnHt/2 btnWid btnHt/2];
btnPos2=[xPos yPos-spacing btnWid btnHt/2];
popupHndl=uicontrol( ...
'Style','text', ...
'Units','normalized', ...
'Position',btnPos1, ...
'String',textStr);
btnPos=[xPos yPos-spacing btnWid btnHt/2];
popupHndl=uicontrol( ...
'Style','popup', ...
'Value',4, ...t
'Units','normalized', ...
'Position',btnPos2, ...
'String',popupStr);
%====================================
% The STOP button
btnNumber=3;
yPos=0.90-(btnNumber-1)*(btnHt+spacing);
labelStr='Stop';
% Setting userdata to -1 (=stop) will stop the demo. callbackStr='set(gca,''Userdata'',-1)';
% Generic button information
btnPos=[xPos yPos-spacing btnWid btnHt];
stopHndl=uicontrol( ...
'Style','pushbutton', ...
'Units','normalized', ...
'Position',btnPos, ...
'Enable','off', ...
'String',labelStr, ...
'Callback',callbackStr);
%====================================
% The INFO button
labelStr='Detection';
callbackStr='travel(''info'')';
infoHndl=uicontrol( ...
'Style','push', ...
'Units','normalized', ...
'Position',[xPos 0.20 btnWid 0.10], ...
'String',labelStr, ...
'Callback',callbackStr);
%====================================
% The CLOSE button
labelStr='Close';
callbackStr='close(gcf)';
closeHndl=uicontrol( ...
'Style','push', ...
'Units','normalized', ...
'Position',[xPos 0.05 btnWid 0.10], ...
'String',labelStr, ...
'Callback',callbackStr);
% Uncover the figure
hndlList=[startHndl popupHndl stopHndl infoHndl closeHndl];
set(figNumber, ...
'Visible','on', ...
'UserData',hndlList);
watchoff(oldFigNumber);
figure(figNumber);
case 'start',
%//////////////////////////////////////////////////////////// vidobj = videoinput('winvideo', 1, 'RGB24_320X240');
preview(vidobj);
%////////////////////////////////////////////////////////////
WNumber=watchon;
axHndl=gca;
figNumber=gcf;
hndlList=get(figNumber,'Userdata');
startHndl=hndlList(1);
popupHndl=hndlList(2);
stopHndl=hndlList(3);
infoHndl=hndlList(4);
closeHndl=hndlList(5);
set([startHndl closeHndl infoHndl],'Enable','off');
set(stopHndl,'Enable','on');
set(axHndl,'Userdata',play);
set(popupHndl, 'Enable', 'off');
% ====== Start of Demo
% Travel problem
% This is the main program for the Traveling Salesman Problem. % This function makes use of the following other functions:
% inside
% Lay down a picture of the United States for graphic appeal.
load('usborder.mat','x','y','xx','yy');
% The file usborder.mat contains a map of the US in the variables % x and y, and a geometrically simplified version of the same map % in the variables xx and yy.
cla;
plot(x,y,'Color','blue');
axis off;
axis([-0.1 1.5 -0.2 1.2]);
set(axHndl,'Drawmode','Fast');
hold on;
drawnow;
nptsStr=get(popupHndl,'String');
nptsVal=get(popupHndl,'Value');
npts=str2double(nptsStr(nptsVal,:));
set(popupHndl, 'Enable', 'off');
% ...else generate the random cities to visit
X=[];
Y=[];
% Form the US border in imaginary coords for the INSIDE routine w=xx+i*yy;
n=0;
while n<npts,
a=rand*1.4+i*rand;
if inside(a,w),
X=[X; real(a)];
Y=[Y; imag(a)];
n=n+1;
end;
end;
xy=[X Y];
% Calculate the distance matrix for all of the cities
distmatrix = zeros(npts);
for count1=1:npts,
for count2=1:count1,
x1 = xy(count1,1);
y1 = xy(count1,2);
x2 = xy(count2,1);
y2 = xy(count2,2);
distmatrix(count1,count2)=sqrt((x1-x2)^2+(y1-y2)^2); distmatrix(count2,count1)=distmatrix(count1,count2); end;
end;
% Generate an initial random path between those cities
p=randperm(npts);
newxy=xy(p,:);
newxy=[newxy; newxy(1,:)];
xdata=newxy(:,1);
ydata=newxy(:,2);
watchoff(WNumber);
plot(xdata,ydata,'r.','Markersize',24);
plothandle=plot(xdata,ydata,'yellow','LineWidth',2);
axis off;
drawnow;
len=LocalPathLength(p,distmatrix);
lenhist=len;
while get(axHndl,'Userdata')==play,
drawnow;
drawFlag=0;
pause(1);% make the image more clear
background=getsnapshot(vidobj);
[ox,oy,r]=FindFirstYellow(background,1,240,1,320);
disp(ox);
disp(oy);
disp(r);
%background=double(background)/255;
%figure(3);
% image(background);
%disp(background(1,1,3));
% Try a point for point swap
% ========================
swpt1=floor(npts*rand)+1;
swpt2=floor(npts*rand)+1;
swptlo=min(swpt1,swpt2);
swpthi=max(swpt1,swpt2);
order=1:npts;
order(swptlo:swpthi)=order(swpthi:-1:swptlo);
pnew = p(order);
lennew=LocalPathLength(pnew,distmatrix);
if lennew<len,
p=pnew;
len=lennew;
drawFlag=1;
end;
% ========================
% Try a single point insertion
% ========================
swpt1=floor(npts*rand)+1;
swpt2=floor((npts-1)*rand)+1;
order=1:npts;
order(swpt1)=[];
order=[order(1:swpt2) swpt1 order((swpt2+1):(npts-1))]; pnew = p(order);
lennew=LocalPathLength(pnew,distmatrix);
if lennew<len,
p=pnew;
len=lennew;
drawFlag=1;
end
if drawFlag,
newxy=xy(p,:);
newxy=[newxy; newxy(1,:)];
xdata=newxy(:,1);
ydata=newxy(:,2);
set(plothandle,'XData',xdata,'YData',ydata);
drawnow;
end;
% ========================
end;
% ====== End of Demo
set([startHndl closeHndl infoHndl],'Enable','on');
set(stopHndl,'Enable','off');
set(popupHndl, 'Enable', 'on');
delete(vidobj);
clear vidobj;
case 'info',
%helpwin(mfilename)
vidobj = videoinput('winvideo', 1, 'RGB24_320X240');
preview(vidobj);
pause(1);% make the image more clear
background=getsnapshot(vidobj);
delete(vidobj);
clear vidobj;
x1=background;
figure(2);
image(x1);
[ox,oy,r]=FindFirstYellow(x1,1,240,1,320);
disp(ox);
disp(oy);
disp(r);
end; % if strcmp(action, ...
function total=LocalPathLength(p,distmatrix)
% Calculate current path length for traveling salesman problem.
% This function calculates the total length of the current path
% p in the traveling salesman problem.
npts = size(p,2);
% This is a vectorized distance calculation
%
% We're creating two vectors: p and p([end 1:(end-1)]
% The first is the list of first cities in any leg, and the second % is the list of destination cities for that same leg.
% (the second vector is an element-shift-right version of the first) %
% We then use column indexing into distmatrix to create a vector of % lengths of each leg which can then be summed.
total=sum(distmatrix((p-1)*npts + p([end 1:(end-1)])));
11. 关于智能玩具小车设计过程中出现的一些问题的反思
2.1关于单片机的稳定性的困惑
在实际的测试中,我们发现一个很奇怪的现象,即当给单片机烧录进程序后,发现大概五分钟后单片机会自动重启.
在网上查阅了大量的电子资料后,我们得到了如下结论:单片机工作不稳定,抗干扰能力差,一般不是单片机的问题。

可能的原因有:
1、电路板设计不合理,元件位置安排不当,走线不合理。

2、电源电路设计问题,供电电压中含有尖峰干扰。

3、机械结构不合理,对干扰敏感的电路靠近干扰源。

为此,可以提出以下的解决方案:
在印刷电路板的设计中,要注意电路板的布线及工艺要求,元器件要合理分区,即合理分配单片机系统的模拟区(怕干扰)、数字区(既怕干扰又产生干扰)、功能区(干扰源)。

在元器件布局上,噪声元件与非噪声元件要尽量远离。

印刷电路板应遵循单点接地,单点接电源的供电原则。

( 3个区域的电源、地线应分别引出。

在达到系统要求的前提下,尽可能用低频晶振。

使用电源监控及看门狗电路,可大幅度提高系统的抗干扰能力。

在软件上,若失控的程序进入死循环,此时,通常采用“看门狗”技术使程序脱离死循环。

通过不断检测程序循环运行时间,若发现程序循环运行时间超过了预先设定的最大值,就认为程序陷入了死循环,按启动出错处理。

“看门狗”技术既可由硬件实现,也可由软件实现。

在工程实践中发现,严重的干扰能引起中断方式控制字的改变而关闭中断允许,使系统无法定时“喂狗”,硬件看门狗电路失效。

而软件看门狗电路能排除这种干扰。

我们知道,51系列单片机有两个定时器,我们可以用它们来组成一个环形监视系统。

即用定时器T0 监视定时器T1,用T1 监视主程序,用主程序监视T0。

这种环形监视的过程是这样的:在主程序、T0中断服务程序、T1 中断服务程序中各设一运行观察变量,如MainW,T0W,T1W,主程序每循环一次,MainW 加1,同样T0、T1 中断服务程序每执行一T0W、T1W 也加1。

在T0中断服务程序中通过检测T1W 的变化来判断T1运行是否正常,在T1中断服务程序中通过检测MainW 的变化来判定主程序是否运行正常,而在主程序中则根据T0W的变化情况来判断。

若检测到某变量不正常,则转至相应的出错处理程序。

值得注意的是,对主程序的最大循环周期、T0和T1的定时周期应合理设置。

2.1经验主义往往会让人误入歧途
以往在科技创新以及各种各样的试验中,经验告诉我们三级管平着放,左到右的顺序是 e, b, c
但事实上不是如此,直接导致在设计印刷电路板时没有详细查看所用三级管的datasheet。

而实际我们所用的5610和5609的三级管, 平着放,从左到右的顺序却是e, c, b.
2.3整个团队的效率较低
我认为这是我们日后应该重点注意的一个问题,在刚开始做这个PRP项目的时候,5个人对于电路设计的知识都是一片空白,于是虽然我们做到了每周都有一整个周六泡在试验室,但实际上是五个人在串行的工作,五个人对于同一个问题各抒己见,于是导致了每周六只能解决一个很。

相关文档
最新文档