Challenge

Project 1 - Controlling a DC motor using PWM and monitoring its Running status

Implement a system on the simulator for controlling a DC motor using L293 motor driver, monitor its status and print the running status of motor on the LCD Display

Implement a system on the simulator for controlling the DC motor using the L293 motor driver.

Simulating hardware interactions in a text-based environment can be challenging, and it's essential to know the specifics of the simulator you are using. Assuming you have a simulator that supports GPIO simulation and you're working in a Unix-like environment, you can use the following example code with the WiringPi library to control a DC motor using the L293 motor driver. Additionally, this example assumes a two-wire connection to the L293 motor driver (IN1 and IN2).

Please make sure you have WiringPi installed in your simulator environment.

#include <iostream>

#include <wiringPi.h>

#include <unistd.h>

// Pin configuration for L293 motor driver

const int motorIn1 = 17; // Change this to the actual pin number in your simulator

const int motorIn2 = 18; // Change this to the actual pin number in your simulator

// Function to initialize GPIO pins

void initializeGPIO() {

wiringPiSetupGpio(); // Initialize WiringPi with GPIO numbering

pinMode(motorIn1, OUTPUT);

pinMode(motorIn2, OUTPUT);

}

// Function to start the motor

void startMotor() {

digitalWrite(motorIn1, HIGH);

digitalWrite(motorIn2, LOW);

}

// Function to stop the motor

void stopMotor() {

digitalWrite(motorIn1, LOW);

digitalWrite(motorIn2, LOW);

}

int main() {

initializeGPIO();

try {

while (true) {

Start the motor

startMotor();

std::cout << "Motor is running." << std::endl;

Run the motor for 5 seconds

sleep(5);

Stop the motor

stopmotor();

std::cout << "Motor is stopped." << std::endl;

Wait for 5 seconds before starting again

sleep(5);

}

} catch (...) {

// Handle exceptions if needed

}

return 0;

}

This example uses the WiringPi library to control GPIO pins. You might need to adapt the pin numbers according to your simulator's GPIO pin configuration. Also, please check if your simulator provides any specific GPIO simulation capabilities.

To compile the code, you can use a command like:

bash

g++ -o motor_control motor_control.cpp -lwiringPi

Displaying the running status of the DC motor on the LCD display.

Simulating an LCD display in a text-based environment is more challenging and might not accurately represent a real-world scenario. However, you can simulate it using print statements to represent messages on the console. Here's an updated example that simulates displaying the running status of the DC motor on the console:

#include <iostream>

#include <wiringPi.h>

#include <unistd.h>

// Pin configuration for L293 motor driver

const int motorIn1 = 17; // Change this to the actual pin number in your simulator

const int motorIn2 = 18; // Change this to the actual pin number in your simulator

// Pin configuration for simulated LCD

const int lcdRs = 25; // Change this to the actual pin number in your simulator

const int lcdEn = 24; // Change this to the actual pin number in your simulator

const int lcdD4 = 23; // Change this to the actual pin number in your simulator

const int lcdD5 = 22; // Change this to the actual pin number in your simulator

const int lcdD6 = 21; // Change this to the actual pin number in your simulator

const int lcdD7 = 20; // Change this to the actual pin number in your simulator

// Function to initialize GPIO pins

void initializeGPIO() {

wiringPiSetupGpio(); // Initialize WiringPi with GPIO numbering

pinMode(motorIn1, OUTPUT);

pinMode(motorIn2, OUTPUT);

}

// Function to start the motor

void startMotor() {

digitalWrite(motorIn1, HIGH);

digitalWrite(motorIn2, LOW);

}

// Function to stop the motor

void stopMotor() {

digitalWrite(motorIn1, LOW);

digitalWrite(motorIn2, LOW);

}

Simulated LCD print function

void lcdPrint(const std::string& message) {

std::cout << "LCD: " << message << std::endl;

}

