Go Down

Topic: Problème détection entrée / sortie passage infrarouge (Read 595 times) previous topic - next topic

Odin68

Bonjour,
Je suis en train de réaliser un projet qui consiste à compter le nombre de personnes dans une pièce grâce à une barrière infrarouge.
Cette barrière est composée de deux diodes émettrices infrarouges (SFH4554) et de deux photodiodes (BPV10NF) sachant que chaque diode émettrice a sa photodiode de l'autre côté de l'entrée de la pièce.
Utilisant une photodiode et non un récepteur qui ne reçoit comme données que des 0 ou 1, mon moniteur série m'indique que la valeur captée se situe entre 10 et 50 environ pour chacune des deux photodiodes. Mais voilà : dans mon code, quand il se lance et quand je passe à travers la barrière, le nombre de personnes ne fait que d'augmenter et jamais la sortie n'est détectée. Voici mon code, j'espère que quelqu'un pourra m'aider. (PS : j'avais déjà fait ce projet en maquette et le code avait fonctionné)

Code: [Select]

int ndp = 0;

void setup()
{
  pinMode(A0, INPUT); // 1 ère Photodiode
  pinMode(A1, INPUT); // 2ème Photodiode
  Serial.begin(9600);
}

void loop()
{

  if ((analogRead(A1)) <= 1)
  {
    delay(150);
    if ((analogRead(A0)) <= 7)
    {
      ndp = ndp - 1;
      Serial.println (ndp);
      delay(1000);
    }
  }
 
 
 
 if ((analogRead(A0)) <= 7)
  {
    delay(150);
    if ((analogRead(A1)) <= 1)
    {
      ndp = ndp + 1;
      Serial.println (ndp);
      delay(500);
    }
  }
 
   
 
}

En espérant que j'ai donné toutes les informations nécessaires pour résoudre mon problème.

supercc

Bonjour,

peux tu préciser le sens de :
(analogRead(A1)) <= 1 ?
et
(analogRead(A1)) <= 7 ?

Donc tu as une pièce avec une entrée et une sortie et une seule carte arduino. Quel est la longueur des plus longs fils ? Un petit schéma ?


dbrion06

Excusez moi, mais j'ai du mal (commentaires oubliés lors du copier coller?déficience en vitamines? traumatisme post Chernobyl?) à faire un lien entre:

Quote
Utilisant une photodiode et non un récepteur qui ne reçoit comme données que des 0 ou 1, mon moniteur série m'indique que la valeur captée se situe entre 10 et 50 environ pour chacune des deux photodiode
et les seuils (1 et 7) des tests de votre bout de logiciel.

J'ai l'impression que ça peut être, si mes difficultés de compréhension affectent d'autres personnes, une source de malentendus.

Odin68

Bonjour, merci déjà de m'avoir répondu.

Supercc : Alors la pièce est ma chambre, donc elle n'a qu'une seule entrée et sortie.

Pour la longueur des fils, je dirais 2,50m car pour une diode émettrice et une diode réceptrice, j'ai dû faire passer les câbles au-dessus du cadre de la porte.

(analogRead(A0)<=7) est le résultat d'un test que j'ai effectué. Après quelques changement , la valeur reçue quand le faisceau n'est pas coupé est plutôt de 16 et la valeur quand le faisceau est coupé (donc le seuil), est plutôt en-dessous de 9. Pour A1, le seuil est en-dessous de 1 comme dit dans le code.

drion06 : En fait je me suis mal exprimé. Je voulais juste dire que j'avais utilisé une photodiode analogique ( de façon à pouvoir traiter les données plus facilement) et non numérique, c'est tout !
Effectivement, les seuils sont 1 et 7 (seulement à certains moment, parce que en fonction de la luminosité ambiante, ça diffère ! Mais là n'est pas le problème.

Merci encore de vous intéresser à mon probème et j'espère cette fois qu'il n'y aura plus de malentendu !

68tjs

Le type de carte que tu utilises (Uno, Mega, Zéro, Mkr) on le devine comment ?
Service de cartomancienne de Mme Irma ?

Il me semble que quand on arrive sur un forum on en lit les règles et JUSTEMENT il y a un message épinglé qui s'intitule "Règles du forum francophone" le hasard fait bien les chose n'est-ce pas !

Seuils 7 et 9 alors que le max est probablement 1024 il y a comme un problème.

Je te conseille de te renseigner sur le choix de la référence du convertisseur analogique digital.
Avec un signal faible on obtiendra une réponse plus élevée en abaissant la valeur de la référence de tension.
Ainsi sur une carte UNO par défaut la référence est Vcc= 5V mais tu peut choisir une référence externe que tu applique sur Aref ou la référence interne à 1,1V.
Je te conseille aussi d'améliorer le fonctionnement du couple émetteur récepteur infra rouge : plus tu aura de niveau en réception moins tu sera embêté.

Quote
Mais voilà : dans mon code, quand il se lance et quand je passe à travers la barrière, le nombre de personnes ne fait que d'augmenter et jamais la sortie n'est détectée.
Dans ton code je ne vois pas de fonction pour détecter le sens de passage.

Je suppose que tu as prévu de détecter le couple émetteur /récepteur qui se coupe le premier pour détecter le sens du passage.
Pour cela il faut s'assurer qu'une diode d'émission située d'un coté de la porte n'active pas le récepteur situé de l'autre coté de la porte.

J-M-L

Il y'a un couloir étroit pour rentrer dans la chambre ?

Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Odin68

Bonsoir,

Alors oui effectivement j'ai oublié quelque chose de fondamental : le type de carte utilisé !
J'utilise une carte Arduino Uno R3.

Par rapport aux valeurs du récepteur, je pense premièrement que c'est dû à la distance émetteur/récepteur (75 cm soit la largeur de l'encadrement de la porte) et deuxièmement à cause de la tension émise comme tu l'as dit.

Juste un truc :
Quote
Dans ton code je ne vois pas de fonction pour détecter le sens de passage.

Je suppose que tu as prévu de détecter le couple émetteur /récepteur qui se coupe le premier pour détecter le sens du passage.
Pour cela il faut s'assurer qu'une diode d'émission située d'un coté de la porte n'active pas le récepteur situé de l'autre coté de la porte.
Effectivement j'essaye de faire comme cela. Comment faut-il faire pour que la diode d'émission n'active pas le récepteur ? Et comment faire pour qu'une entrée/sortie soit détectée ?

J'espère ne pas trop en demander, en tout cas je vous remercie de vos réponses très rapides.

Quote
Il y'a un couloir étroit pour rentrer dans la chambre ?
Comme dit avant, la largeur de l'encadrement fait 75 cm.

supercc

Comment sont placées les diodes émettrices ? Une diode émettrice du coté gauche de la porte (avec son récepteur à droite) et l'autre diode émettrice du coté opposé (droit) avec son récepteur à gauche. Genre :

Code: [Select]

                  Vue de haut
                 <- 75 cm ->
         Gauche   PORTE     Droite
## mur ## |                   |## mur ##
         E1        -->        R1
         R2        <--        E2


Si c'est le cas :
  * Quelle distance sépare l'émetteur E1 du récepteur R2 ?
  * Tout est dans le même plan horizontal ? A quelle hauteur ?

Quote
Comment faut-il faire pour que la diode d'émission n'active pas le récepteur ?
Ne pas l'allumer. Ce n'est pas une blague ;-)

