Infrarouge et photodiodes.

Bonjour,

J'aurai besoin de vos talents de codeurs Arduino pour m'aider dans mon projet de TPE :) .

Je vous explique :

J'ai acheté des photo diodes avec émetteur (LED ir) et récepteur (LED 2 pins).

J'ai fais des tests et j'en ai conclu que ma LED réceptrice laissait passer le courant en fonction de la puissance de mon rayon d'émission.

J'ai donc un système qui envoie peu de courant quand il reçoit un rayon infrarouge.

Et là, j'aurai besoin de faire en sorte que si mon Arduino détecte que ma LED laisse passer (peu ou fort) du courant, on le transforme en tout ou rien.

J'ai pensé à la fonction Boolean mais je n'arrive à rien :'(.

Alors si vous avez des idées, je suis preneur !

Merci et bonne journée à tous.

bonjour, un code a proposer? ref du matériel?

Bonjour,

si c'est du tout ou rien que tu veux, l'arduino a besoin, sur l'une de ses entrées digitales, d'une tension qui soit : - plutôt proche de 0 volt, ou - plutôt proche de 5 volts (3v3 pour les modèles 3v3)

le principe est de polariser ta led ir réceptrice (ne s'agit-il pas plutôt d'un phototransistor ?) de la manière suivante : +5v -[résistance]- entrée digitale - -|>|- - gnd

peux-tu essayer avec une résistance de 2k2 pour voire ce que cela donne ?

J'ai pensé à la fonction Boolean mais je n'arrive à rien

Il faut traiter le problème électronique avant la programmation.

J'ai donc un système qui envoie peu de courant quand il reçoit un rayon infrarouge.

Est-ce que c'est toujours ton projet de comptage de frelon ?

Et là, j'aurai besoin de faire en sorte que si mon Arduino détecte que ma LED.......

En absence de boule de cristal pas de schéma pas de chocolat.

Encore un problème d'étudiant où la question est fort mal posée.

Tu poses une question du genre : "je dois faire un trajet en voiture. combien d'essence dois-je prévoir ?"

Avec aussi peu d'élément, je ne vois pas comment on peut te répondre

Bonjour,

Je ne suis pas un spécialiste loine de la, mais j' ai deja realisé quelques bricoles en IR car c'est une partie des bases qu il faut maitriser.

Je ne sais pas si tu as un phototransistor a 2 pins mais dans ce cas tu l utilise comme un interrupteur en serie avec une resistance, si lumiere il conduit donc 0V sinon il bloque et tu a la tension nominale aux bornes de la resistance.

Pour une photodiode on l' utilise en general en polarisation inverse, la patte la plus courte qui normalement va au - la elle sera sur le + comme ici:

http://startrobotics.blogspot.lu/2013/05/how-to-use-ir-led-and-photodiode-with-arduino.html

Si ca peut t aider c est cool :)

Re bonjour,

désolé pour mon retard mais je suis étudiant et j'avais cours ^^'

Pour commencer, oui c'est toujours le piège à frelons.

Ensuite, oui c'est une led infrarouge réceptrice à 2 pins donc je suppose phototransistor.

Je ne peux pas obtenir 5V avec cette led pour mon arduino...

Pour le schéma, une bête diode ir émettrice en série avec sa résistance, et idem pour la diode réceptrice.

Je n'ai pas encore testé la méthode de CelticLord.

Merci encore pour vos réponses.

Ensuite, oui c'est une led infrarouge réceptrice à 2 pins donc je suppose phototransistor.

Non c'est peut être une diode.

Principe : la détection des photons se fait [u]toujours[/u] sur une jonction à semiconducteur.

La question est de savoir qu'elle est la jonction ? - soit c'est celle d'une diode. - soit c'est la jonction Base-Emetteur d'un phototransistor.

Pour le savoir c'est simple : Tu prend un multimètre en position ohm ou mieux en position diode si tu peux. Tu mets le composant à mesurer dans le noir pour éviter de compliquer davantage. Tu teste dans un sens puis dans l'autre. - si cela conduit dans aucun sens c'est un phototransistor que tu testes entre l'émetteur et le collecteur. - si cela ne conduit que dans un sens c'est une diode que tu testes entre l'anode et la cathode.

Pour le schéma, une bête diode ir émettrice en série avec sa résistance, et idem pour la diode réceptrice.

On VEUT le schéma pour être sur et ne pas partir dans une mauvaise direction. Sans schéma pas d'aide.

Re,

Voici le schéma (que j’ai mis en “Attach”)

