第09课 电机的驱动和调速#
9.1 项目介绍:#
想要让智能小车跑起来,光有电机是不够的,我们还需要一个“大力士”来帮Arduino控制电机。这个“大力士”就是电机驱动模块。
在本课中,我们将学习如何使用 L298P 电机驱动扩展板。L298P 是一款非常经典且强大的电机驱动芯片,它可以同时驱动两个直流电机,最大电流可达 2A。通过它,我们可以轻松控制小车的前进、后退、转弯以及速度。
9.2 元件知识:#
为了简化接线,我们使用了一款基于 L298P 设计的电机驱动扩展板。这块板子可以直接插接在 Arduino 开发板上(就像戴帽子一样),这种设计叫做 “Shield(盾板)” 或 “扩展板”。


9.3 驱动原理与控制逻辑:#
1. 引脚定义
根据扩展板的电路设计,Arduino 与电机的连接关系如下:
电机通道 |
方向控制引脚 (Digital) |
速度控制引脚 (PWM) |
对应物理电机 |
|---|---|---|---|
电机 A |
D2 |
D6 |
M3, M4 (右侧电机) |
电机 B |
D4 |
D5 |
M1, M2 (左侧电机) |
注意: 不同批次的小车电机编号可能不同,请以实际接线为准。通常 A 组(A1/A2)控制一侧的两个电机并联,B 组(B1/B2)控制另一侧的两个电机并联。
2. 运动逻辑表
通过组合方向引脚的高低电平和速度引脚的 PWM 值,我们可以实现各种动作。PWM 值的范围是 0-255,数值越大,电机转速越快。
动作 |
D2(方向A) |
D6 (速度A) |
电机A状态 |
D4 (方向B) |
D5(速度B) |
电机B状态 |
|---|---|---|---|---|---|---|
前进 |
HIGH |
200 |
正转 |
HIGH |
200 |
正转 |
后退 |
LOW |
200 |
反转 |
LOW |
200 |
反转 |
左旋转 |
HIGH |
200 |
正转 |
LOW |
200 |
反转 |
右旋转 |
LOW |
200 |
反转 |
HIGH |
200 |
正转 |
停止 |
/ |
0 |
停止 |
/ |
0 |
停止 |
右旋转原理:左侧电机正转,右侧电机反转,车身向右原地旋转。
左旋转原理:左侧电机反转,右侧电机正转,车身向左原地旋转。
9.4 项目组件:#
组装好的智能车(未插上蓝牙模块) *1 |
USB线 *1 |
5号(1.5V)电池 *6(电池自备) |
|---|---|---|
|
|
|
9.5 接线图:#
⚠️ 特别注意:4WD智能车已经组装好了,这里不需要把4个电机拆下来又重新组装和接线,这里再次提供接线图,是为了方便您编写代码!
电机 |
电机驱动扩展板 |
|---|---|
左侧电机(M1) |
B2 |
左侧电机(M2) |
B1 |
右侧电机(M3) |
A1 |
右侧电机(M4) |
A2 |