Quote
Et comment faire pour qu'une entrée/sortie soit détectée ?
de belles transitions déclenchant de beaux fronts pour des interruptions aurait été l'idéal. Là les tensions sont un peu faibles... Par scrutation, comme tu l'envisages, te permettra peut être d'atteindre la précision nécessaire. Mais dans ce cas tu peux commencer par virer les delay(), le but est d'aller à fond !

68tjs

Comment faire ?
Par expérimentation.

La détection du premier couple qui a été coupé peut se faire par interruption, la carte UNO disposant de deux entrées interuption directe (D2 et D3) cela tombe bien.

Les interuptions ne fonctionnent qu'avec un signal numérique. Il sera necessaire de transformer le signal analogique en signal numérique.
Cela peut se faire par l'électronique avec un CI appellé comparateur comme le vénérable LM393, mais il existe d'autre modèles. Dans les datasheets des composants il y a toujours des exemples d'application, il faut les utiliser.
Le LM393 est un comparateur à collecteur ouvert c'est à dire qu'il faut obligatoirement  ajouter une résistance de charge entre sa sortie et le Vcc : ce n'est pas pour embêter le monde, c'est ce qui fonctionne le mieux.

A propos de comparateur le microcontrôleur de la carte UNO, l'atmega328p, possede un comparateur.
Ce comparateur doit générer des interruptions : a voir si c'est exploitable dans cette application.
Note : les fonctions arduino ne gèrent pas ce comparateur, il faut soit trouver une bibliothèque qui le gère soit le faire soi même.