J’ai testé al méthode du multimètre, et le courant ne passe que dans un sens, c’est donc une diode.

J’ai également testé le programme avec le fil en sortie de la résistance de 3kohms, il ne fonctionne pas :

Si j’enlève la résistance, ça fonctionne, si je la remet, ça ne fonctionne plus, peut n’importe si la led reçoit de la lumière ambiante/infrarouge ou non.

Que me conseillez-vous maintenant ?

et le courant ne passe que dans un sens, c'est donc une diode.

Eh eh ce n'est pas aux vieux singes que l'on apprend à faire des grimaces. :grin:

Venons en au schéma : Je cite :

Pour le schéma, une bête diode ir émettrice en série avec sa résistance, et idem pour la diode réceptrice.

Tu as tout faux : 1) la diode d'émission est bien à monter en direct mais celle de réception doit être montée en inverse. 2) la résistance doit être [u]entre la masse[/u] et la diode. 3) la diode entre la résistance et le +5 V.

Le point commun entre la résistance et la diode doit être connecté sur l'arduino. Pour mettre au point l'émetteur/récepteur je te conseille de te contenter d'un simple voltmètre.

L'information que tu obtiendra est analogique. Pour la suite à toi de voir si tu peut te contenter d'une mesure analogique ou s'il te faux une information numérique. Pour transformer un signal analogique en signal numérique le mieux est d'utiliser un comparateur comme le LM393. Pour le schéma : il n'y a rien de mieux que de consulter les datasheets qui fourmillent d'exemples.

Pour le Lm393 cherche une datasheet "National Semiconducteur" sur ce site. http://www.datasheetcatalog.com/

Et n'oublie pas de mettre un petit hystérésis.

[1] National n'existe plus il a été racheté par Texas mais ses "vieilles" datasheets sont des merveilles didactiques.

Bonjour,

En te lisant j’ai l’impression qu’il s’agit bien d’un phototransistor. Comme 68tjs l’a mentionné, les pattes d’un phototransistor doit être inversé. Comme tu l’as observé toi-même le phototransistor laisse passer plus ou moins de courant selon la quantité de lumière qu’il reçois. Si tu monte ton circuit avec une résistance de 3kOhms et que par la suite tu changes un peu ton montage, la distance entre la DEL et le phototransistor par exemple, le circuit ne réagira pas de la même façon. La première chose que j’ai fait est de fixé mon montage. Personnellement j’ai utilisé une résistance de 10kOhms, mais peu importe. L’important est de déterminer la tension lorsque la LED est allumé et éteinte. Moi j’ai essayé d’avoir le plus d’écart possible entre les deux valeurs. Si on veut utiliser une pin digital de l’Arduino il faut s’arranger pour avoir une tension << 3.3V et >> 3.3 pour les deux états. Dans mon cas j’ai utiliser une pin analogique de mon Arduino, j’ai pris la lecture des deux états, exemple DEL allumé= 314 / DEL éteint= 852 et dans mon programme j’ai demandé que si la valeur est < 600 alors 1 sinon 0. Bien sûr mes résultats seront différent si je prends mes résultats à la noirceur.

Tout ça pour dire qu’en procédant par l’expérimentation et des mesures, je n’ai pas eu à connaître exactement les propriétés de mes phototransistors. (Phototransistors que j’ai reçu par erreur alors que j’avais commandé des DELs IR et livrés sans sa datasheet malheureusement).

Bonne chance et bonne continuité !

Re bonjour,

Merci pour tes conseils, j’ai enfin compris !

J’ai utilisé ce site qui m’as redis les mêmes choses que vous, mais en plus il détient un programme.

http://atelierjcm.com/arduino/detecter-la-coupure-dun-faisceau-infrarouge-avec-une-photodiode/

