tutoriales.com

Controlling DC Motor Speed and Direction with Arduino and L298N: A Beginner's Practical Guide!

Discover how to control DC (Direct Current) motors using Arduino and the popular L298N motor driver module. This detailed tutorial will guide you through the hardware setup and programming needed to adjust your motors' speed and direction, perfect for robotics and automation projects.

Principiante15 min de lectura133 views
Reportar error

Welcome to this tutorial! 🎉 In the world of electronics and robotics, DC (Direct Current) motors are fundamental components. They bring our projects to life, making robot wheels spin, turning on a fan, or moving objects with a small crane. However, you can't connect a DC motor directly to an Arduino pin because Arduino can't supply enough current, and you risk damaging the board.

This is where the L298N module comes in. It's a versatile and robust motor driver that acts as a 'bridge' between your Arduino and your motors, allowing you to control them safely and efficiently.


📖 What will you learn in this tutorial?

In this practical guide, we will cover the following topics:

  • Understand the basic operation of DC motors and the L298N module.
  • Connect the L298N module to Arduino and your DC motors.
  • Program Arduino to control motor direction.
  • Implement speed control using PWM (Pulse Width Modulation).
  • Practical examples and tips for your projects.
💡 Tip: Make sure you have all materials ready before you start for a smooth learning experience.

🎯 Materials Needed

Before we dive into the action, make sure you have the following components:

  • Arduino Board: An Arduino UNO or similar is perfect. 🤖
  • L298N Motor Driver Module: This is the brain of your motor control. 🧠
  • DC Motor(s): At least one, preferably two, to observe independent control. ⚙️
  • External Power Supply: 9V/12V batteries or a power adapter. (Crucial for the motors!) 🔋
  • Jumper Wires: Several male-to-male and male-to-female wires. 🔌
  • Breadboard (optional): Useful for additional connections. 🍞
  • USB Cable: To connect your Arduino to your computer. 💻

Suggested Materials Table

ComponentQuantityNotes
Arduino UNO1Any compatible board will work.
L298N Module1Make sure it's the L298N, not the L293D.
DC Motor (12V)1-2Small motors, like those from RC toys.
9V or 12V Battery1Or a suitable power adapter.
Battery Connector1Makes battery connection easier.
Jumper Wires~20Male-to-male and male-to-female.
🔥 Important: The L298N can control motors up to 46V and 2A per channel, but always check your motor's specifications to avoid exceeding limits!

🧠 Understanding the L298N and DC Motors

How Does a DC Motor Work?

A direct current motor converts electrical energy into rotational mechanical energy. When we apply voltage to its terminals, the motor starts to spin. The direction of rotation depends on the polarity of the applied voltage (if we reverse the wires, it will spin in the opposite direction), and the speed of rotation depends on the voltage magnitude. Simple, right?

The L298N Module: A Powerful Bridge

The L298N is a dual H-bridge motor driver. This means it can independently control two DC motors or one bipolar stepper motor. An H-bridge is an electronic circuit that allows voltage to be applied to a load (in this case, a motor) in either direction. It's essentially a switch that reverses polarity.

📌 Note: H-bridges are at the heart of direction control for DC motors. Without them, you could only make the motor spin in one direction.

The L298N module has the following key parts:

  • Power Input: Usually two screw terminals for connecting the external motor power supply (Vs) and ground (GND).
  • Motor Outputs: Two pairs of terminals (OUT1/OUT2 and OUT3/OUT4) where you connect your DC motors.
  • Logic Inputs: Pins to connect to Arduino (IN1, IN2, IN3, IN4) that control the direction of each motor.
  • Enable Pins: ENA and ENB pins, which control whether a motor is on or off, and are also used for PWM speed control. They often come with a jumper set by default.
  • 5V Output: Some modules have an internal 5V regulator that can power Arduino if the appropriate jumper is removed and the external power supply is 7-12V. Be careful with this!

Here is a simplified diagram of the L298N module:

L298N Driver Vs (12V) GND External Power IN1 IN2 ENA (PWM) Arduino (Motor A) ENB (PWM) IN3 IN4 Arduino (Motor B) OUT 1 / 2 Motor A OUT 3 / 4 Motor B L298N: Dual H-Bridge Driver for direction and speed (PWM) control

🛠️ Hardware Connections: Let's Get Started!

Now let's connect all the components. Follow these steps carefully.

General Connection Diagram