Pour voir si une diode d'émission "bave" sur l'autre couple il suffit de surveiller l'autre couple et d'alumer et éteindre la diode potentiellement perturbatrice.
Si tu ne vois pas de différence c'est bon, sinon il faut améliorer.

Pour l'amélioration de la sélectivité dans l'espace de la diode réceptrice tu peux essayer de l'entourer d'un tube opaque à la longueur d'onde --> attention il faudra bien aligner sinon il y aura encore une perte de niveau.


Odin68

Quote
Comment sont placées les diodes émettrices ? Une diode émettrice du coté gauche de la porte (avec son récepteur à droite) et l'autre diode émettrice du coté opposé (droit) avec son récepteur à gauche.
Si c'est le cas :
  * Quelle distance sépare l'émetteur E1 du récepteur R2 ?
  * Tout est dans le même plan horizontal ? A quelle hauteur ?
Effectivement les diodes sont placées de cette façon afin qu'il n'y ait aucune perturbation.

E1 est séparé de R2 par 10 cm tout comme E2 et R1 et le tout à 1m10 du sol.

Quote
Ne pas l'allumer. Ce n'est pas une blague ;-)
Mais alors ce sera interprété comme si je coupais le faisceau avec mon corps non ?

Quote
A propos de comparateur le microcontrôleur de la carte UNO, l'atmega328p, possede un comparateur.
Ce comparateur doit générer des interruptions : a voir si c'est exploitable dans cette application.
Note : les fonctions arduino ne gèrent pas ce comparateur, il faut soit trouver une bibliothèque qui le gère soit le faire soi même.
Je vais essayer comme ça, merci des infos :)

Quote
Pour l'amélioration de la sélectivité dans l'espace de la diode réceptrice tu peux essayer de l'entourer d'un tube opaque à la longueur d'onde --> attention il faudra bien aligner sinon il y aura encore une perte de niveau.
Pour ça j'avais essayé d'enrouler le récepteur de scotch noir pour électricien, mais je n'ai pas vu de changement.


supercc


Quote
Quote
Ne pas l'allumer. Ce n'est pas une blague ;-)
Mais alors ce sera interprété comme si je coupais le faisceau avec mon corps non ?
;

Je réponds mais je ne traite que du cas de la scrutation. Autrement dit cela ne fonctionne pas avec les interruptions. Pourtant la solution avec les interruptions est la plus performante s'il n'y a pas de perturbation entre les diodes émettrices.

Postulat : les diodes émettrices sont chacune alimentées par une broche différente de la uno (PG pour puissance gauche mettons et PD pour puissance droite) et donc activable par un simple digitalWrite.
 
Soit la fonction suivante (pas testé, ni même compilée).

