Robot 2 moteurs, seul le gauche tourne

Je suis a monter un robot avec Arduino, sensor shield v5, ultrason et servo 90, L298N et 2 petits moteurs 3-6V.

Les moteurs sont alimentés avec 7.4V lithium-ion et Arduino Uno R3 + shield avec une pile 9V.

J’ai fait passer des tests de fonctionnement au groupe moteur -ça fonctionne. Le test pour le groupe sensor shield + servo + ultrason est aussi un succès.

Mais voila, lorsque je veux ralentir mes moteurs, seul celui de gauche tourne. Sûrement lié avec mon code, mais je ne vois pas comment le corriger.

Pouvez-vous regarder cela et me dire ou ça cloche?

Voici le code en attachement:

Merci pour votre aide,

Avoid_obstacle_robot_speed_modifie.ino (3.83 KB)

Salut,

Je comprend pas le fonctionnement du programme, surtout dans la boucle loop, pourquoi ne pas appeler des fonctions en fonctions du capteur ultra-son et il doit faire quoi exactement le robot ?.

Voici un exemple de programme qui réalise un suivi de ligne au sol, en utilisant deux capteurs de suivi de ligne.

//Déclraration des varaiables

// Gestion carte moteurs CC
const int vitesseMotA=3; // Constante pour la broche 3
const int sensMotA=12; // Constante pour la broche 12
const int freinMotA=9; // Constante pour la broche 9

const int vitesseMotB=11; // Constante pour la broche 11
const int sensMotB=13; // Constante pour la broche 13
const int freinMotB=8; // Constante pour la broche 8

// Capteurs suivi de ligne
int suivi_G;
int suivi_D;

bool boucle=false;
long temps1;
long temps2;

void setup()
{
 pinMode (vitesseMotA,OUTPUT); // Broche vitesseMotA configurée en sortie
 pinMode (freinMotA,OUTPUT); // Broche freinMotA configurée en sortie
 pinMode (sensMotA,OUTPUT); // Broche sensMotA configurée en sortie
 pinMode (vitesseMotB,OUTPUT); // Broche vitesseMotA configurée en sortie
 pinMode (freinMotB,OUTPUT); // Broche freinMotA configurée en sortie
 pinMode (sensMotB,OUTPUT); // Broche sensMotA configurée en sortie
 pinMode (48, INPUT_PULLUP); // Bonton poussoir de mise en route du robot
 pinMode (4,INPUT);// capteur suivi de ligne gauche broche 4
 pinMode (5,INPUT);// capteur suivi de ligne droite broche 5
 Serial.begin(9600);
 temps1=millis();
  
}

void loop()
{
  int sensorVal = !digitalRead(48); //inversion de la logique du BP du fait du Pullup interne
  
  if ((sensorVal == HIGH || boucle==true))
  {
    digitalWrite(freinMotA, LOW);// desactivation frein
    digitalWrite(freinMotB, LOW);// desactivation frein
    suivi_G=digitalRead(4);
    suivi_D=digitalRead(5);
      if (suivi_G==1)
       {
        Serial.println("Gauche");
        gauche(150);
       }
      else if (suivi_D==1)
       {
        Serial.println("Droite");
        droite(150);
       }
      else
       {
        Serial.println("Avant");        
        avant(200);
       } 
    boucle=true;
  }
  
   
}

void avant (int PWM)
{
digitalWrite(sensMotA,LOW); // sens 1
analogWrite(vitesseMotA, PWM); 
digitalWrite(sensMotB,LOW); // sens 1
analogWrite(vitesseMotB, PWM); // 
}

void arret()
{
 digitalWrite(freinMotA, HIGH);
 digitalWrite(freinMotB, HIGH);
}

void droite (int PWM)
{
digitalWrite(sensMotA,LOW); // sens 1
analogWrite(vitesseMotA, PWM); 
digitalWrite(sensMotB,HIGH); // sens 2
analogWrite(vitesseMotB, PWM);  
}

void gauche (int PWM)
{
digitalWrite(sensMotA,HIGH); // sens 2
analogWrite(vitesseMotA, PWM); 
digitalWrite(sensMotB,LOW); // sens 1
analogWrite(vitesseMotB, PWM); 
}