Connection Diagram: Arduino + L298N Arduino UNO GND D2 (IN1) D3 (IN2) D5 (ENA PWM) D7 (IN3) D8 (IN4) D9 (ENB PWM) L298N Driver IN1 IN2 ENA IN3 IN4 ENB +12V GND +5V OUT 1/2 OUT 3/4 Motor A Motor B 12V Battery ● Orange: Direction Signals ● Purple: PWM Signals (Speed)

Detailed Connection Steps

Step 1: Connect External Power to the L298N
Connect the **positive** of your power supply (e.g., 12V) to the `+12V` (or `Vs`) pin on the L298N. Connect the **negative** (GND) of your power supply to the `GND` pin on the L298N.
Step 2: Connect Common Ground (GND)
It is **CRUCIAL** to connect the `GND` pin of your Arduino to the `GND` pin of the L298N. This ensures both devices share a common voltage reference. Without this, the control pins will not function correctly.
Step 3: Connect the DC Motors
Connect one DC motor to the `OUT1` and `OUT2` terminals of the L298N. Connect the second DC motor (if you have one) to the `OUT3` and `OUT4` terminals. The initial polarity doesn't matter much, as we will control it via software.
Step 4: Connect the Logic Control Pins (IN)
These pins control the direction of the motors. You can use any digital pin on Arduino, but for this tutorial we will use the following:
  • Arduino Pin **D2** to `IN1` (Motor A)
  • Arduino Pin **D3** to `IN2` (Motor A)
  • Arduino Pin **D7** to `IN3` (Motor B)
  • Arduino Pin **D8** to `IN4` (Motor B)
Step 5: Connect the Enable (Enable/PWM) Pins
These pins enable/disable the motors and control their speed. The ENA and ENB pins of the L298N must be connected to PWM pins (marked with `~`) on Arduino to control the speed. If you only want to turn them on/off and control direction, you can connect them to normal digital pins or simply leave their jumper in place (if applicable) and connect them to 5V.
  • Arduino Pin **D5** (PWM) to `ENA` (Motor A)
  • Arduino Pin **D9** (PWM) to `ENB` (Motor B)

Make sure to remove the ENA and ENB jumpers on the L298N if it has them so you can control them from Arduino!
⚠️ Warning: Never connect the external power supply directly to the Arduino, nor try to power the motors with Arduino's 5V. You could permanently damage your board!

✍️ Arduino Programming: Controlling Direction

With the connections ready, it's time to program our Arduino. First, we'll focus on controlling the direction of a single motor.

Understanding the Control Logic

To control the direction of a motor with the L298N, we use the IN1 and IN2 pins (for Motor A) or IN3 and IN4 (for Motor B). The truth table is simple:

Direction Control Table (Motor A)

IN1IN2Result (Motor A)
LOWLOWStopped
LOWHIGHRotates in one direction
HIGHLOWRotates in opposite direction
HIGHHIGHStopped
📌 Note: When `ENA` (or `ENB`) is `LOW`, the motor is disabled, regardless of the `INx` values. When `ENA` is `HIGH` (or receives a PWM signal), the motor is activated according to `INx`.

Basic Code: One Motor Forward and Backward

This code will make a motor spin in one direction for 2 seconds, stop, and then spin in the opposite direction for 2 seconds, repeating the cycle.

// Pin definitions for Motor A
const int motorA_IN1 = 2;
const int motorA_IN2 = 3;
const int motorA_ENA = 5; // PWM pin to control speed

void setup() {
  // Configure pins as OUTPUT
  pinMode(motorA_IN1, OUTPUT);
  pinMode(motorA_IN2, OUTPUT);
  pinMode(motorA_ENA, OUTPUT);
  
  // Ensure the motor is initially stopped
  digitalWrite(motorA_IN1, LOW);
  digitalWrite(motorA_IN2, LOW);
  analogWrite(motorA_ENA, 0); // Speed 0, motor stopped
}

