problème avec la puissance des moteurs de mon robot

bonjour

je boss sur un mini robot arduino mais voila mais il se fait que quand je ne donne pas la valeur de 255 aux pins EN du moteurs, la roue gauche ne tourne. et quand le pdonne la valeur 255, les roues tournent trop vite. j'aimerai pouvoir réguler la puissance des moteurs. j'utilse une carte Arduino UNO et un shield BB-L298 pour la gestion des moteurs

PS le code que j'utilse

#include <Servo.h>


/*DECLARATIONS EN LIEN AVEC LE MOTEUR*/
const int DOUT_MOTEUR_GAUCHE_EN  = 6;
const int moteurGaucheA = 5;
const int moteurGaucheR = 7;
const int DOUT_MOTEUR_DROIT_EN   = 9;
const int moteurDroitA = 8;
const int moteurDroitR = 10;
//DECLARATION EN LIEN AVEC LE CAPTEUR DISTANCE ET LE SERVOMOTEUR*/
const byte TRIGGER = 4; // broche TRIGGER
const byte ECHO = 2; // broche ECHO
//const unsigned long MEASURE_TIMEOUT = 25000UL;
//const float SOUND_SPEED = 340.0 / 1000;



float intervalle;
int distanceAvant;
float distanceDroite;
float distanceGauche;
const int delay_time = 250;

Servo myservo;


//DECLARATION VARIABLE DHT

void setup() {
 // put your setup code here, to run once:

 // initialisation de la communication série:
 Serial.begin(115200);
 pinMode(moteurGaucheA, OUTPUT);
 pinMode(moteurGaucheR, OUTPUT);
 pinMode(moteurDroitA, OUTPUT);
 pinMode(moteurDroitR, OUTPUT);
 digitalWrite(moteurGaucheA, LOW);
 digitalWrite(moteurGaucheR, LOW);
 digitalWrite(moteurDroitA, LOW);
 digitalWrite(moteurDroitR, LOW);
 // inialisation du capteur de distance et du servomoteur

 pinMode(TRIGGER, OUTPUT);
 //digitalWrite(TRIGGER, LOW);
 pinMode(ECHO, INPUT);
 myservo.attach(3);
 myservo.write(30);
 
  pinMode(DOUT_MOTEUR_GAUCHE_EN, OUTPUT);
 pinMode(DOUT_MOTEUR_DROIT_EN, OUTPUT);
}




//FONCTION MOTEURS
void avancer()
{
 analogWrite(DOUT_MOTEUR_GAUCHE_EN, 255); // les deux moteurs tournent à la même vitesse//
   analogWrite(DOUT_MOTEUR_DROIT_EN, 255);
   digitalWrite(moteurGaucheA, HIGH);
 digitalWrite(moteurGaucheR, LOW);


 digitalWrite(moteurDroitA, HIGH);
 digitalWrite(moteurDroitR, LOW);

}

void reculer()
{
 analogWrite(DOUT_MOTEUR_GAUCHE_EN , 255); // les deux moteurs tourne dans le sens opposé à celui qu'ils avait dans la commande pour avancer en ligne droite//
 analogWrite(DOUT_MOTEUR_DROIT_EN, 255);
 digitalWrite(moteurGaucheA, LOW);
 digitalWrite(moteurGaucheR, HIGH);
 
  //
 
 digitalWrite(moteurDroitA, LOW);
 digitalWrite(moteurDroitR, HIGH);
}
void arreter()
{
 analogWrite(DOUT_MOTEUR_GAUCHE_EN , 0); // les deux moteurs s'arrêtent //


 analogWrite(DOUT_MOTEUR_DROIT_EN, 0);
 digitalWrite(moteurGaucheA, LOW);
 digitalWrite(moteurGaucheR, LOW);
 
 digitalWrite(moteurDroitA, LOW);
 digitalWrite(moteurDroitR, LOW);
}
void pivoterGauche()
{
 analogWrite(DOUT_MOTEUR_GAUCHE_EN , 0); // le moteur gauche frenne en tournant dans le sens opposé à celui du moteur droit //
 digitalWrite(moteurGaucheA, LOW);
 digitalWrite(moteurGaucheR, HIGH);
 
 analogWrite(DOUT_MOTEUR_DROIT_EN, 255);
 
 digitalWrite(moteurDroitA, HIGH);
 digitalWrite(moteurDroitR, LOW);

 delay(250);
 
 analogWrite(DOUT_MOTEUR_GAUCHE_EN , 0); // les deux moteurs s'arrêtent //


 analogWrite(DOUT_MOTEUR_DROIT_EN, 0);
 digitalWrite(moteurGaucheA, LOW);
 digitalWrite(moteurGaucheR, LOW);
 
 digitalWrite(moteurDroitA, LOW);
 digitalWrite(moteurDroitR, LOW);
}
void pivoterDroite()
{
 analogWrite(DOUT_MOTEUR_GAUCHE_EN , 255); // le moteur gauche continue à tourner avec la même vitesse //
 digitalWrite(moteurGaucheA, HIGH);
 digitalWrite(moteurGaucheR, LOW);
 
 analogWrite(DOUT_MOTEUR_DROIT_EN, 0);
 
 digitalWrite(moteurDroitA, LOW);
 digitalWrite(moteurDroitR, HIGH);
 
 delay(250);

 analogWrite(DOUT_MOTEUR_GAUCHE_EN , 0); // les deux moteurs s'arrêtent //


 analogWrite(DOUT_MOTEUR_DROIT_EN, 0);
 digitalWrite(moteurGaucheA, LOW);
 digitalWrite(moteurGaucheR, LOW);
 
 digitalWrite(moteurDroitA, LOW);
 digitalWrite(moteurDroitR, LOW);
}

