机电一体化报告

《机电一体化综合训练》

个人实习报告

实验组:

指导教师:

小组成员:

西北农林科技大学机械与电子工程学院

2013-7-7

目录

一.舵机车总结 ................................................................................................................................... 4

1.实习目的、任务与要求 ....................................................................................................................... 4

1.1实习目的 .................................................................................................................................... 4

1.2实习任务与要求 ........................................................................................................................ 4

2.实习准备 ............................................................................................................................................... 5

2.1实习准备 .................................................................................................................................... 5

2.2舵机车的组装和软件的安装 .................................................................................................... 5

2.2.1硬件的安装 ..................................................................................................................... 5

2.2.2软件的安装 ..................................................................................................................... 5

3.实习任务 ............................................................................................................................................... 5

3.1伺服电机的控制 ........................................................................................................................ 5

3.1.1编程控制LED测试电路 ................................................................................................. 5

3.1.2伺服电机控制信号 ......................................................................................................... 6

3.1.3伺服电机连接 ................................................................................................................. 6

3.1.4伺服电机调零 ................................................................................................................. 6

3.1.5计数并控制循环次数 ..................................................................................................... 7

3.1.6测试电机 ......................................................................................................................... 7

3.2舵机车组装及测试 .................................................................................................................... 9

3.2.1舵机车的组装 ................................................................................................................. 9

3.2.2重新测试伺服电机 ......................................................................................................... 9

3.2.3开始/复位指示电路和编程 ............................................................................................ 9

4.舵机车的巡航控制 ............................................................................................................................... 9

4.1舵机车的基本动作 .................................................................................................................... 9

4.2舵机车触觉导航 ...................................................................................................................... 11

4.2.1连接触觉导航电路并测试 ........................................................................................... 11

4.2.2触须导航 ....................................................................................................................... 11

4.2.3程序运行 ....................................................................................................................... 12

4.3红外线导航 .............................................................................................................................. 14

4.3.1红外导航电路图及其工作原理 ................................................................................... 14

4.3.2探测和避开障碍物 ....................................................................................................... 14

4.3.3程序运行 ....................................................................................................................... 15

4.4光敏电阻导航 .......................................................................................................................... 18

4.4.1光敏电阻工作原理 ....................................................................................................... 18

4.4.2光敏电阻应用导航 ....................................................................................................... 18

4.4.3 程序运行 ...................................................................................................................... 18

4.5循迹导航 .................................................................................................................................. 19

二.直流电机总结 ............................................................................................................................ 22

1.实习目的、任务与要求 ..................................................................................................................... 22

1.1实习目的 .................................................................................................................................. 22

1.2实习任务与要求 ...................................................................................................................... 22

2.实习准备 ............................................................................................................................................. 22

2.1实习准备 .................................................................................................................................. 22

2.2直流车的组装和软件的安装 .................................................................................................. 23

2.2.1硬件的组装 ................................................................................................................... 23

2.2.2软件的安装 ................................................................................................................... 23

3.实习任务 ............................................................................................................................................. 23

3.1基本运动 .................................................................................................................................. 23

4.模块测试 ............................................................................................................................................. 23

4.1超声波模块 .............................................................................................................................. 23

4.1.1舵机归中 ....................................................................................................................... 23

4.1.2超声波避障舵机转动 ................................................................................................... 25

4.2蓝牙模块 .................................................................................................................................. 27

4.2.1蓝牙的安装 ................................................................................................................... 27

4.2.2程序运行 ....................................................................................................................... 27

4.3无线模块 .................................................................................................................................. 29

4.4循迹测试 .................................................................................................................................. 30

三.步进电机小车总结 .................................................................................................................... 30

1实习目的、任务与要求 ..................................................................................................................... 30

1.1实习目的 .................................................................................................................................. 30

1.2实习任务与要求 ...................................................................................................................... 31

2.实习准备 ............................................................................................................................................. 31

2.1实习准备 .................................................................................................................................. 31

2.2步进车的组装和软件的安装 .................................................................................................. 31

2.2.1硬件的安装 ................................................................................................................... 31

2.2.2软件的安装 ................................................................................................................... 32

3.实习任务 ............................................................................................................................................. 32

3.1基本运动 .................................................................................................................................. 32

4.模块测试 ............................................................................................................................................. 32

4.1超声波模块 .............................................................................................................................. 32

4.1.1超声波原理 ................................................................................................................... 32

4.1.2超声波LCD显示 ......................................................................................................... 32

4.2避障光电开关 .......................................................................................................................... 37

4.3循迹模块 .................................................................................................................................. 39

4.4无线遥控模块 .......................................................................................................................... 40

四.实习总结...................................................................................................................................... 43

机电一体化综合训练实习总结

一.舵机车总结

1.实习目的、任务与要求

1.1实习目的

(1)通过训练,了解舵机车由哪几部分组成。理解舵机车是根据什么要求而设计的,理解设计时需要考虑的参数,包括:机器人的运动路径、定位精度,重复定位精度、任务执行等。

(2)了解目前舵机车能量的供给形式,掌握控制部分和执行部分的供电方式。

(3)理解舵机车的构成及其原理。

(4)了解舵机车上的传感器有哪些,掌握传感器的原理及工作方式。

(5)理解舵机车是如何根据传感器的信息做出决策。

(6)掌握舵机车如何运动以及其他的运动方式。

(7)理解舵机车与用户交换信息的各种方法。

(8)通过训练,学会独立完成开发一个基于单片机控制的机电系统。

(9)尽可能的在组装好的舵机车上实现不同情况的开发。

(10)培养团队协作和独立工作能力。

1.2实习任务与要求

(1)熟悉舵机车的组成部分,组装并测试好舵机车。

(2)舵机车的可以前进、后退、左转、右转、停止,并在允许范围内可调节速度。

(3)陈述清楚舵机车如何实现运动。

(4)掌握舵机车的控制部分和运动部分的供电方式。

(5)理清舵机车的人机交互关系,陈述清楚舵机车如何实现人机交互。

(6)陈述清楚舵机车有哪些传感器,传感器的信息是如何传送到单片机的。

(7)完成舵机车的触须导航、光敏电阻导航、红外线导航、距离检测和循迹等任务,并陈述清楚其原理。

(8)能在实验中迅速排除各种故障。

(9)鼓励创新,在完成前八个基本任务的前提下,尽量做出新的开发,如果现有硬件条件不满足,可以陈述清楚创新原理。

2.实习准备

2.1实习准备

硬件:PC机、AT89S52单片机、舵机车组件、ISP下载电缆、串口线、电池。 软件:Keil uVision4 IDE集成开发环境、SL-ISP软件下载工具、串口调试软件。

2.2舵机车的组装和软件的安装

2.2.1硬件的安装

根据实习指导书上的步骤将舵机车的硬件组装起来

2.2.2软件的安装

(1)解压缩光盘中的KeilC51到某个目录下,如D:\keil

(2)执行D:\keil\setup\setup.exe 安装程序,选择安装Eval Version版进行安装

(3)安装ISP下载软件

3.实习任务

3.1伺服电机的控制

3.1.1编程控制LED测试电路

二极管是单向导电的电子管,而发光二极管(LED)在有电流流过时会发光。不像电阻上的颜色代码,LED的颜色仅仅表示电流流过时它将发什么颜色的光。LED重要的标识在它的外形上。因为二极管是单向导电的电子管,你必须保证连接正确,否则它将不能工作。完成测试所搭建的电路如图8所示:

图8 两个发光二极管分别与I/O脚P1_0、P1_1连接

在本次测试中,我们使用P1端口的第一脚记为 P1_0,再设置I/O端口的电平来控制LED发光或熄灭,注意它是怎样输出高或低电平的。

让另一个连接到P1_1管脚的LED闪烁是一件很容易的事情,把P1_0改为P1_1,重新运行程序即可。当然,你可以再次修改程序,让两个发光二极管交替亮或灭,你也可以通过改变延时函数的参数n的值,来改变LED的闪烁频率。

3.1.2伺服电机控制信号

通过对微控制器编程发给伺服电机的高、低电平信号必须保持非常精确时间。这是因为伺服电机根据信号的高电平持续时间的长短作为向什么方向转动的指示。对于精确的伺服电机控制而言,信号的高电平持续的时间要求比

delay_nms函数的时间值要精确的多。你只能每次以1ms为单位改变delay_nms函数的参数n的取值。这时需要使用另一个延时函数delay_nus(unsigned int i)。

3.1.3伺服电机连接

连接伺服电机到电源和控制器的I/O口。先前搭建的LED电路将被用来监视控制器模块发送到伺服电机的运动控制信号。

3.1.4伺服电机调零

将运行一个程序,发送一个脉冲信号到伺服电机,让电机保持静止。由于伺服电机在工厂没有预先调整,它们在接收到该信号时将转动。你要用螺丝刀调节伺服电机让它们保持静止。这就是伺服电机调零。调节之后,你要测试伺服电机,验证其功能是否正常。测试程序将发送信号让伺服电机顺时针和逆时针以不同的速度旋转。

图9显示的信号是发送到与P1_1连接的伺服电机的校准信号,称为零点标定信号。伺服电机调节好之后,这个信号就可以指示电机保持静止。这个信号是由时间间隔为20 ms 的脉宽为1.5 ms的一系列脉冲组成。

图9 1.5ms脉冲宽度的时间矢量图

下面我们计算脉宽为1.5 ms时delay_nus函数的参数n的取值。1.5 ms即1500us。前面说过,无论delay_nus函数的参数n的取值是多少,都要乘以1 μs,这样就可以计算出总的延时。如果知道脉冲要持续多长时间,你就可以计算出delay_nus函数的参数n的取值。用这个公式计算:

下面我们连接到P1_0的伺服电机零点调整,程序如下:

#include

#include

int main(void)

{

uart_Init();

printf("Program Running!");

while(1)

{

P1_0=1;

delay_nus(1500);

P1_0=0;

delay_nms(20);

}

}

3.1.5计数并控制循环次数

最方便的控制一段代码执行次数的方法是利用for循环,语法如下:

for(表达式1;表达式2;表达式3) 语句

它的执行过程如下:

(1) 先求解表达式1。

(2) 求解表达式2,若其值为真(非0),则执行for语句中指定的内嵌语句,然后执行下面第3)步;若其值为假(0),则结束循环,转到第5)步。

(3) 求解表达式3。

(4) 转回上面第2)步继续执行。

(5) 循环结束,执行for语句下面的一个语句。

下面是一个用myCounter来计数的for循环例程。每执行一次循环,它会显示myCounter的值。

