Pages: 1 [2]   Go Down
Author Topic: [conseil] projet de détéction d'obstacle, question de compréhension  (Read 2290 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 38
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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
« Last Edit: May 21, 2012, 05:56:59 am by Benoit1121 » Logged

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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:
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:
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.
Logged

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 ?

Offline Offline
Newbie
*
Karma: 0
Posts: 38
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Merci beaucoup barbudor !

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

« Last Edit: May 21, 2012, 08:34:06 am by Benoit1121 » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 38
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Voilà je pense que je touche au but ! smiley

Code:
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
« Last Edit: May 21, 2012, 09:31:35 am by Benoit1121 » Logged

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 = ?
Logged

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 ?

Offline Offline
Newbie
*
Karma: 0
Posts: 38
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Merci Brabudor,

J'ai tout simplement ajouté un *2 :

Code:
void lecture_val()
{
val = analogRead(analogPin);
interval = val * 2 ;
Serial.println (interval);
}

Merci

Benoit
Logged

Rennes
Offline Offline
Sr. Member
****
Karma: 1
Posts: 315
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Tu peux aussi utiliser la fonction map(...) pour à partir de la valeur de ton capteur, calculer une autre valeur entre les bornes spécifiées.
La doc est ici: http://arduino.cc/en/Reference/map

Ca permet simplement de faire varier les bornes mini et maxi calculées tout en gardant les mêmes bornes en entrée.

Pour te donner un exemple concret de comment je l'utilise sur mon projet actuel:
J'ai un capteur de lumière qui est lu sur une entrée analogique et me fournit une valeur entre 230 et 900 selon l'éclairage de la pièce. Hors j'ai besoin en sortie d'une valeur entre 0 et 15, pour piloter l'intensité lumineuse d'un éclairage.
Je transforme donc la valeur lue comme ceci

int  brightness = analogRead(PIN_LDR); //valeur brute
int  scaledBrightness = map(brightness,230,900,0,15); //valeur transformée entre 0 et 15

J'ai constaté hier que si la valeur brute passe sous la valeur minimale indiquée on a un débordement. Pour moi ça ressemble à un bug de map() mais bon...je vais faire en sorte de détecter ce cas car mon signal d'entrée pourrait passer sous 230 dans certaines conditions je pense.
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 38
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@Patq_ : Merci, tu viens de m'apprendre quelque chose qui peut m’être utile pour autre chose smiley
En revanche dans mon cas, je ne pense pas en avoir besoin car j'ai tout simplement multiplié la valeur de "interval" et ça fonctionne correctement !

Je ne suis pas un expert et peut être ce que je vais dire va paraitre idiot mais pour ton problème, si j'ai bien compris ton capteur te donne un plage entre 230 et 900 en fonction de la lumière mais, c'est toi qui l'a définit comme ça ? ou bien c'est tout simplement la lumière mini et maxi de ta pièce ? car la lumière peut varier suivant certains facteur donc peut être que parfois il fait plus clair que d'habitude ou moins clair ^^ donc cela peut être normal ton soucis..

Merci

Cordialement

Benoit
Logged

Rennes
Offline Offline
Sr. Member
****
Karma: 1
Posts: 315
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

@Patq_ : Merci, tu viens de m'apprendre quelque chose qui peut m’être utile pour autre chose smiley
En revanche dans mon cas, je ne pense pas en avoir besoin car j'ai tout simplement multiplié la valeur de "interval" et ça fonctionne correctement !
Juste un truc, mon pseudo c'est PatG_ et non PatQ_   smiley-grin
En fait si tu multiplies simplement la valeur tu ne fais que changer la pente de la droite, sans pouvoir spécifier le mini et le maxi que tu souhaites en résultat. Ca peut convenir dans certains cas.

Je ne suis pas un expert et peut être ce que je vais dire va paraitre idiot mais pour ton problème, si j'ai bien compris ton capteur te donne un plage entre 230 et 900 en fonction de la lumière mais, c'est toi qui l'a définit comme ça ? ou bien c'est tout simplement la lumière mini et maxi de ta pièce ? car la lumière peut varier suivant certains facteur donc peut être que parfois il fait plus clair que d'habitude ou moins clair ^^ donc cela peut être normal ton soucis..
En fait c'est une LDR qui forme un pont diviseur de tension avec une résistance en série.
La résistance est calculée pour obtenir la plage de variation de tension optimale en fonction des éclairements mini et maxi de la pièce où sera situé le dispositif.
De là j'ai les valeurs mini et maxi  une fois converties en digital.
Donc les valeurs sont plutôt issues d'un calcul pour optimiser la sensibilité de la mesure de l'intensité lumineuse.


Merci

Cordialement

Benoit

[/quote]
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 38
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Aaaah désolé ! au temps pour moi Patg_ !

Ensuite, je me répete mais je suis pas pro dans tout ceci, mais d'apres ce que tu dis, (si j'ai bien compris) la plage est définit en fonction de la valeur de la resistance? dans ce cas si c'est pas un bug de map () essais d'élargir ta plage, mais tu optimiseras moins ta sensibilité.. sinon je ne vois pas d'où peut venir ce probleme, je n'ai pas assez de recul dans ce domaine encore désolé..

Benoit
Logged

Pages: 1 [2]   Go Up
Jump to: