Partage
  • Partager sur Facebook
  • Partager sur Twitter

Projet véhicule autonome

Sujet résolu
    10 janvier 2015 à 0:32:25

    Bonsoir a tous,

    J'aimerai faire un petit véhicule autonome, qui ce déplace tous seule et évite les obstacles pour le moment voila ce que j'ai comme matériels:

    _Une carte Arduino Leonardo
    _Un capteur a ultra-son URM37 V3.2 ( j'ai fait quelques teste avec mais mes limites de programmation de l'arduino son limité )
    _Un chassie 3 roues avec 2 moteurs a courant continue ( 2 roues motrices et une directrice sans moteur )
    _Un Arduino Dual Stepper Motor Driver Shield 
    _Des Ponts en H L298N
    _Des batteries de 6V 2A/H
    _Et un bon stocke de composants électronique résistances, condensateurs, LEDs,....


    Voila ce que j'ai comme matériels pour le moment, le seule problème je sais utiliser le capteur a Ultra-son pour qu'il me dise sur l'ordinateur a quel distance il y a un objet mais je ne sais pas comment faire pour faire fonctionné mes moteurs et qu'il puissent contourner des obstacles suivant son 
    environnement. 

    Si qu'elle qu'un pourrai m'expliqué afin que je progresse en programmation ça serai aussi pas mal.

    Merci d'avance et bonne soirée a tous.
    Bonne année 2015 ;)
    • Partager sur Facebook
    • Partager sur Twitter
      10 janvier 2015 à 14:49:09

      Il te suffit de regarder la distance et agir en conséquence ;)

      Si la distance est faible, il te faut tourner en n'actionnant qu'un des deux moteurs.

      Le code ressemble donc à ça :

      Setup:
          // Ta fonction setup de l'arduino
      
      
      
      Loop:
      
          distance = MesurerDistance();
      
          Si [ distance > 50cm ] :
              MoteurDroit(AVANCER);
              MoteurGauche(AVANCER);
              delay(100);
      
          Sinon, si [ distance > 10cm ] :
              MoteurDroit(AVANCER);
              MoteurGauche(RECULER);
              delay(20);
      
          Sinon :
              MoteurDroit(RECULER);
              MoteurGauche(RECULER);
              delay(1000);
      
      

      Avec ce code, ton arduino fait des mesures et des actions en boucle.

      A chaque début de bout, il fait une mesure et agit de la sorte :

      - si la distance est supérieur à 50cm : il actionne les 2 moteurs dans le sens avancer et fait un delay de 100ms => il avance pendant 100ms

      - si la distance est entre 10 et 50cm : il actionne un moteur dans un sens et l'autre dans l'autre sens puis fait un delay de 20ms => il tourne sur lui même pendant 20ms

      - si la distance est plus petite que 10cm : il actionne les 2 moteurs dans le sens reculer et fait un delay de 1000ms => il recule pendant 1000ms

      Tu noteras que le temps pour reculer est assez long, c'est pour permettre au robot de s'éloigner suffisamment de l'objet avant de refaire la prochaine détection.

      Au final, tu devrais avoir des déplacements qui ressemble à ça : https://www.youtube.com/watch?v=TEBwA7ePpf0

      -
      Edité par lorrio 10 janvier 2015 à 14:52:28

      • Partager sur Facebook
      • Partager sur Twitter
        10 janvier 2015 à 17:39:18

        Bonjour, merci a vous.

        • Vous savais par hasard comment je dois connecté le URM37 V3.2 ?
        • Je suis perdu moi sais au niveau du code général et savoir quoi utiliser sois le Dual Stepper Motor Driver Shield  ou le pont en H
        • Car allumer une led sais bien, utilisé le URM37 V3.2 avec le pc ça aussi sais bon.

        Ce qu'il me pause problème sais la communication entre ces différents périphériques.

        Merci d'avance pour votre réponse.

        • Partager sur Facebook
        • Partager sur Twitter
          10 janvier 2015 à 19:11:37

          Pour ton URM37, tout est là : http://www.dfrobot.com/wiki/index.php/URM37_V3.2_Ultrasonic_Sensor_%28SKU:SEN0001%29


          Un motor shield, c'est un circuit qui contient un pont en H et tout ce qui va autour pour le faire fonctionner.

          Le L298N, c'est uniquement un pont en H.

          Du coup, je te conseille vivement d'utiliser le shield, tu n'auras pas à te faire ***** à rajouter des composants à cotés ;)


          Je ne vais pas te donner un code tout fait, prêt à copié/collé.

          C'est à toi de faire ton propre code, et le poster ici si tu veux que je te donne mon avis dessus.

          Si tu ne t'en sens pas capable, le mieux serait de procéder par étape.

          Voici donc ce que je te propose comme étape :

          1/ Faire un code qui lit la valeur du capteur et allume une LED si la distance est de moins de 50cm

          2/ Faire un code qui fait avancer les moteurs pendant 2 seocndes, puis reculer pendant 2 secondes

          • Partager sur Facebook
          • Partager sur Twitter
            11 janvier 2015 à 16:57:05

            Bonjour j'ai une carte avec un double pont en H il y a un ans je l'utilisé mais j'ai tous perdu... 

            Je sais pas pourquoi pourtant sais quelque chose que me tiens a coeur donc je vais faire comme vous me dite pour procédé par étape je vous tiens au courant dans quelque instant.

            Merci

            • Partager sur Facebook
            • Partager sur Twitter
              11 janvier 2015 à 18:03:08

              Pour l'URM37 sais bon: 

              // # Editor    :Jiang from DFRobot
              // # Data      :18.09.2012
               
              // # Product name:ultrasonic scanner 
              // # Product SKU:SEN0001
              // # Version :  0.2
               
              // # Description:
              // # The Sketch for scanning 180 degree area 4-500cm detecting range
               
              // # Connection:
              // #       Pin 1 VCC (URM V3.2) -> VCC (Arduino)
              // #       Pin 2 GND (URM V3.2) -> GND (Arduino)
              // #       Pin 4 PWM (URM V3.2) -> Pin 3 (Arduino)
              // #       Pin 6 COMP/TRIG (URM V3.2) -> Pin 5 (Arduino)
              // #       
              int URPWM = 3; // PWM Output 0-25000US,Every 50US represent 1cm
              int URTRIG=5; // PWM trigger pin
              int led=2; // LED pin 2 Arduino
              
              unsigned int Distance=0;
              uint8_t EnPwmCmd[4]={0x44,0x02,0xbb,0x01};    // distance measure command
               
              void setup(){                                 // Serial initialization
                Serial.begin(9600);                        // Sets the baud rate to 9600
                pinMode(led, OUTPUT);                      // led en sortie
                digitalWrite(led, LOW);                    // led a l'état 0
                PWM_Mode_Setup();
              }
               
              void loop()
              {
               PWM_Mode();
               delay(20);
               if ( Distance<=50){           // condition ditance plus petit ou égal a 50 cm allamge de la led 
                 digitalWrite(led,HIGH);     // état 1 de la LED
                 }
                 else {                      // condition Sinon 
                 digitalWrite(led, LOW);     // état 0 de la LED  
                 }
               
              }                      //PWM mode setup function
               
              void PWM_Mode_Setup(){ 
                pinMode(URTRIG,OUTPUT);                     // A low pull on pin COMP/TRIG
                digitalWrite(URTRIG,HIGH);                  // Set to HIGH
                
                pinMode(URPWM, INPUT);                      // Sending Enable PWM mode command
                
                for(int i=0;i<4;i++){
                    Serial.write(EnPwmCmd[i]);
                 } 
              }
               
              void PWM_Mode(){                              // a low pull on pin COMP/TRIG  triggering a sensor reading
                  digitalWrite(URTRIG, LOW);
                  digitalWrite(URTRIG, HIGH);               // reading Pin PWM will output pulses
                   
                  unsigned long DistanceMeasured=pulseIn(URPWM,LOW);
                   
                  if(DistanceMeasured==50000){              // the reading is invalid.
                    Serial.print("Invalid");    
                 }
                  else{
                    Distance=DistanceMeasured/50;           // every 50us low level stands for 1cm
                 }
                Serial.print("Distance=");
                Serial.print(Distance);
                Serial.println("cm");
              }

              Donc voila cela marche donc je vais faire fonctionner maintenant mes deux moteur C.C avec le pont en H.

              • Partager sur Facebook
              • Partager sur Twitter
                11 janvier 2015 à 18:14:40

                Voila qui est un bon début.

                N'oublies pas de virer tes Serial.print pour le programme final ;)

                • Partager sur Facebook
                • Partager sur Twitter
                  11 janvier 2015 à 18:40:11

                  Euh ça faudrait m'expliqué après... car je début donc je suis pas trop au courant merci ;)

                  Faut que je cherche un programme....

                  • Partager sur Facebook
                  • Partager sur Twitter
                    11 janvier 2015 à 19:38:08

                    Re donc voila pour le contrôles des moteurs :)

                    int EA = 10;
                    int I1 = 8;
                    int I2 = 9;
                    int EB = 5;
                    int I3 = 3;
                    int I4 = 4;
                    
                    void setup()
                    {
                      pinMode(EA,OUTPUT);
                      pinMode(EB,OUTPUT);
                      pinMode(I1,OUTPUT);
                      pinMode(I2,OUTPUT);
                      pinMode(I3,OUTPUT);
                      pinMode(I4,OUTPUT);
                    }
                    void loop()
                    {
                      digitalWrite(I1,HIGH);
                      digitalWrite(I2,LOW);
                      digitalWrite(I3,HIGH);
                      digitalWrite(I4,LOW);
                      analogWrite(EA, 255);
                      analogWrite(EB, 255);
                      delay(5000);
                      digitalWrite(I1,LOW);
                      digitalWrite(I2,HIGH);
                      digitalWrite(I3,LOW);
                      digitalWrite(I4,HIGH);
                      analogWrite(EA, 255);
                      analogWrite(EB, 255);
                      delay(5000);
                      
                    }



                    • Partager sur Facebook
                    • Partager sur Twitter
                      11 janvier 2015 à 20:00:29

                      Et bien si ça marche, il ne reste plus qu'à fusionner ces deux programmes ;)

                      • Partager sur Facebook
                      • Partager sur Twitter
                        11 janvier 2015 à 21:56:16

                        Voila la fin :) Programme final:

                        int URPWM = 6; 
                        int URTRIG=11; 
                        int EA = 10;
                        int I1 = 8;
                        int I2 = 9;
                        int EB = 5;
                        int I3 = 3;
                        int I4 = 4;
                         
                        unsigned int Distance=0;
                        uint8_t EnPwmCmd[4]={0x44,0x02,0xbb,0x01};    
                        
                        void setup(){                                 
                          Serial.begin(9600);                         
                          pinMode(EA,OUTPUT);
                          pinMode(EB,OUTPUT);
                          pinMode(I1,OUTPUT);
                          pinMode(I2,OUTPUT);
                          pinMode(I3,OUTPUT);
                          pinMode(I4,OUTPUT);
                          PWM_Mode_Setup();
                        }
                         
                        void loop()
                        {
                         PWM_Mode();
                         delay(20);
                         if ( Distance<=20){ 
                           digitalWrite(I1,HIGH);
                          digitalWrite(I2,LOW);
                          digitalWrite(I3,LOW);
                          digitalWrite(I4,HIGH);
                          analogWrite(EA, 200);
                          analogWrite(EB, 200);
                          delay(1300);
                           }
                           else {                      
                           digitalWrite(I1,HIGH);
                          digitalWrite(I2,LOW);
                          digitalWrite(I3,HIGH);
                          digitalWrite(I4,LOW);
                          analogWrite(EA, 255);
                          analogWrite(EB, 255);
                           }          
                           
                        }                      
                         
                        void PWM_Mode_Setup(){ 
                          pinMode(URTRIG,OUTPUT);                     
                          digitalWrite(URTRIG,HIGH);                  
                          
                          pinMode(URPWM, INPUT);     
                          
                          for(int i=0;i<4;i++){
                              Serial.write(EnPwmCmd[i]);
                           } 
                        }
                         
                        void PWM_Mode(){                              
                            digitalWrite(URTRIG, LOW);
                            digitalWrite(URTRIG, HIGH);               
                             
                            unsigned long DistanceMeasured=pulseIn(URPWM,LOW);
                             
                            if(DistanceMeasured==50000){              
                              Serial.print("Invalid");    
                           }
                            else{
                              Distance=DistanceMeasured/50;           
                           }
                          Serial.print("Distance=");
                          Serial.print(Distance);
                          Serial.println("cm");
                        }



                        • Partager sur Facebook
                        • Partager sur Twitter
                          12 janvier 2015 à 7:56:01

                          Comme je te l'ai dis, tu devrais virer les Serial.print qui ne te servent plus à rien et qui ralentissent ton programme.

                          Ou alors, tu peux les mettre dans un #if de façon à pouvoir les désactiver à la compilation.

                          Je pourrais aussi faire quelques fonctions en plus et/ou revoir le nom de certaines de façon à avoir un code plus claire.

                          Rajouter quelques constantes ne fera pas de mal non plus (cela évite les boulettes).

                          Voici ce que je peux te proposer :

                          // Activation ou non des prints (mettre 0 pour le programme finale)
                          #define ENABLE_DEBUG_PRINT 0
                          
                          
                          const int URPWM = 6;
                          const int URTRIG = 11;
                          const int EA = 10;
                          const int I1 = 8;
                          const int I2 = 9;
                          const int EB = 5;
                          const int I3 = 3;
                          const int I4 = 4;
                          
                          
                          unsigned int Distance = 0;
                          uint8_t EnPwmCmd[4] = {0x44, 0x02, 0xbb, 0x01};   
                          
                          
                          void setupMotor() {
                          	pinMode(EA,OUTPUT);
                          	pinMode(EB,OUTPUT);
                          	pinMode(I1,OUTPUT);
                          	pinMode(I2,OUTPUT);
                          	pinMode(I3,OUTPUT);
                          	pinMode(I4,OUTPUT);
                          }
                          
                          
                          void setupSensor() {
                          	pinMode(URTRIG,OUTPUT);
                          	digitalWrite(URTRIG,HIGH);
                          	pinMode(URPWM, INPUT);
                          }
                          
                          
                          
                          void setup() {
                          	Serial.begin(9600);
                          	setupMotor();
                          	setupSensor();
                          }
                          
                          
                          void updateDistance() {
                          
                          	digitalWrite(URTRIG, LOW);
                          	digitalWrite(URTRIG, HIGH);
                          
                          	unsigned long measure = pulseIn(URPWM, LOW);
                          
                          	Distance = measure / 50;
                          
                          #if ENABLE_DEBUG_PRINT
                          	Serial.print("Distance=");
                          	Serial.print(Distance);
                          	Serial.println("cm");
                          #endif
                          
                          }
                          
                          
                          void motorGoForward(int speed) {
                          	digitalWrite(I1,HIGH);
                          	digitalWrite(I2,LOW);
                          	digitalWrite(I3,HIGH);
                          	digitalWrite(I4,LOW);
                          	analogWrite(EA, speed);
                          	analogWrite(EB, speed);
                          }
                          
                          
                          void motorTurnLeft(int speed) {
                          	digitalWrite(I1,HIGH);
                          	digitalWrite(I2,LOW);
                          	digitalWrite(I3,LOW);
                          	digitalWrite(I4,HIGH);
                          	analogWrite(EA, speed);
                          	analogWrite(EB, speed);
                          }
                          
                          
                          void loop() {
                          
                          	updateDistance();
                          	delay(20);
                          
                          	if ( Distance <= 20 ) {
                          		motorTurnLeft(200);
                          		delay(1300);
                          	} else {
                          		motorGoForward(255);
                          	}
                          
                          }

                          Et surtout, le plus important : rajoutes des commentaires !

                          • Partager sur Facebook
                          • Partager sur Twitter
                            17 janvier 2015 à 19:31:38

                            Merci bien je testerai cela, j'analyserai un peu plus tard :)

                            Mais sais gentil de proposer votre idée comme ça cela me permet d'évoluer :) 

                            • Partager sur Facebook
                            • Partager sur Twitter

                            Projet véhicule autonome

                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                            • Editeur
                            • Markdown