Arduino moteur et ultrasons

Résolu
WiildLife Messages postés 92 Statut Membre -  
 Utilisateur anonyme -
Bonjour,
J'utilise l’Arduino , ainsi qu'un pont en H.
Mon problème est sur cette ligne de code :
if (range < 20) {
if (rangegauche < rangedroite) {
x = 0;
y = 255;
delay(700);
}

pour expliquer , range , rangegauche et rangedroite sont des capteurs a ultrasons placer sur une robot comme l'indique leur nom.La première partie du programme fonctionnent et n'a pas besoin de modification c'est un if dans if , si un obstacle est détecter devant le robot , il cherche si un obstacle est plus prés a droite ou a gauche et tourne en fonction.
Mais voila le problème et que mon robot ne tourne très peu car des que l'obstacle devant n'est plus a 20 cm et bien le robot se remet a avancer tout droit et se prend le mur. Ma première idée a donc était de mettre un delay afin de lui faire faire un 90° mais , ce delay affecte avant que les roues tourne , c'est a dire que il détecte un obstacle et tourne 700ms après , et ce n'est pas ce que je veux. Ce que je voudrais c'est que , lors de la détection de l'obstacle c'est qu'il tourne durant 700ms.
Voila j’espère avoir était claire et je m'excuse pour les fautes , merci d'avance et si vous avez des questions n'hésiter pas.

2 réponses

  1. Utilisateur anonyme
     
    Salut, il nous faudrait plus d'informations sur ton montage électrique (schéma) ainsi que le code complet si possible.
    0
    1. WiildLife Messages postés 92 Statut Membre 122
       
      Ok , pour le schéma electrique ca va être compliquer j'ai fais ca a l'envoler sans schéma particulier
      mais voici le code complet

      //Module GSM



      // Ici entrer le numéro
      // Ici le message

      //Vitesse des moteurs
      int x = 0; //roue droite
      int y = 0; //roue gauche
      //PIN Utiliser par le moteur
      int E1 = 5;
      int M1 = 4;
      int E2 = 6;
      int M2 = 7;

      // déclarations des variables pour l'ultrasons
      #include "Ultrasonic.h"
      int range;
      int rangegauche;
      int rangedroite;
      Ultrasonic ultrasonic(11);
      Ultrasonic ultrasonicgauche(8);
      Ultrasonic ultrasonicdroite(9);

      void setup()
      {
      //Module GSM

      // sendSMS();

      //initialisation a 9600 baud
      Serial.begin(9600);

      // Moteur 1 et Moteur 2 déclarer comme des sorties afins de les alimenters.
      pinMode(M1, OUTPUT);
      pinMode(M2, OUTPUT);
      }


      void loop()
      {
      //Capteur a ultraons devant
      long range;
      range = ultrasonic.MeasureInCentimeters(); // Mesure en centimetre
      Serial.print(range);//Afficher dans le moniteur série la distance de 0 a 400cm
      Serial.println(" cmdevant");

      //Capteur a ultraons droite
      long rangedroite;
      rangedroite = ultrasonicdroite.MeasureInCentimeters(); // two measurements should keep an interval
      Serial.print(rangedroite);//0~400cm
      Serial.println(" cmdroite");
      //Capteur a ultraons gauche
      long rangegauche;
      rangegauche = ultrasonicgauche.MeasureInCentimeters(); // two measurements should keep an interval
      Serial.print(rangegauche);//0~400cm
      Serial.println(" cmgauche");


      // Moteur 1 et 2 initialiser vers l'avant , puis leur vitesse en fonction du x et y dans les if
      digitalWrite(M1, LOW);
      digitalWrite(M2, LOW);
      analogWrite(E1, x); //PWM Speed Control
      analogWrite(E2, y); //PWM Speed Control



      if (range < 20) {
      if (rangegauche < rangedroite) {
      delay(700);
      x = 0;
      y = 255;
      }
      else {
      delay(700);
      x = 255;
      y = 0;
      }
      }
      else {
      x = 255;
      y = 255;
      } ç
      if ( (rangedroite < 10) && (rangegauche < 10) && (range < 10) ) {
      digitalWrite(M1, HIGH);
      digitalWrite(M2, HIGH);
      delay(5000);
      x = 255;
      y = 255;

      }
      }
      // Mini programme pour envoyer les messages
      0
  2. Utilisateur anonyme
     
    Je ne peut pas tester mais essai dans cette idée :


    //PIN Utiliser par le moteur
    int E1 = 5;
    int M1 = 4;
    int E2 = 6;
    int M2 = 7;

    // déclarations des variables pour l'ultrasons
    #include "Ultrasonic.h"
    long range;
    long rangegauche;
    long rangedroite;

    Ultrasonic ultrasonic(11);
    Ultrasonic ultrasonicgauche(8);
    Ultrasonic ultrasonicdroite(9);

    void setup()
    {

    // Moteur 1 et Moteur 2 déclarer comme des sorties afins de les alimenters.
    Serial.begin(9600);
    pinMode(M1, OUTPUT);
    pinMode(M2, OUTPUT);

    }

    void loop()
    {

    mesureCapteur(range);
    mesureCapteur(rangegauche);
    mesureCapteur(rangedroite);

    digitalWrite(M1, LOW);
    digitalWrite(M2, LOW);

    // Rotation Gauche
    if (range < 20 and (rangegauche < rangedroite)) {
    rotationMoteur(0, 255);
    }

    // Rotation Droite
    if (range < 20 and (rangedroite < rangegauche)) {
    rotationMoteur(255, 0);
    }

    // Avancer
    if (range >= 20) {
    analogWrite(E1, 255); //PWM Speed Control
    analogWrite(E2, 255); //PWM Speed Control
    }

    }

    void rotationMoteur(long x, long y) {

    // ICI REGLE LE TEMPS DE ROTATION EN CHANGANT ""100""
    for (int i = 0; i < 100; i ++) {
    analogWrite(E1, x);
    analogWrite(E2, y);
    delay(5);
    }

    }

    void mesureCapteur(long capteur) {

    capteur = ultrasonicdroite.MeasureInCentimeters();
    Serial.print(capteur);
    Serial.println(" cmdroite");
    }
    0
    1. WiildLife Messages postés 92 Statut Membre 122
       
      Ok super intelligent , je n'y avais pas du tout penser , merci beaucoup j'essaye et je communique le résultats merci encore !
      0
    2. WiildLife Messages postés 92 Statut Membre 122
       
      Et bien le résultats est super , c'est exactement ce qu'il me fallait , merci beaucoup a toi , voici le programme final avec quelque modification pour les intéressé.




      //Module GSM



      // Ici entrer le numéro
      // Ici le message

      //Vitesse des moteurs
      int x = 0; //roue droite
      int y = 0; //roue gauche
      //PIN Utiliser par le moteur
      int E1 = 5;
      int M1 = 4;
      int E2 = 6;
      int M2 = 7;

      // déclarations des variables pour l'ultrasons
      #include "Ultrasonic.h"
      int range;
      int rangegauche;
      int rangedroite;
      Ultrasonic ultrasonic(11);
      Ultrasonic ultrasonicgauche(8);
      Ultrasonic ultrasonicdroite(9);

      void setup()
      {
      //Module GSM

      // sendSMS();

      //initialisation a 9600 baud
      Serial.begin(9600);

      // Moteur 1 et Moteur 2 déclarer comme des sorties afins de les alimenters.
      pinMode(M1, OUTPUT);
      pinMode(M2, OUTPUT);
      }


      void loop()
      {
      //Capteur a ultraons devant
      long range;
      range = ultrasonic.MeasureInCentimeters(); // Mesure en centimetre
      Serial.print(range);//Afficher dans le moniteur série la distance de 0 a 400cm
      Serial.println(" cmdevant");

      //Capteur a ultraons droite
      long rangedroite;
      rangedroite = ultrasonicdroite.MeasureInCentimeters(); // two measurements should keep an interval
      Serial.print(rangedroite);//0~400cm
      Serial.println(" cmdroite");
      //Capteur a ultraons gauche
      long rangegauche;
      rangegauche = ultrasonicgauche.MeasureInCentimeters(); // two measurements should keep an interval
      Serial.print(rangegauche);//0~400cm
      Serial.println(" cmgauche");


      // Moteur 1 et 2 initialiser vers l'avant , puis leur vitesse en fonction du x et y dans les if
      digitalWrite(M1, LOW);
      digitalWrite(M2, LOW);
      analogWrite(E1, x); //PWM Speed Control
      analogWrite(E2, y); //PWM Speed Control


      // Rotation Gauche
      if (range < 20 && (rangegauche < rangedroite)) {
      rotationMoteur(0, 255);
      }
      // Rotation Droite
      if (range < 20 && (rangedroite < rangegauche)) {
      rotationMoteur(255, 0);
      }
      // Avancer
      if (range >= 20) {
      analogWrite(E1, 255); //PWM Speed Control
      analogWrite(E2, 255); //PWM Speed Control
      }
      //Reculer
      if ( (rangedroite < 10) && (rangegauche < 10) && (range < 10) ) {
      digitalWrite(M1, HIGH);
      digitalWrite(M2, HIGH);
      rotationMoteur(255, 255);


      }

      }
      // Mini programme pour envoyer les messages


      void rotationMoteur(long x, long y) {

      // ICI REGLE LE TEMPS DE ROTATION EN CHANGANT ""100""
      for (int i = 0; i < 250; i ++) {
      analogWrite(E1, x);
      analogWrite(E2, y);
      delay(5);
      }

      }
      0
    3. Utilisateur anonyme
       
      Merci pour le retour, je marque ton poste comme résolu.
      0