第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),然后单击 Arduino_2.3.6-a40 按钮上传示例代码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),然后单击 Arduino_2.3.6-a40 按钮上传示例代码2至Arduino控制板。

代码上传成功后,小车将按照 “前进 -> 后退 -> 左转 -> 右转 -> 停止” 的顺序循环动作,每个动作持续 1 秒,你会发现小车的整体速度变慢了。

这是因为我们将 PWM 值从 200 降低到了 100 和 150。PWM 值越小,电机获得的平均电压越低,转速也就越慢。

9.11 注意事项与常见问题:#

1. 电机不动?

  • 检查电池是否有电,电压是否在 7-9V 之间。

  • 检查电机驱动扩展板是否牢固地插在 Arduino 上。

  • 检查电机接线是否接触良好。

2. 方向相反?

如果小车 “前进” 命令发出后实际在 “后退”,你可以交换该组电机的两根接线,或者在代码中将 HIGH 改为 LOWLOW 改为 HIGH

3. 小车走不直?

由于电机个体差异,即使给相同的 PWM 值,两边转速也可能不同。后续课程我们将学习如何通过软件调整左右电机的 PWM 差值来校正直线行驶。

4. 发热问题

L298P芯片在大电流工作时会产生热量,这是正常现象。如果长时间堵转(车轮被卡住),芯片会过热保护甚至损坏,请避免长时间堵转。