hello
tu as mélangé pas mal de choses
plus 3 lignes en double qui rendaient le prg incohérent.
tu te plantais dans la façon d’appeler les fonctions.
je ne sais pas s’il est fonctionnel, mais voici ton prg tel que tu aurais du le faire
j’ai ajouté une variable pour modifier la vitesse des déplacements. à toi de t’inspirer de cela pour éventuellement demander des vitesses différentes selon les mouvement que le prg demande

#include <Servo.h> 
#include "NewPing.h"

// Pins on Sensor Shield v5.0
#define SONAR_SERVO_PIN 4
#define TRIGGER_PIN     A0
#define ECHO_PIN        A1

#define MAX_DISTANCE    200

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
Servo myServo;

// Motor A [Right Side]
const int enA = 10;
const int in1 = 9;//avant
const int in2 = 8;//arriere
// Motor B [Left Side]
const int enB = 5;
const int in3 = 7;//avant
const int in4 = 6;//arriere

const int triggerDistance = 20;

// Variables
unsigned int time;            
int distance;                
int fDistance;    //front side           
int lDistance;    //left side           
int rDistance;    //right side           


char dist[3];
char rot[3];
int rotation = 0;
String output = "";

int vitesse_des_moteurs =100;//c'est ici qu'il faut modifier la vitesse des moteurs pour toutes les fonctions