⚠️ 特别注意:
接线时请确保电源断开(拔掉Arduino主控板上的USB线或将电机驱动扩展板上的拨码开关拨到 “OFF” 端),避免短路。
电源连接:电池盒电源接到电机驱动扩展板的 BAT 接口(注意正负极不要接反),端口正反面,请勿反插,否则会损坏端口。
电池正负极切勿接反,否则可能烧毁电机驱动扩展板。
电机驱动扩展板上的拨码开关拨到 “ON” 端。
电机线如果接反导致方向不对,可以通过交换电机两根线的位置,或者修改代码中的高低电平来修正。
9.6 示例代码1:基础运动控制#
基础运动:以固定速度(PWM 200)测试前进、后退、左转、右转。
⚠️ 重要提示:
上传示例代码前,请务必拔掉蓝牙模块! 因为蓝牙模块也占用Arduino的串口通信(TX/RX),如果不拔掉,示例代码上传会失败。
/*
keyes 4WD 多功能智能车
课程 09.1
电机驱动扩展板
http://www.keyes-robot.com
*/
#define MA 2 // 电机M3、M4方向控制引脚 D2
#define PWMA 6 // 电机M3、M4速度控制引脚 D6
#define MB 4 // 电机M1、M2方向控制引脚 D4
#define PWMB 5 // 电机M1、M2速度控制引脚 D5
/* 功能:初始化电机控制引脚 */
void setup() {
pinMode(MA, OUTPUT); // 配置电机M3,M4方向引脚为输出
pinMode(PWMA, OUTPUT); // 配置电机M3,M4速度引脚为输出
pinMode(MB, OUTPUT); // 配置电机M1,M2方向引脚为输出
pinMode(PWMB, OUTPUT); // 配置电机M1,M2速度引脚为输出
}
/* 功能:主循环,控制小车前进、后退、左转、右转和停止 */
void loop() {
// 前进1秒
digitalWrite(MA, HIGH); // 电机A正转
analogWrite(PWMA, 200); // 电机A速度为200
digitalWrite(MB, HIGH); // 电机B正转
analogWrite(PWMB, 200); // 电机B速度为200
delay(1000);
// 后退1秒
digitalWrite(MA, LOW); // 电机A反转
analogWrite(PWMA, 200); // 电机A速度为200
digitalWrite(MB, LOW); // 电机B反转
analogWrite(PWMB, 200); // 电机B速度为200
delay(1000);
// 左转1秒
digitalWrite(MA, HIGH); // 电机A正转
analogWrite(PWMA, 200); // 电机A速度为200
digitalWrite(MB, LOW); // 电机B反转
analogWrite(PWMB, 200); // 电机B速度为200
delay(1000);
// 右转1秒
digitalWrite(MA, LOW); // 电机A反转
analogWrite(PWMA, 200); // 电机A速度为200
digitalWrite(MB, HIGH); // 电机B正转
analogWrite(PWMB, 200); // 电机B速度为200
delay(1000);
// 停止1秒
analogWrite(PWMA, 0); // 电机A停止
analogWrite(PWMB, 0); // 电机B停止
delay(1000);
}
9.7 项目结果1:#
⚠️ 重要提示:
上传示例代码前,请务必拔掉蓝牙模块! 因为蓝牙模块也占用Arduino的串口通信(TX/RX),如果不拔掉,示例代码上传会失败。
外接电源,将电机驱动扩展板上的拨码开关拨到 “ON” 端,上电后。选择好正确的开发板板型(Arduino Uno)和 适当的串口端口(COMxx),然后单击
按钮上传示例代码1至Arduino控制板。
代码上传成功后,小车将按照 “前进 -> 后退 -> 左转 -> 右转 -> 停止” 的顺序循环动作,每个动作持续 1 秒,速度较快且均匀。

