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é)
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:
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.
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 !
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é.
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.
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 :
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.
Il y'a un couloir étroit pour rentrer dans la chambre ?
Comme dit avant, la largeur de l'encadrement fait 75 cm.
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 :
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 ?
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
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 !
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.
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.
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 ?
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
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.
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();
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.
[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...
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 {}.
Eh bien en fait pour ce qui est de la luminosité, je pourrais faire une variable pour le seuil car j'ai aussi une photorésistance avec mon projet, donc en fonction de la luminosité le seuil change. Mais pour moi il y a juste le problème de détection d'entrée et de sortie. Il faudrait faire un code sous cette forme.
-Si ce récepteur est coupé avant (ou puis) le deuxième, alors augmenter le nombre de personnes et inversement.
En réalité, je ne vais pas seulement créer une barrière infrarouge. J'ai pour but d'allumer la lumière de ma chambre quand le nombre de personnes dans la pièce est supérieur à 0. En condition, il faut que la luminosité soit assez basse pour permettre à la lumière de s'allumer, sinon, c'est une perte d'énergie. De plus, si on est dans la chambre et qu'on veut quand même éteindre la lumière, j'ai rajouté un capteur à ultrasons qui est branché sur D2 et D3 , donc pour la comparaison je pense pas que ça ira pas. Si je passe la main devant celui-ci, la lumière s'éteint, et j'ai le code pour ça.
Bref, j'ai rajouté une accolade et la compilation fut un succès. Pour ce qui est du code que t m'as donné, que va-t-il me permettre exactement ?
Le deuxième paragraphe a seulement pour but de vous exposer mon projet en entier et en aucun cas pour vous demander quelque chose de plus.
Bref, j'ai rajouté une accolade et la compilation fut un succès. Pour ce qui est du code que t m'as donné, que va-t-il me permettre exactement ?
De voir l'évolution des capteurs.
Je pense que comme tout débutant tu ne pourras pas avancer si tu ne commences pas a apprendre par toi même les bases. Regardes le blog d'eskimon. Entraîne toi sur des exemples simples et cherche a bien les comprendre. Sinon tu vas buter sur tout et on ne va pas se comprendre. En tout cas c'est mon avis.
Je suis d'accord sur ce point-là, je vais y faire un tour.
Serait-il possible pour vous de m'aider sur ce point :
Il faudrait faire un code sous cette forme.
-Si ce récepteur est coupé avant (ou puis) le deuxième, alors augmenter le nombre de personnes et inversement.
Déjà, supercc vous a donné un code qui permet de savoir si le recpteur gauche (mais le droit ne pose pas de problème une fois qu'on a compris le principe) est coupé ou pas.
Ceci semble peu, mais est énorme, parce qu'il n'est pas trop difficile de rajouter des arguments à la dite fonction (je vois le seuil, la diode emettrice gauche (qui là, peut devenir celle de droite) et le canal analogique correspondant comme candidats naturels).
Une fois que vous aurez pleinement compris l'interet de ce code, voire de ces adaptations (des adaptations proposées par un tiers -mézigue- sont forcèment inférieures à celles mûrement réfléchies par le demandeur -Votre Seigneurie-), en le lisant et en le testant, il sera assez simple de résoudre votre problème complet en notant dans un petit coin -deux variables- que le recepteur droit /resp gauche a été coupé (si aucun des recepteurs n'a été précedemment coupé).
Mais , selon Descartes, il faut sérier les problèmes sans essouffler son cerveau.
Ok, je vais essayer d'intégrer tout cela, malgré le fait que je ne comprends pas pourquoi il faut éteindre la diode émettrice ? Surtout que mon tout premier code fonctionnait avec ma maquette, et que il faut faire tous ces changements pour une évolution grandeur nature.