基于Arduino的智能循迹小车
文章目录
基础知识
本设计需要掌握一些相关的硬件软件知识,读者可通过下面的链接跳转学习。
Arduino的基础知识、语法及常用函数等
Arduino IDE的安装与使用
Arduino UNO的引脚说明
电池驱动TB6612的引脚说明
蓝牙模块HC-05
系统功能说明及材料准备
本设计利用Arduino单片机作为主控制器,结合循迹传感器、蓝牙模块、电机驱动模块等硬件组件,参考具体使用的硬件参数,使用C语言来编写代码,实现小车的自动循迹与启停控制等功能,从而使小车可以按照正确的路线来行驶。
本系统所有所需原件如下表所示:
部件名称/数量 | 功能 |
---|---|
Arduino Uno/1 | 微控制器,是智能小车的核心 |
MG513/2 | 电机驱动,控制转向和转速 |
亚克力板/2 | 底板 |
轮胎/2 | 后轮,受电机控制 |
万向轮/2 | 前轮 |
亚伯四路循迹传感器/1 | 检测路线 |
3s航模电池/1 | 供电 |
TB6612电池驱动/1 | 确保电压电流稳定输出 |
HC-05/1 | 蓝牙通讯 |
系统总体架构图如下
一、硬件连接
1.电池驱动模块
首先进行主板与电池驱动及电机的连接,接线图如图,其中STBY是TB6612驱动的启动脚,它用于控制电机驱动模块的启动与否,当STBY引脚接5V时,驱动模块可以正常工作,但当STBY接低电平时,驱动模块将处于休眠状态。PWMA(PWMB)引脚连接Arduino Uno,接收开发板传出的PWM信号,控制电机的转速。
除此之外TB6612的电源输入接口(如下图)要连接上航模电池的电源线,此时打开电源开关,可以看到电池驱动板上的LED灯亮起,即为连接成功,电池可以正常供电。
2.循迹模块及蓝牙控制模块
接下来将四路循迹模块和蓝牙模块与Uno开发板进行连接,这一步中要格外注意该模块中四个独立的小传感器的位置和其排线顺序之间的对应。除此之外,因为检测的精度与灵敏度对后面小车运行轨迹的准确性息息相关,所以还要注意将传感器固定在底板上时要使调节灵敏度的旋钮暴露在底板外,方便后续调节。接线图如图所示。
二、整体功能整合
1.功能流程图示意
根据上述系统流程图,编写相应的程序代码,以实现小车的完整功能,程序主要由电机驱动、循迹模块、蓝牙通讯三部分组成。
2.程序设计
2.1 电机驱动
在setup()函数中要先通过Serial函数设置串口波特率,方便后续通过串口查看当前数据情况。首先通过Motor_Init函数实现电机初始化,每个电机都需要与特定的引脚相连,这些引脚需要使用pinMode函数配置为输出模式,若不对电机进行初始化,Arduino无法正确控制电机的工作状态。初始化过程中,电机会被设定为一个初始状态(如停止或以低速运行),这是为了防止电机在系统启动时因接收到随机信号而突然启动,从而避免潜在的危险和不稳定情况。初始化过程可以确保每次系统启动时,电机都处于相同的初始状态,这对于调试和控制算法的稳定运行至关重要。
部分代码如下所示:
//右路电机PWMA引脚5,左路电机PWMB引脚6,必须是有PWM功能的端口
#define PWMA 5
#define PWMB 6
// 右边电机引脚7-8,左边电机引脚10-11
#define AIN1 7
#define AIN2 8
#define BIN1 10
#define BIN2 11
void Motor_Init()
{
//电机引脚初始化,设置为输出模式
pinMode(AIN1, OUTPUT);
pinMode(AIN2, OUTPUT);
pinMode(BIN1, OUTPUT);
pinMode(BIN2, OUTPUT);
pinMode(PWMA, OUTPUT);
pinMode(PWMB, OUTPUT);
}
在Motor_Toward函数中通过相关引脚的高低电平组合,设置电机的前进模式(参考前文的表格4-2中的电机转向真值表);Motor_Speed函数则用于调整小车两轮的转速,通过控制两轮转速的差值实现小车的直行、左转或右转模式。例如两轮速度相同时,小车正常直行,需要左转时,另左轮速度减小,反之则另右轮速度减小。
void Motor_Toward(int toward)//控制电机的前行模式
{
if(toward==1){//右轮正转,左轮正转 小车前进
digitalWrite(AIN1,1);
digitalWrite(AIN2,0);
digitalWrite(BIN1,1);
digitalWrite(BIN2,0);
}
2.2 循迹模块
通过对传感器传输数据的不同组合进行判断,analogRead函数可以通过引脚读取传感器数据,决定当前小车电机以何种速度和方向行驶,使小车按照既定轨迹行驶。循迹函数封装完成后,将其写入loop函数,使小车可以一直轮询接收传感器数据。原则上只需考虑直行、左转、右转三种情况,但由于实地运行的时候循迹模块的四个传感器会出现许多可能的组合,如地面不平而产生的阴影区域,会导致小车将没有黑线的地方识别成黑线,从而使小车偏离轨道行驶。因此在实际应用中,还需要根据具体情况,通过合理的调试和优化,调节传感器灵敏度,并在算法中将各种可能的组合都进行逻辑判断,并据此选择合适的小车的运行模式。由于篇幅原因下面只列出部分情况下的逻辑判断。
if (Sensor [0]==1 && Sensor [1]==0 && Sensor [2]==0 && Sensor [3]==1)//1001 直行
{
mv_go(right_speed,left_speed);
}
else if(Sensor [0]==1 && Sensor [1]==1 && Sensor [2]==0 && Sensor [3]==0)//1100
{
xunji_right_slightly(right_speed,left_speed);
}
else if(Sensor [0]==1 && Sensor [1]==1 && Sensor [2]==0 && Sensor [3]==1)//1101
{
xunji_right_slightly(right_speed,left_speed);
}
else if(Sensor [0]==1 && Sensor [1]==1 && Sensor [2]==1 && Sensor [3]==0)//1110
{
xunji_right_severely(right_speed,left_speed);
}
2.3 蓝牙通讯
首先需要引入SoftwareSerial头文件,并通过BT函数设置接收和发送的引脚。注意在初次连接使用蓝牙模块HC-05时,要对蓝牙模块进行初始化设置,即进入AT模式,即一种使其可以接收用户通过串口发送特定的命令(AT命令)来配置和控制蓝牙模块的各种参数和功能的模式。常见的设置,如恢复出厂设置,修改蓝牙名称方便手机查找,设置密码提高连接的安全性等,都可以通过AT指令来实现。进入AT模式的步骤如下:将串口波特率设置为38400,上传代码后将Arduino断电,按住HC-05模块上的按钮,直到将Arduino与PC连接上电后再松开按钮,此时HC-05模块指示灯按2秒的周期慢闪,即成功进入AT模式。此时我们就可以通过AT指令完成想要的设置了。设置完毕后,将串口通讯波特率设置回9600,在手机上的蓝牙调试器app中查找并连接小车的蓝牙模块,即可进行正常通信。