9.8 代码说明:#
digitalWrite( );
digitalWrite(MA, HIGH); // 高电平,电机正转
digitalWrite(MA, LOW); // 低电平,电机反转
电机的旋转方向取决于电流的方向。L298P 芯片通过改变内部开关的状态来改变电流方向。我们只需要向方向引脚(D2, D4)发送高电平(HIGH)或低电平(LOW)即可控制正反转。
analogWrite( );
analogWrite(PWMA, 200); // 设置PWM值为200
Arduino 的数字引脚只能输出 0V 或 5V,无法直接输出中间电压。但是,通过 PWM(脉冲宽度调制) 技术,我们可以快速地在 0V 和 5V 之间切换。
PWM 值范围:0 ~ 255。
0:相当于始终为 0V,电机停止。
255:相当于始终为 5V(逻辑电平,实际驱动电压取决于外部电源),电机全速运转。
中间值:数值越大,高电平占比越高,电机平均电压越高,转速越快。
注意: 只有标有波浪号 “~” 的引脚(如: D3、D5、D6、D9、D10、D11)才支持 analogWrite() 的PWM 功能。本课使用的 D5 和 D6 正好具备此功能。
9.9 示例代码2:变速运动控制#
在这个代码中,我们降低了 PWM 值,并让转弯时的速度与直行不同,体验速度控制的效果。同时,电机的接线不变。
⚠️ 重要提示:
上传示例代码前,请务必拔掉蓝牙模块! 因为蓝牙模块也占用Arduino的串口通信(TX/RX),如果不拔掉,示例代码上传会失败。
/*
keyes 4WD 多功能智能车
课程 09.2
电机驱动扩展板
http://www.keyes-robot.com
*/
#define MA 2 // 电机M3、M4方向控制引脚 D2
#define PWMA 6 // 电机M3、M4速度控制引脚 D6
#define MB 4 // 电机M1、M2方向控制引脚 D4
#define PWMB 5 // 电机M1、M2速度控制引脚 D5
/* 功能:初始化电机控制引脚 */
void setup() {
pinMode(MA, OUTPUT); // 配置电机M3,M4方向引脚为输出
pinMode(PWMA, OUTPUT); // 配置电机M3,M4速度引脚为输出
pinMode(MB, OUTPUT); // 配置电机M1,M2方向引脚为输出
pinMode(PWMB, OUTPUT); // 配置电机M1,M2速度引脚为输出
}
/* 功能:主循环,控制电机前进、后退、左转、右转和停止 */
void loop() {
// 前进1秒
digitalWrite(MA, HIGH); // 电机M3,M4正转
analogWrite(PWMA, 100); // 电机M3,M4速度设为100
digitalWrite(MB, HIGH); // 电机M1,M2正转
analogWrite(PWMB, 100); // 电机M1,M2速度设为100
delay(1000); // 延时1秒
// 后退1秒
digitalWrite(MA, LOW); // 电机M3,M4反转
analogWrite(PWMA, 100); // 电机M3,M4速度设为100
digitalWrite(MB, LOW); // 电机M1,M2反转
analogWrite(PWMB, 100); // 电机M1,M2速度设为100
delay(1000); // 延时1秒
// 左转1秒
digitalWrite(MA, HIGH); // 电机M3,M4正转
analogWrite(PWMA, 150); // 电机M3,M4速度设为150
digitalWrite(MB, LOW); // 电机M1,M2反转
analogWrite(PWMB, 150); // 电机M1,M2速度设为150
delay(1000); // 延时1秒
// 右转1秒
digitalWrite(MA, LOW); // 电机M3,M4反转
analogWrite(PWMA, 150); // 电机M3,M4速度设为150
digitalWrite(MB, HIGH); // 电机M1,M2正转
analogWrite(PWMB, 150); // 电机M1,M2速度设为150
delay(1000); // 延时1秒
// 停止1秒
analogWrite(PWMA, 0); // 电机M3,M4停止
analogWrite(PWMB, 0); // 电机M1,M2停止
delay(1000); // 延时1秒
}
9.10 项目结果2:#
⚠️ 重要提示:
上传示例代码前,请务必拔掉蓝牙模块! 因为蓝牙模块也占用Arduino的串口通信(TX/RX),如果不拔掉,示例代码上传会失败。
外接电源,将电机驱动扩展板上的拨码开关拨到 “ON” 端,上电后。选择好正确的开发板板型(Arduino Uno)和 适当的串口端口(COMxx),然后单击
按钮上传示例代码2至Arduino控制板。
代码上传成功后,小车将按照 “前进 -> 后退 -> 左转 -> 右转 -> 停止” 的顺序循环动作,每个动作持续 1 秒,你会发现小车的整体速度变慢了。

这是因为我们将 PWM 值从 200 降低到了 100 和 150。PWM 值越小,电机获得的平均电压越低,转速也就越慢。
9.11 注意事项与常见问题:#
1. 电机不动?
检查电池是否有电,电压是否在 7-9V 之间。
检查电机驱动扩展板是否牢固地插在 Arduino 上。
检查电机接线是否接触良好。
2. 方向相反?
如果小车 “前进” 命令发出后实际在 “后退”,你可以交换该组电机的两根接线,或者在代码中将
HIGH 改为 LOW,LOW 改为 HIGH。
3. 小车走不直?
由于电机个体差异,即使给相同的 PWM 值,两边转速也可能不同。后续课程我们将学习如何通过软件调整左右电机的 PWM 差值来校正直线行驶。
4. 发热问题
L298P芯片在大电流工作时会产生热量,这是正常现象。如果长时间堵转(车轮被卡住),芯片会过热保护甚至损坏,请避免长时间堵转。