For(int myCounter=1; myCounter

{

printf(“%d”,myCounter);

delay_nms(500);

}

3.1.6测试电机

在装配宝贝车机器人之前还有最后一件事要做,那就是测试电机。在本任务中,你将运行程序,使电机以不同速度和不同的方向旋转。通过这些测试,将确保在装配之前电机工作是正常的。

图10 1.3 ms的连续脉冲使电机顺时针全速旋转

图2-17所示是当你给连续旋转电机1.3 ms的脉冲时,它如何以全速顺时针旋转。全速的范围是50 到 60 转每分钟(RPM)

图11 1.7ms的连续脉冲使电机逆时针全速旋转

将delay_nus的参数n设为大于1500的数会使电机逆时针旋转。n的值为1700可以发出1.7 ms的脉冲,如图11所示,这将使电机全速逆时针旋转。

控制两个电机的delay_nus函数的参数n有四种不同的组合,这些组合经常会被用到。发送了这些组合中的一种,1700给P1_1 ,1300 给P1_0。通过测试不同的组合,填写表1的描述列。你将慢慢熟悉这些组合并为你自己建立一个参考。当你的宝贝车机器人安装完成后,填写下表的行和列,你就会看到每种组合使它怎样运动。

3.2舵机车组装及测试

3.2.1舵机车的组装

按指导书上的步骤做即可,但在组装的过程中,我们发现需要小心谨慎,并将繁杂的线路分清整理好。

3.2.2重新测试伺服电机

本任务通过测试确保主板和伺服电机之间的电气连接正确。舵机车的前后左右的定义。确保右边的伺服电机从端口P1_0接收到脉冲后旋转,左边的电机从端口P1_1接收到脉冲后旋转。在测试电动机顺时针旋转三秒,停止一秒,然后逆时针旋转三秒时,我们发现我们的宝贝车右边电机在静止的时候并非完全静止,而是有稍微的旋转,我们通过修改delay_nus(int n)中n的值来使电机停止,通过调整,右边电机的静止参数为1490,左边电机为1500。

注意:在载入程序的过程中,一定要把三位开关设置到位置“2”。

3.2.3开始/复位指示电路和编程

在微控制器运行的过程中,可能会有一些因素使处理器复位。这会导致舵机车行为混乱。在某些情况下,机器人在按任何程序规定的路线行走,突然地,它好象迷路了并走向我们不期望的方向。实际情况是处理器受到某些因素的影响而产生复位使宝贝车程序从头重新运行。在这些情形下,程序重新/开始指示器成为一个非常有用的诊断设备和机器人工具。一种指示程序重启的方法是在所有舵机车程序的开始处包含一个明确的信号。这个信号在每次复位时产生。一个有效的表明程序重启的方法是扬声器,它在每次程序从头开始运行或重启时就会发出声音。测试过程得到宝贝车重启时蜂鸣器可以发出声音。

4. 舵机车的巡航控制

4.1舵机车的基本动作

让舵机车向前走、左转、右转以及向后走。程序如下:

#include

#include

int main(void)

{

int counter;

printf("Program Running!\n");

for(counter=1;counter

{

P1_4=1;

delay_nus(1000);

P1_4=0;

delay_nus(1000);

}

for(counter=1;counter

P1_1=1;

delay_nus(1700);

P1_1=0;

P1_0=1;

delay_nus(1300);

P1_0=0;

delay_nms(20);

}

for(counter=1;counter

P1_1=1;

delay_nus(1300);

P1_1=0;

P1_0=1;

delay_nus(1300);

P1_0=0;

delay_nms(20);

}

for(counter=1;counter

P1_1=1;

delay_nus(1700);

P1_1=0;

P1_0=1;

delay_nus(1700);

P1_0=0;

delay_nms(20);

}

for(counter=1;counter

P1_1=1;

delay_nus(1300);

P1_1=0;

P1_0=1;

delay_nus(1700);

P1_0=0;

delay_nms(20);

}

} 注意:伺服电机的控制线连接在教学板的单片机上,通过给单片机控制器编程,使单片机的P1端口的第一引脚P1_1和第二引脚P1_1来发出伺服电机的控制信号,控制信号通过控制线来控制左右伺服电机的转动,从而实现机器人以不同的速度及方向运动。

4.2舵机车触觉导航

4.2.1连接触觉导航电路并测试

零件列表:金属丝2根、平头M3×22盘头螺钉2个、13mm圆形立柱2个、M3尼龙垫圈2个、3-pin公-公接头2个、220欧电阻2个、10k欧电阻2个

安装步骤:(1).拆掉连接主板到前支架的两颗螺钉;

(2).螺钉依次穿过尼龙垫圈和圆形立柱;

(3).把须状金属丝的其中一个勾在尼龙垫圈之上,另一个勾在尼龙垫圈之下,调整位置使他们横向交叉但又不接触; (4).拧紧螺钉到支架上。

按照图12搭建电路:

图12 触须电路原理图

电路原理:由原理图可知,每条胡须都是一个常开开关。连接到每个胡须电路的I/O引脚监视着10k上拉电阻上的电压变化。当胡须没有被触动时,连接胡须的I/O管脚的电压是5V,当胡须被触动,I/O短接到地,所以I/O管脚的电压是0V。单片机可以读入相应的数据,进行分析、处理、控制机器人运动。在进行胡须测试之前需将串口电缆连接好,需用到调试终端以显示左右胡须状态,调用相关程序进行测试。 4.2.2触须导航

两个胡须状态有三种,需分情况讨论,需用到if语句。程序中应用的子程序(Ox代表十六进制数):

 获取P1_3的状态,即左胡须 int P1_3state(void) {return (P1&0x08)?1:0;}

 获取P1_2的状态,即右胡须

int P1_2state(void) {return (P2&0x04)?1:0;}

 向前子程序 void Forward(void)

 左转子程序

void Left_Turn(void)

 右转子程序

void Right_Turn(void)

 后退子程序 void Backward(void)

 循迹左转

void Left_Turnsmall(void)

 循迹右转

void Right_Turnsmall(void)

 左拐180度

void Left_Turn180(void)

 右拐180度

void Right_Turn180(void)

 小幅度左拐

void Left_Turn111(void)

 小幅度右拐

void Right_Turn111(void)

 停车

void Stop_car(void)

说明:左胡须接引脚P1_3,右胡须接引脚P1_2,在机器人的运动过程中,当左右胡须同时触到障碍物时,两个引脚输入全为0,此时通过调用相应函数Backward();Left_Turn();Left_Turn();实现后退并转180度;当只有左胡须触到障碍物时,P1_4输入为0,此时调用函数Backward();Right_Turn();实现向后并向右转;当只有右胡须触到障碍物时,P2_3输入为0,此时调用函数Backward();Left_Turn();实现向后并向左转。函数调用的过程中其实是通过连接在单片机引脚上的两个伺服电机控制线,向伺服电机发送不同的脉冲序列,从而实现电机的不同运动。 4.2.3程序运行

#include #include int P1_5state(void) {

return (P1&0x20)?1:0; }

int P2_3state(void) {

return (P2&0x08)?1:0; }

void Forward(void) {

P1_1=1;

delay_nus(1700); P1_1=0; P1_0=1;

delay_nus(1300); P1_0=0;

delay_nms(20); }

void Left_Turn(void) {

for(i=1;i

P1_1=1;

delay_nus(1300); P1_1=0; P1_0=1;

delay_nus(1300); P1_0=0;

delay_nms(20); } }

void Right_Turn(void) {

for(i=1;i

P1_1=1;

delay_nus(1700); P1_1=0; P1_0=1;

delay_nus(1700); P1_0=0;

delay_nms(20); } }

void Backward(void) {

for(i=1;i

P1_1=1;

delay_nus(1300); P1_1=0; P1_0=1;

delay_nus(1700); P1_0=0;

delay_nms(20); } }

int main(void) {

int counter; int old2=1; int old3=0; uart_Init();

printf("Program Running!\n"); for(counter=1;counter

{

P1_4=1;

delay_nus(1000); P1_4=0;

delay_nus(1000); }

counter=1; while(1) {

if(P1_5state()!=P2_3state()) {

if((old2!=P1_5state())&&(old3!=P2_3state()))

{

counter=counter+1; old2=P1_5state(); old3=P2_3state(); if(counter>4) {

counter=1;

Backward();//向后 Left_Turn();//向左 Left_Turn();//向左 } } else

counter=1; }

if((P1_5state()==0)&&(P2_3state()==0))

{

Backward();//向后 Left_Turn();//向左 Left_Turn();//向左 }

else if(P1_5state()==0) {

Backward();//向后 Right_Turn();//向右 }

else if(P2_3state()==0) } { else Backward();//向后 Forward();//向前 Left_Turn();//向左 }

这个程序使宝贝车在第四次或第五次交替探测到墙角后,完成一个“U”型的拐弯,次数依赖于哪一个胡须先被触动。

4.3红外线导航

4.3.1红外导航电路图及其工作原理

清单列表:两个红外探测器、两个IR LED、四个470欧电阻、两个9013三极管

按照图13建立电路图:

图13 原理图

电路工作原理:在连接三极管时注意三极管的管脚分别属于什么极,由电路可以看出,三极管相当于一个开关:当P1_3(P3_6)置高时,从集电区到基区到发射区电路导通,加载在IR LED上的电压为VCC,IR LED向外发射红外线,当P1_3(P3_6)置低时,电路又断开,IR LED停止发射。探测器只能接收频率为38.5kHz的红外信号,当没有红外信号返回时,探测器的输出状态为高,当它检测到被物体反射的38.5kHz的红外信号时,它的输出为低。探测器的输出作为单片机引脚的输入,根据单片机两个引脚不同的输入,通过伺服电机控制线分别向伺服电机发送不同的脉冲序列,从而控制伺服电机的不同运动。发送完信号后立即将IR探测器的输出存储到变量中,这些存储的值会显示在调试终端或被机器人用来导航。

4.3.2探测和避开障碍物

红外探测与触须的输出非常相像,没有检测到物体时,输出为高,检测到物体时,输出为低。根据左右探测器接收到红外线的情况可以分情况讨论其运动形式。

注意:为了使IR LED发射红外线的频率更精确,可采用空函数_nop_(void),

它能延迟1us,减少了由于调用延时函数产生的延时。

红外探测程序流程图如下:

图14

说明:通过调用IR LED红外发射器和探测器子程序打开发射器和探测器,在机器人运动过程中,当两个探测器同时探测到障碍物时,通过给伺服电机发送相应的脉冲,使机器人后退并转180度;当左边探测器检测到障碍物时,通过给伺服电机发送右转的脉冲,使其向右转;当机器人右边探测器检测到障碍物时,通过给伺服电机发送向左的脉冲,使其左转。即可实现红外线导航。 4.3.3程序运行

#include #include #include

#define LeftIR P1_5 //左边红外接收连接到P15 #define RightIR P3_6 //右边红外接收连接到P36 #define LeftLaunch P1_4 //左边红外发射连接到P14 #define RightLaunch P3_5 //右边红外发射连接到P35 int IRLaunch(unsigned char IR) {

unsigned int counter; if(IR=='L')

for(counter=0;counter

LeftLaunch=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();

_nop_(); _nop_(); _nop_();

LeftLaunch=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } else

for(counter=0;counter

RightLaunch=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();

RightLaunch=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } }

int main(void) {

int counter; int pulseLeft; int pulseRight;

bit irDetectLeft, irDetectRight; char IR;

uart_Init();

printf("Program Running!\n");

for(counter=1;counter

delay_nus(1000); P1_3=0;

delay_nus(1000); } do {

IRLaunch('R');

irDetectRight = RightIR; //右边接收 IRLaunch('L');

irDetectLeft = LeftIR; //左边接收

if((irDetectLeft==0)&&(irDetectRight==0)) //向前走 {

pulseLeft=1300; pulseRight=1700; printf("Forword\n"); }

else if((irDetectLeft==0)&&(irDetectRight==1)) //左转 {

pulseLeft=1700; pulseRight=1500;

printf("turn_Left\n"); }

else if((irDetectLeft==1)&&(irDetectRight==0)) //右转 {

pulseLeft=1500; pulseRight=1300;

printf("turn_Right\n"); } else {

pulseLeft=1700; //后退 pulseRight=1300; printf("back\n"); }

P1_1=1;

delay_nus(pulseLeft); P1_1=0; P1_0=1;

delay_nus(pulseRight); P1_0=0;

delay_nms(15); }

while(1); }

探测障碍物很重要的一点是在宝贝车撞到它之前给宝贝车留有绕开它的空间。如果前方有障碍物,宝贝车会使用脉冲命令避开,然后探测,如果物体还在,再使用另一个脉冲来避开它。宝贝车能持续使用电机驱动脉冲和探测,直到它绕开障碍物,然后它会继续发向前行走的脉冲。本程序能够很好地实现这一点。

4.4光敏电阻导航

4.4.1光敏电阻工作原理

光敏电阻又称光导管, 它几乎都是用半导体材料制成的光电器件。 光敏电阻没有极性, 纯粹是一个电阻器件, 使用时既可加直流电压, 也可以加交流电压。无光照时, 光敏电阻值(暗电阻)很大, 电路中电流(暗电流)很小。当光敏电阻受到一定波长范围的光照时, 它的阻值(亮电阻)急剧减少, 电路中电流迅速增大。 一般希望暗电阻越大越好, 亮电阻越小越好,此时光敏电阻的灵敏度高。

4.4.2光敏电阻应用导航

基于光敏电阻的工作原理,可以将其应用于机器人的导航,如下电路图:  分压电路如图8: R为光敏电阻,光敏电阻在受到光照时,电阻会减小,

则R上的分压减小,V0增大,当大于1.5V时为高电平;当没有光照时,光敏电阻阻值很大,R上分压也大,V0减小,当小于1.5V时为低电平。  光检测电路如图9:P1_5、P2_3为与光敏电阻连接的引脚,当在空白有

光处,光敏电阻阻值很小,与之所连接的引脚为高电平;当遇到阴影处,光敏电阻阻值很大,与之连接的引脚为低电平。根据引脚的高低电平可以避开阴影区从而实现光敏电阻导航。

图15 图16

4.4.3 程序运行

#include #include

int P1_5state(void)//获取P1_5口的状态

{ else if(P1_5state()==0)//只有return (P1&0x20)?1:0; 左边的探测到阴影,向左转 } { int P2_3state(void) //获取P1_1=1; P2_3口的状态 delay_nus(1500);

{ P1_1=0; return (P2&0x08)?1:0; P1_0=1; } delay_nus(1300); int main(void) P1_0=0; { } Int counter; else if(P2_3state()==0)//只有uart_Init(); //串口初始化 右边的探测到阴影,向右转 printf("Program Running!\n"); { for(counter=1;counter

{ P1_1=0; P1_4=1; P1_0=1; delay_nus(1000); delay_nus(1500); P1_4=0 P1_0=0; delay_nus(1000); } } else //没有探测到阴影,静止不while(1) 动 { { if((P1_5state()==0)&&(P2_3stP1_1=1; ate()==0))//都探测到阴影,向前运delay_nus(1500); 动 P1_1=0;

{ P1_0=1; P1_1=1; delay_nus(1500); delay_nus(1700); P1_0=0; P1_1=0; } P1_0=1; delay_nms(20); delay_nus(1300); } P1_0=0; } }

当运行上面的程序时,如果没有阴影遮住光敏电阻,宝贝车机器人会静止不动,当同时遮住两个光敏电阻时,宝贝车机器人会向前移动,当只遮住一个光敏电阻时,机器人会向探测到阴影的光敏电阻一侧转动。

4.5循迹导航

宝贝车的底盘前下方安装两个红外传感,有发射器和探测器,通过从地表反射回来的红外线探测路况,当传感器下方是白色时,红外线反射给探测器,则与此探测器连接的引脚输出为低电平0;当传感器下方是黑色时,红外线被吸收,探测器接收不到红外光,则于此探测器连接的引脚输出为高电平1。通过编程实

现机器人沿着黑色胶带路运动,而不会跑到外边。

程序如下:

#include #include sbit P32=P3^2; sbit P33=P3^3; void Forward(void) {

P1_1=1;

delay_nus(1700); P1_1=0; P1_0=1;

delay_nus(1300); P1_0=0;

delay_nms(20); }

void Left_Turn(void) {

P1_1=1; P1_0=1;

delay_nus(1300); P1_1=0; P1_0=0;

delay_nms(20); }

void Right_Turn(void) {

P1_1=1; P1_0=1;

delay_nus(1700); P1_1=0; P1_0=0;

delay_nms(20); }

void ting(void) {

P1_1=1; P1_0=1;

delay_nus(1500);

P1_1=0; P1_0=0;

delay_nms(20); }

int main(void) {

int counter; uart_Init();

for(counter=1;counter

P1_4=1;

delay_nus(1000); P1_4=0;

delay_nus(1000); }

while(1) {

if((!P32)&&(!P33)) {

ting(); }

if((P32)&&(P33)) {

Forward(); }

if((P32)&&(!P33)) {

Left_Turn(); }

if((!P32)&&(P33)) {

Right_Turn(); } } }

二.直流电机总结

1.实习目的、任务与要求

1.1实习目的

(1)通过训练,了解直流小车由哪几部分组成。理解直流小车是根据什么要求而设计的,理解设计时需要考虑的参数,包括:机器人的运动路径、定位精度,重复定位精度、任务执行等。

(2)理解直流小车的构成及其原理。

(3)了解直流小车上的传感器有哪些,掌握传感器的原理及工作方式。 (4)理解直流小车是如何根据传感器的信息做出决策。

(5)尽可能的在组装好的直流小车上实现不同情况的开发。 (6)培养团队协作和独立工作能力。

1.2实习任务与要求

(1)熟悉直流小车的组成部分,组装并测试好直流小车。

(2)直流小车的可以前进、后退、左转、右转、停止,并在允许范围内可调节速度。

(3)陈述清楚直流小车如何实现运动。

(4)理清直流小车的人机交互关系,陈述清楚直流小车如何实现人机交互。 (5)陈述清楚直流小车有哪些传感器,传感器的信息是如何传送到单片机的。 (6)能在实验中迅速排除各种故障。

(7)鼓励创新,在完成前八个基本任务的前提下,尽量做出新的开发,如果现有硬件条件不满足,可以陈述清楚创新原理。

2.实习准备

2.1实习准备

硬件:PC机、AT89S52单片机、直流小车组件、USB下载接口、串口线、电池。

软件:Keil uVision4 IDE集成开发环境、SL-ISP软件下载工具、串口调试软件。

2.2直流车的组装和软件的安装

2.2.1硬件的组装

第一步:在开始安装前要先把充电电池充 8-10 小时后手工断电,不 能充太久,以保证小车供电正常。 第二步:焊接电机导线

第三步:安装并固定四个寻迹探头 第四步:电池放置与安装

第五步:安装四路寻线模块与驱动模块 第六步:红外探头与中控板连接 第七步:电池,驱动模块,电机连接

第八步:测试驱动模块与电机连接是否正确,并制作供电线 第九步:驱动模块的控制线与单片机IO相连 第十步:传感器供电连接 2.2.2软件的安装

直流小车软件的安装和舵机车基本相同

3.实习任务

3.1基本运动

对直流小车最基本的要求就是能够实现前进,后退,左转,右转和停止等。

4.模块测试

4.1超声波模块

4.1.1舵机归中

实习中要求舵机归中,这样可以使超声波装置左右转过的角度相同。程序如下:

#include #include

#define Sevro_moto_pwm P2_7

unsigned char pwm_val_left = 0;//变量定义

unsigned char push_val_left =14;//舵机归中,产生约,1.5MS 信号 unsigned long S=0;

unsigned long S1=0; unsigned long S2=0; unsigned long S3=0; unsigned long S4=0;

unsigned int time=0; //时间变量 unsigned int timer=0; //延时基准变量

unsigned char timer1=0; //扫描时间变量 /*调节push_val_left的值改变电机转速,占空比 */ void pwm_Servomoto(void) {

if(pwm_val_left

Sevro_moto_pwm=0; if(pwm_val_left>=200) pwm_val_left=0; }

void time1()interrupt 3 using 2 {

TH1=(65536-100)/256; //100US定时 TL1=(65536-100)%256;

//定时器100US为准。在这个基础上延时 pwm_val_left++; pwm_Servomoto(); }

void main(void) {

TMOD=0X11;

TH1=(65536-100)/256; //100US定时 TL1=(65536-100)%256; TH0=0; TL0=0; TR1= 1; ET1= 1; ET0= 1; EA = 1;

push_val_left=14; //舵机归中 while(1) /*无限循环*/ { } }

4.1.2超声波避障舵机转动

程序如下:此程序能够实现直流小车躲避障碍的功能

#include #include

#define Sevro_moto_pwm P2_7 #define ECHO P2_4 #define TRIG P2_5

#define Left_moto_go

{P1_0=1,P1_1=0,P1_2=1,P1_3=0;} #define Left_moto_back {P1_0=0,P1_1=1,P1_2=0,P1_3=1;} //

#define Left_moto_Stop

{P1_0=0,P1_1=0,P1_2=0,P1_3=0;} #define Right_moto_go {P1_4=1,P1_5=0,P1_6=1,P1_7=0;} / #define Right_moto_back {P1_4=0,P1_5=1,P1_6=0,P1_7=1;} #define Right_moto_Stop {P1_4=0,P1_5=0,P1_6=0,P1_7=0;} unsigned char const

positon[3]={ 0xfe,0xfd,0xfb};

unsigned char disbuff[4] ={ 0,0,0,0,}; unsigned char posit=0;

unsigned char pwm_val_left = 0; unsigned char push_val_left =14; unsigned long S=0; unsigned long S1=0; unsigned long S2=0; unsigned long S3=0; unsigned long S4=0; unsigned int time=0;

//时间变量

unsigned int timer=0; //延时基准变量 unsigned char timer1=0; void delay(unsigned int k) { unsigned int x,y; for(x=0;x

void Display(void)

{

if(posit==0)

{P0=(discode[disbuff[posit]])&0x7f;} else

{P0=discode[disbuff[posit]];} if(posit==0)

{ P2_1=0;P2_2=1;P2_3=1;} if(posit==1)

{P2_1=1;P2_2=0;P2_3=1;} if(posit==2)

{P2_1=1;P2_2=1;P2_3=0;} if(++posit>=3) posit=0; }

void StartModule() { TRIG=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); TRIG=0; }

void Conut(void) //计算距离

{

while(!ECHO); TR0=1;

while(ECHO);

TR0=0; /

time=TH0*256+TL0;

TH0=0; TL0=0;

S=(time*1.7)/100;

disbuff[0]=S%1000/100;

disbuff[1]=S%1000%100/10; disbuff[2]=S%1000%10 %10; }

void run(void) {

Left_moto_go ; //左电机往前走 Right_moto_go ; //右电机往前走 }

void backrun(void) {

Left_moto_back ; //左电机往前走 Right_moto_back ; //右电机往前走 }

void leftrun(void) {

Left_moto_back ; //左电机往前走 Right_moto_go ; //右电机往前走

}

void rightrun(void) {

Left_moto_go ; //左电机往前走 Right_moto_back ; //右电机往前走 }

void stoprun(void) {

Left_moto_Stop ; //左电机停走 Right_moto_Stop ; //右电机停走 }

void COMM( void ) { push_val_left=5; while(timer

StartModule();

Conut();

S2=S; S4=S;

push_val_left=14; //舵机归中 timer=0;

while(timer

if((S2

backrun(); //后退

timer=0;

while(timerS4)

{

rightrun();

while(timer

}

else { leftrun();

timer=0;

while(timer

} void pwm_Servomoto(void) {

if(pwm_val_left

Sevro_moto_pwm=0; if(pwm_val_left>=200) pwm_val_left=0;

}

void time1()interrupt 3 using 2 {

TH1=(65536-100)/256;/100US定时 TL1=(65536-100)%256;timer++;

pwm_val_left++; pwm_Servomoto(); timer1++; //2MS扫一次数码管

if(timer1>=20)

{ timer1=0; Display();

} }

void timer0()interrupt 1 using 0 {

}

void main(void) {

TMOD=0X11;

TH1=(65536-100)/256; //100US定时 TL1=(65536-100)%256; TH0=0; TL0=0; TR1= 1; ET1= 1; ET0= 1; EA = 1; delay(100);

push_val_left=14; {

if(timer>=1000)

while(1)

StartModule(); //启动检测 if(S

COMM(); }

{

stoprun(); //小车停止

4.2蓝牙模块

4.2.1蓝牙的安装

直接对插入我们相应的插座处!注意了,插拔模块一定要把电断了后再进行,否则可能会烧模块。

注意:蓝牙模块串口切换问题(蓝牙串口程序,采用波特率9600,所以我们一定要用11.0592M 的晶振,注意我们单片机控制板防静电包装里面有一个11。0592M 晶振,请注意查找)。 4.2.2程序运行

#define left 'C' #define right 'D' #define up 'A' #define down 'B' #define stop 'F'

char code str[] = "收到指令,向前!\n"; char code str1[] = "收到指令,向后!\n"; char code str2[] = "收到指令,向左!\n"; char code str3[] = "收到指令,向右!\n"; char code str4[] = "收到指令,停止!\n"; bit flag_REC=0; bit flag =0;

unsigned char i=0; unsigned char dat=0;

unsigned char buff[5]=0; //接收缓冲字节 void delay(unsigned int k) {

unsigned int x,y; for(x=0;x

void send_str( )

// 传送字串 {

unsigned char i = 0; while(str[i] != '\0') { SBUF = str[i]; while(!TI);

TI = 0;

i++;

}

}

void send_str1( )

unsigned char i = 0; while(str1[i] != '\0') { SBUF = str1[i]; while(!TI);

TI = 0;

i++;

} }

void send_str2( )

{

unsigned char i = 0; while(str2[i] != '\0') { SBUF = str2[i]; while(!TI);

TI = 0;

i++;

}

}

void send_str3() {

unsigned char i = 0; while(str3[i] != '\0') { SBUF = str3[i]; while(!TI); // 等特数据传送 TI = 0;

// 清

除数据传送标志

i++;

// 下一个

字符

} }

void send_str4()

// 传送字串

{

unsigned char i = 0; while(str4[i] != '\0') { }

void run(void) {

Left_moto_go ; //左电机往前走 Right_moto_go ; //右电机往前走 }

void backrun(void)

{

Left_moto_back ; //左电机往前走

Right_moto_back ; //右电机往前走 }

void leftrun(void) {

Left_moto_back ; //左电机往前走 Right_moto_go ; //右电机往前走 }

void rightrun(void) {

Left_moto_go ; //左电机往前走

Right_moto_back ; //右电机往前走 }

void stoprun(void) {

Left_moto_Stop ; //左电机往前走 Right_moto_Stop ; //右电机往前走 }

void sint() interrupt 4 { if(RI) { RI=0;

dat=SBUF;

if(dat=='O'&&(i==0)) { buff[i]=dat;

flag=1; } else if(flag==1) { i++; buff[i]=dat; if(i>=2)

{i=0;flag=0;flag_REC=1 ;} // 停止接收

} } }

void main(void) {

TMOD=0x20;

TL1=0xFd; SCON=0x50; PCON=0x00; TR1=1;

ES=1;

//

while(1) { EA=1; TH1=0xFd;

}

send_str( ); run(); break;

case down: // 后退

send_str1( ); backrun(); break;

case left: // 左转

send_str2( ); leftrun(); break;

case right: // 右转

send_str3( ); rightrun(); break;

if(flag_REC==1) {

flag_REC=0;

case stop: // 停止

send_str4( ); stoprun(); break;

if(buff[0]=='O'&&buff[1]=='N')

第一个字节为O,第二个字节为N,第三个字节为控制码

switch(buff[2]) case up : // 前进

{

} } }

4.3无线模块

程序如下:运行此程序后,会通过遥控器对小车的基本运动进行控制。 //主函数

void main(void) { while(1) {

if(P0_7==1&&P0_6==0) run();

if(P0_6==1&&P0_7==0) backrun(); if(P0_5==1) leftrun(); if(P0_4==1) rightrun();

/*无限循环*/

//按了B按键 小车前进

//按了D按键 小车后退 //按了A按键 小车左转 //按了C按键 小车右转

if(P0_7==1&&P0_6==1) {

stoprun(); } } }

//同时按下B 与 D 小车停止

4.4循迹测试

将四个循迹传感器安装在校车的底部,由于传感器的作用,可以通过程序使直流小车沿着黑色的轨迹走。程序如下:

/*--主函数--*/

void main(void) {

delay(100); run(); while(1) {

//有信号为0 没有信号为1 run(); else {

if(Right_1_led==1&&Left_2_led==0)

{

//左边两个电机正转 //右边两个电机反转 //左边检测到黑线

//右边两个电机正转 //左边两个电机反转

Left_moto_go;

}

if(Left_2_led==1&&Right_1_led==0) {

Right_moto_go;

//右边检测到黑线

if(Left_2_led==0&&Right_1_led==0)

/*无限循环*/

//延时一段时间

Right_moto_back;

Left_moto_back;}}}

三.步进电机小车总结

1实习目的、任务与要求

1.1实习目的

(1)通过训练,了解步进小车由哪几部分组成。理解步进小车是根据什么要求而设计的,理解设计时需要考虑的参数。

(2)理解步进小车的构成及其原理。

(3)了解步进小车上的传感器有哪些,掌握传感器的原理及工作方式。 (4)理解步进小车是如何根据传感器的信息做出决策。 (5)掌握步进小车如何运动以及其他的运动方式。 (6)培养团队协作和独立工作能力。

1.2实习任务与要求

(1)熟悉步进小车的组成部分,组装并测试好步进小车。

(2)步进小车的可以前进、后退、左转、右转、停止,并在允许范围内可调节速度。

(3)陈述清楚步进小车如何实现运动。 (4)陈述清楚步进小车有哪些传感器,传感器的信息是如何传送到单片机的。 (5)能在实验中迅速排除各种故障。

(6)鼓励创新,在完成前八个基本任务的前提下,尽量做出新的开发,如果现有硬件条件不满足,可以陈述清楚创新原理。

2.实习准备

2.1实习准备

硬件:PC机、AT89S52单片机、步进车组件、ISP下载电缆、串口线、电池。 软件:Keil uVision4 IDE集成开发环境、SL-ISP软件下载工具、串口调试软件。

2.2步进车的组装和软件的安装

2.2.1硬件的安装

根据实习指导书上的步骤将步进车的硬件组装起来:

(1)首先连接电机和电机固定座,然后把电机的四根线从电机固定座的圆孔中穿过。

(2)把组装好的驱动单元安装到底板上,为了方便安装底板上的安装孔为长孔,电机固定座有一定的活动余量,安装时一定要注意调节两个电机在同一直线上,这样才能保证小车运动的精准性。

(3)接下来安装电机驱动,电机与驱动的接线顺序在接线图里面有介绍 (4).然后安装联轴器。联轴器的顶丝不要忘记装~ (5)装上轮胎

(6)接下来安装牛眼,铜柱是由一根30mm 和两根8mm 的拼接而成的 如果安装好铜柱之后,两条铜柱不是平行的话,就用手把他们弄成平行的, 这样才能,准确的安装到底板上。

(7)接下来安装小车的眼睛—光电开关 (8)寻迹传感器安装到这里,调整下传感器的角度到适合所寻黑线的宽度。 (9)然后插上线,注意区分vcc gnd out 三根线不要弄混。 2.2.2软件的安装

(1)解压缩光盘中的KeilC51到某个目录下,如D:\keil

(2)执行D:\keil\setup\setup.exe 安装程序,选择安装Eval Version版进行安装

(3)安装ISP下载软件

3.实习任务

3.1基本运动

对直流小车最基本的要求就是能够实现前进,后退,左转,右转和停止等,根据指导书上的部分子程序进行测试和运行。

4.模块测试

4.1超声波模块

4.1.1超声波原理

本模块输出方式为PWM 方式。利用单片机从控制口发一个10US,以上的高电平,就可以在接收口等待高电平输出。一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,方可算出距离。如此周期性地测量方可移动测距。 4.1.2超声波LCD显示

#include #include sbit DX=P2^0; sbit WX=P2^1; #define RX P2_7 #define TX P2_6

#define LCM_RW P2_1 //定义LCD引脚 #define LCM_RS P2_0 #define LCM_E P2_2 #define LCM_Data P0

#define Key_Data P2_0 //定义Keyboard引脚 #define Key_CLK P3_2

#define Busy 0x80 //用于检测LCM状态字中的Busy标识

void LCMInit(void);

//声明LCD初始化函数

void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData); void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData); void Delay5Ms(void); void Delay400Ms(void);

void Decode(unsigned char ScanCode); void WriteDataLCM(unsigned char WDLCM);

void WriteCommandLCM(unsigned char WCLCM,BuysC); unsigned char ReadDataLCM(void); unsigned char ReadStatusLCM(void);

unsigned char code mcustudio[] ={"mcustudio.com.cn"}; unsigned char code email[] = {"[email protected]"}; unsigned char code Cls[] = {" "};

unsigned char code ASCII[15] = {'0','1','2','3','4','5','6','7','8','9','.','-','M'}; static unsigned char DisNum = 0; //显示用指针

unsigned int time=0; unsigned long S=0; bit flag =0; unsigned char disbuff[4] ={ 0,0,0,0,};

void WriteDataLCM(unsigned char WDLCM)

{

ReadStatusLCM(); //检测忙 LCM_Data = WDLCM; LCM_RS = 1; LCM_RW = 0;

LCM_E = 0; //若晶振速度太高可以在这后加小的延时 LCM_E = 0; //延时 LCM_E = 1; }

void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测{

if (BuysC) ReadStatusLCM(); //根据需要检测忙 LCM_Data = WCLCM; LCM_RS = 0; LCM_RW = 0; LCM_E = 0; LCM_E = 0; LCM_E = 1; }

//读数据

unsigned char ReadDataLCM(void) {

LCM_RS = 1; LCM_RW = 1; LCM_E = 0; LCM_E = 0; LCM_E = 1; return(LCM_Data); }

unsigned char ReadStatusLCM(void) {

LCM_Data = 0xFF; LCM_RS = 0; LCM_RW = 1; LCM_E = 0; LCM_E = 0; LCM_E = 1;

while (LCM_Data & Busy); //检测忙信号 return(LCM_Data); }

void LCMInit(void) //LCM初始化 {

LCM_Data = 0;

WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号 Delay5Ms();

WriteCommandLCM(0x38,0); Delay5Ms();

WriteCommandLCM(0x38,0); Delay5Ms();

WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号 WriteCommandLCM(0x08,1); //关闭显示 WriteCommandLCM(0x01,1); //显示清屏

WriteCommandLCM(0x06,1); // 显示光标移动设置 WriteCommandLCM(0x0F,1); // 显示开及光标设置 }

void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData) { Y &= 0x1;

X &= 0xF; //限制X不能大于15,Y不能大于1 if (Y) X |= 0x40; //当要显示第二行时地址码+0x40; X |= 0x80; //算出指令码

WriteCommandLCM(X, 1); //发命令字 WriteDataLCM(DData); //发数据

void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData) {

unsigned char ListLength;

ListLength = 0; Y &= 0x1;

X &= 0xF; //限制X不能大于15,Y不能大于1 while (DData[ListLength]>0x19) //若到达字串尾则退出 { if (X

}

}

}

void Delay5Ms(void) {

unsigned int TempCyc = 5552; while(TempCyc--); }

void Delay400Ms(void) {

unsigned char TempCycA = 5; unsigned int TempCycB; while(TempCycA--) { TempCycB=7269; while(TempCycB--); };

}

void StartModule() { TX=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); TX=0; }

void delayms(unsigned int ms)

unsigned char i=100,j; for(;ms;ms--) { while(--i) { j=10; while(--j);

}

} }

void main(void) {

unsigned char TempCyc; DX=1;

LCM_Data=0xff; DX=0; WX=1;

LCM_Data=0xff; WX=0;

Delay400Ms(); //启动等待,等LCM讲入工作状态 LCMInit(); //LCM初始化 Delay5Ms(); //延时片刻(可不要) DisplayListChar(0, 0, mcustudio); DisplayListChar(0, 1, email); ReadDataLCM();//测试用句无意义 for (TempCyc=0; TempCyc

while(1) {

TMOD=0x01; //设T0为方式1,GATE=1;

TH0=0;

TL0=0;

ET0=1; //允许T0中断 EA=1;

//开启总中断

while(1) {

StartModule();

DisplayOneChar(0, 1, ASCII[0]);

while(!RX); //当RX为零时等待 TR0=1; //开启计数 while(RX); //当RX为1计数并等待 TR0=0;

//关闭计数

Conut();

delayms(80);

//计算

//80MS

}}}

4.2避障光电开关

运行下面的程序,能够避开障碍,从而实现想要的功能。

#include "reg51.h" #include "stdio.h" #include #include #define uchar unsigned char #define uint unsigned int sbit ir_left=P1^6;

//左侧红外传感器接收位

sbit ir_right=P1^7; //右侧红外传感器接收位 sbit ir_mid=P2^3; //中间红外传感器接收位 void timer1_init(); //定时器1初始化函数

void move_left(uint speed_l,uchar cw,uchar en);//左电机运动函数 void move_right(uint speed_r,uchar cw,uchar en);//右电机运动函数 void delay(unsigned int k);

//延时函数

uint n;//进定时器1中断次数计数 uint speed;//电机速度控制变量 void timer1_init() {

TMOD=0X10; ET1=1; EA=1;

TH1=(65536-100)/256; TL1=(65536-100)%256;

TR1=1;//定时器启动后 运动控制脉冲将一直产生 小车的运动方式受 cw 和en控制 }

void main (void) { delay(10); timer1_init();

while(1) {

if(ir_left==0&&ir_mid==0&&ir_right==0) //以下是三个红外传感器的八种状态和对 { }

move_left(15,0,1); move_right(15,0,1); delay(800);

if(ir_left==0&&ir_mid==0&&ir_right==1) { move_left(15,0,1); move_right(15,0,1); delay(400); }

if(ir_left==0&&ir_mid==1&&ir_right==0)

{ move_left(15,0,1); move_right(15,0,1); delay(800); }

if(ir_left==0&&ir_mid==1&&ir_right==1)

{ move_left(15,0,1); move_right(15,0,1); delay(400); }

if(ir_left==1&&ir_mid==0&&ir_right==0)

{ move_left(15,1,1); move_right(15,1,1); delay(400); }

if(ir_left==1&&ir_mid==0&&ir_right==1)

{ move_left(15,0,1); move_right(15,0,1); delay(800); }

if(ir_left==1&&ir_mid==1&&ir_right==0)

{ move_left(15,1,1); move_right(15,1,1); delay(400); }

if(ir_left==1&&ir_mid==1&&ir_right==1)

{ move_left(15,0,1); move_right(15,1,1); }

}

}

void timer1_serve() interrupt 3 {

TH1=(65536-100)/256; TL1=(65536-100)%256; n=n+1; m=m+1; if(n==speed) {

clk_left=~clk_left; clk_right=~clk_right; n=0; }

4.3循迹模块

将循迹传感器安装在校车的底部,由于传感器的作用,可以通过程序使步进小车沿着黑色的轨迹走。程序如下:

//主函数体

void main (void) { delay(10); timer1_init();

while(1) {

if(ir_left==0&&ir_right==0) { }

if(ir_left==0&&ir_right==1) { }

if(ir_left==1&&ir_right==0) {

move_left(15,0,1); move_right(15,0,1); delay(100);

move_left(15,0,0); move_right(15,0,0);

move_left(15,1,1); move_right(15,1,1);

delay(100);

}

}

if(ir_left==1&&ir_right==1) { }

move_left(15,0,1); move_right(15,1,1); delay(40);

void timer1_serve() interrupt 3 {

TH1=(65536-100)/256; TL1=(65536-100)%256; n=n+1; m=m+1; if(n==speed) {

clk_left=~clk_left; clk_right=~clk_right; n=0; } }

4.4无线遥控模块

程序如下:运行此程序后,会通过遥控器对小车的基本运动进行控制。 //函数体

void timer1_init() {

TMOD=0X10; ET1=1; EA=1;

TH1=(65536-100)/256; TL1=(65536-100)%256;

TR1=1;//定时器启动后 运动控制脉冲将一直产生 小车的运动方式受 cw 和en控制 }

void main (void) { delay(10); timer1_init();

while(1) {

if(A_key==1&&B_key==0&&C_key==0&&D_key==0) {

EA=1;

move_left(20,0,1);

move_right(20,1,1);

}

else if(A_key==0&&B_key==1&&C_key==0&&D_key==0)

{

EA=1;

move_left(20,0,1);

move_right(20,0,1);

}

else if(A_key==0&&B_key==0&&C_key==1&&D_key==0)

{

EA=1;

move_left(20,1,1);

move_right(20,1,1);

}

else if(A_key==0&&B_key==0&&C_key==0&&D_key==1)

{

EA=1;

move_left(20,1,1);

move_right(20,0,1);

}

else

{

EA=0;

}

}

}

void delay(uint speed)

{

while(speed--)

{

;

}

}

void timer1_serve() interrupt 3

{

TH1=(65536-100)/256;

TL1=(65536-100)%256;

n=n+1;

if(n==speed)

{

clk_left=~clk_left;

clk_right=~clk_right;

n=0;

}

}

void move_right(uint speed_r,uchar cw,uchar en)

{ //speed_r速度控制变量 cw方向控制变量 en使能控制变量

speed=speed_r; //speed数值与速度成反比 请结合实际情况进行调节,

if(cw==1) //但速度不能无限加快因为步进电机有速度上限

{ //而且速度加快是力矩会下降,容易导致丢步现象

cw_right=1; //所以实际应用当中应调节到速度可力矩比较合适的数值

} //应考虑到电池电压,轮胎直径等因素

else

{

cw_right=0; //cw 控制电机正反转,1与0各代表一个方向

}

if(en==1)

{ //en 为使能位 1:能 0:不能

en_right=1;

}

else

{

en_right=0;

}

}

void move_left(uint speed_l,uchar cw,uchar en)

{ //speed_l速度控制变量 cw方向控制变量 en使能控制变量

speed=speed_l;

if(cw==1)

{

cw_left=1;

}

else

{

cw_left=0;

}

if(en==1)

{

en_left=1;

}

else

{

}

} en_left=0;

四.实习总结

这次实习,通过老师的简单说明,使我了解到此次实习的任务有三个。三个实习任务分别是:1.步进小车2.直流小车3.舵机车。

就这样我开始了实习,一天天过去了,通过实习完,我真觉得很累,但是,此次实习特别有意义和价值,使我学到了太多的东西。我作为小组组长,和自己的组员通力合作,踏踏实实的按照要求实现每种功能,一丝不苟的操作和检验每一次电路的连接,充满期待的去观察每一次功能的实现。我感觉实习的每时每刻都过的非常充实,每天的实习在不经意间就很快过去了。我觉得自己还是不能高效快速的完成任务,因此当自己的进度和别人的差距拉得过大的时候,我就吃完饭直接回到宿舍,和还意犹未尽的伙伴在舍友的电脑上编程、烧程序和观察小车的运动情况。特别是自己在给舵机车实现调零的时候,自己都觉得自己是如此一丝不苟,力求使车的运行轨迹能够尽量的直一些。每当小车实现一个功能,我都是无比的欢喜,内心感觉到一种得到满足的欣喜,就在这个时候我总是无法控制自己内心的激动,尽情的宣泄着,迫不及待的向伙伴或者临近的同学炫耀我们自己的小车所实现的功能。我对此感到有一种无以言语的成就感,也许这就是常理上所说:一个人在得到别人的认知和肯定之后的一种内心的充实!下面我就整个操作过程简单介绍一下。

所有的小车都是以单片机为核心构成的,我们通过编程可以实现探测周围的环境,处理接收到的信息,控制小车的运动。首先,对于直流小车,说实话,从外观来说,它是最炫的。经过几天的组装,调试,我觉得它是最简单的,我和搭档首先对其组装,然后进行一些必要的调试。例如,轮子方向的测试,一些小车的基本运动:前进,后退,左转,右转等。最后,我们浇了一些复杂的运动。利用一些传感器的原理,实现一些特殊的功能,比如:循迹,避障,测距,蓝牙控制,无线遥控控制等。然后,我们组又开始了对步进小车的研究,我觉得它的速度很慢,不过,像一个坦克,笨重有力,和直流小车一样,我和搭档首先对其组装,然后进行一些必要的调试。例如,轮子方向的测试,一些小车的基本运动:前进,后退,左转,右转等。本以为可以很轻松的完成,可是在进行一些复杂的运动时,就出现了很多问题,比如:程序中的错误,接线的错误,和行驶方向错误的问题。不过,我们没有气馁,我们一个一个的改正,最后,终于实现了步进车的循迹,避障,超声波LCD显示,和无线遥控控制等功能。最后,我们做的是舵机车,首先是伺服电机的调零开始我们只知道伺服电机在高电平持续的时间为

1.5ms低电平持续的时间是20ms的时候应该是不转动,但是电机为什么会在这样的情况下不转动我们并不了解,后来老师提示我们,我们所使用的伺服电机是舵机位置式伺服系统,我们上网查阅了关于舵机方面的知识,明白了舵机的工作原理,也就明白了为什么要那样调节。舵机的原理实际上就是舵机内部的基准电路产生高电平持续时间为1.5ms低电平持续时间为20ms的脉冲,施加同样的外部脉冲,两种脉冲产生的电压差为0所以伺服电机的转速为0,伺服电机的调零实际上就是调节内部的基准电路的脉冲。通过对伺服电机的调零,使我明白做什

么要先搞明白原理,不要盲目的去做,那样什么效果也没有。这是实习中我们遇到的第一个问题,为了解决这个问题,我们查阅了相关的知识,只是少有的自主学习的机会,锻炼了我们搜集信息,扩展自己知识面的能力,为以后的学习奠基了宝贵的经验。下来我们实习的是舵机车的基本的导航任务,主要的是实习舵机车的前进,拐弯,后退以及匀加速和匀减速的基本运动。接下来我们实习的是红外传感器的导航。红外传感器是属于非接触式的传感器,是利用红外发射器和红外接收器进行工作的,当红外发射器发射的红外光遇到障碍反射回来被红外接收器接受时,实现低电平的输出,表明前方有障碍物;如果前方没有障碍物则实现高电平的输出,表明前方没有障碍。通过这次实习,我们明白了红外传感器的工作原理,让我们收获颇丰。接下来我们实习的是光敏电阻的导航。光敏电阻遇到光时呈现低电阻的状态,传感器输出高电平;当没有光时光敏电阻传感器输出的是低电平。实习中正是利用了光敏电阻的这一特性实现了舵机车对阴影的探测。 最后我们又对舵机小车进行了无线遥控控制的实现和触须导航的实现,真的很有意思。

时间过得真快,在实习这段时间里,我学到了很多在课堂上学不到的东西,也认识到了自己很多的不足,感觉受益匪浅。回想起在实习的这两周时间里,真的很累,这是由实习性质决定的,也是我自己选择的,因为在我看来在实习中,不允许丝毫的马虎,严谨认真是时刻要牢记的。

在没有进行机电一体化实习前我们总是孤立的看待我们的专业课,这让我们缺少了独立思考的空间,这次实习给了我们很大的冲击,我们遇到了很多问题,强迫我们自己去思考问题解决问题,培养了我们自己独立思考问题的能力和发现问题解决问题的能力。我们需要重新审视经验教训,在以后的学习、生活和工作中尽量避免犯同样的错误。两周的实习结束了,虽然我们还有许多问题没有解决,但是这次实习却留给了我们更多的思考空间,只有总结两周的经验教训,我们才能学到更多的知识。

我坚信通过这一段时间的实习,从中获得的实践经验使我终身受益,并会在我毕业后的实际工作中不断地得到印证,我会持续地理解和体会实习中所学到的知识,期望在今后把学到的理论知识和实践经验不断的应用到实际中来,充分展示我的个人价值和人生价值,为实现自我的理想和光明的前程而努力。

《机电一体化综合训练》

个人实习报告

实验组:

指导教师:

小组成员:

西北农林科技大学机械与电子工程学院

2013-7-7

目录

一.舵机车总结 ................................................................................................................................... 4

1.实习目的、任务与要求 ....................................................................................................................... 4

1.1实习目的 .................................................................................................................................... 4

1.2实习任务与要求 ........................................................................................................................ 4

2.实习准备 ............................................................................................................................................... 5

2.1实习准备 .................................................................................................................................... 5

2.2舵机车的组装和软件的安装 .................................................................................................... 5

2.2.1硬件的安装 ..................................................................................................................... 5

2.2.2软件的安装 ..................................................................................................................... 5

3.实习任务 ............................................................................................................................................... 5

3.1伺服电机的控制 ........................................................................................................................ 5

3.1.1编程控制LED测试电路 ................................................................................................. 5

3.1.2伺服电机控制信号 ......................................................................................................... 6

3.1.3伺服电机连接 ................................................................................................................. 6

3.1.4伺服电机调零 ................................................................................................................. 6

3.1.5计数并控制循环次数 ..................................................................................................... 7

3.1.6测试电机 ......................................................................................................................... 7

3.2舵机车组装及测试 .................................................................................................................... 9

3.2.1舵机车的组装 ................................................................................................................. 9

3.2.2重新测试伺服电机 ......................................................................................................... 9

3.2.3开始/复位指示电路和编程 ............................................................................................ 9

4.舵机车的巡航控制 ............................................................................................................................... 9

4.1舵机车的基本动作 .................................................................................................................... 9

4.2舵机车触觉导航 ...................................................................................................................... 11

4.2.1连接触觉导航电路并测试 ........................................................................................... 11

4.2.2触须导航 ....................................................................................................................... 11

4.2.3程序运行 ....................................................................................................................... 12

4.3红外线导航 .............................................................................................................................. 14

4.3.1红外导航电路图及其工作原理 ................................................................................... 14

4.3.2探测和避开障碍物 ....................................................................................................... 14

4.3.3程序运行 ....................................................................................................................... 15

4.4光敏电阻导航 .......................................................................................................................... 18

4.4.1光敏电阻工作原理 ....................................................................................................... 18

4.4.2光敏电阻应用导航 ....................................................................................................... 18

4.4.3 程序运行 ...................................................................................................................... 18

4.5循迹导航 .................................................................................................................................. 19

二.直流电机总结 ............................................................................................................................ 22

1.实习目的、任务与要求 ..................................................................................................................... 22

1.1实习目的 .................................................................................................................................. 22

1.2实习任务与要求 ...................................................................................................................... 22

2.实习准备 ............................................................................................................................................. 22

2.1实习准备 .................................................................................................................................. 22

2.2直流车的组装和软件的安装 .................................................................................................. 23

2.2.1硬件的组装 ................................................................................................................... 23

2.2.2软件的安装 ................................................................................................................... 23

3.实习任务 ............................................................................................................................................. 23

3.1基本运动 .................................................................................................................................. 23

4.模块测试 ............................................................................................................................................. 23

4.1超声波模块 .............................................................................................................................. 23

4.1.1舵机归中 ....................................................................................................................... 23

4.1.2超声波避障舵机转动 ................................................................................................... 25

4.2蓝牙模块 .................................................................................................................................. 27

4.2.1蓝牙的安装 ................................................................................................................... 27

4.2.2程序运行 ....................................................................................................................... 27

4.3无线模块 .................................................................................................................................. 29

4.4循迹测试 .................................................................................................................................. 30

三.步进电机小车总结 .................................................................................................................... 30

1实习目的、任务与要求 ..................................................................................................................... 30

1.1实习目的 .................................................................................................................................. 30

1.2实习任务与要求 ...................................................................................................................... 31

2.实习准备 ............................................................................................................................................. 31

2.1实习准备 .................................................................................................................................. 31

2.2步进车的组装和软件的安装 .................................................................................................. 31

2.2.1硬件的安装 ................................................................................................................... 31

2.2.2软件的安装 ................................................................................................................... 32

3.实习任务 ............................................................................................................................................. 32

3.1基本运动 .................................................................................................................................. 32

4.模块测试 ............................................................................................................................................. 32

4.1超声波模块 .............................................................................................................................. 32

4.1.1超声波原理 ................................................................................................................... 32

4.1.2超声波LCD显示 ......................................................................................................... 32

4.2避障光电开关 .......................................................................................................................... 37

4.3循迹模块 .................................................................................................................................. 39

4.4无线遥控模块 .......................................................................................................................... 40

四.实习总结...................................................................................................................................... 43

机电一体化综合训练实习总结

一.舵机车总结

1.实习目的、任务与要求

1.1实习目的

(1)通过训练,了解舵机车由哪几部分组成。理解舵机车是根据什么要求而设计的,理解设计时需要考虑的参数,包括:机器人的运动路径、定位精度,重复定位精度、任务执行等。

(2)了解目前舵机车能量的供给形式,掌握控制部分和执行部分的供电方式。

(3)理解舵机车的构成及其原理。

(4)了解舵机车上的传感器有哪些,掌握传感器的原理及工作方式。

(5)理解舵机车是如何根据传感器的信息做出决策。

(6)掌握舵机车如何运动以及其他的运动方式。

(7)理解舵机车与用户交换信息的各种方法。

(8)通过训练,学会独立完成开发一个基于单片机控制的机电系统。

(9)尽可能的在组装好的舵机车上实现不同情况的开发。

(10)培养团队协作和独立工作能力。

1.2实习任务与要求

(1)熟悉舵机车的组成部分,组装并测试好舵机车。

(2)舵机车的可以前进、后退、左转、右转、停止,并在允许范围内可调节速度。

(3)陈述清楚舵机车如何实现运动。

(4)掌握舵机车的控制部分和运动部分的供电方式。

(5)理清舵机车的人机交互关系,陈述清楚舵机车如何实现人机交互。

(6)陈述清楚舵机车有哪些传感器,传感器的信息是如何传送到单片机的。

(7)完成舵机车的触须导航、光敏电阻导航、红外线导航、距离检测和循迹等任务,并陈述清楚其原理。

(8)能在实验中迅速排除各种故障。

(9)鼓励创新,在完成前八个基本任务的前提下,尽量做出新的开发,如果现有硬件条件不满足,可以陈述清楚创新原理。

2.实习准备

2.1实习准备

硬件:PC机、AT89S52单片机、舵机车组件、ISP下载电缆、串口线、电池。 软件:Keil uVision4 IDE集成开发环境、SL-ISP软件下载工具、串口调试软件。

2.2舵机车的组装和软件的安装

2.2.1硬件的安装

根据实习指导书上的步骤将舵机车的硬件组装起来

2.2.2软件的安装

(1)解压缩光盘中的KeilC51到某个目录下,如D:\keil

(2)执行D:\keil\setup\setup.exe 安装程序,选择安装Eval Version版进行安装

(3)安装ISP下载软件

3.实习任务

3.1伺服电机的控制

3.1.1编程控制LED测试电路

二极管是单向导电的电子管,而发光二极管(LED)在有电流流过时会发光。不像电阻上的颜色代码,LED的颜色仅仅表示电流流过时它将发什么颜色的光。LED重要的标识在它的外形上。因为二极管是单向导电的电子管,你必须保证连接正确,否则它将不能工作。完成测试所搭建的电路如图8所示:

图8 两个发光二极管分别与I/O脚P1_0、P1_1连接

在本次测试中,我们使用P1端口的第一脚记为 P1_0,再设置I/O端口的电平来控制LED发光或熄灭,注意它是怎样输出高或低电平的。

让另一个连接到P1_1管脚的LED闪烁是一件很容易的事情,把P1_0改为P1_1,重新运行程序即可。当然,你可以再次修改程序,让两个发光二极管交替亮或灭,你也可以通过改变延时函数的参数n的值,来改变LED的闪烁频率。

3.1.2伺服电机控制信号

通过对微控制器编程发给伺服电机的高、低电平信号必须保持非常精确时间。这是因为伺服电机根据信号的高电平持续时间的长短作为向什么方向转动的指示。对于精确的伺服电机控制而言,信号的高电平持续的时间要求比

delay_nms函数的时间值要精确的多。你只能每次以1ms为单位改变delay_nms函数的参数n的取值。这时需要使用另一个延时函数delay_nus(unsigned int i)。

3.1.3伺服电机连接

连接伺服电机到电源和控制器的I/O口。先前搭建的LED电路将被用来监视控制器模块发送到伺服电机的运动控制信号。

3.1.4伺服电机调零

将运行一个程序,发送一个脉冲信号到伺服电机,让电机保持静止。由于伺服电机在工厂没有预先调整,它们在接收到该信号时将转动。你要用螺丝刀调节伺服电机让它们保持静止。这就是伺服电机调零。调节之后,你要测试伺服电机,验证其功能是否正常。测试程序将发送信号让伺服电机顺时针和逆时针以不同的速度旋转。

图9显示的信号是发送到与P1_1连接的伺服电机的校准信号,称为零点标定信号。伺服电机调节好之后,这个信号就可以指示电机保持静止。这个信号是由时间间隔为20 ms 的脉宽为1.5 ms的一系列脉冲组成。

图9 1.5ms脉冲宽度的时间矢量图

下面我们计算脉宽为1.5 ms时delay_nus函数的参数n的取值。1.5 ms即1500us。前面说过,无论delay_nus函数的参数n的取值是多少,都要乘以1 μs,这样就可以计算出总的延时。如果知道脉冲要持续多长时间,你就可以计算出delay_nus函数的参数n的取值。用这个公式计算:

下面我们连接到P1_0的伺服电机零点调整,程序如下:

#include

#include

int main(void)

{

uart_Init();

printf("Program Running!");

while(1)

{

P1_0=1;

delay_nus(1500);

P1_0=0;

delay_nms(20);

}

}

3.1.5计数并控制循环次数

最方便的控制一段代码执行次数的方法是利用for循环,语法如下:

for(表达式1;表达式2;表达式3) 语句

它的执行过程如下:

(1) 先求解表达式1。

(2) 求解表达式2,若其值为真(非0),则执行for语句中指定的内嵌语句,然后执行下面第3)步;若其值为假(0),则结束循环,转到第5)步。

(3) 求解表达式3。

(4) 转回上面第2)步继续执行。

(5) 循环结束,执行for语句下面的一个语句。

下面是一个用myCounter来计数的for循环例程。每执行一次循环,它会显示myCounter的值。

For(int myCounter=1; myCounter

{

printf(“%d”,myCounter);

delay_nms(500);

}

3.1.6测试电机

在装配宝贝车机器人之前还有最后一件事要做,那就是测试电机。在本任务中,你将运行程序,使电机以不同速度和不同的方向旋转。通过这些测试,将确保在装配之前电机工作是正常的。

图10 1.3 ms的连续脉冲使电机顺时针全速旋转

图2-17所示是当你给连续旋转电机1.3 ms的脉冲时,它如何以全速顺时针旋转。全速的范围是50 到 60 转每分钟(RPM)

图11 1.7ms的连续脉冲使电机逆时针全速旋转

将delay_nus的参数n设为大于1500的数会使电机逆时针旋转。n的值为1700可以发出1.7 ms的脉冲,如图11所示,这将使电机全速逆时针旋转。

控制两个电机的delay_nus函数的参数n有四种不同的组合,这些组合经常会被用到。发送了这些组合中的一种,1700给P1_1 ,1300 给P1_0。通过测试不同的组合,填写表1的描述列。你将慢慢熟悉这些组合并为你自己建立一个参考。当你的宝贝车机器人安装完成后,填写下表的行和列,你就会看到每种组合使它怎样运动。

3.2舵机车组装及测试

3.2.1舵机车的组装

按指导书上的步骤做即可,但在组装的过程中,我们发现需要小心谨慎,并将繁杂的线路分清整理好。

3.2.2重新测试伺服电机

本任务通过测试确保主板和伺服电机之间的电气连接正确。舵机车的前后左右的定义。确保右边的伺服电机从端口P1_0接收到脉冲后旋转,左边的电机从端口P1_1接收到脉冲后旋转。在测试电动机顺时针旋转三秒,停止一秒,然后逆时针旋转三秒时,我们发现我们的宝贝车右边电机在静止的时候并非完全静止,而是有稍微的旋转,我们通过修改delay_nus(int n)中n的值来使电机停止,通过调整,右边电机的静止参数为1490,左边电机为1500。

注意:在载入程序的过程中,一定要把三位开关设置到位置“2”。

3.2.3开始/复位指示电路和编程

在微控制器运行的过程中,可能会有一些因素使处理器复位。这会导致舵机车行为混乱。在某些情况下,机器人在按任何程序规定的路线行走,突然地,它好象迷路了并走向我们不期望的方向。实际情况是处理器受到某些因素的影响而产生复位使宝贝车程序从头重新运行。在这些情形下,程序重新/开始指示器成为一个非常有用的诊断设备和机器人工具。一种指示程序重启的方法是在所有舵机车程序的开始处包含一个明确的信号。这个信号在每次复位时产生。一个有效的表明程序重启的方法是扬声器,它在每次程序从头开始运行或重启时就会发出声音。测试过程得到宝贝车重启时蜂鸣器可以发出声音。

4. 舵机车的巡航控制

4.1舵机车的基本动作

让舵机车向前走、左转、右转以及向后走。程序如下:

#include

#include

int main(void)

{

int counter;

printf("Program Running!\n");

for(counter=1;counter

{

P1_4=1;

delay_nus(1000);

P1_4=0;

delay_nus(1000);

}

for(counter=1;counter

P1_1=1;

delay_nus(1700);

P1_1=0;

P1_0=1;

delay_nus(1300);

P1_0=0;

delay_nms(20);

}

for(counter=1;counter

P1_1=1;

delay_nus(1300);

P1_1=0;

P1_0=1;

delay_nus(1300);

P1_0=0;

delay_nms(20);

}

for(counter=1;counter

P1_1=1;

delay_nus(1700);

P1_1=0;

P1_0=1;

delay_nus(1700);

P1_0=0;

delay_nms(20);

}

for(counter=1;counter

P1_1=1;

delay_nus(1300);

P1_1=0;

P1_0=1;

delay_nus(1700);

P1_0=0;

delay_nms(20);

}

} 注意:伺服电机的控制线连接在教学板的单片机上,通过给单片机控制器编程,使单片机的P1端口的第一引脚P1_1和第二引脚P1_1来发出伺服电机的控制信号,控制信号通过控制线来控制左右伺服电机的转动,从而实现机器人以不同的速度及方向运动。

4.2舵机车触觉导航

4.2.1连接触觉导航电路并测试

零件列表:金属丝2根、平头M3×22盘头螺钉2个、13mm圆形立柱2个、M3尼龙垫圈2个、3-pin公-公接头2个、220欧电阻2个、10k欧电阻2个

安装步骤:(1).拆掉连接主板到前支架的两颗螺钉;

(2).螺钉依次穿过尼龙垫圈和圆形立柱;

(3).把须状金属丝的其中一个勾在尼龙垫圈之上,另一个勾在尼龙垫圈之下,调整位置使他们横向交叉但又不接触; (4).拧紧螺钉到支架上。

按照图12搭建电路:

图12 触须电路原理图

电路原理:由原理图可知,每条胡须都是一个常开开关。连接到每个胡须电路的I/O引脚监视着10k上拉电阻上的电压变化。当胡须没有被触动时,连接胡须的I/O管脚的电压是5V,当胡须被触动,I/O短接到地,所以I/O管脚的电压是0V。单片机可以读入相应的数据,进行分析、处理、控制机器人运动。在进行胡须测试之前需将串口电缆连接好,需用到调试终端以显示左右胡须状态,调用相关程序进行测试。 4.2.2触须导航

两个胡须状态有三种,需分情况讨论,需用到if语句。程序中应用的子程序(Ox代表十六进制数):

 获取P1_3的状态,即左胡须 int P1_3state(void) {return (P1&0x08)?1:0;}

 获取P1_2的状态,即右胡须

int P1_2state(void) {return (P2&0x04)?1:0;}

 向前子程序 void Forward(void)

 左转子程序

void Left_Turn(void)

 右转子程序

void Right_Turn(void)

 后退子程序 void Backward(void)

 循迹左转

void Left_Turnsmall(void)

 循迹右转

void Right_Turnsmall(void)

 左拐180度

void Left_Turn180(void)

 右拐180度

void Right_Turn180(void)

 小幅度左拐

void Left_Turn111(void)

 小幅度右拐

void Right_Turn111(void)

 停车

void Stop_car(void)

说明:左胡须接引脚P1_3,右胡须接引脚P1_2,在机器人的运动过程中,当左右胡须同时触到障碍物时,两个引脚输入全为0,此时通过调用相应函数Backward();Left_Turn();Left_Turn();实现后退并转180度;当只有左胡须触到障碍物时,P1_4输入为0,此时调用函数Backward();Right_Turn();实现向后并向右转;当只有右胡须触到障碍物时,P2_3输入为0,此时调用函数Backward();Left_Turn();实现向后并向左转。函数调用的过程中其实是通过连接在单片机引脚上的两个伺服电机控制线,向伺服电机发送不同的脉冲序列,从而实现电机的不同运动。 4.2.3程序运行

#include #include int P1_5state(void) {

return (P1&0x20)?1:0; }

int P2_3state(void) {

return (P2&0x08)?1:0; }

void Forward(void) {

P1_1=1;

delay_nus(1700); P1_1=0; P1_0=1;

delay_nus(1300); P1_0=0;

delay_nms(20); }

void Left_Turn(void) {

for(i=1;i

P1_1=1;

delay_nus(1300); P1_1=0; P1_0=1;

delay_nus(1300); P1_0=0;

delay_nms(20); } }

void Right_Turn(void) {

for(i=1;i

P1_1=1;

delay_nus(1700); P1_1=0; P1_0=1;

delay_nus(1700); P1_0=0;

delay_nms(20); } }

void Backward(void) {

for(i=1;i

P1_1=1;

delay_nus(1300); P1_1=0; P1_0=1;

delay_nus(1700); P1_0=0;

delay_nms(20); } }

int main(void) {

int counter; int old2=1; int old3=0; uart_Init();

printf("Program Running!\n"); for(counter=1;counter

{

P1_4=1;

delay_nus(1000); P1_4=0;

delay_nus(1000); }

counter=1; while(1) {

if(P1_5state()!=P2_3state()) {

if((old2!=P1_5state())&&(old3!=P2_3state()))

{

counter=counter+1; old2=P1_5state(); old3=P2_3state(); if(counter>4) {

counter=1;

Backward();//向后 Left_Turn();//向左 Left_Turn();//向左 } } else

counter=1; }

if((P1_5state()==0)&&(P2_3state()==0))

{

Backward();//向后 Left_Turn();//向左 Left_Turn();//向左 }

else if(P1_5state()==0) {

Backward();//向后 Right_Turn();//向右 }

else if(P2_3state()==0) } { else Backward();//向后 Forward();//向前 Left_Turn();//向左 }

这个程序使宝贝车在第四次或第五次交替探测到墙角后,完成一个“U”型的拐弯,次数依赖于哪一个胡须先被触动。

4.3红外线导航

4.3.1红外导航电路图及其工作原理

清单列表:两个红外探测器、两个IR LED、四个470欧电阻、两个9013三极管

按照图13建立电路图:

图13 原理图

电路工作原理:在连接三极管时注意三极管的管脚分别属于什么极,由电路可以看出,三极管相当于一个开关:当P1_3(P3_6)置高时,从集电区到基区到发射区电路导通,加载在IR LED上的电压为VCC,IR LED向外发射红外线,当P1_3(P3_6)置低时,电路又断开,IR LED停止发射。探测器只能接收频率为38.5kHz的红外信号,当没有红外信号返回时,探测器的输出状态为高,当它检测到被物体反射的38.5kHz的红外信号时,它的输出为低。探测器的输出作为单片机引脚的输入,根据单片机两个引脚不同的输入,通过伺服电机控制线分别向伺服电机发送不同的脉冲序列,从而控制伺服电机的不同运动。发送完信号后立即将IR探测器的输出存储到变量中,这些存储的值会显示在调试终端或被机器人用来导航。

4.3.2探测和避开障碍物

红外探测与触须的输出非常相像,没有检测到物体时,输出为高,检测到物体时,输出为低。根据左右探测器接收到红外线的情况可以分情况讨论其运动形式。

注意:为了使IR LED发射红外线的频率更精确,可采用空函数_nop_(void),

它能延迟1us,减少了由于调用延时函数产生的延时。

红外探测程序流程图如下:

图14

说明:通过调用IR LED红外发射器和探测器子程序打开发射器和探测器,在机器人运动过程中,当两个探测器同时探测到障碍物时,通过给伺服电机发送相应的脉冲,使机器人后退并转180度;当左边探测器检测到障碍物时,通过给伺服电机发送右转的脉冲,使其向右转;当机器人右边探测器检测到障碍物时,通过给伺服电机发送向左的脉冲,使其左转。即可实现红外线导航。 4.3.3程序运行

#include #include #include

#define LeftIR P1_5 //左边红外接收连接到P15 #define RightIR P3_6 //右边红外接收连接到P36 #define LeftLaunch P1_4 //左边红外发射连接到P14 #define RightLaunch P3_5 //右边红外发射连接到P35 int IRLaunch(unsigned char IR) {

unsigned int counter; if(IR=='L')

for(counter=0;counter

LeftLaunch=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();

_nop_(); _nop_(); _nop_();

LeftLaunch=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } else

for(counter=0;counter

RightLaunch=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();

RightLaunch=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } }

int main(void) {

int counter; int pulseLeft; int pulseRight;

bit irDetectLeft, irDetectRight; char IR;

uart_Init();

printf("Program Running!\n");

for(counter=1;counter

delay_nus(1000); P1_3=0;

delay_nus(1000); } do {

IRLaunch('R');

irDetectRight = RightIR; //右边接收 IRLaunch('L');

irDetectLeft = LeftIR; //左边接收

if((irDetectLeft==0)&&(irDetectRight==0)) //向前走 {

pulseLeft=1300; pulseRight=1700; printf("Forword\n"); }

else if((irDetectLeft==0)&&(irDetectRight==1)) //左转 {

pulseLeft=1700; pulseRight=1500;

printf("turn_Left\n"); }

else if((irDetectLeft==1)&&(irDetectRight==0)) //右转 {

pulseLeft=1500; pulseRight=1300;

printf("turn_Right\n"); } else {

pulseLeft=1700; //后退 pulseRight=1300; printf("back\n"); }

P1_1=1;

delay_nus(pulseLeft); P1_1=0; P1_0=1;

delay_nus(pulseRight); P1_0=0;

delay_nms(15); }

while(1); }

探测障碍物很重要的一点是在宝贝车撞到它之前给宝贝车留有绕开它的空间。如果前方有障碍物,宝贝车会使用脉冲命令避开,然后探测,如果物体还在,再使用另一个脉冲来避开它。宝贝车能持续使用电机驱动脉冲和探测,直到它绕开障碍物,然后它会继续发向前行走的脉冲。本程序能够很好地实现这一点。

4.4光敏电阻导航

4.4.1光敏电阻工作原理

光敏电阻又称光导管, 它几乎都是用半导体材料制成的光电器件。 光敏电阻没有极性, 纯粹是一个电阻器件, 使用时既可加直流电压, 也可以加交流电压。无光照时, 光敏电阻值(暗电阻)很大, 电路中电流(暗电流)很小。当光敏电阻受到一定波长范围的光照时, 它的阻值(亮电阻)急剧减少, 电路中电流迅速增大。 一般希望暗电阻越大越好, 亮电阻越小越好,此时光敏电阻的灵敏度高。

4.4.2光敏电阻应用导航

基于光敏电阻的工作原理,可以将其应用于机器人的导航,如下电路图:  分压电路如图8: R为光敏电阻,光敏电阻在受到光照时,电阻会减小,

则R上的分压减小,V0增大,当大于1.5V时为高电平;当没有光照时,光敏电阻阻值很大,R上分压也大,V0减小,当小于1.5V时为低电平。  光检测电路如图9:P1_5、P2_3为与光敏电阻连接的引脚,当在空白有

光处,光敏电阻阻值很小,与之所连接的引脚为高电平;当遇到阴影处,光敏电阻阻值很大,与之连接的引脚为低电平。根据引脚的高低电平可以避开阴影区从而实现光敏电阻导航。

图15 图16

4.4.3 程序运行

#include #include

int P1_5state(void)//获取P1_5口的状态

{ else if(P1_5state()==0)//只有return (P1&0x20)?1:0; 左边的探测到阴影,向左转 } { int P2_3state(void) //获取P1_1=1; P2_3口的状态 delay_nus(1500);

{ P1_1=0; return (P2&0x08)?1:0; P1_0=1; } delay_nus(1300); int main(void) P1_0=0; { } Int counter; else if(P2_3state()==0)//只有uart_Init(); //串口初始化 右边的探测到阴影,向右转 printf("Program Running!\n"); { for(counter=1;counter

{ P1_1=0; P1_4=1; P1_0=1; delay_nus(1000); delay_nus(1500); P1_4=0 P1_0=0; delay_nus(1000); } } else //没有探测到阴影,静止不while(1) 动 { { if((P1_5state()==0)&&(P2_3stP1_1=1; ate()==0))//都探测到阴影,向前运delay_nus(1500); 动 P1_1=0;

{ P1_0=1; P1_1=1; delay_nus(1500); delay_nus(1700); P1_0=0; P1_1=0; } P1_0=1; delay_nms(20); delay_nus(1300); } P1_0=0; } }

当运行上面的程序时,如果没有阴影遮住光敏电阻,宝贝车机器人会静止不动,当同时遮住两个光敏电阻时,宝贝车机器人会向前移动,当只遮住一个光敏电阻时,机器人会向探测到阴影的光敏电阻一侧转动。

4.5循迹导航

宝贝车的底盘前下方安装两个红外传感,有发射器和探测器,通过从地表反射回来的红外线探测路况,当传感器下方是白色时,红外线反射给探测器,则与此探测器连接的引脚输出为低电平0;当传感器下方是黑色时,红外线被吸收,探测器接收不到红外光,则于此探测器连接的引脚输出为高电平1。通过编程实

现机器人沿着黑色胶带路运动,而不会跑到外边。

程序如下:

#include #include sbit P32=P3^2; sbit P33=P3^3; void Forward(void) {

P1_1=1;

delay_nus(1700); P1_1=0; P1_0=1;

delay_nus(1300); P1_0=0;

delay_nms(20); }

void Left_Turn(void) {

P1_1=1; P1_0=1;

delay_nus(1300); P1_1=0; P1_0=0;

delay_nms(20); }

void Right_Turn(void) {

P1_1=1; P1_0=1;

delay_nus(1700); P1_1=0; P1_0=0;

delay_nms(20); }

void ting(void) {

P1_1=1; P1_0=1;

delay_nus(1500);

P1_1=0; P1_0=0;

delay_nms(20); }

int main(void) {

int counter; uart_Init();

for(counter=1;counter

P1_4=1;

delay_nus(1000); P1_4=0;

delay_nus(1000); }

while(1) {

if((!P32)&&(!P33)) {

ting(); }

if((P32)&&(P33)) {

Forward(); }

if((P32)&&(!P33)) {

Left_Turn(); }

if((!P32)&&(P33)) {

Right_Turn(); } } }

二.直流电机总结

1.实习目的、任务与要求

1.1实习目的

(1)通过训练,了解直流小车由哪几部分组成。理解直流小车是根据什么要求而设计的,理解设计时需要考虑的参数,包括:机器人的运动路径、定位精度,重复定位精度、任务执行等。

(2)理解直流小车的构成及其原理。

(3)了解直流小车上的传感器有哪些,掌握传感器的原理及工作方式。 (4)理解直流小车是如何根据传感器的信息做出决策。

(5)尽可能的在组装好的直流小车上实现不同情况的开发。 (6)培养团队协作和独立工作能力。

1.2实习任务与要求

(1)熟悉直流小车的组成部分,组装并测试好直流小车。

(2)直流小车的可以前进、后退、左转、右转、停止,并在允许范围内可调节速度。

(3)陈述清楚直流小车如何实现运动。

(4)理清直流小车的人机交互关系,陈述清楚直流小车如何实现人机交互。 (5)陈述清楚直流小车有哪些传感器,传感器的信息是如何传送到单片机的。 (6)能在实验中迅速排除各种故障。

(7)鼓励创新,在完成前八个基本任务的前提下,尽量做出新的开发,如果现有硬件条件不满足,可以陈述清楚创新原理。

2.实习准备

2.1实习准备

硬件:PC机、AT89S52单片机、直流小车组件、USB下载接口、串口线、电池。

软件:Keil uVision4 IDE集成开发环境、SL-ISP软件下载工具、串口调试软件。

2.2直流车的组装和软件的安装

2.2.1硬件的组装

第一步:在开始安装前要先把充电电池充 8-10 小时后手工断电,不 能充太久,以保证小车供电正常。 第二步:焊接电机导线

第三步:安装并固定四个寻迹探头 第四步:电池放置与安装

第五步:安装四路寻线模块与驱动模块 第六步:红外探头与中控板连接 第七步:电池,驱动模块,电机连接

第八步:测试驱动模块与电机连接是否正确,并制作供电线 第九步:驱动模块的控制线与单片机IO相连 第十步:传感器供电连接 2.2.2软件的安装

直流小车软件的安装和舵机车基本相同

3.实习任务

3.1基本运动

对直流小车最基本的要求就是能够实现前进,后退,左转,右转和停止等。

4.模块测试

4.1超声波模块

4.1.1舵机归中

实习中要求舵机归中,这样可以使超声波装置左右转过的角度相同。程序如下:

#include #include

#define Sevro_moto_pwm P2_7

unsigned char pwm_val_left = 0;//变量定义

unsigned char push_val_left =14;//舵机归中,产生约,1.5MS 信号 unsigned long S=0;

unsigned long S1=0; unsigned long S2=0; unsigned long S3=0; unsigned long S4=0;

unsigned int time=0; //时间变量 unsigned int timer=0; //延时基准变量

unsigned char timer1=0; //扫描时间变量 /*调节push_val_left的值改变电机转速,占空比 */ void pwm_Servomoto(void) {

if(pwm_val_left

Sevro_moto_pwm=0; if(pwm_val_left>=200) pwm_val_left=0; }

void time1()interrupt 3 using 2 {

TH1=(65536-100)/256; //100US定时 TL1=(65536-100)%256;

//定时器100US为准。在这个基础上延时 pwm_val_left++; pwm_Servomoto(); }

void main(void) {

TMOD=0X11;

TH1=(65536-100)/256; //100US定时 TL1=(65536-100)%256; TH0=0; TL0=0; TR1= 1; ET1= 1; ET0= 1; EA = 1;

push_val_left=14; //舵机归中 while(1) /*无限循环*/ { } }

4.1.2超声波避障舵机转动

程序如下:此程序能够实现直流小车躲避障碍的功能

#include #include

#define Sevro_moto_pwm P2_7 #define ECHO P2_4 #define TRIG P2_5

#define Left_moto_go

{P1_0=1,P1_1=0,P1_2=1,P1_3=0;} #define Left_moto_back {P1_0=0,P1_1=1,P1_2=0,P1_3=1;} //

#define Left_moto_Stop

{P1_0=0,P1_1=0,P1_2=0,P1_3=0;} #define Right_moto_go {P1_4=1,P1_5=0,P1_6=1,P1_7=0;} / #define Right_moto_back {P1_4=0,P1_5=1,P1_6=0,P1_7=1;} #define Right_moto_Stop {P1_4=0,P1_5=0,P1_6=0,P1_7=0;} unsigned char const

positon[3]={ 0xfe,0xfd,0xfb};

unsigned char disbuff[4] ={ 0,0,0,0,}; unsigned char posit=0;

unsigned char pwm_val_left = 0; unsigned char push_val_left =14; unsigned long S=0; unsigned long S1=0; unsigned long S2=0; unsigned long S3=0; unsigned long S4=0; unsigned int time=0;

//时间变量

unsigned int timer=0; //延时基准变量 unsigned char timer1=0; void delay(unsigned int k) { unsigned int x,y; for(x=0;x

void Display(void)

{

if(posit==0)

{P0=(discode[disbuff[posit]])&0x7f;} else

{P0=discode[disbuff[posit]];} if(posit==0)

{ P2_1=0;P2_2=1;P2_3=1;} if(posit==1)

{P2_1=1;P2_2=0;P2_3=1;} if(posit==2)

{P2_1=1;P2_2=1;P2_3=0;} if(++posit>=3) posit=0; }

void StartModule() { TRIG=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); TRIG=0; }

void Conut(void) //计算距离

{

while(!ECHO); TR0=1;

while(ECHO);

TR0=0; /

time=TH0*256+TL0;

TH0=0; TL0=0;

S=(time*1.7)/100;

disbuff[0]=S%1000/100;

disbuff[1]=S%1000%100/10; disbuff[2]=S%1000%10 %10; }

void run(void) {

Left_moto_go ; //左电机往前走 Right_moto_go ; //右电机往前走 }

void backrun(void) {

Left_moto_back ; //左电机往前走 Right_moto_back ; //右电机往前走 }

void leftrun(void) {

Left_moto_back ; //左电机往前走 Right_moto_go ; //右电机往前走

}

void rightrun(void) {

Left_moto_go ; //左电机往前走 Right_moto_back ; //右电机往前走 }

void stoprun(void) {

Left_moto_Stop ; //左电机停走 Right_moto_Stop ; //右电机停走 }

void COMM( void ) { push_val_left=5; while(timer

StartModule();

Conut();

S2=S; S4=S;

push_val_left=14; //舵机归中 timer=0;

while(timer

if((S2

backrun(); //后退

timer=0;

while(timerS4)

{

rightrun();

while(timer

}

else { leftrun();

timer=0;

while(timer

} void pwm_Servomoto(void) {

if(pwm_val_left

Sevro_moto_pwm=0; if(pwm_val_left>=200) pwm_val_left=0;

}

void time1()interrupt 3 using 2 {

TH1=(65536-100)/256;/100US定时 TL1=(65536-100)%256;timer++;

pwm_val_left++; pwm_Servomoto(); timer1++; //2MS扫一次数码管

if(timer1>=20)

{ timer1=0; Display();

} }

void timer0()interrupt 1 using 0 {

}

void main(void) {

TMOD=0X11;

TH1=(65536-100)/256; //100US定时 TL1=(65536-100)%256; TH0=0; TL0=0; TR1= 1; ET1= 1; ET0= 1; EA = 1; delay(100);

push_val_left=14; {

if(timer>=1000)

while(1)

StartModule(); //启动检测 if(S

COMM(); }

{

stoprun(); //小车停止

4.2蓝牙模块

4.2.1蓝牙的安装

直接对插入我们相应的插座处!注意了,插拔模块一定要把电断了后再进行,否则可能会烧模块。

注意:蓝牙模块串口切换问题(蓝牙串口程序,采用波特率9600,所以我们一定要用11.0592M 的晶振,注意我们单片机控制板防静电包装里面有一个11。0592M 晶振,请注意查找)。 4.2.2程序运行

#define left 'C' #define right 'D' #define up 'A' #define down 'B' #define stop 'F'

char code str[] = "收到指令,向前!\n"; char code str1[] = "收到指令,向后!\n"; char code str2[] = "收到指令,向左!\n"; char code str3[] = "收到指令,向右!\n"; char code str4[] = "收到指令,停止!\n"; bit flag_REC=0; bit flag =0;

unsigned char i=0; unsigned char dat=0;

unsigned char buff[5]=0; //接收缓冲字节 void delay(unsigned int k) {

unsigned int x,y; for(x=0;x

void send_str( )

// 传送字串 {

unsigned char i = 0; while(str[i] != '\0') { SBUF = str[i]; while(!TI);

TI = 0;

i++;

}

}

void send_str1( )

unsigned char i = 0; while(str1[i] != '\0') { SBUF = str1[i]; while(!TI);

TI = 0;

i++;

} }

void send_str2( )

{

unsigned char i = 0; while(str2[i] != '\0') { SBUF = str2[i]; while(!TI);

TI = 0;

i++;

}

}

void send_str3() {

unsigned char i = 0; while(str3[i] != '\0') { SBUF = str3[i]; while(!TI); // 等特数据传送 TI = 0;

// 清

除数据传送标志

i++;

// 下一个

字符

} }

void send_str4()

// 传送字串

{

unsigned char i = 0; while(str4[i] != '\0') { }

void run(void) {

Left_moto_go ; //左电机往前走 Right_moto_go ; //右电机往前走 }

void backrun(void)

{

Left_moto_back ; //左电机往前走

Right_moto_back ; //右电机往前走 }

void leftrun(void) {

Left_moto_back ; //左电机往前走 Right_moto_go ; //右电机往前走 }

void rightrun(void) {

Left_moto_go ; //左电机往前走

Right_moto_back ; //右电机往前走 }

void stoprun(void) {

Left_moto_Stop ; //左电机往前走 Right_moto_Stop ; //右电机往前走 }

void sint() interrupt 4 { if(RI) { RI=0;

dat=SBUF;

if(dat=='O'&&(i==0)) { buff[i]=dat;

flag=1; } else if(flag==1) { i++; buff[i]=dat; if(i>=2)

{i=0;flag=0;flag_REC=1 ;} // 停止接收

} } }

void main(void) {

TMOD=0x20;

TL1=0xFd; SCON=0x50; PCON=0x00; TR1=1;

ES=1;

//

while(1) { EA=1; TH1=0xFd;

}

send_str( ); run(); break;

case down: // 后退

send_str1( ); backrun(); break;

case left: // 左转

send_str2( ); leftrun(); break;

case right: // 右转

send_str3( ); rightrun(); break;

if(flag_REC==1) {

flag_REC=0;

case stop: // 停止

send_str4( ); stoprun(); break;

if(buff[0]=='O'&&buff[1]=='N')

第一个字节为O,第二个字节为N,第三个字节为控制码

switch(buff[2]) case up : // 前进

{

} } }

4.3无线模块

程序如下:运行此程序后,会通过遥控器对小车的基本运动进行控制。 //主函数

void main(void) { while(1) {

if(P0_7==1&&P0_6==0) run();

if(P0_6==1&&P0_7==0) backrun(); if(P0_5==1) leftrun(); if(P0_4==1) rightrun();

/*无限循环*/

//按了B按键 小车前进

//按了D按键 小车后退 //按了A按键 小车左转 //按了C按键 小车右转

if(P0_7==1&&P0_6==1) {

stoprun(); } } }

//同时按下B 与 D 小车停止

4.4循迹测试

将四个循迹传感器安装在校车的底部,由于传感器的作用,可以通过程序使直流小车沿着黑色的轨迹走。程序如下:

/*--主函数--*/

void main(void) {

delay(100); run(); while(1) {

//有信号为0 没有信号为1 run(); else {

if(Right_1_led==1&&Left_2_led==0)

{

//左边两个电机正转 //右边两个电机反转 //左边检测到黑线

//右边两个电机正转 //左边两个电机反转

Left_moto_go;

}

if(Left_2_led==1&&Right_1_led==0) {

Right_moto_go;

//右边检测到黑线

if(Left_2_led==0&&Right_1_led==0)

/*无限循环*/

//延时一段时间

Right_moto_back;

Left_moto_back;}}}

三.步进电机小车总结

1实习目的、任务与要求

1.1实习目的

(1)通过训练,了解步进小车由哪几部分组成。理解步进小车是根据什么要求而设计的,理解设计时需要考虑的参数。

(2)理解步进小车的构成及其原理。

(3)了解步进小车上的传感器有哪些,掌握传感器的原理及工作方式。 (4)理解步进小车是如何根据传感器的信息做出决策。 (5)掌握步进小车如何运动以及其他的运动方式。 (6)培养团队协作和独立工作能力。

1.2实习任务与要求

(1)熟悉步进小车的组成部分,组装并测试好步进小车。

(2)步进小车的可以前进、后退、左转、右转、停止,并在允许范围内可调节速度。

(3)陈述清楚步进小车如何实现运动。 (4)陈述清楚步进小车有哪些传感器,传感器的信息是如何传送到单片机的。 (5)能在实验中迅速排除各种故障。

(6)鼓励创新,在完成前八个基本任务的前提下,尽量做出新的开发,如果现有硬件条件不满足,可以陈述清楚创新原理。

2.实习准备

2.1实习准备

硬件:PC机、AT89S52单片机、步进车组件、ISP下载电缆、串口线、电池。 软件:Keil uVision4 IDE集成开发环境、SL-ISP软件下载工具、串口调试软件。

2.2步进车的组装和软件的安装

2.2.1硬件的安装

根据实习指导书上的步骤将步进车的硬件组装起来:

(1)首先连接电机和电机固定座,然后把电机的四根线从电机固定座的圆孔中穿过。

(2)把组装好的驱动单元安装到底板上,为了方便安装底板上的安装孔为长孔,电机固定座有一定的活动余量,安装时一定要注意调节两个电机在同一直线上,这样才能保证小车运动的精准性。

(3)接下来安装电机驱动,电机与驱动的接线顺序在接线图里面有介绍 (4).然后安装联轴器。联轴器的顶丝不要忘记装~ (5)装上轮胎

(6)接下来安装牛眼,铜柱是由一根30mm 和两根8mm 的拼接而成的 如果安装好铜柱之后,两条铜柱不是平行的话,就用手把他们弄成平行的, 这样才能,准确的安装到底板上。

(7)接下来安装小车的眼睛—光电开关 (8)寻迹传感器安装到这里,调整下传感器的角度到适合所寻黑线的宽度。 (9)然后插上线,注意区分vcc gnd out 三根线不要弄混。 2.2.2软件的安装

(1)解压缩光盘中的KeilC51到某个目录下,如D:\keil

(2)执行D:\keil\setup\setup.exe 安装程序,选择安装Eval Version版进行安装

(3)安装ISP下载软件

3.实习任务

3.1基本运动

对直流小车最基本的要求就是能够实现前进,后退,左转,右转和停止等,根据指导书上的部分子程序进行测试和运行。

4.模块测试

4.1超声波模块

4.1.1超声波原理

本模块输出方式为PWM 方式。利用单片机从控制口发一个10US,以上的高电平,就可以在接收口等待高电平输出。一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,方可算出距离。如此周期性地测量方可移动测距。 4.1.2超声波LCD显示

#include #include sbit DX=P2^0; sbit WX=P2^1; #define RX P2_7 #define TX P2_6

#define LCM_RW P2_1 //定义LCD引脚 #define LCM_RS P2_0 #define LCM_E P2_2 #define LCM_Data P0

#define Key_Data P2_0 //定义Keyboard引脚 #define Key_CLK P3_2

#define Busy 0x80 //用于检测LCM状态字中的Busy标识

void LCMInit(void);

//声明LCD初始化函数

void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData); void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData); void Delay5Ms(void); void Delay400Ms(void);

void Decode(unsigned char ScanCode); void WriteDataLCM(unsigned char WDLCM);

void WriteCommandLCM(unsigned char WCLCM,BuysC); unsigned char ReadDataLCM(void); unsigned char ReadStatusLCM(void);

unsigned char code mcustudio[] ={"mcustudio.com.cn"}; unsigned char code email[] = {"[email protected]"}; unsigned char code Cls[] = {" "};

unsigned char code ASCII[15] = {'0','1','2','3','4','5','6','7','8','9','.','-','M'}; static unsigned char DisNum = 0; //显示用指针

unsigned int time=0; unsigned long S=0; bit flag =0; unsigned char disbuff[4] ={ 0,0,0,0,};

void WriteDataLCM(unsigned char WDLCM)

{

ReadStatusLCM(); //检测忙 LCM_Data = WDLCM; LCM_RS = 1; LCM_RW = 0;

LCM_E = 0; //若晶振速度太高可以在这后加小的延时 LCM_E = 0; //延时 LCM_E = 1; }

void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测{

if (BuysC) ReadStatusLCM(); //根据需要检测忙 LCM_Data = WCLCM; LCM_RS = 0; LCM_RW = 0; LCM_E = 0; LCM_E = 0; LCM_E = 1; }

//读数据

unsigned char ReadDataLCM(void) {

LCM_RS = 1; LCM_RW = 1; LCM_E = 0; LCM_E = 0; LCM_E = 1; return(LCM_Data); }

unsigned char ReadStatusLCM(void) {

LCM_Data = 0xFF; LCM_RS = 0; LCM_RW = 1; LCM_E = 0; LCM_E = 0; LCM_E = 1;

while (LCM_Data & Busy); //检测忙信号 return(LCM_Data); }

void LCMInit(void) //LCM初始化 {

LCM_Data = 0;

WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号 Delay5Ms();

WriteCommandLCM(0x38,0); Delay5Ms();

WriteCommandLCM(0x38,0); Delay5Ms();

WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号 WriteCommandLCM(0x08,1); //关闭显示 WriteCommandLCM(0x01,1); //显示清屏

WriteCommandLCM(0x06,1); // 显示光标移动设置 WriteCommandLCM(0x0F,1); // 显示开及光标设置 }

void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData) { Y &= 0x1;

X &= 0xF; //限制X不能大于15,Y不能大于1 if (Y) X |= 0x40; //当要显示第二行时地址码+0x40; X |= 0x80; //算出指令码

WriteCommandLCM(X, 1); //发命令字 WriteDataLCM(DData); //发数据

void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData) {

unsigned char ListLength;

ListLength = 0; Y &= 0x1;

X &= 0xF; //限制X不能大于15,Y不能大于1 while (DData[ListLength]>0x19) //若到达字串尾则退出 { if (X

}

}

}

void Delay5Ms(void) {

unsigned int TempCyc = 5552; while(TempCyc--); }

void Delay400Ms(void) {

unsigned char TempCycA = 5; unsigned int TempCycB; while(TempCycA--) { TempCycB=7269; while(TempCycB--); };

}

void StartModule() { TX=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); TX=0; }

void delayms(unsigned int ms)

unsigned char i=100,j; for(;ms;ms--) { while(--i) { j=10; while(--j);

}

} }

void main(void) {

unsigned char TempCyc; DX=1;

LCM_Data=0xff; DX=0; WX=1;

LCM_Data=0xff; WX=0;

Delay400Ms(); //启动等待,等LCM讲入工作状态 LCMInit(); //LCM初始化 Delay5Ms(); //延时片刻(可不要) DisplayListChar(0, 0, mcustudio); DisplayListChar(0, 1, email); ReadDataLCM();//测试用句无意义 for (TempCyc=0; TempCyc

while(1) {

TMOD=0x01; //设T0为方式1,GATE=1;

TH0=0;

TL0=0;

ET0=1; //允许T0中断 EA=1;

//开启总中断

while(1) {

StartModule();

DisplayOneChar(0, 1, ASCII[0]);

while(!RX); //当RX为零时等待 TR0=1; //开启计数 while(RX); //当RX为1计数并等待 TR0=0;

//关闭计数

Conut();

delayms(80);

//计算

//80MS

}}}

4.2避障光电开关

运行下面的程序,能够避开障碍,从而实现想要的功能。

#include "reg51.h" #include "stdio.h" #include #include #define uchar unsigned char #define uint unsigned int sbit ir_left=P1^6;

//左侧红外传感器接收位

sbit ir_right=P1^7; //右侧红外传感器接收位 sbit ir_mid=P2^3; //中间红外传感器接收位 void timer1_init(); //定时器1初始化函数

void move_left(uint speed_l,uchar cw,uchar en);//左电机运动函数 void move_right(uint speed_r,uchar cw,uchar en);//右电机运动函数 void delay(unsigned int k);

//延时函数

uint n;//进定时器1中断次数计数 uint speed;//电机速度控制变量 void timer1_init() {

TMOD=0X10; ET1=1; EA=1;

TH1=(65536-100)/256; TL1=(65536-100)%256;

TR1=1;//定时器启动后 运动控制脉冲将一直产生 小车的运动方式受 cw 和en控制 }

void main (void) { delay(10); timer1_init();

while(1) {

if(ir_left==0&&ir_mid==0&&ir_right==0) //以下是三个红外传感器的八种状态和对 { }

move_left(15,0,1); move_right(15,0,1); delay(800);

if(ir_left==0&&ir_mid==0&&ir_right==1) { move_left(15,0,1); move_right(15,0,1); delay(400); }

if(ir_left==0&&ir_mid==1&&ir_right==0)

{ move_left(15,0,1); move_right(15,0,1); delay(800); }

if(ir_left==0&&ir_mid==1&&ir_right==1)

{ move_left(15,0,1); move_right(15,0,1); delay(400); }

if(ir_left==1&&ir_mid==0&&ir_right==0)

{ move_left(15,1,1); move_right(15,1,1); delay(400); }

if(ir_left==1&&ir_mid==0&&ir_right==1)

{ move_left(15,0,1); move_right(15,0,1); delay(800); }

if(ir_left==1&&ir_mid==1&&ir_right==0)

{ move_left(15,1,1); move_right(15,1,1); delay(400); }

if(ir_left==1&&ir_mid==1&&ir_right==1)

{ move_left(15,0,1); move_right(15,1,1); }

}

}

void timer1_serve() interrupt 3 {

TH1=(65536-100)/256; TL1=(65536-100)%256; n=n+1; m=m+1; if(n==speed) {

clk_left=~clk_left; clk_right=~clk_right; n=0; }

4.3循迹模块

将循迹传感器安装在校车的底部,由于传感器的作用,可以通过程序使步进小车沿着黑色的轨迹走。程序如下:

//主函数体

void main (void) { delay(10); timer1_init();

while(1) {

if(ir_left==0&&ir_right==0) { }

if(ir_left==0&&ir_right==1) { }

if(ir_left==1&&ir_right==0) {

move_left(15,0,1); move_right(15,0,1); delay(100);

move_left(15,0,0); move_right(15,0,0);

move_left(15,1,1); move_right(15,1,1);

delay(100);

}

}

if(ir_left==1&&ir_right==1) { }

move_left(15,0,1); move_right(15,1,1); delay(40);

void timer1_serve() interrupt 3 {

TH1=(65536-100)/256; TL1=(65536-100)%256; n=n+1; m=m+1; if(n==speed) {

clk_left=~clk_left; clk_right=~clk_right; n=0; } }

4.4无线遥控模块

程序如下:运行此程序后,会通过遥控器对小车的基本运动进行控制。 //函数体

void timer1_init() {

TMOD=0X10; ET1=1; EA=1;

TH1=(65536-100)/256; TL1=(65536-100)%256;

TR1=1;//定时器启动后 运动控制脉冲将一直产生 小车的运动方式受 cw 和en控制 }

void main (void) { delay(10); timer1_init();

while(1) {

if(A_key==1&&B_key==0&&C_key==0&&D_key==0) {

EA=1;

move_left(20,0,1);

move_right(20,1,1);

}

else if(A_key==0&&B_key==1&&C_key==0&&D_key==0)

{

EA=1;

move_left(20,0,1);

move_right(20,0,1);

}

else if(A_key==0&&B_key==0&&C_key==1&&D_key==0)

{

EA=1;

move_left(20,1,1);

move_right(20,1,1);

}

else if(A_key==0&&B_key==0&&C_key==0&&D_key==1)

{

EA=1;

move_left(20,1,1);

move_right(20,0,1);

}

else

{

EA=0;

}

}

}

void delay(uint speed)

{

while(speed--)

{

;

}

}

void timer1_serve() interrupt 3

{

TH1=(65536-100)/256;

TL1=(65536-100)%256;

n=n+1;

if(n==speed)

{

clk_left=~clk_left;

clk_right=~clk_right;

n=0;

}

}

void move_right(uint speed_r,uchar cw,uchar en)

{ //speed_r速度控制变量 cw方向控制变量 en使能控制变量

speed=speed_r; //speed数值与速度成反比 请结合实际情况进行调节,

if(cw==1) //但速度不能无限加快因为步进电机有速度上限

{ //而且速度加快是力矩会下降,容易导致丢步现象

cw_right=1; //所以实际应用当中应调节到速度可力矩比较合适的数值

} //应考虑到电池电压,轮胎直径等因素

else

{

cw_right=0; //cw 控制电机正反转,1与0各代表一个方向

}

if(en==1)

{ //en 为使能位 1:能 0:不能

en_right=1;

}

else

{

en_right=0;

}

}

void move_left(uint speed_l,uchar cw,uchar en)

{ //speed_l速度控制变量 cw方向控制变量 en使能控制变量

speed=speed_l;

if(cw==1)

{

cw_left=1;

}

else

{

cw_left=0;

}

if(en==1)

{

en_left=1;

}

else

{

}

} en_left=0;

四.实习总结

这次实习,通过老师的简单说明,使我了解到此次实习的任务有三个。三个实习任务分别是:1.步进小车2.直流小车3.舵机车。

就这样我开始了实习,一天天过去了,通过实习完,我真觉得很累,但是,此次实习特别有意义和价值,使我学到了太多的东西。我作为小组组长,和自己的组员通力合作,踏踏实实的按照要求实现每种功能,一丝不苟的操作和检验每一次电路的连接,充满期待的去观察每一次功能的实现。我感觉实习的每时每刻都过的非常充实,每天的实习在不经意间就很快过去了。我觉得自己还是不能高效快速的完成任务,因此当自己的进度和别人的差距拉得过大的时候,我就吃完饭直接回到宿舍,和还意犹未尽的伙伴在舍友的电脑上编程、烧程序和观察小车的运动情况。特别是自己在给舵机车实现调零的时候,自己都觉得自己是如此一丝不苟,力求使车的运行轨迹能够尽量的直一些。每当小车实现一个功能,我都是无比的欢喜,内心感觉到一种得到满足的欣喜,就在这个时候我总是无法控制自己内心的激动,尽情的宣泄着,迫不及待的向伙伴或者临近的同学炫耀我们自己的小车所实现的功能。我对此感到有一种无以言语的成就感,也许这就是常理上所说:一个人在得到别人的认知和肯定之后的一种内心的充实!下面我就整个操作过程简单介绍一下。

所有的小车都是以单片机为核心构成的,我们通过编程可以实现探测周围的环境,处理接收到的信息,控制小车的运动。首先,对于直流小车,说实话,从外观来说,它是最炫的。经过几天的组装,调试,我觉得它是最简单的,我和搭档首先对其组装,然后进行一些必要的调试。例如,轮子方向的测试,一些小车的基本运动:前进,后退,左转,右转等。最后,我们浇了一些复杂的运动。利用一些传感器的原理,实现一些特殊的功能,比如:循迹,避障,测距,蓝牙控制,无线遥控控制等。然后,我们组又开始了对步进小车的研究,我觉得它的速度很慢,不过,像一个坦克,笨重有力,和直流小车一样,我和搭档首先对其组装,然后进行一些必要的调试。例如,轮子方向的测试,一些小车的基本运动:前进,后退,左转,右转等。本以为可以很轻松的完成,可是在进行一些复杂的运动时,就出现了很多问题,比如:程序中的错误,接线的错误,和行驶方向错误的问题。不过,我们没有气馁,我们一个一个的改正,最后,终于实现了步进车的循迹,避障,超声波LCD显示,和无线遥控控制等功能。最后,我们做的是舵机车,首先是伺服电机的调零开始我们只知道伺服电机在高电平持续的时间为

1.5ms低电平持续的时间是20ms的时候应该是不转动,但是电机为什么会在这样的情况下不转动我们并不了解,后来老师提示我们,我们所使用的伺服电机是舵机位置式伺服系统,我们上网查阅了关于舵机方面的知识,明白了舵机的工作原理,也就明白了为什么要那样调节。舵机的原理实际上就是舵机内部的基准电路产生高电平持续时间为1.5ms低电平持续时间为20ms的脉冲,施加同样的外部脉冲,两种脉冲产生的电压差为0所以伺服电机的转速为0,伺服电机的调零实际上就是调节内部的基准电路的脉冲。通过对伺服电机的调零,使我明白做什

么要先搞明白原理,不要盲目的去做,那样什么效果也没有。这是实习中我们遇到的第一个问题,为了解决这个问题,我们查阅了相关的知识,只是少有的自主学习的机会,锻炼了我们搜集信息,扩展自己知识面的能力,为以后的学习奠基了宝贵的经验。下来我们实习的是舵机车的基本的导航任务,主要的是实习舵机车的前进,拐弯,后退以及匀加速和匀减速的基本运动。接下来我们实习的是红外传感器的导航。红外传感器是属于非接触式的传感器,是利用红外发射器和红外接收器进行工作的,当红外发射器发射的红外光遇到障碍反射回来被红外接收器接受时,实现低电平的输出,表明前方有障碍物;如果前方没有障碍物则实现高电平的输出,表明前方没有障碍。通过这次实习,我们明白了红外传感器的工作原理,让我们收获颇丰。接下来我们实习的是光敏电阻的导航。光敏电阻遇到光时呈现低电阻的状态,传感器输出高电平;当没有光时光敏电阻传感器输出的是低电平。实习中正是利用了光敏电阻的这一特性实现了舵机车对阴影的探测。 最后我们又对舵机小车进行了无线遥控控制的实现和触须导航的实现,真的很有意思。

时间过得真快,在实习这段时间里,我学到了很多在课堂上学不到的东西,也认识到了自己很多的不足,感觉受益匪浅。回想起在实习的这两周时间里,真的很累,这是由实习性质决定的,也是我自己选择的,因为在我看来在实习中,不允许丝毫的马虎,严谨认真是时刻要牢记的。

在没有进行机电一体化实习前我们总是孤立的看待我们的专业课,这让我们缺少了独立思考的空间,这次实习给了我们很大的冲击,我们遇到了很多问题,强迫我们自己去思考问题解决问题,培养了我们自己独立思考问题的能力和发现问题解决问题的能力。我们需要重新审视经验教训,在以后的学习、生活和工作中尽量避免犯同样的错误。两周的实习结束了,虽然我们还有许多问题没有解决,但是这次实习却留给了我们更多的思考空间,只有总结两周的经验教训,我们才能学到更多的知识。

我坚信通过这一段时间的实习,从中获得的实践经验使我终身受益,并会在我毕业后的实际工作中不断地得到印证,我会持续地理解和体会实习中所学到的知识,期望在今后把学到的理论知识和实践经验不断的应用到实际中来,充分展示我的个人价值和人生价值,为实现自我的理想和光明的前程而努力。


相关文章

  • 毕业设计过程记录
  • 安徽机电职业技术学院毕业论文(设计) 安徽机电职业技术学院毕业论文(设计)指导过程记录表 机电职业技术学院毕业论文 题 目 学 电气工程系 1 2 班 机电你一体化的发展与应用 号 级 机电 指导教师 顺序号 第 1 次 学生姓名 系 部 ...查看


  • 机电一体化职业岗位与工作任务分析报告
  • 职业岗位与工作任务分析报告 课题组成员通过现场调研.数控专业技术人员调查.毕业生调查等方式,对数控技术应用专业人才培养进行深入分析研究.在调查的企业中,有80%的企业从学校招聘毕业生,由此可见,数控技术技术人才的主要来源仍是招聘学校毕业生. ...查看


  • 光机电一体化实习报告
  • 光 机 电 一 体 化 实 习 报 告 动力与机械学院 08级自动化3班 唐禹 [1**********]78 2010.05.04 动力与机械学院 08级自动化3班 唐禹 光机电一体化实习报告 [1**********]78 " ...查看


  • 机电产品市场营销理念学习报告
  • <机电产品市场营销理念> 心得体会 专业: 学号: 班级: 姓名: 序号: 这学期由康志新教授和赵海东教授给我们上"机电产品市场营销"的课程.这是我们09级机电一体化专业上大学以来第一次接触市场营销方面的课程 ...查看


  • 机电设备管理
  • 13级机电一体化技术专业 <机电设备管理与营销>课程教学指导书 根据学院要求,2013级机电一体化专业学生于2015.6.30 -2015.12.30号为顶岗实习时间,在此期间,学生需要完成第五学期专业课程的学习.顶岗实习,其中 ...查看


  • 机电一体化工作实习报告范文
  • 实践课题机电一体化技术中铣工的实践运用 实践内容 一.实习目的 终于等到了实习的时候了,很早以前就从师兄那里打听到了有实习,那时候可以说是急切地期盼着这一天的到来,因为大家再也无法满足于课堂教学,尽管从同学朋友那里了解到实习并非像想象中的那 ...查看


  • 机电一体化专业开题报告
  • 常州信息职业技术学院 学生毕业设计(论文)报告 系 别: 专 业: 班 号: 学 生 姓 名: 学 生 学 号: 设计(论文)题目: 指 导 教 师: 设 计 地 点: 起 迄 日 期: [本页适用于毕业设计] 毕业设计(论文)任务书 专业 ...查看


  • 数控车床是机电一体化的典型产品
  • 数控车床是机电一体化的典型产品,是集机床.计算机.电机及其拖动.自动控制.检测等技术为一身的自动化设备.其中主轴运动是数控车床的一个重要内容,以完成切削任务,其动力约占整台车床的动力的70%-80%.基本控制是主轴的正.反转和停止,可自动换 ...查看


  • 机电一体化课程设计报告
  • 机电一体化系统设计基础 课程设计报告 专 业: 机械电子工程 班 级: 机电0811 学 号: 2008716022 姓 名: 陈智建 指导教师: 刘云 .柯江岩 2012 年 1 月 13 日 目录 第一节 绪论 ............ ...查看


  • 机械手开题报告新
  • 盐城机电高等职业技术学校 2011 届毕业设计(论文)开题报告 题 目:系 别:专 业:专业方向:班 级:学生姓名:组 别:指导教师: 机械手维修项目 机电工程系 机电一体化 机电一体化 07大专机电 孙德洋.周往星.宣锐.仇春杨.姚东辉 ...查看


热门内容