Partage
  • Partager sur Facebook
  • Partager sur Twitter

Equivalent plus rapide que ce systeme

    20 novembre 2018 à 22:20:08

    Bonjour, j'ai fait ce programme permettant de mesurer la vitesse d'un objet entre deux photorésistances. Seulement, il n'est pas assez réactif a la vitesse. Tout ce qui est haut dessus de 12 voir 13km/h n'est plus pris en compte car la photorésistance ne capte pas le changement de lumière assez rapidement. Donc je me demandais si vous connaissiez un autre moyen de faire le même système permettant la mesure d'une plus grand vitesse. (en effet, j'en aurais besoin pour mesurer environ 23km/h) 

    Mon code :

    //Constants
    const int pResistor = A0; // Photoresistor at Arduino analog pin A0
    const int phResistor = A1; //Photorésistance 2
     
    //Chrono
    unsigned long MS; 
    unsigned long start;
     
    //Variables
    int value;          // Stockage de la valeur photoresitance 1
    int value2;         //Stockage de la valeur photoresitance 2
    int valeurlaser = 800;    //Valeur produite par le laser
    float vitesse1;
    float distance = 1.8; //Distance en m
     
    void setup()
    {
      Serial.begin(9600); //Communication avec l'ordinateur
      pinMode(pResistor, INPUT);
      pinMode(phResistor, INPUT);
      //INITIALISATION
      value = analogRead(pResistor);
      value2 = analogRead(phResistor);
    }
     
    void loop()
    {
      //debut de la boucle
      value = analogRead(pResistor); //on attribue en boucle à value la valeur de la photoresistance
      value2 = analogRead(phResistor);  //on attribue en boucle à value2 la valeur de la photoresistance2
      
      if (value < valeurlaser)  //Si la valeur 1 est inferieur a celle du laser
      {
        Serial.println("Bille qui passe");
        start=millis(); //Lancement du chrono
        
        while (value2 >= valeurlaser)
        {
          value2 = analogRead(phResistor);  //on attribue en boucle à value2 la valeur de la photoresistance2
        //Calcul et affichage sur ordinateur du temps utilisé
        MS = millis()-start;
        Serial.println((MS / 1000) % 60);      // secondes
        Serial.println("'' ");
        Serial.println(MS % 1000);           // millièmes
        }
        
        vitesse1 = distance / (((MS / 1000) % 60) + ((MS % 1000)*0.001));
        Serial.println("Vitesse :");
        Serial.println(vitesse1);
        Serial.println("m/s");
        Serial.println(vitesse1*3,6);
        Serial.println("km/h");
      }
      else  //Sinon
      {
      }
    }



    • Partager sur Facebook
    • Partager sur Twitter
      21 novembre 2018 à 12:03:10

      Avec un Serial configuré à 9600 bauds, l'envoie de chaque caractère au PC prend environ 1ms.

      Tous tes Serial.print faussent donc terriblement tes mesures car ils prennent du temps.

      Tu devrais supprimer tes appels à Serial pendant la mesure pour ne pas fausser celle-ci ;)

      En effet, si ton arduino est en train de faire un print, il n'est pas en train de faire une lecture de la photorésistance.

      Donc même si la photo résistance détecte un bref passage, il est possible que l'arduino ne le détecte pas car il serait en train de faire un print au lieux de faire un analogRead.

      {
      
      	//debut de la boucle
      	value = analogRead(pResistor); //on attribue en boucle à value la valeur de la photoresistance
      	value2 = analogRead(phResistor);  //on attribue en boucle à value2 la valeur de la photoresistance2
      
      	if (value < valeurlaser)  // Si la valeur 1 est inferieur a celle du laser
      	{
      		// On s'autorise un seul caractère, histoire de dire que l'on a détecté quelque chose
      		// Mais rien de plus car Serial.print prend du temps !!!
      		Serial.print(">");
      		
      		start=millis(); // Lancement du chrono
      		
      		// Attente de second passage
      		// Pas de calcul ni de print pour être très réactif !!!
      		while (value2 >= valeurlaser) {
      			value2 = analogRead(phResistor);  //on attribue en boucle à value2 la valeur de la photoresistance2
      		}
      		
      		stop=millis(); // Arrêt du chrono
      		
      		Serial.println();
      		
      		//Calcul et affichage sur ordinateur du temps utilisé
      		MS = stop-start;
      		Serial.println((MS / 1000) % 60);      // secondes
      		Serial.println("'' ");
      		Serial.println(MS % 1000);           // millièmes
      
      		vitesse1 = distance / (((MS / 1000) % 60) + ((MS % 1000)*0.001));
      		Serial.println("Vitesse :");
      		Serial.println(vitesse1);
      		Serial.println("m/s");
      		Serial.println(vitesse1*3,6);
      		Serial.println("km/h");
      		
      	}
      	else  //Sinon
      	{
      	}
      	
      }

      PS N°1: cette ligne n'est pas bonne :

      Serial.println(vitesse1*3,6);

       En langage C, la virgule sert de séparateur d'argument et non de virgule pour un nombre.

      C'est un point que tu devrais utiliser ;)

      Serial.println(vitesse1*3.6);

      -
      Edité par lorrio 21 novembre 2018 à 12:09:55

      • Partager sur Facebook
      • Partager sur Twitter
        21 novembre 2018 à 14:10:58

        Merci ! J'irais voir ça directement quand j'aurais le temps ! Par rapport à la virgule, j'avais vu ça et déjà réglé ce souci 😉 ! Normalement  ce système est assez réactif à présent ? Je pense même couper toute communication avec le serial pour brancher un écran lcd et afficher mes valeurs après calcul ! Toujours plus rapide ! 

        [EDIT]

        Voila mon code actuel, mais j'ai toujours peur qu'il ne soit pas assez réactif, d'autres solutions s'offrent à moi au cas où ? Pour info, maintenant, il capte des valeurs proche des 1.1m/s (j'ai réglé la distance à l'écart entre mes photorésistances).

        Voila le code actuel:

        #include <LiquidCrystal.h> // on importe la bibliothèque
        LiquidCrystal monEcran(12,11,5,4,3,2); // on crée l'objet écran
        
        
        //Constants
        const int pResistor = A0; // Photoresistor at Arduino analog pin A0
        const int phResistor = A1; //Photorésistance 2
         
        //Chrono
        unsigned long MS; 
        unsigned long start;
        unsigned long stop1;
         
        //Variables
        int value;          // Stockage de la valeur photoresitance 1
        int value2;         //Stockage de la valeur photoresitance 2
        int valeurlaser = 900;    //Valeur produite par le laser
        float vitesse1;
        float distance = 0.159; //Distance en m
         
        void setup()
        {
          monEcran.begin(16,2); //on initialise la communication avec 16 colonnes et deux lignes
          monEcran.clear(); // on efface l'écran
          pinMode(pResistor, INPUT);
          pinMode(phResistor, INPUT);
          //INITIALISATION
          value = analogRead(pResistor);
          value2 = analogRead(phResistor);
          monEcran.print("Vitesse bille:");
          monEcran.setCursor(4,1);
          monEcran.print("m/s");
          monEcran.setCursor(12,1);
          monEcran.print("km/h");
        }
         
        void loop()
        {
          //debut de la boucle
          value = analogRead(pResistor); //on attribue en boucle à value la valeur de la photoresistance
          value2 = analogRead(phResistor);  //on attribue en boucle à value2 la valeur de la photoresistance2
          
          if (value < valeurlaser)  //Si la valeur 1 est inferieur a celle du laser
          {
            start=millis(); //Lancement du chrono
            
            while (value2 >= valeurlaser)
            {
              value2 = analogRead(phResistor);  //on attribue en boucle à value2 la valeur de la photoresistance2
            }
        
            stop1=millis();
            MS = stop1-start;
            vitesse1 = distance / (((MS / 1000) % 60) + ((MS % 1000)*0.001));
            monEcran.setCursor(0,1);
            monEcran.print(vitesse1);
            monEcran.setCursor(8,1);
            monEcran.print(vitesse1*3.6);
          }
          else  //Sinon
          {
          }
        }



        -
        Edité par Tituya 21 novembre 2018 à 16:16:36

        • Partager sur Facebook
        • Partager sur Twitter

        Equivalent plus rapide que ce systeme

        × 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