//FONCTIONs UTRASONs

void mesurerDistanceAvant()//controle direction droit du servocommande
{
 myservo.write(30);
 delay(delay_time);

 digitalWrite(TRIGGER, LOW);
 delayMicroseconds(10);
 digitalWrite(TRIGGER, HIGH);
 intervalle = pulseIn(ECHO, HIGH);

 /* 3 calcul la distance a partir du temps mesuré */

 distanceAvant = ((intervalle / 2) / 29.1);
 Serial.print(" Distance ");
 //distanceAvant = distance_mm / 10.0, 2;
 Serial.print(distanceAvant);
 //Serial.println("cm");


// delay(300);
}

void mesurerDistanceGauche()//controle direction droit du servocommande
{
 myservo.write(0);
 delay(delay_time);

 digitalWrite(TRIGGER, LOW);
 delayMicroseconds(10);
 digitalWrite(TRIGGER, HIGH);
 intervalle = pulseIn(ECHO, HIGH);

 /* 3 calcul la distance a partir du temps mesuré */

 distanceGauche = ((intervalle / 2) / 29.1);
 /*Serial.println("distance Gauche ");
 Serial.print(distanceGauche);
 Serial.print("cm de ");*/


 delay(300);
}

void mesurerDistanceDroite()//controle direction droit du servocommande
{
 myservo.write(60);
 delay(delay_time);

 digitalWrite(TRIGGER, LOW);
 delayMicroseconds(10);
 digitalWrite(TRIGGER, HIGH);
 intervalle = pulseIn(ECHO, HIGH);

 /* 3 calcul la distance a partir du temps mesuré */

 distanceDroite = ((intervalle / 2) / 29.1);
 /*Serial.println("distance Droite ");
 //distanceAvant = distance_mm / 10.0, 2;
 Serial.print(distanceAvant);
 Serial.print("cm de ");*/


 delay(300);
}
//FONCTION UTASONS

void modeUltrason()
{
 mesurerDistanceAvant();
 delay(delay_time);

 if (distanceAvant < 25) //Si la distance avant est de moins de 25cm
 {
   arreter();
   //"Obstacle à l'avant")
   
   delay(delay_time);
   mesurerDistanceGauche();
   delay(delay_time);
   mesurerDistanceDroite();
   delay(delay_time);
   //delay(delay_time);
   //reculer();
   //delay(delay_time);
   //pivoterGauche();
   //delay(delay_time);
   //avancer();
   if (distanceGauche < 15 && distanceDroite < 15) //Si la distance à gauche et la distance à droite sont de moins de 15cm
   {
     //Obstacles à gauche et à droite, reculer
     reculer();
     delay(500);
     pivoterGauche();
     delay(250);
   }
   else if (distanceGauche > distanceDroite) //Si la distance gauche est plus grande que la distance droite
   {
     //Obstacle à droite, tourner à gauche
     pivoterGauche();
     delay(250);
   }
   else if (distanceGauche <= distanceDroite) //Si la distance gauche est plus petite ou égale à la distance droite
   {
     //Obstacle à gauche, tourner à droite
     pivoterDroite();
     delay(250);
   }
 }

 else //Si la distance avant est de plus de 15cm
 {
  /* Serial.println("Aucun obstacle, continuer tout droit");
   Serial.println();*/
   
   avancer();
 }

}
void loop() {
 // put your main code here, to run repeatedly:
  modeUltrason();
}

Manque des infos... Alimentation des moteurs et de la carte ? Type des moteurs ? Quel Arduino?

Et la L298, c’est ce genre là?

Il y a bcp de delay() dans le code, c’est pas top pour un contrôle fin...

bonjour
merci pour la réponse

j'utilise un Arduino UNO. mes moteurs sont directement alimentés avec une pile 7.4V LIPO. pour le model du l298 que j'utilise voir figure. pour mes roues j'utilise deux moteurs Gearmotor a engrenage à courant continu. dés que je change la valeur

