Help with my program please

Hello,
my name is Louis, I’m in my last yeat of high school in France and I’ve to make a project. Our project is about a robot, controlled by arduino. I worked quite a lot, learning and understanding arduino over the year, and i did my best to make the program i’ll show you, we found one particular problem, the motor m3 and m4 do not work…
We use two different motor shields: the motor shield V2.0 : http://wiki.seeed.cc/Motor_Shield_V2.0/

and the motor shield v1.2: http://www.elecfreaks.com/store/l298-motor-shield-shdl298n-p-501.html

I use an external generator…

So the motors m3 and m4 do not work :
here is my program (sorry for somes of the annotations, they’re in french). :

#include <Servo.h> //On inclus la bibliothèque Servo.h pour controler les servomoteurs
Servo Servo1; //On donne le nom Servo1 à notre servomoteur
int val = 500; //On attribue à val la valeure 500
int sensorpin1 = 0; //On attribue le pin 0 au capteur
int E1 = 6; //On attribue le pin 6 à l’entrée E1
int M1 = 7; //On attribue le pin 7 à l’entrée M1
int E2 = 5; //On attribue le pin 5 à l’entrée E2
int M2 = 4; //On attribue le pin 4 à l’entrée M2
int EnableM3 = 9; //On attribue le pin 9 à EnableM3
int EnableM4 = 10; //On attribue le pin 10 à EnableM4
int E3 = 8; //On attribue le pin 8 à l’entrée E3
int M3 = 11; //On attribue le pin 11 à l’entrée M3
int E4 = 12; //On attribue le pin 12 à l’entrée E4
int M4 = 13; //On attribue le pin 13 à l’entrée M4

void setup()
{
Servo1.attach(9); //Notre servo moteur est situé au niveau du pin 9

analogWrite(E1, 3000); //On règle le pmw du moteur 1 à 3000.
analogWrite(E2, 3000); //on règle le pmw du moteur 2 à 3000.
analogWrite(EnableM3, 3000); //on règle le pmw du moteur 3 à 3000.
analogWrite(EnableM4, 3000); //on règle le pmw du moteur 4 à 3000.
}

void loop()
{
//Tant que le capteur capte quelque chose, il execute la fonction “monte”. (voir fonction plus bas).

if (val >= 300) {
monte();
Servo1.write(20); //On faire tourner le servo moteur qui est situé au pin 9 de 180° (et le maintien à 180°)
val = analogRead(sensorpin1); //On attribue la valeur prise par la capteur à val
} //Fin de SI monter

//Dès que le capteur ne capte plus, il execute la fonction “Descend”. (voir fonction plus bas).

if (val < 300) {
descend(); //Execute la fonction “descend”
Servo1.write(20); //On montien le servo moteur à 180°
val = 0; //On atribu la valeur 0 à Val (capteur)
} //Fin de SI descente

}

void monte() { //Debut création de la fonction.
//On regle le pin E3 (8) en entrée.
pinMode(M1, OUTPUT); //On règle le pin M1 (7) en Sortie.
digitalWrite(M1, HIGH);
pinMode(M2, OUTPUT);
digitalWrite(M2, LOW);
pinMode(E3, INPUT);
pinMode(M3, OUTPUT);
digitalWrite(M3, HIGH);

}

void descend () { //Debut création de la fonction.
pinMode(M1, OUTPUT);
digitalWrite(M1, LOW);
pinMode(M2, OUTPUT);
digitalWrite(M2, HIGH); //On envoie de la puissance (inverse) sur le pin M2 (4)
pinMode(E3, OUTPUT);
pinMode(M3, INPUT);
digitalWrite(E3, HIGH);

}

Why are you diddling with the mode of the pins in monte() and descend()? The mode should be set in setup(), and not changed.

What do the Enable pins do? I find it difficult to understand why you would PWM an enable pin. Do you think you can partially enable a motor, but writing 150 to the enable pin?

You can't send a value over 255 to analogWrite(). 3000 is too big.

