Arduino tutoriel IR sensor
Arduino tutoriel IR sensor PDF
...
Les détecteurs infrarouges sont de petites puces avec une cellule photoélectrique qui sont réglées pour écouter la lumière infrarouge. Ils sont presque toujours utilisés pour la détection à distance - chaque téléviseur et lecteur de DVD en possède un à l'avant pour écouter le signal infrarouge du clicker. À l’intérieur de la télécommande se trouve une diode infrarouge correspondante, qui émet des impulsions IR pour indiquer au téléviseur qu’il doit allumer, éteindre ou changer de canal. La lumière infrarouge n’est pas visible à l’œil humain, ce qui signifie qu’il faut un peu plus de travail pour tester une configuration.
Il y a quelques différences entre celles-ci et dites a:
Les détecteurs infrarouges sont spécialement filtrés pour la lumière infrarouge. Ils ne détectent pas bien la lumière visible. D'autre part, les cellules photoélectriques sont bonnes à détecter la lumière visible jaune / verte, pas bonnes à la lumière infrarouge
Les détecteurs IR ont un démodulateur à l’intérieur qui recherche l’IR modulé à 38 KHz. Une simple DEL IR ne sera pas détectée, elle doit clignoter à 38 KHz. Les cellules photoélectriques ne disposent d'aucun démodulateur et peuvent détecter n'importe quelle fréquence (y compris la tension continue) dans la vitesse de réponse de la cellule photoélectrique (qui est d'environ 1 kHz).
- Les détecteurs infrarouges ont une sortie numérique - soit ils détectent le signal infrarouge à 38 KHz et une sortie basse (0V), soit ils ne détectent aucun signal et une sortie haute (5V). Les cellules photoélectriques agissent comme des résistances, la résistance change en fonction de la quantité de lumière à laquelle elles sont exposées.
Dans ce tutoriel, nous montrerons comment
Testez votre capteur infrarouge pour vous assurer qu'il fonctionne
Lire les codes IR bruts dans un microcontrôleur
Créer un intervalle de caméra
Écoutez les "commandes" d'une télécommande de votre microcontrôleur
Quelques statistiques
Ces statistiques concernent le détecteur infrarouge du magasin Adafruit, également connu sous le nom de PNA4602. Presque toutes les cellules photoélectriques auront des spécifications légèrement différentes, bien qu'elles fonctionnent toutes pratiquement de la même manière. S'il y a une fiche technique, vous voudrez vous y référer
Taille: carré, zone de détection de 7 mm sur 8 mm
Prix: 2,00 $ à la boutique Adafruit
Sortie: 0V (bas) lors de la détection de la porteuse 38KHz, 5V (haut) sinon
Plage de sensibilité: 800 nm à 1100 nm avec une réponse maximale à 940 nm. La plage de fréquence est de 35KHz à 41KHz avec détection de pic à 38KHz Alimentation: 3-5V DC 3mA
…
Que pouvez-vous mesurer?
Comme vous pouvez le voir sur ces graphiques de fiche technique, la détection de fréquence de crête est à 38 KHz et la couleur de crête de la LED est de 940 nm. Vous pouvez utiliser environ 35 KHz à 41 KHz, mais la sensibilité diminuera de sorte qu’elle ne détectera pas aussi bien de loin. De même, vous pouvez utiliser des diodes électroluminescentes de 850 à 1100 nm, mais elles ne fonctionneront pas aussi bien que de 900 à 1 000 nm, assurez-vous d’avoir des diodes identiques! Vérifiez la fiche technique de votre LED IR pour vérifier la longueur d'onde.
Essayez d’obtenir un 940nm - rappelez-vous que 940nm n’est pas une lumière visible (son infrarouge)!
Tester un capteur IR
Parce qu'il y a un semi-conducteur / puce à l'intérieur du capteur, il doit être alimenté avec 3 - 5V pour fonctionner. Cela contraste avec les cellules photoélectriques et les FSR où ils agissent comme des résistances et peuvent donc être simplement testés avec un multimètre.
Ici nous allons connecter le détecteur en tant que tel:
La broche 1 est la sortie, nous la connectons donc à une LED et à une résistance visibles
La broche 2 est rectifiée
La broche 3 est VCC, connectez à 3-5V
Lorsque le détecteur détecte le signal infrarouge, il réduit la sortie en allumant la DEL - car la DEL est rouge, il est beaucoup plus facile de voir que l’IR!
Nous allons utiliser des piles 4xAA 1.3V (j'utilise NiMH) pour que la tension alimentant le capteur soit d'environ 4V.
2 piles (3V) peut être trop peu. 3 piles devraient bien fonctionner si vous avez un support triple AA
Vous pouvez également obtenir 5V d'un microcontrôleur comme un Arduino si vous en avez un. Le sol va à la broche du milieu.
La tête positive (la plus longue) de la LED rouge se connecte à la broche + 6V et la borne négative (plus courte) se connecte via une résistance de 200 à 1000 ohms à la première broche du capteur infrarouge.
Maintenant, prenez une télécommande quelconque comme une télévision, un DVD, un ordinateur, etc. et dirigez-la vers le détecteur tout en appuyant sur certaines touches. Vous devriez voir la DEL clignoter plusieurs fois lorsque vous appuyez sur la télécommande
Signaux à distance IR
Maintenant que nous savons que le capteur fonctionne, nous voulons savoir ce qui est envoyé, non? Mais avant cela, examinons d’abord comment les données sont envoyées de la télécommande infrarouge (dans votre main) au capteur de réception infrarouge (sur la maquette).
Pour cet exemple, nous utiliserons le code IR d'activation / désactivation de Sony provenant d'une télécommande de téléviseur Sony. C'est très simple et couramment documenté!
Imaginons que nous avons une télécommande Sony et que nous pouvons voir exactement quelle lumière est projetée par la DEL IR. Nous allons brancher un capteur de lumière de base (comme une cellule photoélectrique de base!) Et l'écouter. Nous n'utiliserons pas de décodeur tel qu'un PNA4602 (pour l'instant) car nous voulons voir le signal non décodé. Ce que nous voyons est le suivant:
Fondamentalement, nous voyons des impulsions ou un signal IR. les «blocs» jaunes correspondent à la transmission de la LED IR et lorsqu'il n'y a qu'une ligne, la LED IR est éteinte. (Notez que la tension à 3VDC est juste à cause de la façon dont j'ai branché le capteur, si j'avais troqué le pull-up pour un pulldown, il serait à la terre.)
Le premier bloc mesure environ 2,5 ms (voir les curseurs et la mesure sur le côté)
Si vous zoomez sur l’un de ces blocs…
Vous voyez qu'ils ne sont pas vraiment des "blocs" mais des impulsions très rapides!
Si vous effectuez un zoom avant…
Vous pouvez mesurer la fréquence des impulsions IR. Comme vous pouvez le constater avec les curseurs et les mesures sur le côté, la fréquence est d'environ 37.04KHz
OK, nous pouvons maintenant comprendre comment les codes IR sont envoyés. La DEL de l’émetteur IR émet des impulsions rapides (modulation PWM - largeur d’impulsion) à une fréquence élevée de 38 KHz, puis émet et éteint de façon plus lente les impulsions PWM, qui durent environ 1 à 3 ms.
Pourquoi ne pas allumer et éteindre la LED? Pourquoi les pulsations des porteuses PWM? De nombreuses raisons!
Une des raisons est que cela laisse la LED refroidir. Les LED IR peuvent prendre jusqu'à 1 ampère (1000 milliampères!) De courant. La plupart des LED ne prennent que 20mA environ. Cela signifie que les DEL infrarouges sont conçues pour la projection à haute puissance MAIS elles ne peuvent le prendre que pendant quelques microsecondes. PWM'ing, vous laissez la LED refroidir la moitié du temps
Une autre raison est que le téléviseur n'écoute que certaines fréquences de PWM. Ainsi, une télécommande Sony à 37 KHz ne pourra pas fonctionner avec un lecteur de DVD JVC qui ne veut que 50 KHz.
Enfin, la raison la plus importante est qu’en émettant une onde porteuse, vous réduisez les effets de la lumière ambiante. Le téléviseur recherche uniquement les changements de niveaux de lumière aux alentours de 37KHz. Tout comme il est plus facile pour nous de faire la différence entre les tonalités audio que de déterminer précisément la hauteur de tonalité (enfin, du moins pour la plupart des gens)
OK, nous connaissons maintenant la fréquence porteuse. C'est 37KHz. Suivant permet de trouver les largeurs d'impulsion!
Regardant la première image de la portée
La première impulsion est de 2,5 ms. Nous pouvons utiliser les curseurs pour mesurer les impulsions restantes. Je vous épargne les 12 images et vous tiens au courant que les impulsions sont:
PWM ON
……
Alors disons que vous n'avez pas d'oscilloscope à 1 000 $, comment pouvez-vous lire ces signaux autrement? Le décodeur IR tel que le PNA4602 nous rend un service: il filtre le signal de 38 KHz de sorte que nous n'obtenions que les gros morceaux de signal dans la gamme des millisecondes. Cela est beaucoup plus facile à gérer pour un microcontrôleur. C’est ce que nous ferons dans la section suivante!
La bonne nouvelle est qu'il est très facile de brancher ce capteur. Il suffit de connecter la sortie à une broche numérique. La mauvaise nouvelle est que la procédure conviviale digitalRead () de l’Arduino est un peu trop lente pour lire de manière fiable le signal rapide entrant. Nous utilisons donc la fonction de lecture matérielle directement à partir de la broche D2, c’est ce que la ligne "IRpin_PIN & BV ( IRpin)) "fait.
/ * Croquis du décodeur IR brut!
- Ce croquis / programme utilise Arduno et un PNA4602 pour décoder les IR reçus. Ceci peut être utilisé pour créer un récepteur IR
- (en recherchant un code particulier) ou un émetteur (en émettant une DEL IR à ~ 38 KHz pendant les durées détectées
- Le code est du domaine public, visitez www.ladyada.net et adafruit.com - pour plus de tutoriels! - * /
// Nous devons utiliser les méthodes de lecture de broches 'brutes'
// car le timing est très important ici et le digitalRead ()
// la procédure est plus lente!
// uint8_t IRpin = 2;
// La broche numérique n ° 2 est identique à la broche D2, voir
#define IRpin_PIN- - - - - - PIND
#define IRpin- - - - - - - - - - 2
// l'impulsion maximale que nous écouterons - 65 millisecondes, c'est long #define MAXPULSE 65000
// ce que notre résolution temporelle devrait être, plus grand est meilleur // car plus précis - mais trop grand et vous n'aurez pas
// timing précis
#define RÉSOLUTION 20
// nous allons stocker jusqu'à 100 paires d'impulsions (c'est un lot)
// nous allons stocker jusqu'à 100 paires d'impulsions (c'est-à-dire un lot). uint16_t impulsions [100] [2]; - // la paire est haute et basse impulsion uint8_t currentpulse = 0; // index pour les impulsions que nous stockons
void setup (void) {
- Serial.begin (9600);
- Serial.println ("Prêt à décoder IR!");
}
boucle vide (vide) {
- uint16_t highpulse, lowpulse; - // temporisation de stockage temporaire - highpulse = lowpulse = 0; // commence sans durée d'impulsion
// - while (digitalRead (IRpin)) {// c'est trop lent!
- - - while (IRpin_PIN & (1 << IRpin)) {- - - - - // la broche est encore HAUTE
- - - - // comptez quelques microsecondes supplémentaires - - - - - highpulse ++; delayMicroseconds (RESOLUTION);
- - - - // Si l'impulsion est trop longue, le délai est dépassé - soit rien
- - - - // a été reçu ou le code est terminé, alors imprimez ce que - - - - - // nous avons saisi jusqu'à présent, puis réinitialisez- - - - - if ((highpulse> = MAXPULSE) && (currentpulse ! = 0)) {- - - - - - - impulsions d’impression (); - - - - - - - currentpulse = 0; revenir;
- - - -}
-}
- // nous n'avons pas dépassé le temps imparti, alors cachons les impulsions de lecture [currentpulse] [0] = highpulse;
- // idem que ci-dessus - while (! (IRpin_PIN & _BV (IRpin))) {- - - - - // la broche est toujours FAIBLE - - - - - lowpulse ++; - - - - - delayMicroseconds (RESOLUTION);
- - - - if ((lowpulse> = MAXPULSE) - && (currentpulse! = 0)) {- - - - - - - impulsions d’impression (); - - - - - - - currentpulse = 0; - - - - - - - revenir;
- - - -} - -}
- impulsions [impulsion de courant] [1] = impulsion faible;
- // nous lisons avec succès une impulsion haut-bas, continuez! - - currentpulse ++;
}
void printpulses (void) {
- Serial.println ("\ n \ r \ n \ rReceived: \ n \ rOFF \ tON"); - - pour (uint8_t i = 0; i <currentpulse; i ++) {
- - - Serial.print (impulsions [i] [0] * RESOLUTION, DEC); - - - - Serial.print ("usec,");
- - - Serial.print (impulsions [i] [1] * RESOLUTION, DEC);
- - - Serial.println ("usec");
-} - -
- // l'imprimer dans un format 'tableau'
- Serial.println ("int IRsignal [] = {"); - - Serial.println ("// ON, OFF");
- pour (uint8_t i = 0; i <currentpulse-1; i ++) {
- - - //Serial.print("\t "); // onglet
- - - Serial.print ("pulseIR ("));
- - - Serial.print (impulsions [i] [1] * RESOLUTION, DEC);
- - - Serial.print (");");
- - - Serial.println ("");
- - - //Serial.print("\t ");
- - - Serial.print ("delayMicroseconds (");
- - - Serial.print (impulsions [i + 1] [0] * RESOLUTION, DEC);
- - - Serial.println (");");
-}
- //Serial.print("\t "); // onglet
- Serial.print ("pulseIR ("));
- Serial.print (impulsions [currentpulse-1] [1] * RESOLUTION, DEC);
- Serial.print (");");
}
Si vous l'exécutez en pointant une télécommande infrarouge Sony et en appuyant sur le bouton ON, vous obtiendrez ce qui suit ...
Si vous ignorez la première impulsion OFF (c'est juste le temps écoulé entre le moment où l'Arduino est allumé et le premier signal IR reçu) et la dernière impulsion ON (le début du code suivant), vous trouverez le code d'alimentation Sony:
………
OK maintenant que nous pouvons lire les codes IR, faisons un projet de base. Le premier que nous ferons est de faire un intervalomètre. Un intervalomètre est essentiellement une chose électronique qui fait qu'une caméra s'éteigne toutes les quelques minutes. Ceci peut être utilisé pour des projets timelapse, de la photographie aérienne de cerf-volant ou d'autres projets photo.
La caméra que nous allons utiliser possède une télécommande infrarouge que vous pouvez utiliser pour la désactiver (la plupart des caméras haut de gamme en sont équipées).
Nous allons d’abord comprendre les codes en lisant le signal envoyé lorsque vous appuyez sur le bouton. Ensuite, nous allons prendre ces données et faire en sorte que l'Arduino crache ce code dans une LED IR une fois par minute
La première étape est simple, pointez la télécommande vers le capteur infrarouge et appuyez sur le bouton. Nous avons obtenu ce qui suit pour notre télécommande ML-L3 Nikon.
……
void pulseIR (longs microsecs) est notre procédure d'assistance, elle créera le signal IR PWM comme nous l'avons vu auparavant. J'ai utilisé mon oscilloscope pour l'ajuster afin que les retards soient totalisés correctement. Nous utilisons les procédures pas souvent discutées cli () et sei () pour désactiver les interruptions. L’arduino fait plusieurs choses à l’arrière-plan, comme rechercher des données série à lire ou à écrire, garder une trace du temps, etc. La plupart du temps, nous pouvons simplement les ignorer, mais pour les signaux à haute vitesse aussi délicats, nous voulons rester silencieux afin que nous recevons un beau signal
Si vous regardez SendNikonCode (), vous verrez le code de commande IR que nous avons déduit dans le projet précédent en chronométrant les impulsions du capteur IR.
Nous avons câblé cela et cela a bien fonctionné, assurez-vous de pointer correctement le voyant infrarouge vers la caméra
Pour notre dernier projet, nous utiliserons une télécommande pour envoyer des messages à un microcontrôleur. Par exemple, cela pourrait être utile pour un robot pouvant être dirigé avec une télécommande infrarouge. Cela peut également être utile pour les projets que vous souhaitez contrôler de loin, sans fil.
Pour une télécommande dans cet exemple, nous utiliserons une télécommande Apple Clicker. Vous pouvez utiliser n'importe quel type de télécommande que vous souhaitez ou vous pouvez en voler une à un hipster sans méfiance.
Nous utiliserons le code de notre dessin précédent pour la lecture IR brute, mais cette fois-ci, nous allons éditer notre imprimante-outer pour qu'il nous donne les impulsions d'un tableau C, cela nous facilitera l'utilisation du filtrage.
void printpulses (void) {
Serial.println ("\ n \ r \ n \ rReceived: \ n \ rOFF \ tON"); - - pour (uint8_t i = 0; i <currentpulse; i ++) {
- - - Serial.print (impulsions [i] [0] * RESOLUTION, DEC); - - - - Serial.print ("usec,");
- - - Serial.print (impulsions [i] [1] * RESOLUTION, DEC);
- - - Serial.println ("usec");
-}
- // l'imprimer dans un format 'tableau'
- Serial.println ("int IRsignal [] = {");
- Serial.println ("// ON, OFF (en dizaines de microsecondes)"); - - pour (uint8_t i = 0; i <currentpulse-1; i ++) {
- - - Serial.print ("\ t"); // onglet
- - - Serial.print (impulsions [i] [1] * RESOLUTION / 10, DEC);
- - - Serial.print (",");
- - - Serial.print (impulsions [i + 1] [0] * RESOLUTION / 10, DEC);
- - - Serial.println (",");
-}
- Serial.print ("\ t"); // onglet
- Serial.print (impulsions [currentpulse-1] [1] * RESOLUTION / 10, DEC);
- Serial.print (", 0};");
}
J'ai téléchargé le nouveau croquis et appuyé sur le bouton Lecture de la télécommande Apple pour obtenir le résultat suivant:
int IRsignal [] = {// ON, OFF (en dizaines de microsecondes)