analogWrite(DOUT_MOTEUR_GAUCHE_EN, 255);
   analogWrite(DOUT_MOTEUR_DROIT_EN, 255);

en

analogWrite(DOUT_MOTEUR_GAUCHE_EN, 127);
   analogWrite(DOUT_MOTEUR_DROIT_EN, 127);

les roues ne tournent plus

https://www.olimex.com/Products/Robot-CNC-Parts/MotorDrivers/BB-L298/open-source-hardware

pour mes roues j'utilise deux moteurs Gearmotor a engrenage à courant continu

Vous avez un lien sur ces moteurs? quelles spécifications?

avez vous testé un code tout simple qui met une roue en marche à diverses vitesses, puis l'autre, puis les 2 - sans tout votre code autour?

je viens de le faire en faisant un boucle

for(int i =0;i<=255;i++)
{
  analogWrite(DOUT_MOTEUR_GAUCHE_EN, i); // les deux moteurs tournent à la même vitesse//
    analogWrite(DOUT_MOTEUR_DROIT_EN, i);
    digitalWrite(moteurGaucheA, HIGH);
  digitalWrite(moteurGaucheR, LOW);
  digitalWrite(moteurDroitA, HIGH);
  digitalWrite(moteurDroitR, LOW);
 
  }

mais la seul valeur de i qui fait tourner les deux roues est 255. j'ai aussi remarqué que je branche l'arduino directement au PC par câble les deux roues tournent a vitesse réduite.

https://shop.mchobby.be/fr/moteurs-continu/638-micro-moteur-1001-lp-axe-3mm-d-engrenage-metal-3232100006386-pololu.html

Pour les liens c'est pas la balise de code qu'il faut utiliser.... mais la balise de lien...

Si vous ne mettez qu'un seul moteur est-ce que ça marche? (j'imagine que vous faites le test sans charge sur le moteur)

quelle est la spec de votre batterie en terme de puissance / nombre de C?

Quelle est la puissance de vos moteurs? (sachant qu'il faut 0.4 A pour demarrer un moteur, la puissance minimale doit être de 4 watts pour demarrer les deux)
(si vous alimentez par l'USB, quelle est l'intensité maximale qu'elle peut fournir; sachant que l'Arduino consomme un peu pour foctionner)

les caractéristiques de ma batterie LiPo est : 1300mAh, 2S/7.4V, 9.6Wh, 25C

les caractéristiques des moteurs:

Bon, déjàn par l'USB (s'il fit 500 mA) vous ne pouvez pas garantir le démarrage simultané des deux moteurs.
Vous devriez réellement faire les tests préconisés par JML (un moteur tourne-t-il? peut -il changer de vitesse? idem pour l'autre moteur; puis pour les deux ensembles)
Une autre piste, peu probable: la carte montrée par JML en post 1 a un emplacement vide pour un electrochimique C3; peut être avez vous la même et faut il cabler un condensateur de filtrage basse fréquence

dbrion06:
Une autre piste, peu probable: la carte montrée par JML en post 1 a un emplacement vide pour un electrochimique C3; peut être avez vous la même et faut il cabler un condensateur de filtrage basse fréquence

Il semble qu'il ait cette carte, donc qui contiendrait le condensateur déjà

Pour ses moteurs la spec dit

Courant à vide (6v): 40 mA
Courant de blocage (6v): 360 mA

--> je ne pense pas qu'il faille 400mA pour démarrer un moteur, ça semblerait bcp

je dois faire quoi?

Tester un moteur, et son ralenti avec le programme simple dont vous disposez

Vous testerez là le moteur et le programme simple, dans des conditions les plus confortables possibles.

Tester l'autre moeteur, et son ralenti (mêmes conditions) : vous vérifierz si l'autre moteur est en bon état.

Tester les deux moteurs ensemble, avec le programme simple (démarrant, accélérant, ralentissant ensemble). Si ça échoue, on incriminera l'alimentation (et on n'aura pas à hésiter entre le logiciel, les moteurs ou l'alimentation) .

ok merci. je fais ca et je vous reviens

@JML: honte à moi et à la lecture rapide (j'ai effectivement mélangé deux lignes)

je comprend plus rien. quand j'applique une régulateur de tension sortie 4V entre les moteurs et la batterie, les moteurs tournent lentement(ce qui me convient pour mon projet). mais quand les moteurs sont directement connectés à la batterie, là il faut forcement que analogWrite soit à 255 pour que les moteurs tournent mais par contre ça tournent a fond.

je comprend rien. vous pouvez m'expliquez le mécanisme et comment? et quoi faire?

la spec à l'air de dire que vos moteurs fonctionnent à leur point optimal sous 6v.

Donc à 4V, si la puissance est limitée il se peut qu'ils tournent moins bien