PaulS:
Why are you diddling with the mode of the pins in monte() and descend()? The mode should be set in setup(), and not changed.

What do the Enable pins do? I find it difficult to understand why you would PWM an enable pin. Do you think you can partially enable a motor, but writing 150 to the enable pin?

actually, i want to change the pin mod during the loop, because one of the shields needs it to change the rotation way…
The two shields do not work the same way, one does not have an enable pin, that’s why i need to et change the PWM on the enable pin, i undestood that the motor shield v1.2 works like that

No, for that you just need to digitalWrite the right states HIGH or LOW to those pins. They should be set as outputs already in setup. You don't need to use pinMode again.

Could you try to correct the part you think i'm false please? Thank you

here is what i’ve done, the problem is that the two motors still don’t work … :

#include <Servo.h> //On inclus la bibliothèque Servo.h pour controler les servomoteurs
Servo Servo1; //On donne le nom Servo1 à notre servomoteur
int val = 500; //On attribue à val la valeure 500
int sensorpin1 = 0; //On attribue le pin 0 au capteur
int E1 = 6; //On attribue le pin 6 à l’entrée E1
int M1 = 7; //On attribue le pin 7 à l’entrée M1
int E2 = 5; //On attribue le pin 5 à l’entrée E2
int M2 = 4; //On attribue le pin 4 à l’entrée M2
int EnableM3 = 9; //On attribue le pin 9 à EnableM3
int EnableM4 = 10; //On attribue le pin 10 à EnableM4
int E3 = 8; //On attribue le pin 8 à l’entrée E3
int M3 = 11; //On attribue le pin 11 à l’entrée M3
int E4 = 12; //On attribue le pin 12 à l’entrée E4
int M4 = 13; //On attribue le pin 13 à l’entrée M4

void setup()
{
Servo1.attach(9);
pinMode(M1, OUTPUT);
pinMode(M2, OUTPUT);
pinMode(M3, OUTPUT);
pinMode(M4, OUTPUT);
pinMode(E4, INPUT);
pinMode(E3, INPUT);
pinMode(E2, INPUT);
pinMode(E1, INPUT);
analogWrite(E1, 255);
analogWrite(E2, 255);
analogWrite(EnableM3, 255);
analogWrite(EnableM4, 255);
}

void loop()
{
//Tant que le capteur capte quelque chose, il execute la fonction “monte”. (voir fonction plus bas).

if (val >= 300) {
monte();
Servo1.write(20); //On faire tourner le servo moteur qui est situé au pin 9 de 180° (et le maintien à 180°)
val = analogRead(sensorpin1); //On attribue la valeur prise par la capteur à val
} //Fin de SI monter

//Dès que le capteur ne capte plus, il execute la fonction “Descend”. (voir fonction plus bas).

if (val < 300) {
descend(); //Execute la fonction “descend”
Servo1.write(20); //On montien le servo moteur à 180°
val = 0; //On atribu la valeur 0 à Val (capteur)
} //Fin de SI descente

}

//fonction “avancer” / “marche avant” / “monter” du robot:
void monte() { //Debut création de la fonction.
//On regle le pin E3 (8) en entrée.
//On règle le pin M1 (7) en Sortie.
digitalWrite(M1, HIGH);
digitalWrite(M2, LOW);
digitalWrite(M3, HIGH);
digitalWrite(M4, HIGH);

}

//Fonction “reculer” / “marche arriere” / “descendre” du robot:
void descend () { //Debut création de la fonction.

digitalWrite(M1, LOW);
digitalWrite(M2, HIGH);
digitalWrite(M3, LOW);
digitalWrite(M4, LOW);

}

Have you written any simpler test programs, to verify the hardware?

Louis37000:
Could you try to correct the part you think i’m false please? Thank you

Instead, you read the suggestions, you modify the code and post it again using code tags, please. You’re not paying us to work for you.

Before you do that, please eliminate the useless white space and auto-format the code using T in the IDE.

