本教程介绍了如何使用本教程ESP32和L298N控制电机驱动器DC电机的方向和速度。首先,我们将很快理解L298N电机驱动器的工作原理。然后,我们将向您展示如何使用带有它的示例Arduino IDE的ESP32和L298N控制电机驱动器DC电机的速度和方向。
:控制直流电机的方法有很多。我们将使用它L298N电机驱动器。本教程还兼容类似的电机驱动模块。
要完成本教程,您需要以下部分:

控制直流电机的方法有很多。这里使用的方法大多需要6V或12V业余爱好者电机的操作。
我们将使用L298N35电机驱动器V高达3的电压可以处理A电流。此外,它还允许我们同时驱动两个直流电机,这非常适合建造机器人。
L298N如下图所示:电机驱动器:
让我们看看L298N电机驱动器的引脚排列,看它是如何工作的。
每台电机的每侧都有两个接线端子。OUT1和OUT2在左侧,OUT3和OUT4在右侧。
:直流电机A 端子 :直流电动机A –端子 :直流电机B 端子 :直流电动机B –端子底部有带 12V,GND和 5V三个接线端子。 12V终端用于电机电源。 5V端子用于L298N芯片。但是,如果安装跳线,芯片将使用电机电源,您不需要通过 5V端子提供5V 电压。
:如果您提供的电压超过12V,需要卸下跳线并向前移动 5V端子提供5V的电压。
重要的是要注意,尽管端子的名字是 12V,但在这里,我们可以提供6个设置(如果有跳线)V至12V之间的任何电压。本教程将使用4节AA 1.5V这些电池的总输出约为6V,但是你可以使用任何其他合适的电源。例如,您可以使用开关电源来测试本教程。
: 12V端子是你应该连接电源的地方 :电源GND :如果跳线被移除,则提供5V。如果有跳线,则充当5V输出 :默认的跳线–使用电机电源为芯片加电。跳线已被移除:您需要为此提供服务 5V端子提供5V如果您提供的电压超过12V,则应卸下跳线右下角有四个输入引脚和两个启用端子。输入引脚用于控制直流电机的方向,而引脚用于控制每个电机的速度。
电机A输入1 :电机A输入2 :电机B输入1 :电机B输入2 :电机A的使能引脚 :电机B的使能引脚在默认情况下,能引脚上有跳线帽。为了控制电机的速度,制电机的速度。
现在你已经熟悉了L298N让我们看看如何使用电机驱动器来控制直流电机。
能引脚就像电机ON和OFF例如:
如果将 如果发送到使能1引脚,电机A准备以最大速度控制;如果将 如果发送到使能1引脚,电机A将关闭;否则,电机A将启用。如果发送 ,它可以控制电机的速度。电机的速度与空比成正比。但请注意,在较小的空比下,电机可能不会旋转,并会发出持续的嗡嗡声。输入引脚控制电机旋转方向。输入1和输入2控制电机A,输入3和4控制电机B.
如果将LOW应用于输入1,将HIGH如果用于输入2,电机将正转;如果用相反的方式加电:输入1高,输入2低,电机将向后旋转。同样的方法可以用来控制电机B,但是将HIGH或LOW用于输入3和输入4。如果机器人汽车是用两个直流电机建造的,这些电机应该沿着特定的方向旋转,使机器人向左、向右、向前或向后移动。
例如,如果你想让机器人向前移动,两个电机都应该向前旋转。两者都应该向后旋转,以便向后移动。
为了使机器人朝一个方向旋转,您需要更快地旋转相反的电机。例如,如果机器人向右旋转,请在左侧启动电机,然后在右侧禁止电机。
现在,你知道如何使用它L298N电机驱动器控制直流电机,让我们建立一个简单的例子来控制直流电机的速度和方向。
我们将控制的电机连接到电机A的输出引脚,因此我们需要将电机驱动器ENABLEA,INPUT1和INPUT2引脚连接到ESP32.直流电机和L298N连接到电机驱动器ESP32。
DC电机需要大电流跳跃才能启动,因此应使用ESP32外部电源为电机供电。例如,我们使用4AA但是你可以使用任何其他合适的电源。您可以在此配置中使用6V至12V的电源。
电池座和电机驱动器之间的开关是可选的,但切断和连接电源非常方便。这样,您就不需要连续连接,然后断开电线以节省功率。
我们建议将0.1uF陶瓷电容器焊接到直流电机的正负极,以帮助消除任何电压峰值。(注:电机也可以在没有电容器的情况下工作。
Arduino IDE您可以使用附加组件Arduino IDE编程语言对ESP32编程。确保已安装。ESP本教程可在32插件后继续。
以下代码控制直流电机的速度和方向。这个代码在现实世界中是无用的,这只是一个更好地理解如何使用的简单例子ESP32控制DC电机的速度和方向。
/*********
Rui Santos
Complete project details at https://randomnerdtutorials.com
*********/
// Motor A
int motor1Pin1 = 27;
int motor1Pin2 = 26;
int enable1Pin = 14;
// Setting PWM properties
const int freq = 30000;
const int pwmChannel = 0;
const int resolution = 8;
int dutyCycle = 200;
void setup() {
// sets the pins as outputs:
pinMode(motor1Pin1, OUTPUT);
pinMode(motor1Pin2, OUTPUT);
pinMode(enable1Pin, OUTPUT);
// configure LED PWM functionalitites
ledcSetup(pwmChannel, freq, resolution);
// attach the channel to the GPIO to be controlled
ledcAttachPin(enable1Pin, pwmChannel);
Serial.begin(115200);
// testing
Serial.print("Testing DC Motor...");
}
void loop() {
// Move the DC motor forward at maximum speed
Serial.println("Moving Forward");
digitalWrite(motor1Pin1, LOW);
digitalWrite(motor1Pin2, HIGH);
delay(2000);
// Stop the DC motor
Seial.println("Motor stopped");
digitalWrite(motor1Pin1, LOW);
digitalWrite(motor1Pin2, LOW);
delay(1000);
// Move DC motor backwards at maximum speed
Serial.println("Moving Backwards");
digitalWrite(motor1Pin1, HIGH);
digitalWrite(motor1Pin2, LOW);
delay(2000);
// Stop the DC motor
Serial.println("Motor stopped");
digitalWrite(motor1Pin1, LOW);
digitalWrite(motor1Pin2, LOW);
delay(1000);
// Move DC motor forward with increasing speed
digitalWrite(motor1Pin1, HIGH);
digitalWrite(motor1Pin2, LOW);
while (dutyCycle <= 255){
ledcWrite(pwmChannel, dutyCycle);
Serial.print("Forward with duty cycle: ");
Serial.println(dutyCycle);
dutyCycle = dutyCycle + 5;
delay(500);
}
dutyCycle = 200;
}
将代码上传到ESP32。确保选择了正确的板和COM端口。让我们看一下代码是如何工作的。
首先,定义电机引脚连接的GPIO。在这种情况下,电机A的输入1连接到GPIO 27,输入2连接到GPIO 26,使能引脚连接到GPIO 14。
int motor1Pin1 = 27;
int motor1Pin2 = 26;
int enable1Pin = 14;
如前所述,您可以通过向L298N电机驱动器的使能引脚施加PWM信号来控制直流电机的速度。速度将与占空比成正比。要将PWM与ESP32一起使用,您需要首先设置PWM信号属性。
const int freq = 30000;
const int pwmChannel = 0;
const int resolution = 8;
int dutyCycle = 200;
在这种情况下,我们将在通道0上以8位分辨率生成30000 Hz的信号。我们从200的占空比开始(您可以将占空比值设置为0到255)。
对于我们使用的频率,当您应用小于200的占空比时,电机将不会移动,并且会发出奇怪的蜂鸣声。因此,这就是为什么我们一开始将占空比设置为200的原因。
:我们在此处定义的PWM属性只是一个示例。电机可以在其他频率下正常工作。
在setup()中,首先将电动机引脚设置为输出。
pinMode(motor1Pin1, OUTPUT);
pinMode(motor1Pin2, OUTPUT);
pinMode(enable1Pin, OUTPUT);
您需要通过使用ledcSetup()函数来配置具有先前定义的属性的PWM信号,该函数接受pwmChannel,frequency和resolution作为参数,如下所示:
ledcSetup(pwmChannel, freq, resolution);
接下来,您需要选择将从其获取信号的GPIO。为此,请使用 ledcAttachPin()函数,该函数接受要获取信号的GPIO以及生成信号的通道作为参数。在此示例中,我们将在enable1Pin GPIO中获取信号,该GPIO与GPIO 14相对应。生成信号的通道为pwmChannel,与通道0相对应。
ledcAttachPin(enable1Pin, pwmChannel);
在loop()中是电动机运动的地方。该代码很好地说明了代码各部分的功能。要使电动机向前移动,请将输入1引脚设置为LOW,将输入2引脚设置为HIGH。在此示例中,电动机向前旋转2秒钟(2000毫秒)。
// Move the DC motor forward at maximum speed
Serial.println("Moving Forward");
digitalWrite(motor1Pin1, LOW);
digitalWrite(motor1Pin2, HIGH);
delay(2000);
要向后移动直流电动机,请反方向向电动机输入引脚供电。高输入1,低输入2。
// Move DC motor backwards at maximum speed
Serial.println("Moving Backwards");
digitalWrite(motor1Pin1, HIGH);
digitalWrite(motor1Pin2, LOW);
delay(2000);
要使直流电动机停止,您可以将使能引脚设置为LOW,或者将输入1和输入2引脚都设置为LOW。在此示例中,我们将两个输入引脚都设置为LOW。
// Stop the DC motor
Serial.println("Motor stopped");
digitalWrite(motor1Pin1, LOW);
digitalWrite(motor1Pin2, LOW);
delay(1000);
要控制直流电动机的速度,我们需要更改PWM信号占空比。为此,您可以使用ledcWrite()函数,该函数接受生成信号的PWM通道(而不是输出GPIO)和占空比的参数,如下所示。
ledcWrite(pwmChannel, dutyCycle);
在我们的示例中,我们有一个while循环,可以在每个循环中将占空比增加5。
// Move DC motor forward with increasing speed
digitalWrite(motor1Pin1, HIGH);
digitalWrite(motor1Pin2, LOW);
while (dutyCycle <= 255){
ledcWrite(pwmChannel, dutyCycle);
Serial.print("Forward with duty cycle: ");
Serial.println(dutyCycle);
dutyCycle = dutyCycle + 5;
delay(500);
}
当while条件不再成立时,我们将占空比再次设置为200。
dutyCycle = 200;
在本教程中,我们向您展示了如何使用ESP32和L298N电机驱动器来控制DC电机的方向和速度。综上所述:
要控制直流电动机旋转的方向,请使用输入1和输入2引脚;将LOW应用于输入1,将HIGH应用于输入2,以使电动机向前旋转。用另一种方法加电以使其向后旋转。要控制直流电动机的速度,请在使能引脚上使用PWM信号。直流电动机的速度与占空比成正比。