int main() {

initializeGPIO();

// Simulate LCD initialization

lcdPrint("Initializing LCD...");

try {

while (true) {

// Start the motor

startMotor();

lcdPrint("Motor is running.");

// Run the motor for 5 seconds

sleep(5);

// Stop the motor

stopMotor();

lcdPrint("Motor is stopped.");

// Wait for 5 seconds before starting again

sleep(5);

}

} catch (...) {

// Handle exceptions if needed

}

return 0;

}

In this example, I've added a simulated LCD print function (`lcdPrint`) that prints messages to the console. You may need to adjust this code to better fit the capabilities of your simulator and how it handles simulated LCD displays.

The DC motor can be controlled by using L293 motor driver

Certainly! Below is a simple example of how you might control a DC motor using the L293 motor driver and display its status on a simulated LCD. Please note that the code is written assuming a hypothetical simulator and might need adjustments based on the actual capabilities and libraries provided by your simulator.

#include <iostream>

#include <thread>

#include <chrono>

// Simulated GPIO class

class GPIO {

public:

static void setMode(int pin, int mode) {

std::cout << "Setting mode for pin " << pin << " to " << mode << std::endl;

}

static void write(int pin, int value) {

std::cout << "Writing value " << value << " to pin " << pin << std::endl;

}

};

// Simulated LCD class

class LCD {

public:

static void initialize() {

std::cout << "Initializing LCD" << std::endl;

}

static void clear() {

std::cout << "Clearing LCD" << std::endl;

}

static void print(const std::string& message) {

std::cout << "Printing to LCD: " << message << std::endl;

}

};

// L293 Motor Driver Class

class L293MotorDriver {

private:

int in1Pin;

int in2Pin;

public:

L293MotorDriver(int in1, int in2) : in1Pin(in1), in2Pin(in2) {

GPIO::setMode(in1Pin, 1); // Set pin as output

GPIO::setMode(in2Pin, 1); // Set pin as output

}

void startMotor() {

GPIO::write(in1Pin, 1);

GPIO::write(in2Pin, 0);

}

void stopMotor() {

GPIO::write(in1Pin, 0);

GPIO::write(in2Pin, 0);

}

};

int main() {

// Simulated pin numbers

int motorIn1 = 17;

int motorIn2 = 18;

// Initialize GPIO and LCD in your simulator

GPIO::setMode(motorIn1, 1);

GPIO::setMode(motorIn2, 1);

LCD::initialize();

// Create an instance of L293MotorDriver

L293MotorDriver motorDriver(motorIn1, motorIn2);

try {

while (true) {

// Simulate motor running status

motorDriver.startMotor();

LCD::clear();

LCD::print("Motor is running");

std::this_thread::sleep_for(std::chrono::seconds(5));

// Simulate motor stopped status

motorDriver.stopMotor();

LCD::clear();

LCD::print("Motor is stopped");

std::this_thread::sleep_for(std::chrono::seconds(5));

}

} catch (...) {

// Handle exceptions if needed

}

return 0;

}

In this example, I've added a simulated LCD class that prints messages to the console. Replace the GPIO and LCD interactions with the corresponding functions or API calls provided by your simulator. Additionally, adapt the pin numbers according to your simulator's GPIO pin configuration.

The speed of a DC motor can be controlled by varying its input voltage. To do this, use PWM (Pulse Width Modulation).

Absolutely correct! Pulse Width Modulation (PWM) is a commonly used technique to control the speed of DC motors by varying the average voltage applied to the motor. PWM works by rapidly switching the voltage on and off at a fixed frequency. The ratio of the time the voltage is on to the total time (duty cycle) determines the average voltage applied to the motor and, consequently, the motor speed.

Here is a modified example of controlling a DC motor using PWM to simulate speed control:

#include <iostream>

#include <thread>

#include <chrono>

// Simulated GPIO class