void setup() 
{ 
  pinMode (TRIGGER_PIN, OUTPUT);
  pinMode (ECHO_PIN, INPUT);
  myServo.attach(SONAR_SERVO_PIN);  // Attaches the Servo to the Servo Object 

  // motor control pins outputs
  pinMode(enA, OUTPUT);
  pinMode(enB, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
} 

void loop()
{
  scan();                          //lecture ultra sons        
  fDistance = distance;            //memo de la distance
  if(fDistance < triggerDistance)  //si la distance frontale est trop courte
  {
    movebackward(vitesse_des_moteurs);             //en arriere
    delay(1000);
    moveright(vitesse_des_moteurs);                //a droite
    delay(300);
      movestop();                  //stoppe les mouvements
    
    scan();                        //lecture ultra sons
    rDistance = distance;          //memo de la distance de droite
    moveLeft(vitesse_des_moteurs);                 //a gauche 

    delay(500);
    moveStop();                    //stoppe les mouvements
    
     
    scan();                        //lecture ultra sons
    lDistance = distance;          //memo de la distance de gauche
   
   
if(lDistance < rDistance)         //si le mobile est trop a gauche
{
    moveRight(vitesse_des_moteurs);               //a doite
    delay(1000);                  //en avant
    moveForward(vitesse_des_moteurs);
}
else                              //sinon, le module est considere comme etant droit
{
    moveForward(vitesse_des_moteurs);             //en avant
}


void scan()                      //analyse ultras sons
{
  int deg = 90;
  myServo.write(deg);
  delay(10);

  time = sonar.ping();
  distance = time / US_ROUNDTRIP_CM;
  delay(10);
  if(distance <= 0){
    distance = triggerDistance;
  }
  delay(30);
}

void moveForward(int speed)    //fonction avance du mobile
{
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  analogWrite(enA, speed);
  analogWrite(enB, speed);
}

void moveBackwards(int speed) //fonction recul du mobile
{
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);
  analogWrite(enA, speed);
  analogWrite(enB, speed);
}

void moveRight(int speed)   //fonction mobile a droite
{
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  analogWrite(enA, speed);
  analogWrite(enB, speed);
}

void moveLeft(int speed)    //fonction mobile a gauche
{
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
  analogWrite(enA, speed);
  analogWrite(enB, speed);
}

void moveStop()             //fonction arret mobile
{
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);  
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
  delay(200);
}

Merci pour ton aide dfgh,

Après avoir fait les changements comme tu me les proposes, le programme bloque a la ligne 57: scan(); -juste après void loop() {. Le message du compilateur est: scan was not declared in this scope.

Avant les modifications, ca ne bloquait pas.

Peux-tu me dire pourquoi?

ca ne bloquait pas parce que tu n’appelais pas les fonctions

il y avait des fautes entre les noms des déclarations des fonctions et le nom utilisé pour les appeler.

après, il faut aussi que tu cherches à comprendre …c’est aussi le but

#include <Servo.h> 
#include "NewPing.h"

// Pins on Sensor Shield v5.0
#define SONAR_SERVO_PIN 4
#define TRIGGER_PIN     A0
#define ECHO_PIN        A1

#define MAX_DISTANCE    200

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
Servo myServo;

// Motor A [Right Side]
const int enA = 10;
const int in1 = 9;//avant
const int in2 = 8;//arriere
// Motor B [Left Side]
const int enB = 5;
const int in3 = 7;//avant
const int in4 = 6;//arriere

const int triggerDistance = 20;

// Variables
unsigned int time;            
int distance;                
int fDistance;    //front side           
int lDistance;    //left side           
int rDistance;    //right side           


char dist[3];
char rot[3];
int rotation = 0;
String output = "";

int vitesse_des_moteurs =100;//c'est ici qu'il faut modifier la vitesse des moteurs pour toutes les fonctions

void setup() 
{ 
  pinMode (TRIGGER_PIN, OUTPUT);
  pinMode (ECHO_PIN, INPUT);
  myServo.attach(SONAR_SERVO_PIN);  // Attaches the Servo to the Servo Object 

  // motor control pins outputs
  pinMode(enA, OUTPUT);
  pinMode(enB, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
} 

void loop()
{
  scan();                          //lecture ultra sons        
  fDistance = distance;            //memo de la distance
  if(fDistance < triggerDistance)  //si la distance frontale est trop courte
  {
    moveBackwards(vitesse_des_moteurs);             //en arriere
    delay(1000);
    moveRight(vitesse_des_moteurs);                //a droite
    delay(300);
      moveStop();                  //stoppe les mouvements
    
    scan();                        //lecture ultra sons
    rDistance = distance;          //memo de la distance de droite
    moveLeft(vitesse_des_moteurs);                 //a gauche 

    delay(500);
    moveStop();                    //stoppe les mouvements
  }  
     
    scan();                        //lecture ultra sons
    lDistance = distance;          //memo de la distance de gauche
   
   
if(lDistance < rDistance)         //si le mobile est trop a gauche
{
    moveRight(vitesse_des_moteurs);               //a doite
    delay(1000);                  //en avant
    moveForward(vitesse_des_moteurs);
}
else                              //sinon, le module est considere comme etant droit
{
    moveForward(vitesse_des_moteurs);             //en avant
}

  }
void scan()                      //analyse ultras sons
{
  int deg = 90;
  myServo.write(deg);
  delay(10);

  time = sonar.ping();
  distance = time / US_ROUNDTRIP_CM;
  delay(10);
  if(distance <= 0){
    distance = triggerDistance;
  }
  delay(30);
}

void moveForward(int speed)    //fonction avance du mobile
{
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  analogWrite(enA, speed);
  analogWrite(enB, speed);
}

void moveBackwards(int speed) //fonction recul du mobile
{
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);
  analogWrite(enA, speed);
  analogWrite(enB, speed);
}

void moveRight(int speed)   //fonction mobile a droite
{
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  analogWrite(enA, speed);
  analogWrite(enB, speed);
}

void moveLeft(int speed)    //fonction mobile a gauche
{
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
  analogWrite(enA, speed);
  analogWrite(enB, speed);
}

void moveStop()             //fonction arret mobile
{
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);  
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
  delay(200);
}

Ca ne donne pas le résultat escompté. Quand le robot est en mode forward: les 2 moteurs tournent mais lorsqu'il détecte un obstacle et qu'il doive reculer, tourner a droite ou a gauche, seul le moteur de gauche fonctionne.

De plus, que je mette n'importe quelle valeur a la variable vitesse, il avance toujours au maximum.

As-tu une idée de ce qui cause ces problèmes?

c'est peut être un problème de hard, et de plus, il faut que tu t'impliques dans ton code

le code n'est pas bien compliqué, si tu l'as pompé sur le net, s'applique t'il vraiment à ton hard?