void loop() {
  // Rotate Motor A forward at maximum speed
  digitalWrite(motorA_IN1, HIGH); // Pin IN1 HIGH
  digitalWrite(motorA_IN2, LOW);  // Pin IN2 LOW
  analogWrite(motorA_ENA, 255);  // Maximum speed (0-255)
  Serial.println("Motor A: Forward");
  delay(2000); // Wait 2 seconds

  // Stop Motor A
  digitalWrite(motorA_IN1, LOW);
  digitalWrite(motorA_IN2, LOW);
  analogWrite(motorA_ENA, 0); // Speed 0
  Serial.println("Motor A: Stopped");
  delay(1000); // Wait 1 second

  // Rotate Motor A backward at maximum speed
  digitalWrite(motorA_IN1, LOW);  // Pin IN1 LOW
  digitalWrite(motorA_IN2, HIGH); // Pin IN2 HIGH
  analogWrite(motorA_ENA, 255);  // Maximum speed
  Serial.println("Motor A: Backward");
  delay(2000); // Wait 2 seconds

  // Stop Motor A
  digitalWrite(motorA_IN1, LOW);
  digitalWrite(motorA_IN2, LOW);
  analogWrite(motorA_ENA, 0); // Speed 0
  Serial.println("Motor A: Stopped");
  delay(1000); // Wait 1 second
}

Code Explanation

  1. const int motorA_IN1 = 2;: We define constants for Motor A's control pins. motorA_ENA is crucial for speed.
  2. pinMode(pin, OUTPUT);: In setup(), we configure all pins as outputs.
  3. digitalWrite(pin, HIGH/LOW);: These functions are used to set the direction logic on IN1 and IN2. A HIGH on one and a LOW on the other determine the direction of rotation.
  4. analogWrite(motorA_ENA, value);: This is where we control the speed. analogWrite() is used on Arduino PWM pins and accepts a value between 0 (stopped) and 255 (maximum speed). If ENA had a jumper to 5V, it would always be at maximum speed.
  5. delay(milliseconds);: Pauses in the program to observe the change in direction.

✨ Speed Control with PWM

Pulse Width Modulation (PWM) is a technique for achieving an analog voltage effect from a digital source. It's like rapidly flicking a switch on and off. The longer it's on (high duty cycle), the faster the motor will spin; the shorter it's on (low duty cycle), the slower.

Arduino implements PWM on specific pins (usually marked with a ~ or PWM). For the Arduino UNO, these are pins 3, 5, 6, 9, 10, and 11.

PWM: Full Speed Control

Advanced Code: Speed and Direction Control for Two Motors

This code will allow you to independently control the speed and direction of two motors, sweeping through speeds and changing directions.

// Pin definitions for Motor A
const int motorA_IN1 = 2;
const int motorA_IN2 = 3;
const int motorA_ENA = 5; // PWM pin to control Motor A speed

// Pin definitions for Motor B
const int motorB_IN3 = 7;
const int motorB_IN4 = 8;
const int motorB_ENB = 9; // PWM pin to control Motor B speed

void setup() {
  // Configure Motor A control pins as OUTPUT
  pinMode(motorA_IN1, OUTPUT);
  pinMode(motorA_IN2, OUTPUT);
  pinMode(motorA_ENA, OUTPUT);

  // Configure Motor B control pins as OUTPUT
  pinMode(motorB_IN3, OUTPUT);
  pinMode(motorB_IN4, OUTPUT);
  pinMode(motorB_ENB, OUTPUT);

  // Ensure both motors are initially stopped
  motorStop();
  
  Serial.begin(9600); // Initialize serial communication for debugging
  Serial.println("Motors ready!");
}

void loop() {
  // --- Motor A Control ---
  Serial.println("Motor A: Forward, accelerating...");
  motorA_Forward(0); // Ensure Motor A is set to forward direction and stopped
  for (int speed = 0; speed <= 255; speed += 5) {
    motorA_SetSpeed(speed);
    delay(50);
  }
  delay(1000);

  Serial.println("Motor A: Backward, decelerating...");
  motorA_Backward(255); // Ensure Motor A is set to backward direction and at max speed
  for (int speed = 255; speed >= 0; speed -= 5) {
    motorA_SetSpeed(speed);
    delay(50);
  }
  delay(1000);

  motorA_Stop();
  delay(2000); // Pause between Motor A cycles

  // --- Motor B Control ---
  Serial.println("Motor B: Forward, accelerating...");
  motorB_Forward(0);
  for (int speed = 0; speed <= 255; speed += 5) {
    motorB_SetSpeed(speed);
    delay(50);
  }
  delay(1000);

  Serial.println("Motor B: Backward, decelerating...");
  motorB_Backward(255);
  for (int speed = 255; speed >= 0; speed -= 5) {
    motorB_SetSpeed(speed);
    delay(50);
  }
  delay(1000);

  motorB_Stop();
  delay(2000); // Pause between Motor B cycles

  // Both motors in different directions and speeds
  Serial.println("Both motors: Motor A forward (medium), Motor B backward (fast)");
  motorA_Forward(120); // Medium speed
  motorB_Backward(200); // Fast speed
  delay(3000);
  motorStop();
  delay(2000);
}

