Go Down

Topic: [conseil] projet de détéction d'obstacle, question de compréhension (Read 2 times) previous topic - next topic

Benoit1121

#15
May 21, 2012, 12:41 pm Last Edit: May 21, 2012, 12:56 pm by Benoit1121 Reason: 1
Voilà, je me suis inspiré d'une part de l'exemple "blinkwithoutdelay" et de programme de cutprod . Voilà ce que ca donne :
dans cette exemple, je me suis servi que de la LED pour faire simple ^^

Code: [Select]
long previousMillis = 0;      
int interval = 200;          
boolean beep_state;
int analogPin = 3;
int val = 0;

void setup()
{
Serial.begin(9600);    
pinMode(11, OUTPUT); // Le signal est envoyé sur la LED qui est branché sur la sortie 13
}

void loop()
{
 lecture_val();
 beep();
}


void lecture_val()
{
val = analogRead(analogPin);
interval = 500 - val;
Serial.println (interval);
}


void beep()
{
  unsigned long currentMillis = millis();

 if(currentMillis - previousMillis > interval)
 {
   // save the last time you blinked the LED
   previousMillis = currentMillis;  


   if (beep_state == 0)
     {
     beep_state = 1;
digitalWrite(11, HIGH);  // active la LED (ON)
tone(8, 1319);
     }
   else
    {
     beep_state = 0;
digitalWrite(11, LOW );  // active la LED (Off)
 noTone(8);
     }
  }
}


Le hic c'est que ca fait l'inverse de ce que j'attend, c'est a dire plus la distance (appelé ici "interval") est grande, plus la led Bip rapidement
j'ai beau changer des parametres, de changer les 1 et 0, ca m'inverse pas..

Deuxieme hic, je ne vois pas comment integrer un ligne me permettant de faire un bip continue lorsque je suis a moins de 1 m

Je suis à fond dessus pour essayer de trouver un moyen, il se peut que je la trouve cette solution ! si c'est le cas, je mettrais le code ^^


PS : je comprends pas pourquoi cutprod utilise "if beep state == 0" c'est quoi ce beep state? l'etat du beep qui est dans la suite c'est à dire O ou 1 ??
Merci

Cordialement

Benoit

barbudor

Le principe est de ne gérer que les transitions sans bloquer
Donc il faut savoir dans quel état tu es pour que à l'expiration de la tempo tu sache ce que tu dois faire.

Ton code me parait parfait et tu dis qu'il marche sauf que la période n'évolue pas dans le bon sens.

Cela ne me surprend pas puisque dans ton code initial, le delay() est proportionel à val
Code: [Select]
delay (val * 5);   // Temps de l'activation qui sera d'une valeur = val x 5

Alors que dans ce nouveau code c'est le contraire :
Code: [Select]
interval = 500 - val;

Pourquoi n'as tu pas utilisé interval = 5 * val comme dans le 1er code ?

Quote
Deuxieme hic, je ne vois pas comment integrer un ligne me permettant de faire un bip continue lorsque je suis a moins de 1 m


Dans beep, il faut gérer ce cas. Il faut gérer les 3 cas d'ailleurs comme dans ton code initial.
Code: [Select]

unsigned long currentMillis = millis();

if ( val < 100)
{
    beep_state = 1;
    digitalWrite(11, HIGH);  // active la LED (ON)
    tone(8, 1319);
    previousMillis = currentMillis;
}
else if (val < 150)
{
    if ( currentMillis - previousMillis > interval )
    {
        // save the last time you blinked the LED
        previousMillis = currentMillis;   
        if (beep_state == 0)
        {
            beep_state = 1;
            digitalWrite(11, HIGH);  // active la LED (ON)
            tone(8, 1319);
        }
        else
       {
            beep_state = 0;
            digitalWrite(11, LOW );  // active la LED (Off)
            noTone(8);
        }
    }
}
else
{
    beep_state = 0;
    digitalWrite(11, LOW );  // active la LED (Off)
    noTone(8);
    previousMillis = currentMillis;
}


Tu remarqueras que je met à jour previousMillis chaque fois qu'il y a un changement d'état de façon a ce que le compteur de temps soit à jour si brutalement la distance change.
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Benoit1121

#17
May 21, 2012, 02:43 pm Last Edit: May 21, 2012, 03:34 pm by Benoit1121 Reason: 1
Merci beaucoup barbudor !

je vais essayer de faire comme dans le premier c'est a dire faire un 5 * val ou autrement


Benoit1121

#18
May 21, 2012, 03:32 pm Last Edit: May 21, 2012, 04:31 pm by Benoit1121 Reason: 1
Voilà je pense que je touche au but ! :)

Code: [Select]
long previousMillis = 0;      
int interval = 200;          
boolean beep_state;
int analogPin = 3;
int val = 0;

void setup()
{
Serial.begin(9600);    
pinMode(12, OUTPUT); // Le signal est envoyé sur le buzzer qui est branché sur la sortie 12
pinMode(11, OUTPUT); // Le signal est envoyé sur la LED qui est branché sur la sortie 13
}

void loop()
{
 lecture_val();
 beep();
}


void lecture_val()
{
val = analogRead(analogPin);
interval = val;
Serial.println (interval);
}


void beep()
{
unsigned long currentMillis = millis();

if ( val < 100)
{
   beep_state = 1;
   digitalWrite(11, HIGH);  // active la LED (ON)
   tone(8, 1319);
   previousMillis = currentMillis;
}
else if (val < 250)
{
   if ( currentMillis - previousMillis > interval )
   {
       // save the last time you blinked the LED
       previousMillis = currentMillis;  
       if (beep_state == 0)
       {
           beep_state = 1;
           digitalWrite(11, HIGH);  // active la LED (ON)
           
           tone(8, 1319);
       }
       else
      {
           beep_state = 0;
           digitalWrite(11, LOW );  // active la LED (Off)
           
           noTone(8);
       }
   }
}
else
{
   beep_state = 0;
   digitalWrite(11, LOW );  // active la LED (Off)
   
   noTone(8);
   previousMillis = currentMillis;
}
}


mais il me reste encore deux questions que j'ai du mal a résoudre ...
1) Je ne trouve aucune explication sur la librairie "tone" et "noTone" et à quoi corresponde les valeurs entre parenthese ? (Ca répondra peut être a ma deuxième question)
2) comment puis je faire pour pour modifier le temps entre chaque bip car je trouve que même à 2 m ça bip assez rapidement..

(Edit : Je suis tombé sur un page wiki qui explique ce qu'est la librairie tones, (elle permet juste de faire des sons différent, grâce aux fréquence des notes). Donc ce ne répond pas à ma 2 eme questions ^^)


Merci

Benoit

barbudor

Quote
comment puis je faire pour pour modifier le temps entre chaque bip car je trouve que même à 2 m ça bip assez rapidement


C'est une remarque purement subjective qui ne dépend que de toi.
A toi de déterminer la fonction intervale = f1(analogRead) sachant que analogRead est déjà f2(distance)

Regarde la spec de ton capteur pour avoir la fonction f2 et détermine f1 en fonction de cela.
Peut être faudra t'il définir un fonction par segment ?
(analogRead entre x1 et x2 -> interval = ?
(analogRead entre x2 et x3 -> interval = ?
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Go Up