Arduino 智能小车-电机控制(20180504实训课--华清远见)
1.Arduino 电机驱动模块
Arduino 小车使用的电机驱动模块为 L298N,模块如下图:
-
L298N 引脚描述如下:
- +12V:该引脚接的电压是驱动模块所能输出给电机的最大电压,一般 直接接电池
- GND: 在该项目中 GND 即为 电源的负极,同时要保证Arduino开发板,驱动模块等所有模块的GND连在一起才可以正常工作 .
- +5V: L298N模块(注意不是L298N芯片)内含稳压电路(将高电压转换为低电压的电路),在模块内部将 +12V 引脚输入的电压转化为可供开发板使用的+5V电压,一般将次输出接入到开发板为开发板供电.
-
L298N 模块有两路输出,可以控制小车的前进,后退,转弯.
-
ENA : 代表第一路输出的电压大小,驱动模块输出电压越高,电机转速越快。
- 当其输入为0V的时候,驱动模块输出对第一路电机输出电压为0V.
- 当其输入为3.3V的时候,驱动模块对第一路电机输出电压为+12V 引脚的输入电压。
- 由于 ENA 输入电压的高低控制驱动对电机的输出电压,因此当我们需要对小车运动速度进行控制的时候,一般通过PWM对 ENA 引脚进行控制
- IN1/IN2 : 这两个引脚控制电机正反转方向,具体控制表:
-
ENA : 代表第一路输出的电压大小,驱动模块输出电压越高,电机转速越快。
ENA | IN1 | IN2 | 直流电机状态 |
---|---|---|---|
0 | X | X | 停止 |
1 | 0 | 0 | 制动 |
1 | 0 | 1 | 正转 |
1 | 1 | 0 | 反转 |
1 | 1 | 1 | 制动 |
2.L298N 工作原理
- L298N 电机驱动模块使用的 H 桥电路, H 桥电路典型的原理图如下:
- H 桥由2个P型场效应管Q1、Q2与2个N型场效应管Q3、Q3组成,所以它叫P-NMOS管H桥.
- 桥臂上的4个场效应管相当于四个开关,P型管在栅极为低电平时导通,高电平时关闭;N型管在栅极为高电平时导通,低电平时关闭
场效应管是电压控制型元件,栅极通过的电流几乎为 零
-
在 H 桥电路中具体的控制如下:
- 控制臂1置高电平(U=VCC)、控制臂2置低电平(U=0)时,Q1、Q4关闭,Q2、Q3导通,电机左端低电平,右端高电平,所以电流沿箭头方向流动。设为电机正转
- 控制臂1置低电平、控制臂2置高电平时,Q2、Q3关闭,Q1、Q4导通,电机左端高电平,右端低电平,所以电流沿箭头方向流动。设为电机反转
- 当控制臂1、2均为低电平时,Q1、Q2导通,Q3、Q4关闭,电机两端均为高电平,电机不转
- 当控制臂1、2均为高电平时,Q1、Q2关闭,Q3、Q4导通,电机两端均为低电平,电机也不转
3.Arduino 开发板与 L298N
3.1 电路连接
- L298 N 内部的稳压电路的输出为 5v 提高给 Arduino 作为电源.
-
L298 N 的 IN1 - IN4 分别与 Arduino 的 IO 引脚相连,我选择的是 4 ,5,6,7,具体分布如下:
- 引脚 4 - 5 : 控制右边的电机
- 引脚 6 - 7 : 控制左边的电机
将左边的两个电机与 L298N IN3/IN4 连接,将右边的两个电机与 L298N IN1/IN2 连接.
- L298N 的 +12v 与电池相连,提供电机驱动电源
- 具体的连线参考图如下:
3.2 编程实现
-
建立 Arduino 工程文件,并编写如下代码:
-
step 1 : 定义5种运动状态,具体程序如下
#define STOP 0 //停止
#define FORWARD 1 //前进
#define BACKWARD 2 //后退
#define TURNLEFT 3 //左转
#define TURNRIGHT 4 //右转
-
step 2 : 定义左右电机控制引脚
//左边的电机控制引脚
int leftMotor_1 = 6;
int leftMotor_2 = 7;
//右边的电机控制引脚
int rightMotor_1 = 4;
int rightMotor_2 = 5;
-
step 3 : 在 setup() 函数中,设置相关控制引脚为 output 功能,具体代码如下:
void setup() {
// put your setup code here, to run once:
//设置控制电机的引脚为输出状态
pinMode(leftMotor_1, OUTPUT);
pinMode(leftMotor_2, OUTPUT);
pinMode(rightMotor_1, OUTPUT);
pinMode(rightMotor_2, OUTPUT);
}
step 4 : 在 loop() 函数中,添加电机控制代码,实现小车向前,向后,向左,向右的控制,可以调用以下函数完成.
-
相应的函数封装如下:
//控制小车左转,左边电机停止,右边电机正转
void moveLeft(void)
{
digitalWrite(leftMotor_1, LOW);
digitalWrite(leftMotor_2, LOW);
digitalWrite(rightMotor_1, LOW);
digitalWrite(rightMotor_2, HIGH);
}
//控制小车右转,左边电机正转,右边电机停止
void moveRight(void)
{
digitalWrite(leftMotor_1,LOW);
digitalWrite(leftMotor_2, HIGH);
digitalWrite(rightMotor_1, LOW);
digitalWrite(rightMotor_2, LOW);
}
//控制小车前进,左边电机正转,右边电机正转
void moveForward(void)
{
digitalWrite(leftMotor_1, LOW);
digitalWrite(leftMotor_2, HIGH);
digitalWrite(rightMotor_1, LOW);
digitalWrite(rightMotor_2, HIGH);
}
//控制小车反转,左边电机反转,右边电机反转
void moveBackward(void)
{
digitalWrite(leftMotor_1, HIGH);
digitalWrite(leftMotor_2, LOW);
digitalWrite(rightMotor_1, HIGH);
digitalWrite(rightMotor_2, LOW);
}
//控制小车停止,左边电机停止,右边电机停止
void stopCar(void)
{
digitalWrite(leftMotor_1, LOW);
digitalWrite(leftMotor_2, LOW);
digitalWrite(rightMotor_1, LOW);
digitalWrite(rightMotor_2, LOW);
}
-
4.相关 Arduino API
-
digitalWrite() 函数:
digitalWrite(pin, value)
功能 : 通过指定引脚输出电平信号
参数 :
@param pin : 引脚编号
@param value : 输出电平信号值
HIGH : 高电平信号
LOW : 低电平信号
-
delay() 函数:
delay(ms)
功能 : 延时函数
参数 :
@param ms : 延时时间,单位为 ms