aarg: Have you written any simpler test programs, to verify the hardware?

Sure, i wrote another program to verify the motor :

int EnableM3 = 9; //On attribue le pin 9 à EnableM3 int EnableM4 = 10; //On attribue le pin 10 à EnableM4 int E3 = 8; //On attribue le pin 8 à l'entrée E3 int M3 = 11; //On attribue le pin 11 à l'entrée M3 int E4 = 12 ; ; //On attribue le pin 12 à l'entrée E4 int M4 = 13; //On attribue le pin 13 à l'entrée M4

void setup() { analogWrite(EnableM3, 3000); //on règle le pmw du moteur 3 à 3000. analogWrite(EnableM4, 3000); //on règle le pmw du moteur 4 à 3000. }

void loop() {

pinMode(E3, OUTPUT); pinMode(M3, INPUT); digitalWrite(E3, HIGH);

}

And this one worked

I arrived here, the motor M3 still not work, and i don’t know how the enable pin works, could you help me please? :

#include <Servo.h> //On inclus la bibliothèque Servo.h pour controler les servomoteurs
Servo Servo1; //On donne le nom Servo1 à notre servomoteur
int val = 500; //On attribue à val la valeure 500
int sensorpin1 = 0; //On attribue le pin 0 au capteur
int E1 = 6; //On attribue le pin 6 à l’entrée E1
int M1 = 7; //On attribue le pin 7 à l’entrée M1
int E2 = 5; //On attribue le pin 5 à l’entrée E2
int M2 = 4; //On attribue le pin 4 à l’entrée M2
int EnableM3 = 9; //On attribue le pin 9 à EnableM3
int EnableM4 = 10; //On attribue le pin 10 à EnableM4
int E3 = 8; //On attribue le pin 8 à l’entrée E3
int M3 = 11; //On attribue le pin 11 à l’entrée M3
int E4 = 12; //On attribue le pin 12 à l’entrée E4
int M4 = 13; //On attribue le pin 13 à l’entrée M4

void setup()
{
pinMode(M3, OUTPUT);
pinMode(M1, OUTPUT); //On règle le pin M1 (7) en Sortie.
pinMode(M2, OUTPUT); //On règle le pin M2 (4) en Sortie.
Servo1.attach(9); //Notre servo moteur est situé au niveau du pin 9
analogWrite(E1, 250); //On règle le pmw du moteur 1 à 3000.
analogWrite(E2, 250);
analogWrite(E3, 250);
EnableM3 = 1;

}

void loop()
{
if (val >= 300) {
Servo1.write(20);
digitalWrite(M3, HIGH);
digitalWrite(M1, HIGH); //On envoie de la puissance sur le pin M1 (7)
digitalWrite(M2, LOW);
val = analogRead(sensorpin1); //On attribue la valeur prise par la capteur à val
} //Fin de SI monter
if (val < 300) {
digitalWrite(M1, LOW); //On envoie de la puissance (inverse) sur le pin M1 (7)
digitalWrite(M2, HIGH); //On envoie de la puissance (inverse) sur le pin M2 (4)
digitalWrite(M3, LOW); //Execute la fonction “descend”
Servo1.write(20); //On montien le servo moteur à 180°
val = 0; //On atribu la valeur 0 à Val (capteur)
} //Fin de SI descente
}

Please answer to reply #7.

Also, your comment doesn't agree with your code:

  analogWrite(E1, 250);        //On règle le pmw du moteur 1 à 3000.

aarg:
Please answer to reply #7.

Also, your comment doesn’t agree with your code:

  analogWrite(E1, 250);        //On règle le pmw du moteur 1 à 3000.

Thank you again aarg,
For the Hardware, i tested everything, separatly, and it works, I did many tests with simpler programs and it works as well, but when it comes all together, the robot fails…
For the comments, it was a non finished program with the wrong comments on it…
I discovered some issues on my program as well, as the fact that the servo.attach(9) is on the same pin as the EnableM3 … but even fixing it, the robot still not works…
The sensor was on 0 but supposed to be on A0…

I’ll post after this my last work on the program, but the problem is that i put it on my robot right now and can’t test it.

#include <Servo.h> //On inclus la bibliothèque Servo.h pour controler les servomoteurs
Servo Servo1;
int pin_servo = 2; // On attribue le pin digital 2 au serv omoteur.
int sensorpin1 = A0; //On attribue le pin 0 au capteur
int E1 = 6; //pin 6 — motuer V1.2 E1 vitesse
int M1 = 7; //pin 7 — moteur V1.2 M1
int E2 = 5; //pin 5 — moteur v1.2 E2 vitesse
int M2 = 4; //pin 4 — moteur v1.2 M2
int moteurgaucheavant = 8; // pin 8 — moteur V2.0 gauche (+) cable rouge
int moteurgauchearriere = 11; // pin 11 — moteur gauche (-) cable noir
int moteurgauchevitesse = 9; // pin 9 — signal vitesse moteur gauche
int moteurdroitavant = 12; // pin 12 — moteur droit (+) cable rouge
int moteurdroitarriere = 13; // pin 13 — moteur droit (-) cable noir
int moteurdroitvitesse = 10; // pin 10 — signal vitesse moteur droit

int vitesse = 255; // Reglage de la vitesse du robot, attnetion, vitesse maximale (255)
int val = 500; //On attribue à val la valeure 500

void setup()
{
Servo1.attach(pin_servo); //on attribu le pin 2 au servomoteur
pinMode(M1, OUTPUT); // on defini le pin comme SORTIE
pinMode(M2, OUTPUT); // on defini le pin comme SORTIE
pinMode(moteurgaucheavant, OUTPUT); // on defini le pin comme SORTIE
pinMode(moteurgauchearriere, OUTPUT); // on defini le pin comme SORTIE
pinMode(moteurgauchevitesse, OUTPUT); // on defini le pin comme SORTIE
pinMode(moteurdroitavant, OUTPUT); // on defini le pin comme SORTIE
pinMode(moteurdroitarriere, OUTPUT); // on defini le pin comme SORTIE
pinMode(moteurdroitvitesse, OUTPUT); // on defini le pin comme SORTIE
}

void loop()
{
if (val >= 300) {
monte(); //Execut la fonction intitulée “monte” (voir ci-dessous)
Servo1.write(20); //On faire tourner le servo moteur qui est situé au pin 9 de 20° (et le maintien à 20°)
val = analogRead(sensorpin1); //On attribue la valeur prise par la capteur à val
}
///////////////////////////////////////Fin de la montée, début de la déscente
if (val < 300) {
descend(); //Execute la fonction intitulée “descend” (voir ci-dessous)
Servo1.write(20); //On montien le servo moteur à 20° (position dans laquel l’abre est le plus étendu)
val = 0; //On atribu la valeur 0 à la valeur du capteur pour rester dans la descente.
}
}

void monte() {
analogWrite(E1, vitesse); //on attribue la valeur analogique venant de la variable “vitesse” (255)
analogWrite(E2, vitesse); //on attribue la valeur analogique venant de la variable “vitesse” (255)
analogWrite(moteurdroitvitesse, vitesse); //on attribue la valeur analogique venant de la variable “vitesse” (255)
digitalWrite(moteurdroitarriere, LOW); //on attribue la valeur digitale “low” (0)
digitalWrite(moteurdroitavant, HIGH); //on attribue la valeur digitale “HIGH” (1)
digitalWrite(moteurgauchevitesse, LOW); //on attribue la valeur digitale à la vitesse “LOW” (0) pour signifier l’arrêt du moteur gauche
digitalWrite(M1, HIGH); //on attribue la valeur digital “HIGH” (1)
digitalWrite(M2, LOW); //on attribue la valeur digital “LOW” (0)
}

void descend() {
analogWrite(E1, vitesse); //on attribue la valeur analogique venant de la variable “vitesse” (255)
analogWrite(E2, vitesse); //on attribue la valeur analogique venant de la variable “vitesse” (255)
analogWrite(moteurdroitvitesse, vitesse); //on attribue la valeur analogique venant de la variable “vitesse” (255)
analogWrite(moteurgauchevitesse, vitesse); //on attribue la valeur analogique venant de la variable “vitesse” (255)
digitalWrite(moteurgaucheavant, LOW); //on attribue la valeur digitale “low” (0)
digitalWrite(moteurdroitavant, LOW); //on attribue la valeur digitale “low” (0)
digitalWrite(M1, LOW); //on attribue la valeur digitale “low” (0)
digitalWrite(moteurgauchearriere, HIGH); //on attribue la valeur digital “HIGH” (1)
digitalWrite(moteurdroitarriere, HIGH); //on attribue la valeur digital “HIGH” (1)
digitalWrite(M2, HIGH); //on attribue la valeur digital “HIGH” (1)
}

Can you please start using code tags for your code. Please read the forum rules if you don’t know what I mean.

Servos use timers. PWM uses timers. When you use a Servo, the timer that is used is no longer available for PWM. The Servo class disables PWM on pins 9 and 10. Maybe that's why your robot doesn't work.

Of course, "it doesn't work" is the lamest thing you can say on this forum. You need to explain EXACTLY what "it" does, and how that differs from what you want.

I’m really sorry for all my mistakes :-, i’m posting at the end of this post the program with the right tag, i’m sorry…

PaulS:
Servos use timers. PWM uses timers. When you use a Servo, the timer that is used is no longer available for PWM. The Servo class disables PWM on pins 9 and 10. Maybe that’s why your robot doesn’t work.

Of course, “it doesn’t work” is the lamest thing you can say on this forum. You need to explain EXACTLY what “it” does, and how that differs from what you want.

Thank you Pauls, when my robot starts, the servo works, it makes the robot grow up (that’s his function), and the 2 DC motors M1 and M2 work at the good moment, the two others, seems not to activate, it looks like, as you say, that the servo is taking the monopoly over the pins 9 and 10 so the motors can’t work …

That let me quite embarassed, i use nearly all my pins and can’t change the position of my pins (as i use the motor shield V2.0), and i can’t figure out how to control the DC motors without the PWM … I think this is the problem of my robot, if one could enlighten me on the way I could use this motors, I would be very thankfull.

Thank you,
Louis.

As i said, here is the code with the tag (code):

#include <Servo.h>        //On inclus la bibliothèque Servo.h pour controler les servomoteurs
Servo Servo1;
int pin_servo = 2;        // On attribue le pin digital 2 au serv omoteur.
int sensorpin1 = A0;      //On attribue le pin 0 au capteur
int E1 = 6;               //pin 6 --- motuer V1.2 E1 vitesse
int M1 = 7;               //pin 7 --- moteur V1.2 M1
int E2 = 5;               //pin 5 --- moteur v1.2 E2 vitesse
int M2 = 4;               //pin 4 --- moteur v1.2 M2
int moteurgaucheavant = 8;    // pin 8 --- moteur V2.0 gauche (+) cable rouge
int moteurgauchearriere = 11; // pin 11 --- moteur gauche (-) cable noir
int moteurgauchevitesse = 9;  // pin 9 --- signal vitesse moteur gauche
int moteurdroitavant = 12;    // pin 12 --- moteur droit (+) cable rouge
int moteurdroitarriere = 13;  // pin 13 --- moteur droit (-) cable noir
int moteurdroitvitesse = 10;  // pin 10 --- signal vitesse moteur droit

int vitesse = 255;            // Reglage de la vitesse du robot, attnetion, vitesse maximale (255)
int val = 500;            //On attribue à val la valeure 500

void setup()
{
  Servo1.attach(pin_servo);             //on attribu le pin 2 au servomoteur
  pinMode(M1, OUTPUT);                  // on defini le pin comme SORTIE
  pinMode(M2, OUTPUT);                  // on defini le pin comme SORTIE
  pinMode(moteurgaucheavant, OUTPUT);   // on defini le pin comme SORTIE
  pinMode(moteurgauchearriere, OUTPUT); // on defini le pin comme SORTIE
  pinMode(moteurgauchevitesse, OUTPUT); // on defini le pin comme SORTIE
  pinMode(moteurdroitavant, OUTPUT);    // on defini le pin comme SORTIE
  pinMode(moteurdroitarriere, OUTPUT);  // on defini le pin comme SORTIE
  pinMode(moteurdroitvitesse, OUTPUT);  // on defini le pin comme SORTIE
}

void loop()
{
  if (val >= 300) {
    monte();                           //Execut la fonction intitulée "monte" (voir ci-dessous)
    Servo1.write(20);                  //On faire tourner le servo moteur qui est situé au pin 9 de 20° (et le maintien à 20°)
    val = analogRead(sensorpin1);      //On attribue la valeur prise par la capteur à val
  }
  ///////////////////////////////////////Fin de la montée, début de la déscente
  if (val < 300) {
    descend();                         //Execute la fonction intitulée "descend" (voir ci-dessous)
    Servo1.write(20);                  //On montien le servo moteur à 20° (position dans laquel l'abre est le plus étendu)
    val = 0;                           //On atribu la valeur 0 à la valeur du capteur pour rester dans la descente.
  }
}

void monte() {
  analogWrite(E1, vitesse);                   //on attribue la valeur analogique venant de la variable "vitesse" (255)
  analogWrite(E2, vitesse);                   //on attribue la valeur analogique venant de la variable "vitesse" (255)
  analogWrite(moteurdroitvitesse, vitesse);   //on attribue la valeur analogique venant de la variable "vitesse" (255)
  digitalWrite(moteurdroitarriere, LOW);      //on attribue la valeur digitale "low" (0)
  digitalWrite(moteurdroitavant, HIGH);       //on attribue la valeur digitale "HIGH" (1)
  digitalWrite(moteurgauchevitesse, LOW);     //on attribue la valeur digitale à la vitesse "LOW" (0)  pour signifier l'arrêt du moteur gauche
  digitalWrite(M1, HIGH);                     //on attribue la valeur digital "HIGH" (1)
  digitalWrite(M2, LOW);                      //on attribue la valeur digital "LOW" (0)
}

void descend() {
  analogWrite(E1, vitesse);                   //on attribue la valeur analogique venant de la variable "vitesse" (255)
  analogWrite(E2, vitesse);                   //on attribue la valeur analogique venant de la variable "vitesse" (255)
  analogWrite(moteurdroitvitesse, vitesse);   //on attribue la valeur analogique venant de la variable "vitesse" (255)
  analogWrite(moteurgauchevitesse, vitesse);  //on attribue la valeur analogique venant de la variable "vitesse" (255)
  digitalWrite(moteurgaucheavant, LOW);       //on attribue la valeur digitale "low" (0)
  digitalWrite(moteurdroitavant, LOW);        //on attribue la valeur digitale "low" (0)
  digitalWrite(M1, LOW);                      //on attribue la valeur digitale "low" (0)
  digitalWrite(moteurgauchearriere, HIGH);    //on attribue la valeur digital "HIGH" (1)
  digitalWrite(moteurdroitarriere, HIGH);     //on attribue la valeur digital "HIGH" (1)
  digitalWrite(M2, HIGH);                     //on attribue la valeur digital "HIGH" (1)
}

if one could enlighten me on the way I could use this motors, I would be very thankfull.

You could use ServoTimer2, instead of Servo. As it's name implies, it uses a different timer. It is NOT exactly a drop-in replacement for Servo. Some code changes are needed.

ServoTimer2 will disable PWM on some other pins. Which ones I do not know offhand. Whether that matters, or not, to you, I don't know.