Dears,
I finished collecting my first robot project with these components:
2 gear DC Motor (3-6V)
L298N Driver
6 Battery 1.5V each (after measurment 7.8V)
Arduino UNO (powred directly from my PC with USB connection)


and this is my montage
and my full code
// Moteur Left
int LM_AV = 6; // Mettre (HIGH ici et LOW sur LM_AR) pour faire avancer le moteur vers l'avant
int LM_AR_7 = 7; // Mettre (HIGH ici et LOW sur LM_AV) pour faire réculer le moteur vers l'arrière
int LM_EN_5 = 5; // PWM port pour mettre une vitesse au moteur Left
// Moteur Right
int RM_AV = 8; // Mettre (HIGH ici et LOW sur RM_AR) pour faire avancer le moteur vers l'avant
int RM_AR = 9; // Mettre (HIGH ici et LOW sur RM_AV) pour faire réculer le moteur vers l'arrière
int RM_EN = 10; // PWM port pour mettre une vitesse au moteur Right
void setup()
{
pinMode(LM_AV, OUTPUT);
pinMode(LM_AR, OUTPUT);
pinMode(LM_EN, OUTPUT);
pinMode(RM_AV, OUTPUT);
pinMode(RM_AR, OUTPUT);
pinMode(RM_EN, OUTPUT);
}
void loop()
{
moveForward(255, 255);
delay(10000);
moveForward(200, 200);
delay(10000);
moveForward(150, 150);
delay(10000);
}
void stopMotorLeft()
{
digitalWrite(LM_AV,LOW);
digitalWrite(LM_AR,LOW);
analogWrite(LM_EN,0);
}
void stopMotorRight()
{
digitalWrite(RM_AV,LOW);
digitalWrite(RM_AR,LOW);
analogWrite(RM_EN,0);
}
void stopAll()
{
stopMotorLeft();
stopMotorRight();
}
void moveBackMotorLeft(int speed)
{
digitalWrite(LM_AV,LOW);
digitalWrite(LM_AR,HIGH);
analogWrite(LM_EN,speed);
}
void moveBackMotorRight(int speed)
{
digitalWrite(RM_AV,LOW);
digitalWrite(RM_AR,HIGH);
analogWrite(RM_EN,speed);
}
void moveBackward(int speedL, int speedR)
{
moveBackMotorLeft(speedL);
moveBackMotorRight(speedR);
}
void moveForwardMotorLeft(int speed)
{
digitalWrite(LM_AV,HIGH);
digitalWrite(LM_AR,LOW);
analogWrite(LM_EN,speed);
}
void moveForwardMotorRight(int speed)
{
digitalWrite(RM_AV,HIGH);
digitalWrite(RM_AR,LOW);
analogWrite(RM_EN,speed);
}
void moveForward(int speedL, int speedR)
{
moveForwardMotorLeft(speedL);
moveForwardMotorRight(speedR);
}
void turnLeft(int speedL, int speedR)
{
moveBackMotorLeft(speedL);
moveForwardMotorRight(speedR);
}
void turnRight(int speedL, int speedR)
{
moveForwardMotorLeft(speedL);
moveBackMotorRight(speedR);
}
when i run this project with 7.8V power supply, all my motors work fine with the differents PWM given
void loop()
{
moveForward(255, 255);
delay(10000);
moveForward(200, 200);
delay(10000);
moveForward(150, 150);
delay(10000);
}
But i need to measure the speed of my motors, so for that i inserted in my schema 2 LM393 speed sensor with 2 encoder disk (attached directly on my motors)
you can find the new schema here :
so for that i used TimerOne library
#include "TimerOne.h"
const byte MOTORLeft = 2; // Motor 1 Interrupt Pin - INT 0
const byte MOTORRight = 3; // Motor 2 Interrupt Pin - INT 1
unsigned int counter1 = 0;
unsigned int counter2 = 0;
// Float for number of slots in encoder disk
float diskslots = 20; // Change to match value of encoder disk
// Moteur Left
int LM_AV = 6; // Mettre (HIGH ici et LOW sur LM_AR) pour faire avancer le moteur vers l'avant
int LM_AR = 7; // Mettre (HIGH ici et LOW sur LM_AV) pour faire réculer le moteur vers l'arrière
int LM_EN = 5; // PWM port pour mettre une vitesse au moteur Left
// Moteur Right
int RM_AV = 8; // Mettre (HIGH ici et LOW sur RM_AR) pour faire avancer le moteur vers l'avant
int RM_AR = 9; // Mettre (HIGH ici et LOW sur RM_AV) pour faire réculer le moteur vers l'arrière
int RM_EN = 10; // PWM port pour mettre une vitesse au moteur Right
void setup()
{
pinMode(MOTORLeft, INPUT);
pinMode(MOTORRight, INPUT);
pinMode(LM_AV, OUTPUT);
pinMode(LM_AR, OUTPUT);
pinMode(LM_EN, OUTPUT);
pinMode(RM_AV, OUTPUT);
pinMode(RM_AR, OUTPUT);
pinMode(RM_EN, OUTPUT);
Serial.begin(9600);
Timer1.initialize(1000000); // set timer for 1sec
attachInterrupt(digitalPinToInterrupt (MOTORLeft), ISR_countLeft, RISING); // Increase counter 1 when speed sensor pin goes High
attachInterrupt(digitalPinToInterrupt (MOTORRight), ISR_countRight, RISING); // Increase counter 2 when speed sensor pin goes High
Timer1.attachInterrupt( ISR_timerone ); // Enable the timer
}
void loop()
{
moveForward(255, 255);
delay(10000);
moveForward(200, 200);
delay(10000);
moveForward(150, 150);
delay(10000);
}
void stopMotorLeft()
{
digitalWrite(LM_AV, LOW);
digitalWrite(LM_AR, LOW);
analogWrite(LM_EN, 0);
}
void stopMotorRight()
{
digitalWrite(RM_AV, LOW);
digitalWrite(RM_AR, LOW);
analogWrite(RM_EN, 0);
}
void stopAll()
{
stopMotorLeft();
stopMotorRight();
}
void moveBackMotorLeft(int speed)
{
digitalWrite(LM_AV, LOW);
digitalWrite(LM_AR, HIGH);
analogWrite(LM_EN, speed);
}
void moveBackMotorRight(int speed)
{
digitalWrite(RM_AV, LOW);
digitalWrite(RM_AR, HIGH);
analogWrite(RM_EN, speed);
}
void moveBackward(int speedL, int speedR)
{
moveBackMotorLeft(speedL);
moveBackMotorRight(speedR);
}
void moveForwardMotorLeft(int speed)
{
digitalWrite(LM_AV, HIGH);
digitalWrite(LM_AR, LOW);
analogWrite(LM_EN, speed);
}
void moveForwardMotorRight(int speed)
{
digitalWrite(RM_AV, HIGH);
digitalWrite(RM_AR, LOW);
analogWrite(RM_EN, speed);
}
void moveForward(int speedL, int speedR)
{
moveForwardMotorLeft(speedL);
moveForwardMotorRight(speedR);
}
void turnLeft(int speedL, int speedR)
{
moveBackMotorLeft(speedL);
moveForwardMotorRight(speedR);
}
void turnRight(int speedL, int speedR)
{
moveForwardMotorLeft(speedL);
moveBackMotorRight(speedR);
}
// Interrupt Service Routines
// Motor 1 pulse count ISR
void ISR_countLeft()
{
counter1++; // increment Motor 1 counter value
}
// Motor 2 pulse count ISR
void ISR_countRight()
{
counter2++; // increment Motor 2 counter value
}
// TimerOne ISR
void ISR_timerone()
{
Timer1.detachInterrupt(); // Stop the timer
Serial.print("Motor Left Speed 1: ");
float rotationLEFT = (counter1 / diskslots) * 60.00; // calculate RPM for Motor Left
Serial.print(rotationLEFT);
Serial.print(" RPM - ");
counter1 = 0; // reset counter to zero
Serial.print("Motor Right Speed 2: ");
float rotationRIGHT = (counter2 / diskslots) * 60.00; // calculate RPM for Motor Right
Serial.print(rotationRIGHT);
Serial.println(" RPM");
counter2 = 0; // reset counter to zero
Timer1.attachInterrupt( ISR_timerone ); // Enable the timer
}
this is my loop function :
void loop()
{
moveForward(255, 255);
delay(10000);
moveForward(200, 200);
delay(10000);
moveForward(150, 150);
delay(10000);
}
the problem is for the first Command moveForward(255, 255) it's OK, both motors work correctly with the full speed
But when i decrease the speed with (moveForward(200, 200) and moveForward(150, 150))
the left Motor works, but the right motor didn't work, and when i measure the voltage it indicates a 0 V
and when the loop comes again to max speed (moveForward(255, 255)) both motors work correctly
i tried to swap the wiring, and the problem happen on the left motor now
I made a rollback to my first sketch (without sensor and interruption) both motors work correctly with the different speed
have you seen a similar problem ? i suspect a power problem,
- my L298N is powerd with 7.8V, the jumper of the 5volt regulator is present
- my Arduino is powered by an USB cable to my PC