class GPIO {

public:

static void setMode(int pin, int mode) {

std::cout << "Setting mode for pin " << pin << " to " << mode << std::endl;

}

static void write(int pin, int value) {

std::cout << "Writing value " << value << " to pin " << pin << std::endl;

}

};

// Simulated PWM class

class PWM {

public:

static void setPWM(int pin, int value) {

std::cout << "Setting PWM for pin " << pin << " to " << value << std::endl;

}

};

// Simulated LCD class

class LCD {

public:

static void initialize() {

std::cout << "Initializing LCD" << std::endl;

}

static void clear() {

std::cout << "Clearing LCD" << std::endl;

}

static void print(const std::string& message) {

std::cout << "Printing to LCD: " << message << std::endl;

}

};

// L293 Motor Driver Class with PWM support

class L293MotorDriver {

private:

int in1Pin;

int in2Pin;

int pwmPin;

public:

L293MotorDriver(int in1, int in2, int pwm) : in1Pin(in1), in2Pin(in2), pwmPin(pwm) {

GPIO::setMode(in1Pin, 1); // Set pin as output

GPIO::setMode(in2Pin, 1); // Set pin as output

PWM::setPWM(pwmPin, 0); // Initialize PWM to 0

}

void startMotor(int speed) {

GPIO::write(in1Pin, 1);

GPIO::write(in2Pin, 0);

PWM::setPWM(pwmPin, speed); // Set PWM to control speed

}

void stopMotor() {

GPIO::write(in1Pin, 0);

GPIO::write(in2Pin, 0);

PWM::setPWM(pwmPin, 0); // Stop the motor by setting PWM to 0

}

};

int main() {

Simulated pin numbers

int motorIn1 = 17;

int motorIn2 = 18;

int pwmPin = 19; // Change this to the actual pin number in your simulator for PWM

Initialize GPIO, PWM, and LCD in your simulator

GPIO::setMode(motorIn1, 1);

GPIO::setMode(motorIn2, 1);

PWM::setPWM(pwmPin, 0); // Initialize PWM to 0

LCD::initialize();

// Create an instance of L293MotorDriver

L293MotorDriver motorDriver(motorIn1, motorIn2, pwmPin);

try {

while (true) {

// Simulate motor running status with varying speeds

for (int speed = 0; speed <= 100; speed += 20) {

motorDriver.startMotor(speed);

LCD::clear();

LCD::print("Motor is running. Speed: " + std::to_string(speed));

std::this_thread::sleep_for(std::chrono::seconds(2));

}

// Stop the motor

motorDriver.stopMotor();

LCD::clear();

LCD::print("Motor is stopped");

// Wait for 5 seconds before starting again

std::this_thread::sleep_for(std::chrono::seconds(5));

}

} catch (...) {

// Handle exceptions if needed

}

return 0;

}

In this example, I added a simulated PWM class and modified the L293MotorDriver class to support PWM. The motor speed is varied by changing the PWM duty cycle. Replace the GPIO, PWM, and LCD interactions with the corresponding functions or API calls provided by your simulator. Adapt the pin numbers according to your simulator's GPIO and PWM pin configuration.

The L293D IC is a typical motor driver IC that allows the DC motor to drive in any direction.

Absolutely. The L293D is a popular motor driver IC that enables control of DC motors in both directions and is commonly used in robotics and other motor control applications. It's an H-bridge motor driver, which means it can drive the motor in both forward and reverse directions.

Here's a brief explanation of how the L293D works:

1. **H-Bridge Configuration:** The L293D IC has two H-bridges, allowing it to control two DC motors independently. Each H-bridge consists of four transistors. By controlling the state of these transistors, the L293D can change the direction of current flow through the motor, resulting in forward or reverse rotation.

2. Enable Pins: The L293D has an enable pin for each H-bridge. When the enable pin is high, the corresponding motor is allowed to operate. When the enable pin is low, the motor is effectively turned off.