int valeurLedGauche() {  // retourne l'état de la led gauche
   unsigned v;
   digitalWrite(PG, 1); // on active la diode émettrice
   v=digitalRead(AG); // valeur associée à la led gauche (AG : Analog Gauche)
   digitalWrite(PG,0); // on éteint la diode émettrice

   if(v...) return 0; // si état 0 détecté
      else return 1; // si état 1 détecté

}

imagine la même mais pour la droite.

Maintenant en début de loop() et si les leds ne sont pas activées :

void loop() {

  int gauche=valeurLedGauche();
  int droite=valeurLedDroite();

  Serial.print(gauche);
  Serial.print(" ");
  Serial.println(droite);
}

Elles ne devraient pas interférer puisque que la seconde n'est pas allumée quand la première est utilisée.

Odin68

Quote
Code: [Select]
int valeurLedGauche() {  // retourne l'état de la led gauche
   unsigned v;
   digitalWrite(PG, 1); // on active la diode émettrice
   v=digitalRead(AG); // valeur associée à la led gauche (AG : Analog Gauche)
   digitalWrite(PG,0); // on éteint la diode émettrice

   if(v...) return 0; // si état 0 détecté
      else return 1; // si état 1 détecté

}
Alors, étant novice, faut-il mettre ce code dans void loop(), void setup() ou autre part ?

Que signifie alors (AG) ? La valeur de la diode réceptrice associée ?

Autre chose, comme fais-je pour réduire les perturbations liées à la luminosité ? Sachant que la valeur lue par ma diode réceptrice est de 50 en luminosité ambiante et que quand je me place devant cela me donne une valeur de 30. En luminosité faible, la valeur reçue sans que je me place devant est inférieur à 30. Dans ce cas-là, le seuil change tout le temps, ce qui pose problème.

dbrion06

Code: [Select]
[quote]Alors, étant novice, faut-il mettre ce code dans void loop(), void setup() ou autre part ?

C'est une fonction:
il faut mettre ce code autre part (surtout pas dans le loop, ni dans le setup -C n'autorise pas la definition de fonctions dans d'autres fonctions_ Un emplacement sympa serait ** avant *** le setup.
Ensuite, il faut l'invoquer ... quand vous voulez: l'emplacement ideal est **dans ** le loop.

LEs deux "constantes" AG et PG représentent  les numéros de pattes,  respectivement, du recepteur Analogique Gauche  et de sa led IR qui l'eclaire PG; la valeur analogique lue est V...

Odin68

Pourtant, lorsque je mets ce code avant le setup :

Code: [Select]
int valeurLedGauche(){
  unsigned v;
  digitalWrite(7, 1);
  v=digitalRead(analogRead(A1));
  digitalWrite(7, 0);

  if(v<=35) return 0;
  else return 1;

 
}
int valeurLedDroite(){
  unsigned f;
  digitalWrite(8, 1);
  f=digitalRead(analogRead(A0));
  digitalWrite(8, 0);

  if(f<=35) return 0;
  else return 1;
}

void setup() {
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);

void loop() {

int gauche = valeurLedGauche();
int droite = valeurLedDroite();

Serial.print(gauche);
Serial.print(" ");
Serial.println (droite);

}


Une fois compilé, j'ai ça :
Code: [Select]

a function-definition is not allowed here before '{' token


Avec la ligne void loop(){ surlignée.

supercc

Quote
Autre chose, comme fais-je pour réduire les perturbations liées à la luminosité ? Sachant que la valeur lue par ma diode réceptrice est de 50 en luminosité ambiante et que quand je me place devant cela me donne une valeur de 30. En luminosité faible, la valeur reçue sans que je me place devant est inférieur à 30. Dans ce cas-là, le seuil change tout le temps, ce qui pose problème.
Représente toi l'évolution de la valeur dans le temps et essaye de trouver ce qui différencie la tombée du jour et le franchissement du seuil... D'ailleurs tu as pensé aux nuages qui passent ?

Et pour ton problème de compilation vérifie les paires d'accolade {}.

Go Up