资源描述
摘要:在科技日益发展的今天,无线遥控的机器人小车在危险环境作业、人员搜集等应用中可发挥特殊的作用。智能车作为智能车辆的仿真车,是研究智能车辆的基础。介绍了基于蓝牙遥控的多功能智能车。该设计采用STC89C52RC芯片为主控制器,利用L298N芯片驱动直流电机。同时利用安卓手机蓝牙无线遥控小车进入蓝牙手动模式,循迹模式和避障模式。在蓝牙模式下小车采用蓝牙模块利用Android平台远程控制小车的移动;在循迹模式下,采用红外光对管对黑线检测,判断出黑线的位置,将采集到的路况信息输入STC89C52单片机中,让小车沿着黑线自动行驶;在避障模式下,让小车自由移动,避障模块将使小车不会撞上障碍物。为了避免小车撞上障碍物,该小车使用了HS-RS04超声波模块,通过超声波的发射与接受来确定障碍物的位置,避免小车撞上障碍物。
关键词:智能车;51单片机;蓝牙通讯;超声波测距;红外检测;
45 / 49
目录
1 方案比较与论证1
1.1 循迹单元方案比较与选择1
1.2 避障单元方案比较与选择1
1.3 无线单元方案与比较2
2 硬件电路设计3
2.1 总体设计3
2.2 单片机模块3
2.2.1 STC89C52简介 3
2.3 电机驱动模块 4
2.3.1 参数4
2.4 电源模块6
2.5 蓝牙模块6
2.6 循迹模块7
2.7 避障模块7
3 软件设计8
3.1 智能车运动控制程序8
3.1.1 智能车运动控制程序构思与框架8
3.1.2 智能车基础运动设计与实现 11
3.1.3 串口通讯接口部分13
3.1.4 智能车蓝牙手动模式设计与实现14
3.1.5 智能车自主循迹模式设计与实现16
3.1.6 智能车自动避障模式设计与实现17
3.2 Android蓝牙客户端设计与实现19
3.2.1 客户端界面设计19
3.2.2 BluetoothCar类设计19
4 系统测试与结论20
4.1 硬件电路调试20
4.1.1 独立元件的检测20
4.1.2 单片机最小系统的调试20
4.1.3 电源电路的调试21
4.1.4 驱动模块的调试21
4.2 软件调试21
4.2.1 C语言的调试21
4.2.2 JAVA语言的调试22
4.3 制作总结22
参考文献24
附录一:原理图25
附录二:源程序27
1 方案比较与论证
1.1 循迹单元方案比较与选择
方案一:采用可见光发光二极管和光敏二极管
采用普通可见光发光管和光敏管组成的发射-接收电路。其缺点在于易受到环境光源的影响。即便提高发光管亮度也难以抵抗外界光的干扰。
方案二:采用反射式红外发射-接收器
采用反射式红外发射-接收器。直接用直流电压对发射管进行供电,其优点是实现简单,对环境光源的抗干扰能力强,在要求不高时可以使用。
结论:根据成本和实现容易性,以与由于传感器可以在车体的下部,发射、接收距地面都很近,外界光对其的干扰都很小。在基本不影响效果的前提下,为了简便起见,系统选用了方案二。
1.2 避障单元方案比较与选择
方案一:超声波探测
超声波测距对色彩和光照不敏感,可用于识别透明与漫反射性的物体,可在黑暗、有灰尘或烟雾的环境当中使用,超声波测距对电磁场与其他电磁干扰不敏感,可用于电磁干扰强、有毒、有害等恶劣环境中,超声波传感器结构简单、体积小、成本低、技术难度小、信息处理简单可靠、易于小型化和集成化。当然超声波测距也有一定的缺点,比如受温度、气流、材质的影响。
方案二:红外式探测
光电对管价格低廉,性能稳定,但探测距离过近(一般不超过3cm),使得小车必须制动迅速。而我们由于采用普通直流电机作为原动力,制动距离至少需要10cm。
方案三:雷达探测
雷达测距受恶劣天气的影响比较大,且成本比较高,雷达还必须满足电磁兼容要求。
方案四:使用视频采集处理装置进行探测
使用CCD实时采集小车前进路线上的图像并进行实时传输与处理,这是最精确的障碍物信息采集方案,可以对障碍物进行精确定位和测距。但是使用视频采集会大大增加小车成本和设计开发难度,而且考虑到我们小车行进转弯的精确度并未达到视频处理的精度,因而使用视频采集在实际应用中是个很大的浪费。
结论:综上所述,再结合我们的设计目标,采用方案一最符合设计要求。
1.3 无线单元方案与比较
无线控制是为了能够实现对智能车的远程遥控,使小车可以在遥控状态下代替人类完成一些危险项目。目前短距离无线数据传输技术主要有两大类,一类是基于IrDA红外无线通信技术,另一类是基于ISM(Industrial Scientific Medical)频段射频通信技术。较为主流的几种通信技术之间既存在着相互竞争,但又在某些实际应用领域相互补充、相互配合,究竟选择何种技术更优越,需要由具体的工作环境来决定。表1-3所示为四种短距离无线通讯技术主要性能参数。
表1.3 四种短距离无线通讯技术主要性能参数
蓝牙技术
红外技术
WiFi技术
ISM射频技术
通信距离
<100m
<10m
<300m
<1000m
通信速率
<10Mb/s
<16Mb/s
<11Mb/s
<500kb/s
通信频率或波长
2.4GHz
0.75um-24um
2.4GHz
315、433.868、915和2400MHz
频率申请
否
否
否
否
开发难度
易
难
难
易
模块成本
较低
很低
较低
低
结论:通过表格可以看出,他们在近距离通讯领域都可以提供可靠的通信服务,但是同时他们的应用有着各自的技术架构的限制。在以上的几种中,我最终选择了蓝牙无线传输方式。
2 硬件电路设计
2.1 总体设计
智能车主要现实远程来控制智能车的运动。它要实现三种运动模式:遥控模式、自主循迹模式、自动壁障模式。根据上述功能需求和模块化思想,智能车可以分为以下几个主要模块:单片机模块、电源管理模块、无线通讯模块、循迹模块、壁障模块。其主要结构框图如图1-1所示。
图2.1总体结构框图
2.2 单片机模块
2.2.1 STC89C52简介
STC89C52是一种带8K字节闪烁可编程可擦除只读存储器(FPEROM-Flash Program able and Erasable Read Only Memory)的低电压,高性能COMOS8的微处理器。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
STC89C52特性:通用I/O口,复位后为:P1/P2/P3/P4是准双向口/弱上拉(普通8051传统I/O口);P0口是开漏输出,作为总线扩展用时,不用加上拉电阻,作为I/O口用时,需要加上拉电阻;ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器可通过串口(RxD/P3.0,TxD/P3.1)直接下载用户程序,数秒即可完成;具有EEPROM功能;具有看门狗自动复位功能;共有3个16位定时器/计数器,其中定时器0还可以当成2个八位定时器使用;外部中断4路,下降沿中断或低电平触发中断,PowerDown模式可由外部中断低电平触发中断方式唤醒。
图2.2.1单片机最小系统原理图
2.3 电机驱动模块
L298N部包含4个通道逻辑驱动电路,是一种二相和四相电机的专用驱动器,即含二个H桥的高电压大电流双全桥式驱动器,接收标准TTL逻辑电平信号,可以驱动4V、2V以下的电机。
2.3.1 参数
1.驱动芯片:L298N双H桥直流电机驱动芯片
2.驱动部分端子供电围Vs:+5V~+35V ;如需要板取电,则供电围Vs:+7V~+35V
3.驱动部分峰值电流Io:2A
4.逻辑部分端子供电围Vss:+5V~+7V(可板取电+5V)
5.逻辑部分工作电流围:0~36mA
6.控制信号输入电压围:
低电平:-0.3V≤Vin≤1.5V
高电平:2.3V≤Vin≤Vss
7.使能信号输入电压围:
低电平:-0.3≤Vin≤1.5V(控制信号无效)
高电平:2.3V≤Vin≤Vss(控制信号有效)
8.最大功耗:20W(温度T=75℃时)
9.存储温度:-25℃~+130℃
图2.3.1驱动模块原理图
表2.3.1驱动状态编码
2.4 电源模块
考虑到电路消耗功率较多,最终采用11.1v的锂电池,可以安在小车上,为小车供电。电机所需电源由锂电池直接供给,51单片机最小系统以与其扩展模块由锂电池通过7805降压至5V后提供电源。电源电路为整个系统供电,包括单片机STC89C52、电机驱动、蓝牙模块、超声波模块与其他外围电路。电源电路分两个部分:一是接外部电源给电机供电;二是由锂电池作为电源,给系统供电,以确保单片机、电机驱动、蓝牙模块的正常运行。在电源电路给系统供电时,红色指示灯点亮,只是当前供电正常。
2.5 蓝牙模块
蓝牙模块支持短距离无线传输,可以通过手机与蓝牙模块的配对实现对小车的无线控制。本小车采用的是HC-06蓝牙芯片,在HC-06芯片里已经将蓝牙协议封装好,只需要通过串口通信实现上位机(手机)与下位机(51单片机)的无线通信。
蓝牙模块中蓝牙芯片的TXD与RXD分别于单片机的RXD与TXD相接,VCC与单片机电源,GND与单片机GND相连。HC-06使用R1114作为稳压芯片,将单片机提供的5V电压转换为3.3V的低电压,为蓝牙芯片供电。
蓝牙芯片应用围:可用于GPS导航,水电煤气抄表系统,工业现场控制,与移动设备无线连接。
2.6 循迹模块
地面发射红外光,当红外光遇到白色纸质地板时发生漫反射,反射光被安装在小车上的接收管接收;如果遇到黑线则红外光被吸收,小车上的接收管接收不倒红外光。单片机就是否反射回来的红外光为依据来确定黑线的位置和小车的行走路线。红外探测器探测的距离有限,一般最大不应超过15cm。
这里用反射式红外传感器ST188。当小车在白色地面行驶时,装在车下的红外发射管发射红外线信号,经白色反射后,被接收管接收,一旦接收管接收到信号,输出端将输出低电平;当小车行驶到黑线时,红外线信号被黑色吸收后,将输出高电平,从而实现了通过红线检测信号的功能。将检测到的信号送到单片机的I/O口,当I/O口检测到的信号为高电平时,表明红外光被地上的黑线吸收了,表明小车处在黑色的引线上;同理,当I/O口检测到的信号为低电平时,表明小车行驶在白色地面上。
图2.6循迹模块原理图
2.7 避障模块
本模块使用的是HC-RS04超声波模块。只需要在Trig/TX管脚输入一个10US以上的高电平,系统便可发出8个40KHZ的超声波脉冲,然后检测回波信号。本模块通过定时器来测量超声波脉冲从发射到接收的时间,乘以超声波在空气之中的速度,得出的距离就是超声波往返传输的距离,将结果除以2后,结果就是超声波模块与障碍物之间的距离。
3 软件设计
整个系统的软件设计可以分为两大部分:全能车运动控制程序、Android蓝牙控制端的APP。其中全能车运动控制程序又可以细分为五个主要模块:全能车运动部分、串口通讯部分、蓝牙控制模式、循迹模式、壁障模式。
3.1 智能车运动控制程序
3.1.1 智能车运动控制程序构思与框架
智能车运动程序流程主要为:首先为各个模块的初始化工作,为后面的工作做好前期准备,再就是判断智能车运动模式,最后就是在相应的运动模式下执行相应的指令。大概程序流程图如图3.1.1所示。
图3.1.1主题程序流程图
智能车处理器为STC89C52,根据其的CPU构架,写出了程序的主体框架。处理器启动后首先要做好设备初始化,为后面的工作做好前期的准备。模块初始化工作部分代码如表3-1所示。
表3-1 源程序之初始化工作
greatcar.c/main()/模块初始化工作部分代码
/* 主函数 */
void main(void)
{
/* 初始化部分 */
// 定时器0初始化
Timer0_Init();
// 定时器1初始化
Timer1_Init();
// 串口初始化
UART_Init();
// 打开总中断开关
EA = 1;
// 以下若干行省略,详细请参考源代码
}
注释:Timer0用于超声波模块,Timer1用于模拟PWM。
智能车初始化后,将进行智能车运动模式的选择。通过安卓手机APP或者拨码开关传递给智能车不同的运动模式指令,主要有三种运动模式。蓝牙手动模式,对应编码为0x01;循迹模式,对应编码为0x10;避障模式,对应编码为0x11。编码为0x00是无效编码,也是智能车启动后的默认值。拨码开关通过两个引脚接到单片机上,两个引脚分别为RM0和RM1。蓝牙控制模式选择指令有三种,分别为蓝牙手动模式0xA0,循迹模式0xB0以与避障模式0xC0。其实现的部分代码如表3-2所示。
表3-2 智能车运动模式判断与选择
greatcar.c/mian()/运动模式判断与选择
/* 主函数 */
void main(void)
{
// 省略初始化部分代码,详细请参考源代码
/* 主体工作部分 */
for(;;)
{
// 全能车模式判断,主要判断P2.0和P2.1引脚的电平高低
if(0==RM1 && 0==RM0)
{
Run_Mode_Flag = 0x11; // 全能壁障模式标志,也是自动避开障碍物
}
else if(0==RM0 && 1==RM1)
{
Run_Mode_Flag = 0x01; // 蓝牙控制模式标志
}
else if(1==RM0 && 0==RM1)
{
Run_Mode_Flag = 0x10; // 红外循迹模式标志
}else
{
switch(R_Buffer)
{
case 0xA0:
Run_Mode_Flag = 0x01;
break;
case 0xB0:
Run_Mode_Flag = 0x10;
break;
case 0xC0:
Run_Mode_Flag = 0x11;
break;
}
}
// 中间省略若干代码,详细参考源代码
// 全能车运行模式判断
if(0x01 == Run_Mode_Flag) // 蓝牙模式,通过串口与蓝牙模块通信,获得相应的执行指令
{
Run_Mode_Bluetooth();
}
else if(0x10 == Run_Mode_Flag) // 循迹模式
{
Run_Mode_Track();
}
else if(0x11 == Run_Mode_Flag) // 自动模式
{
Run_Mode_Auto();
}
}
}
注释:Run_Mode_Flag为智能车运动模式标识符;Run_Mode_Bluetooth()为蓝牙手动模式; Run_Mode_Track()为循迹模式; Run_Mode_Auto()为避障模式;
3.1.2 智能车基础运动设计与实现
智能车基础运动包括前进、倒车、左转、右转和停车,其对应的功能函数名分别如下:前进Car_Go_Forward()、倒车Car_Go_Back()、左转Car_Turn_Left()、右转Car_Turn_Right()以与停车Car_Stop()。智能车是通过PWM技术来实现调整其运动的速度。前进Car_Go_Forward()和左转Car_Turn_Left()部分代码如表3-3所示,而倒车和右转以与停车与前者相似。
表3-3 智能车基础运动源代码
greatcar.c/Car_Go_Forward() & Car_Turn_Left()
/* 小车前进 */
void Car_Go_Forward(void)
{
L_LAMP = R_LAMP = 1; // 关闭左侧和右侧车灯
if( COUNT <= DUTY ) // 高电平
{
// 左边车轮正转, LIN1=1, LIN2=0
// 右边车轮正转,RIN1=1, RIN2=0
Motor_RIN1 = Motor_LIN1 = 1;
Motor_RIN2 = Motor_LIN2 = 0;
}
else // 低电平
{
// 左右都停止
Motor_LIN1 = Motor_RIN1 = 1;
Motor_LIN2 = Motor_RIN2 = 1;
}
}
/* 小车左转 */
void Car_Turn_Left(void)
{
L_LAMP = 0; // 打开左侧车灯
R_LAMP = 1; // 关闭右侧车灯
if(COUNT <= DUTY)
{
// 左边车轮停止转动, LIN1=1, LIN2=1
Motor_LIN1 = 1;
Motor_LIN2 = 1;
// 右边车轮正转,RIN1=1,RIN2=0
Motor_RIN1 = 1;
Motor_RIN2 = 0;
}
else
{
// 左右都停止
Motor_LIN1 = Motor_RIN1 = 1;
Motor_LIN2 = Motor_RIN2 = 1;
}
Delayms(1);
L_LAMP = 1; // 关闭左侧车灯
}
注释:Delayms()为延时函数,具体实现方法参考附录源代码;
Motor_XINX对应着L298四个输入端,分别控制左右电机正反转以与停止。
3.1.3 串口通讯接口部分
蓝牙接收电路与单片机之间是通过UART串口方式通讯的。STC89C52主要接收并处理来自蓝牙接收电路的数据。首先是对UART接口的初始化工作,再通过串口中断接收数据。UART初始化部分代码如表3-4所示。
表3-4 UART初始化部分源代码
greatcar.c/UART_Init()
/* 串口通讯初始化 */
void UART_Init(void)
{
// 串口工作模式1
SCON =0x50; // 等效于SM1=1,SM0=0, REN=1
// Timer2初始化,作为波特率发生器
TL2=RCAP2L = (65536-(FOSC/32/BAUD));
TH2=RCAP2H = (65536-(FOSC/32/BAUD))>>8; // 波特率9600
T2CON = 0x34; // 等效于RCLK=TCLK=TR2= 1
// 清除RI,串口接收中断标志
RI = 0;
// 串口中断使能
ES = 1;
// 记得主程序中要打开EA=1!!!
}
注释:FOSC为系统时钟晶振,已经宏定义#define FOSC 11059200L
BAUD为串口通讯波特率,已经宏定义#define BAUD 9600
初始化UART后,在打开串口中断,用于接收来自蓝牙模块的数据。其实现代码如表3-5所示。
表3-5 串口中断处理函数
greatcar.c/UART_Handler()
/* 串口通讯中断服务函数 */
void UART_Handler()interrupt 4 using 1 // 串口中断号4
{
// 判断RI
if(RI)
{
RI = 0; // 软件方式清除RI标志
R_Buffer = SBUF; // 获得蓝牙数据
}
}
注释:串口接收中断标志RI必须软件清零。
3.1.4 智能车蓝牙手动模式设计与实现
在UART接口的基础上获得来自控制端的指令。通过全局变量R_Buffer来存储当前来自APP客户端的数据,并根据R_Buffer的值来执行相应的功能。蓝牙指令有0x1F前进指令、0x2F倒车指令、0x3F左转指令、0x4F右转指令、0x5F加速指令、0x6F减速指令、0x7F前车灯、0x8F喇叭。手动模式部分源代码如表3-6所示。
表3-6 蓝牙手动模式部分源代码
greatcar.c/Run_Mode_Bluetooth()
/* 全能车模式之蓝牙遥控 */
void Run_Mode_Bluetooth(void)
{
// 再次打开串口中断使能
ES = 1;
// 根据收到的R_Buffer执行该任务
switch(R_Buffer)
{
case 0x1F: // 前进指令
DUTY = 7;
Car_Go_Forward();
break;
case 0x2F: // 后退指令
DUTY = 7;
Car_Go_Back();
break;
case 0x3F: // 左转指令
DUTY = 7;
Car_Turn_Left();
break;
case 0x4F: // 右转指令
DUTY = 7;
Car_Turn_Right();
break;
case 0x00: // 停止指令
Car_Stop();
break;
case 0xD0: // 关闭前车灯
Car_Beep();
break;
}
}
注释:DUTY为占空比,用于调整电机转动速度。
3.1.5 智能车自主循迹模式设计与实现
通过红外对管的工作原理来判断全能车相对位置,以与做出相应的决策。其部分源代码如表3-7所示。
表3-7 智能车循迹模式源代码
greatcar.c/Run_Mode_Track()
/* 全能车模式之循迹 */
void Run_Mode_Track(void)
{
static U8 temp; // 零时存放P1低6位数据,一定要写成static,保存上次的结果。
temp = P1;
temp &=0x3f;
switch(temp)
{
case 0x07: // 左1、左2和左3同时
DUTY = 5;
Car_Turn_Left();
break;
case 0x1F: // 左1
DUTY = 5;
Car_Turn_Left();
break;
// 中间省略若干行,详细参照源代码
case 0x3E: // 右1
DUTY = 5;
Car_Turn_Right();
break;
case 0x38: // 右1、右2和右3同时
DUTY = 5;
Car_Turn_Right();
break;
case 0x00:
Car_Stop();
break;
default: // 前行
DUTY = 4;
Car_Go_Forward();
}
}
注释:红外对管低电平表示遇到黑色线,即没有收到返回光。
3.1.6 智能车自动避障模式设计与实现
通过超声波电路间接测量距离的原理,计算出障碍物距离全能车的距离。部分代码如表3-8所示。
表3-8 智能车避障模式源代码
greatcar.c/避障模式
/* 超声波初始化 */
void Timer0_Init(void)
{
Trig = 0;
TMOD &=0xF0;
TMOD |= 0x01;
TH0 = 0;
TL0 = 0; // 定时器0寄存器清零
TF0 = 0; // 清除定时器0溢出标志
TR0 = 0; // 暂时不启动定时器0
}
/* 启动触发 */
void Trig_Start(void)
{
Trig = 1; // 产生触发信号
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
Trig = 0; // 关闭触发信号
TH0 = 0;
TL0 = 0;
while(!Echo); // 等待返回信号(高电平)
TR0 = 1; // 打开定时器0
while(Echo);
TR0 = 0;
Distance_Cacl();
}
/* 计算距离 */
void Distance_Cacl(void)
{
U16 time;
time = TH0*256 + TL0;
Distance = time*1.87/100;
}
/* 全能车模式之自动 */
void Run_Mode_Auto(void)
{
if(Distance < 70 && Distance > 0)
{DUTY = 3;
Car_Turn_Left();
}
else
{
DUTY = 5;
Car_Go_Forward();
}
}
注释:以上只是自动绕圈的避障演示程序。
3.2 Android蓝牙客户端设计与实现
蓝牙客户端是用户控制智能车的一种手段。智能车蓝牙控制客户端是基于Android平台开发的应用程序。客户端选择在Eclipse和Android SDK组合下使用Java语言进行开发。客户端的开发主要涉与到客户端界面的设计和功能代码的编写。
3.2.1 客户端界面设计
根据智能车的实际情况,客户端选择设计成类似赛车类游戏的界面。界面通过XML来标记和存储资源。
3.2.2 BluetoothCar类设计
BluetoothCar类主要实现访问安卓手机蓝牙设备和发送智能车运动指令。
4 系统测试与结论
4.1 硬件电路调试
硬件单元电路制作好后,在上电之前,应该先用万用表对各个独立元件进行检查,在排除了虚焊、短路、断路等问题后再通电进行电路功能的调试。具体调试过程如下所述。
4.1.1 独立元件的检测
任何组装好的电子电路,在通电调试之前,必须认真检查电路连线是否有误。检查的方法是对照电路图,按一定的顺序逐级对应检查,例如:对电路板的电阻阻值进行确定,可以通过读取电阻上的色环进行确认。特别是注意电源是否接错,电源与地是否有短接,集成电路和晶体管的引脚是否接错,轻轻拨一拨元器件,观察焊点是否牢固等。用万用表检测是不是有短路和断路现象。给系统上电后,看下电源(绿色)灯亮不亮。假如不亮,就要检查电源指示灯发光二极管的好坏。还要用万用表测一下单片机等芯片的电压是不是符合要求。假如不是,就要进行各个芯片的检查,看一下各个芯片的引脚有没有焊好,芯片是否损坏。
4.1.2 单片机最小系统的调试
单片机AT89C52最小系统的检测分为硬件调试与软件调试。量电源电压有没有到位,量复位RSL脚电平对不对,如果是高电平复位那么平时应该是低电平,量外部晶振有没有起振,最小系统电路参考芯片PDF文档,确认正确。
硬件调试时用万用表测量单片机的工作电压与各个管脚的电压是否达到正常工作电压。在此检测中还要烧入程序对各个I/O口的输出进行测试,查看I/O口所输出的电压是否与程序所控制值一致。例如:编写一个调试程序,使的所有I/O口从P1.0口开始依次赋予低电平,用万用表测量其输出电压,确定是否与程序所付值一致,一致则证明正确;然后又对其依次赋予高电平,确定是否与程序所付值一致,一致则证明正确。两次测试都正确,证明单片机最小系统是正常工作的。
4.1.3 电源电路的调试
电源电路作为整个系统的供电电路,其输出电压必须在单片机的正常工作电压围(4V到5.5V之间)。在电源通电之前,一定要检查电路是否接错,特别是极性电容是否有接反,防止出现极性电容接反而造成爆电容的现象。在确保器件接法无误的情况下,接通电源,并用万用表测量输出电压,得到其电压为5.3V,符合系统的正常工作电压要求。然后再在电机驱动输出端接上干电池, 实现两个电源供电。
4.1.4 驱动模块的调试
驱动模块为驱动电机的芯片,L298需要从外部接两个电压,一个是给电机的,另一个给L298芯片的。首先检查驱动芯片与单片机的各个连线是否都正确以后,给芯片通上电源,单片机指示灯点亮以后。运行单片机上的程序,通过单片机P0口的数据变化来控制L298的IN1、IN2、IN3、IN4的电平的高低。L298输入端的高低电平的变化,通过输入端的LED灯的亮灭来显示。当运行前进程序的时候,IN1、IN2、IN3、IN4的值为1、0、1、0,分别点亮LED1和LED3,左右电机都正转,实现小车前进;运行左转程序的时候,IN1、IN2、IN3、IN4分别为1、0、0、1,分别点亮LED1、LED4,左电机正转,右电机反转,实现小车左转;运行右转程序的时候,IN1、IN2、IN3、IN4的值为0、1、1、0,点亮LED2,LED3,左电机反转,右电机正转,实现小车右转;运行后退程序的时候,IN1、IN2、IN3、IN4的值分别为0、1、0、1,分别点亮LED2、LED4,左右电机都反转,实现小车后退。通过调试电机驱动模块能实现基本的功能。
4.2 软件调试
4.2.1 C语言的调试
软件的调试包括程序本身语法的调试和在电路板上功能的调试两种。在编程过程中,为了得到满足要求的用户程序,一般都需要有一个对程序的调试过程,甚至需要经过多次反复的调试才能完成。在调试程序前为了调试方便,避免程序出错时将单片机拆来拆去的麻烦,在电路板上做了一个下载口,可以将下载线直接插到电路板上进行调试,这样就可以一边进行调试,一边修改程序。程序用Keil C软件写好后,先用该软件的编译功能编译一下所写的程序,检查程序是有语法错误或其他的错误。如果有错误则根据提示进行分析将错误改过来直至编译
成功为止。当完成了语法调试后,再根据定时开关插座设计的功能要求修改程序完成系统的各个功能。在编写程序的时候一定要根据系统实现的功能和连接方式,认真分析,画出系统主程序、时钟程序、设置程序的流程图,并根据画出的流程图一步一步的去写出程序。
根据系统的特点,软件系统应该按模块进行调试,当各个模块调试通过后再将各个模块整合起来,进行综合调试,直到得到预期结果。
与纯粹的C语言编程不同的是,单片机编程要考虑到硬件的设计,所有程序的编写都是根据硬件资源进行。
4.2.2 JAVA语言的调试
将做好的工程添加进入Eclipes开发环境中,检查各个文件夹下面的程序有没有出现打红色X的问题以与警告,点开下方的problem的文件,检查该工程有没有出现问题,当排除了所有的问题以后。配置一个2.2版本的模拟器,然后启动模拟器,在模拟器上运行该工程,在模拟器上将会出现已经做好的手机界面,运行完成,调试成功。然后将手机连接到电脑上,打开安卓手机的USB接口。接下来点击运行整个工程项目,在手机上出现前面那个做好的蓝牙小车控制界面。点击各个按钮,都无问题,证明该JAVA程序没有问题
4.3 制作总结
通过这一次小车的制作,我们收获了很多。在制作小车时,我们曾经面对过不断的失败,但随着我们对电路以与程序的不断修正与完善,设计的大部分功能得以实现。原先准备使用MSP430之类的拥有较多资源的芯片,但是由于时间原因而被迫放弃,这使得我们没有很好的实现一些预计的功能,比如说设计好的测速模块最终放弃。STC89C52单片机的运算速度较慢,在带动较大的程序时稳定性逐渐下降,这是其局限性;但是相对于其他单片机来说,它资源广泛,操作方便,价格低廉,有着其不可替代的优势。在测试小车的时候,我们也曾经发现超声波模块只能在正面测量与障碍物的距离时才能准确测得数据,而在以一定的角度测量时很容易出现死角,但最终处理时影响了整个程序的稳定性,STC89C52资源逐渐耗尽以与时间不足而放弃。在电机驱动模块方面,我们曾经用坏了3块LM298,经过多次的测试,虽然它给我们带来了巨大的麻烦,但是我们对这个芯片有了更深的认识与理解。当然,有老师推荐说电机驱动可以利用三极管自己制作,以后如果有机会的话我们也会去尝试一下,以提高自己的技术。
参考文献
[1] 康华光. 电子技术基础模拟部分(第五版)[M]. :高等教育,2006.
[2] 康华光. 电子技术基础数字部分(第五版)[M]. :高等教育,2006.
[3] 群芳. 单片微型计算机与接口技术(第4版)[M]. :电子工业,2012.
[4] 光东. 单片微型计算机原理与接口技术[M]. :华中科技大学,1999.
[5] 马忠梅. 单片机C语言应用程序设计[M]. :航空航天大学,2005.
[6] 佘建伟. Android 4 高级编程(第3版)[M]. :清华大学,2013.
[7] 胡文. Android嵌入式系统程序开发(基于Cortex-A8)[M]. :机械工业,2013.
[8] 刚. 疯狂Android讲义(第2版)[M]. :电子工业,2013.
[9] STC89C52RC/RD+系列单片机器件手册[R]. :STC,2014.
[10] L298, DUAL FULL-BRIDGE DRIVER[R]. Italy: ST,2000.
附录一:原理图
单片机最小系统原理图
驱动模块原理图
循迹模块原理图
附录二:源程序
源程序之初始化工作
greatcar.c/main()/模块初始化工作部分代码
/* 主函数 */
void main(void)
{
/* 初始化部分 */
// 定时器0初始化
Timer0_Init();
// 定时器1初始化
Timer1_Init();
// 串口初始化
UART_Init();
// 打开总中断开关
EA = 1;
// 以下若干行省略,详细请参考源代码
}
注释:Timer0用于超声波模块,Timer1用于模拟PWM。
智能车运动模式判断与选择
greatcar.c/mian()/运动模式判断与选择
/* 主函数 */
void main(void)
{
// 省略初始化部分代码,详细请参考源代码
/* 主体工作部分 */
for(;;)
{
// 全能车模式判断,主要判断P2.0和P2.1引脚的电平高低
if(0==RM1 && 0==RM0)
{
Run_Mode_Flag =
展开阅读全文