3. **Input Pins (IN1, IN2, IN3, IN4):** These pins determine the direction of the motor. The combination of high and low signals on these pins controls the rotation direction. For example, if IN1 is high and IN2 is low, the motor rotates in one direction. If IN1 is low and IN2 is high, it rotates in the opposite direction.

4. **PWM Control:** While the L293D itself doesn't include PWM control, it can be used in conjunction with a microcontroller to achieve pulse-width modulation for speed control. By varying the duty cycle of the PWM signal sent to the enable pin, you can control the speed of the motor.

Here's a simple example of how you might use the L293D to control a DC motor in C++ (assuming it's connected to a Raspberry Pi's GPIO pins using the WiringPi library):

#include <iostream>

#include <wiringPi.h>

const int motorEnablePin = 17; // Enable pin on L293D

const int motorInput1 = 18; // Input 1 on L293D

const int motorInput2 = 23; // Input 2 on L293D

void initializeMotor() {

wiringPiSetupGpio();

pinMode(motorEnablePin, OUTPUT);

pinMode(motorInput1, OUTPUT);

pinMode(motorInput2, OUTPUT);

}

void startMotor() {

digitalWrite(motorEnablePin, HIGH); // Enable the motor

digitalWrite(motorInput1, HIGH); // Set Input 1 high

digitalWrite(motorInput2, LOW); // Set Input 2 low

}

void stopMotor() {

digitalWrite(motorEnablePin, LOW); // Disable the motor

}

int main() {

initializeMotor();

try {

while (true) {

// Start the motor for 2 seconds

startMotor();

std::cout << "Motor is running." << std::endl;

delay(2000);

// Stop the motor for 2 seconds

stopMotor();

std::cout << "Motor is stopped." << std::endl;

delay(2000);

}

} catch (...) {

// Handle exceptions if needed

}

return 0;

}

This example assumes a simplified scenario where the motor is turned on and off repeatedly. In a real-world application, you'd likely want to include more sophisticated control logic, possibly using PWM for speed control and handling different motor states.

Monitoring the running status of the DC motor using the L293 motor driver, which allows the DC motor to drive in any direction,.

Monitoring the running status of a DC motor using the L293 motor driver involves checking the inputs to the L293D and possibly monitoring feedback signals from the motor. Here's a simple example in C++ that illustrates how you might monitor the running status by checking the state of the input pins:

#include <iostream>

#include <wiringPi.h>

const int motorEnablePin = 17; // Enable pin on L293D

const int motorInput1 = 18; // Input 1 on L293D

const int motorInput2 = 23; // Input 2 on L293D

void initializeMotor() {

wiringPiSetupGpio();

pinMode(motorEnablePin, OUTPUT);

pinMode(motorInput1, OUTPUT);

pinMode(motorInput2, OUTPUT);

}

void startMotor() {

digitalWrite(motorEnablePin, HIGH); // Enable the motor

digitalWrite(motorInput1, HIGH); // Set Input 1 high

digitalWrite(motorInput2, LOW); // Set Input 2 low

}

void stopMotor() {

digitalWrite(motorEnablePin, LOW); // Disable the motor

}

bool isMotorRunning() {

return (digitalRead(motorInput1) == HIGH) && (digitalRead(motorInput2) == LOW);

}

int main() {

initializeMotor();

try {

while (true) {

// Start the motor for 2 seconds

startMotor();

std::cout << "Motor is running." << std::endl;

// Monitor the running status for 2 seconds

for (int i = 0; i < 20; ++i) {

if (!isMotorRunning()) {

std::cout << "Motor stopped unexpectedly." << std::endl;

break;

}

delay(100);

}

// Stop the motor for 2 seconds

stopMotor();

std::cout << "Motor is stopped." << std::endl;

delay(2000);

}

} catch (...) {

// Handle exceptions if needed

}

return 0;

}

This example introduces a new function, `isMotorRunning()`, which checks the state of the input pins to determine if the motor is running. You might need to adjust this logic based on your specific setup.