Mais maintenant, nouveau problème :’(

Dans son programme, il n’utilise qu’un récepteur.

Moi mon but est d’en faire parler plusieurs.

Voici son programme :

int photodiodePin = 0;                   
 
int ledcontrolePin = 11;
                           
int photomesure = 0;  // la valeur lue de 0 à 1023
 
int nblect=5; // nb de lectures faites, on va faire une moyenne
 
long somme=0;
 
int seuil = 50 ; // si la valeur analogique lue est inférieure à 50
                  // on allume la LED de controle
 
void setup(void) {
   
  Serial.begin(19200);   
}
  
void loop(void) {    
 
  int i;
   
 somme=0; // on va faire la moyenne de plusieurs mesures
   
  for (i=0 ; i < nblect ; i++) {      
   
  somme = somme +  analogRead(photodiodePin);
  
  } 
   
  photomesure = somme / nblect;
     
  Serial.print("Mesure = ");
  Serial.println(photomesure);       
   
  if (photomesure < seuil) { // faisceau coupé !
      digitalWrite(ledcontrolePin, HIGH);
  } else {
       digitalWrite(ledcontrolePin, LOW);
  }   
  
} // loop

Et voici comment je l’ai modifié :

int ledcontrolePin = 11;

int nblect=5;

long somme1 = 0;
long somme2 = 0;


long somme = 0;

int photomesure = 0;

int seuil = 50;

                                         
int recv1 = 0;                       // On itinialise les pins
int recv2 = 1;

const int led = 11;                                   


void setup(void)
{

 Serial.begin(19200);


}

void loop(void)                         // Début du programme
{


 int i;
   
 somme = 0; // on va faire la moyenne de plusieurs mesures
   
  for (i=0 ; i < nblect ; i++) {      
   
  somme1 = somme +  analogRead(recv1);
  somme2 = somme +  analogRead(recv2);
  somme3 = somme +  analogRead(recv3);
  
  } 
   
recv1 = somme1 / nblect;
recv2 = somme2 / nblect;
recv3 = somme3 / nblect;

if (recv1 < seuil)
{
  if (recv2 < seuil) {  
    digitalWrite(led, HIGH);
  }
}
else{
  digitalWrite(led, LOW);
}
}

Mais il ne marche pas …

Ma LED clignote quand j’y passe mon récepteur mais ne s’éteint pas.

J’ai vu que dans son programme, il parle de faire une moyenne (en fonction de la luminosité ? )

Si je voulais skip cette étape, comment faire ?

Bonjour !

D’abord une erreur que je vois c’est que tu n’as pas déclaré recv3.

int recv1 = 0; // On itinialise les pins
int recv2 = 1;

Si je comprend bien vous voulez lire 3 lectures et vous attitrez ici les pins 0 et 1. Ces pins sont des pin digitales utiliser pour la communication avec l’Arduino. Idéalement il faut éviter de les utiliser. Si vous voulez lire des pins analogiques, choisir plutôt A0, A1, A2 ou leur équivalent 14,15 et 16 par exemple.
Ensuite entrez la valeur lue dans une variable pour utilisation future, par Exemple : Recepteur1 = analogRead(recv3);

En écrivant recv1 = somme1 / nblect; vous redéfinissez la pin à la moyenne obtenue et malheureusement une pin de 43.62 va être difficile à trouver :stuck_out_tongue:

Pour cèsser de faire des moyennes, tout ceci deviendra inutile :
int i;

somme = 0; // on va faire la moyenne de plusieurs mesures

for (i=0 ; i < nblect ; i++) {

somme1 = somme + analogRead(recv1);
somme2 = somme + analogRead(recv2);
somme3 = somme + analogRead(recv3);

}

recv1 = somme1 / nblect;
recv2 = somme2 / nblect;
recv3 = somme3 / nblect;

Comme je suppose que vous voulez seulement utiliser une valeur lue pour fin de comparaison et comparer les 3 valeurs pour allumer la DEL alors peut-être que ceci conviendrait :

if (Recepteur1 < seuil && Recepteur2 < seuil && Recepteur3 < seul)
{
digitalWrite(led, HIGH);
}
else{
digitalWrite(led, LOW);
}

En passant, ne pas oublier de définir la pin led comme OUTPUT… :wink:

Bonne chance !

En te lisant j'ai l'impression qu'il s'agit bien d'un phototransistor. Comme 68tjs l'a mentionné, les pattes d'un phototransistor doit être inversé.

Je n'ai pas dit cela.

J'ai dit : - si c'est une diode : à l'ohmmètre le courant doit passer dans un sens et pas dans l'autre - si c'est un phototransistor les deux pattes sont celles de l'émetteur et du collecteur. ET EN ABSENCE [1] de lumière cela ne doit passer dans aucun sens. [1] le scotch noir c'est utile.

Montage (j'ajoute le cas du phototransistor) : - Si c'est une diode c'est un générateur de courant et il faut la faire débiter dans une résistance connectée à la masse. Bien évidement on peux faire l'inverse mais ce sera du "pourquoi faire simple quand on peut faire compliqué". -Si c'est un phototransistor il faut le monter en [u]Émetteur commun[/u] et commencer par déterminer quelle patte est l'émetteur et quelle patte est le collecteur --> ce n'est pas compliqué soit il y a un détrompeur soit il y a une chance sur deux de se tromper et compte tenu que quoi qu'on fasse l'emerde**ent est maximum 99 chances sur 100 de le monter à l'envers.

Dans son programme, il n'utilise qu'un récepteur. Moi mon but est d'en faire parler plusieurs.

Il faut mettre une porte logique OU avec autant d'entrée que tu as de récepteurs.

Ce peut être un boîtier ou beaucoup plus intelligemment un "OU câblé" [u]comme dans l'I2C.[/u]

Si tu regarde l'I2C tous les modules sortent avec un collecteur ouvert --> le lm 393 est un comparateur à collecteur ouvert : je ne l'ai pas choisi au hasard. Tout les collecteurs ouverts sont reliés ensemble. Au repos tous les comparateur doivent fournir [u]un niveau haut.[/u] Dès qu'un comparateur est activé il passe à l'état bas. Donc quelque soit le frelon détecté le micro verra un état bas.

Au passage note que c'est ce qu'on appelle de la logique Négative. - Au repos c'est à dire au 0logique on a +5V - Au travail c'est à dire au 1logique on a 0V.

Si on faisait l'inverse on n'aurait pas un "OU câblé" mais un "ET câblé" .

Désolé de t'avoir mal cité 68tjs, c'est ce passage auquel je faisait référence :

1) la diode d'émission est bien à monter en direct mais celle de réception doit être montée en inverse.

Que ce soit la détection d'une tension par une DEL en réception ou en utilisant un phototransistor et une résistance, il faut monter à l'envers. (par rapport à la longueur des broches)

La façon que je distingue une DEL d'un phototransistor c'est en l'exposant à la lumière et en mesurant la tension au borne par un voltmètre. Un phototransistor va me donner un 0V alors qu'une DEL peut donner de quelque dizième de volt à plus de 2V selon la couleur et la source de lumière qu'on utilise.

Supertesla: int recv1 = 0; // On itinialise les pins int recv2 = 1; ... Ces pins sont des pin digitales utiliser pour la communication avec l'Arduino. Idéalement il faut éviter de les utiliser. Si vous voulez lire des pins analogiques, choisir plutôt A0, A1, A2 ou leur équivalent 14,15 et 16 par exemple.

non non ça marche aussi avec 0, 1, .. du moment qu'il fait un analogRead

Mortufac: Mais il ne marche pas ...

il ne compile même pas alors je me demande comment tu as essayé prends l'habitude de declarer tes pins en const ça t'éviteras de les utiliser pour faire une moyenne

Re,

Pour le montage électrique, c’est bon.
J’ai mes récepteurs monté en inverse, mes résistances (2,2k) branchées à la masse et les pins partant vers les résistances.

J’ai fait des tests avec le programme du site, ça marche impec !

Mais là je me confronte à un problème :

J’ai en effet mis 2 récepteurs, et inséré ma ligne, en effaçant recv 3 :

if (Recepteur1 < seuil && Recepteur2 < seuil )

Mais ce qui se passe c’est que ma led s’éteint lorsque mon émetteur envoie de l’ir dans l’un des deux récepteurs.
J’ai essayé en ne mettant qu’un seul “&” mais idem.

Moi ce que je voudrais c’est que ma led s’éteigne (ou faire une autre action à terme) seulement si les deux récepteurs reçoivent de l’ir…

par une DEL en réception ou en utilisant un photoresistor, il faut monter à l'envers

Non.

Les photons qui frappent une jonction de diode donnent naissance à un courant d' électrons --> d'où la notion de générateur de courant.

Cas de la diode : Ce courant est très faible et il se superpose au courant de fuite de la diode. Il ne faut surtout pas la polariser en direct. Ordre de grandeur du courant : des µA.

Cas du phototransistor: Les électrons créés par les photons sont injectés directement dans la base. Hormis ce fait le transistor est totalement normal il faut donc l'utiliser comme n'importe quel autre transistor en montage émetteur commun avec une résistance de charge entre le collecteur et l'alim.

Ma diode n'est pas polarisée en direct, elle est en iverse, et ma résistance fait jonction avec l'arduino, comme vous l'avez dit ...

Je répondais a Supertesla.

Mais toi comment gère tu tes récepteurs actuellement ? Electroniquement avec comparateurs et OU câblé -->je ne pense pas tu serais plus rapide que Lucky Luke.

Je pense que tu essayes par programmation. Et donc tu utilises une entrée micro par récepteur. Je me trompe ?