// --- Control Functions for Motor A ---
void motorA_Forward(int speed) {
  digitalWrite(motorA_IN1, HIGH);
  digitalWrite(motorA_IN2, LOW);
  analogWrite(motorA_ENA, speed);
}

void motorA_Backward(int speed) {
  digitalWrite(motorA_IN1, LOW);
  digitalWrite(motorA_IN2, HIGH);
  analogWrite(motorA_ENA, speed);
}

void motorA_Stop() {
  digitalWrite(motorA_IN1, LOW);
  digitalWrite(motorA_IN2, LOW);
  analogWrite(motorA_ENA, 0); // Optional, only if you want an active brake, otherwise IN1/IN2 LOW is enough
}

void motorA_SetSpeed(int speed) {
  analogWrite(motorA_ENA, speed);
}

// --- Control Functions for Motor B ---
void motorB_Forward(int speed) {
  digitalWrite(motorB_IN3, HIGH);
  digitalWrite(motorB_IN4, LOW);
  analogWrite(motorB_ENB, speed);
}

void motorB_Backward(int speed) {
  digitalWrite(motorB_IN3, LOW);
  digitalWrite(motorB_IN4, HIGH);
  analogWrite(motorB_ENB, speed);
}

void motorB_Stop() {
  digitalWrite(motorB_IN3, LOW);
  digitalWrite(motorB_IN4, LOW);
  analogWrite(motorB_ENB, 0);
}

void motorB_SetSpeed(int speed) {
  analogWrite(motorB_ENB, speed);
}

// --- Function to stop both motors ---
void motorStop() {
  motorA_Stop();
  motorB_Stop();
  Serial.println("Both motors stopped.");
}

Advanced Code Explanation

We've created custom functions to make the code more readable and modular:

  • motorA_Forward(speed), motorA_Backward(speed), motorA_Stop(): Encapsulate the logic to control Motor A.
  • motorB_Forward(speed), motorB_Backward(speed), motorB_Stop(): Do the same for Motor B.
  • motorA_SetSpeed(speed) and motorB_SetSpeed(speed): Allow you to change the speed without affecting the direction, useful for smooth transitions.
  • The loop() now demonstrates how you can accelerate, decelerate, and change direction for both motors independently and coordinately.
  • Serial.begin(9600) and Serial.println(): We use the Arduino serial monitor for debugging and to know what the program is doing at any given moment.
💡 Tip: Experiment with different `speed` values (0-255) in `analogWrite()` to observe how the motor speed changes. You can also change the `delay()` times to see how it affects response.

🚀 Applications and Future Projects

Now that you've mastered controlling DC motors with Arduino and the L298N, the possibilities are endless. Here are some ideas for your next projects:

  • Mobile Robots: Build a car or robot that moves forward, backward, turns, and stops. 🚗
  • Controlled Fans: Control the speed of a fan based on ambient temperature (using a temperature sensor). 💨
  • Lifting Systems: Design a small crane or elevator to move light objects. 🏗️
  • Home Automation: Open/close blinds or curtains with DC motors. 🏠
  • Educational Robotics: Create interactive projects involving movement.
Why the L298N and not another driver?The L298N is very popular due to its low cost, ease of use, and ability to handle relatively high currents (up to 2A per channel), making it ideal for a wide range of small to medium DC motors. However, for smaller motors or projects where energy efficiency is critical, you might consider drivers like the DRV8833 or the A4988 (for stepper motors).
What if my motors spin in the opposite direction than expected?No problem! Simply reverse the motor wire connections to the L298N's output pins (OUT1/OUT2 or OUT3/OUT4). The software will still work, but the motor will spin in the opposite direction, which is useful if you want to correct the orientation without changing the code.

✅ Conclusion

Congratulations! You have successfully completed this tutorial and now have a solid foundation for controlling DC motors with Arduino and the L298N module. You've learned about hardware connections, direction control logic, and the crucial PWM technique for adjusting speed.

Skill Acquired: DC Motor Control

Keep experimenting, build new projects, and don't be afraid to make mistakes. Every mistake is an opportunity to learn. The world of robotics and electronics awaits you! 🚀

Tutoriales relacionados

Comentarios (0)

Aún no hay comentarios. ¡Sé el primero!