Keep in mind that monitoring the actual running status of a motor in a real-world scenario might involve additional considerations, such as feedback signals from the motor (like an encoder or a current sensor) or other mechanisms, depending on the level of accuracy required in your application.

The running status, i.e., in which direction the DC motor is running, is to be displayed on the LCD screen.

If you want to display the running status, i.e., the direction in which the DC motor is running, on an LCD screen, you can modify the previous example to include a simulated LCD display. Please note that this is a simplified example, and the actual implementation may vary based on your simulator environment.

Assuming a hypothetical LCD class, you can do something like the following:

#include <iostream>

#include <wiringPi.h>

#include <unistd.h>

// Simulated GPIO class

class GPIO {

public:

static void setMode(int pin, int mode) {

std::cout << "Setting mode for pin " << pin << " to " << mode << std::endl;

}

static void write(int pin, int value) {

std::cout << "Writing value " << value << " to pin " << pin << std::endl;

}

};

// Simulated LCD class

class LCD {

public:

static void initialize() {

std::cout << "Initializing LCD" << std::endl;

}

static void clear() {

std::cout << "Clearing LCD" << std::endl;

}

static void print(const std::string& message) {

std::cout << "Printing to LCD: " << message << std::endl;

}

};

// L293 Motor Driver Class

class L293MotorDriver {

private:

int in1Pin;

int in2Pin;

int pwmPin;

public:

L293MotorDriver(int in1, int in2, int pwm) : in1Pin(in1), in2Pin(in2), pwmPin(pwm) {

GPIO::setMode(in1Pin, 1); // Set pin as output

GPIO::setMode(in2Pin, 1); // Set pin as output

GPIO::setMode(pwmPin, 1); // Set pin as output

}

void startMotor(int speed) {

GPIO::write(in1Pin, 1);

GPIO::write(in2Pin, 0);

GPIO::write(pwmPin, speed);

}

void stopMotor() {

GPIO::write(in1Pin, 0);

GPIO::write(in2Pin, 0);

GPIO::write(pwmPin, 0);

}

};

int main() {

Simulated pin numbers

int motorIn1 = 17;

int motorIn2 = 18;

int pwmPin = 19;

int lcdRs = 20; // Replace with the actual LCD pin number

int lcdEn = 21; // Replace with the actual LCD pin number

Initialize GPIO, PWM, and LCD in your simulator

GPIO::setMode(motorIn1, 1);

GPIO::setMode(motorIn2, 1);

GPIO::setMode(pwmPin, 1);

GPIO::setMode(lcdRs, 1);

GPIO::setMode(lcdEn, 1);

LCD::initialize();

// Create an instance of L293MotorDriver

L293MotorDriver motorDriver(motorIn1, motorIn2, pwmPin);

try {

while (true) {

// Simulate motor running status with varying speeds

for (int speed = 0; speed <= 100; speed += 20) {

motorDriver.startMotor(speed);

// Simulate LCD display of running status

LCD::clear();

LCD::print("Motor is running. Speed: " + std::to_string(speed));

std::this_thread::sleep_for(std::chrono::seconds(2));

}

// Stop the motor

motorDriver.stopMotor();

// Simulate LCD display of stopped status

LCD::clear();

LCD::print("Motor is stopped");

std::this_thread::sleep_for(std::chrono::seconds(5));

}

} catch (...) {

// Handle exceptions if needed

}

return 0;

}

This example assumes a hypothetical LCD class and uses print statements to simulate LCD display updates. Replace the GPIO, PWM, and LCD interactions with the corresponding functions or API calls provided by your simulator. Adjust the pin numbers according to your simulator's GPIO and LCD pin configurations.

Your portfolio, next

Ship work like this
in your own course.

Talk to a career counsellor

Free 20-minute call. We'll map the right course to where you want to work.

By submitting you agree to our Terms and Privacy Policy.