Table des matières:

Télécommande infrarouge I2C avec l'Arduino : 8 étapes (avec photos)
Télécommande infrarouge I2C avec l'Arduino : 8 étapes (avec photos)

Vidéo: Télécommande infrarouge I2C avec l'Arduino : 8 étapes (avec photos)

Vidéo: Télécommande infrarouge I2C avec l'Arduino : 8 étapes (avec photos)
Vidéo: Logic Gates Learning Kit #2 - Transistor Demo 2024, Juillet
Anonim
Télécommande infrarouge I2C avec l'Arduino
Télécommande infrarouge I2C avec l'Arduino
Télécommande infrarouge I2C avec l'Arduino
Télécommande infrarouge I2C avec l'Arduino

PréambuleCe Instructable détaille comment créer une télécommande universelle en utilisant I2C pour l'interface.

Comment étrange vous dites, en utilisant un appareil esclave I2C?

Oui, un appareil esclave I2C.

En effet, la synchronisation précise des paquets IR est assez exigeante et un Arduino typique aura du mal avec s'il effectue déjà de nombreuses autres tâches en même temps. Il est préférable de répartir la charge de calcul en attribuant des activités gourmandes en temps à des processeurs dédiés chaque fois que possible (mieux encore le faire dans le matériel). Étant donné que I2C est une méthode de communication bien documentée et robuste entre les circuits intégrés, j'ai choisi celle-ci comme interface.

introduction

Comme mentionné ci-dessus, cette instructable décrit comment contrôler les appareils ménagers tels que la télévision, le lecteur DVD et le satellite, etc. à l'aide de la bibliothèque IRremote sur l'Arduino.

Il se termine par un exemple de conception transformant l'Arduino en un module de télécommande esclave I2C (photo 1 ci-dessus) avec un prototype de circuit de test (photo 2 ci-dessus) et explique en détail comment réduire votre conception au minimum de composants nécessaires afin qu'elle puisse être intégré dans une autre conception. Dans mon cas, j'utilise cet appareil intégré dans un appareil de télécommande universel IoT basé sur un ESP8266-12E.

De quelles pièces ai-je besoin ?

Pour construire le circuit décrit à l'étape 1 (émetteur IR), vous aurez besoin des pièces suivantes;

  • 2 résistances 10K
  • 1 résistance 390R
  • 1 résistance 33R
  • 1 résistance 3K8
  • 1 LED rouge éteinte
  • 1 LED IR TSAL6400
  • 1 sur Transistor BC337
  • 1 condensateur de 220 uF
  • 1 hors Arduino Uno

Pour construire le circuit décrit à l'étape 4 (récepteur IR), vous aurez besoin des pièces suivantes;

  • 1 résistance 10K
  • 1 sur TSOP38328
  • 1 condensateur de 220 uF
  • 1 hors Arduino Uno

Pour construire le circuit décrit à l'étape 5 (circuit de test esclave), vous aurez besoin des pièces suivantes;

  • 4 résistances 10K
  • 2 résistances 390R
  • 1 résistance 33R
  • 1 résistance 3K8
  • 2 éteint LED rouge
  • 1 LED IR TSAL6400
  • 1 sur Transistor BC337
  • 1 condensateur de 220 uF
  • 2 boutons SPST
  • 2 sur Arduino Unos

Pour construire le circuit décrit à l'étape 6 (conception rétrécie), vous aurez besoin des pièces suivantes;

  • 3 résistances 10K
  • 1 résistance 270R
  • 1 résistance 15R
  • 4 résistances 1K
  • 1 LED rouge éteinte
  • 1 LED IR TSAL6400 ou TSAL5300
  • 1 sur Transistor BC337
  • 1 condensateur électrolytique 220uF @ 6.3v
  • 1 condensateur électrolytique 1000uF @ 6.3v
  • 2 condensateurs de 0,1 uF
  • 2 condensateurs 22pF
  • 1 sur 16MHz Xtal
  • 1 sur ATMega328P-PU

Remarque: Vous aurez également besoin d'un appareil FTDI pour programmer l'ATMega328P

De quelles compétences ai-je besoin ?

  • Une connaissance minimale de l'électronique,
  • Connaissance d'Arduino et de son IDE,
  • Un peu de patience,
  • Une certaine compréhension d'I2C serait utile (voir ici pour quelques détails génériques sur I2C/Wire Library).

Sujets couverts

  • Bref aperçu du circuit,
  • Bref aperçu du logiciel,
  • Contenu du paquet I2C,
  • Acquisition des codes de télécommande (ui32Data),
  • Comment tester votre appareil I2C Slave,
  • Réduire votre conception,
  • Conclusion,
  • Références utilisées.

Clause de non-responsabilité

Comme toujours, vous utilisez ces instructions à vos risques et périls et elles ne sont pas prises en charge.

Étape 1: Bref aperçu du circuit

Bref aperçu du circuit
Bref aperçu du circuit

Le but du circuit est de transmettre des codes de télécommande IR. Son design est assez simple et simple.

Lorsque le transistor Q1 a BC337 NPN est activé via un un logique d'Arduino PWM O/P D3 à la résistance R5, le courant passe par les Leds 1 et 2. Limité uniquement par les résistances de ballast R3 et R4 respectivement. Q1 est utilisé pour augmenter le courant traversant la diode IR (IF Max = 100mA) au-delà de ce que l'Arduino O/P est capable de ~40mA @ +5v d'alimentation.

Le condensateur C1 a 220uF électrolytique fournit une certaine stabilisation empêchant une chute du rail d'alimentation par la puissance consommée par les Leds 1 et 2.

Les résistances R1 et R2 sont des pull-ups I2C.

Étape 2: Bref aperçu du logiciel

Bref aperçu du logiciel
Bref aperçu du logiciel
Bref aperçu du logiciel
Bref aperçu du logiciel
Bref aperçu du logiciel
Bref aperçu du logiciel

Préambule

Pour compiler avec succès ce code source, vous aurez besoin de la bibliothèque supplémentaire suivante;

IRremote.h

  • Par: z3t0
  • Objectif: Bibliothèque distante infrarouge pour Arduino: envoyer et recevoir des signaux infrarouges avec plusieurs protocoles
  • De:

Présentation des codes

Comme le montre l'image 1 ci-dessus, au démarrage, le code configure les E/S du microcontrôleur, puis interroge l'état de l'indicateur logiciel interne « bFreshDataFlag ». Lorsque cet indicateur est défini, le contrôleur affirme sa ligne « Busy » (envoi de la broche de données D4 à l'état bas) et passe à l'état « eBUSY » en lisant séquentiellement les commandes d'appui sur le bouton contenues dans uDataArray et en envoyant les données modulées IR à la LED IR dans un séquence de transmission.

Une fois que les données contenues dans uDataArray ont été entièrement envoyées, l'état « eIDLE » est repris et la ligne « Busy » est désactivée (envoi de la broche de données D4 à l'état haut). L'appareil est maintenant prêt à recevoir d'autres appuis sur les boutons marquant la fin de la séquence de transmission.

Réception des données d'appui sur le bouton IR

Lorsque des données sont envoyées à la télécommande infrarouge via I2C, elle déclenche une interruption et l'appel de fonction receiveEvent() est déclenché de manière asynchrone.

Une fois déclenchées, les données I2C reçues sont écrites séquentiellement dans le tampon 'uDataArray'.

Lors de la réception des données, si une fin de séquence est signalée par le maître (bFreshData!=0x00) le 'bFreshDataFlag' est positionné, signalant ainsi le début de la séquence de transmission.

Les images 2 à 3 donnent un exemple d'une séquence de paquets typique.

Remarque: le code source complet est disponible ici

Étape 3: Contenu du paquet I2C

Contenu du paquet I2C
Contenu du paquet I2C

Le format du paquet de contrôle envoyé à l'esclave via I2C est donné ci-dessus dans l'image 1 la signification de chaque champ est donnée ci-dessous

Signification des champs du paquet de contrôle

octet bEncodage;

  • Encodage de la télécommande IR,

    • RC6 (Ciel) = 0,
    • SONY = 1,
    • SAMSUNG = 2,
    • NCA = 3,
    • LG = 4

uint32_t ui32Data;

La représentation hexadécimale du flux de données IR binaire 4 octets de données (long non signé), LSByte … MSByte

octet bNumberOfBitsInTheData;

Nombre de bits dans les données (Max de 32). Plage = 1 … 32

octet bPulseTrainRepeats;

Combien de répétitions de ce train d'impulsions. Plage = 1 … 255. Typiquement 2…4 répétitions. Vous voudrez peut-être étendre cela pour les commandes On/Off car l'appareil récepteur nécessite parfois quelques répétitions de train d'impulsions supplémentaires pour recevoir un signal d'activation

octet bDelayBetweenPulseTrainRepeats;

Délai entre les répétitions de ce train d'impulsions. Plage = 1 … 255mS. Généralement 22mS … 124mS

octet bButtonRepeats;

Simule une pression répétée sur le même bouton (mais ne prend pas en charge le code modifié comme une télécommande Apple, il répète simplement le code du bouton). Plage = 1 … 256. Par défaut = 1

uint16_t ui16DelayBetweenButtonRepeats;

Délai entre les répétitions de bouton (entier non signé). 2 octets au total LSByte … MSByte. Plage = 1 … 65535mS. Par défaut = 0mS

octet bFreshData;

  • Des données fraîches. Une valeur non nulle. Écrit en dernier, déclenche la séquence IR TX. Plage 0x00…0xFF

    • Plus de paquets de contrôle à venir = 0
    • C'est le paquet de contrôle final = valeur non nulle 1, 2, … 255

Notez l'utilisation de la directive du compilateur '_packed_'. Cela permet de s'assurer que les données sont des paquets octet par octet en mémoire, quel que soit le système cible utilisé (Uno, Due, ESP8266, etc.). Cela signifie que l'union entre registerAllocationType et dataArrayType n'a besoin que d'une horloge de sortie/horloge séquentielle en octets à partir d'un paquet de contrôle, ce qui simplifie le logiciel TX/RX.

Étape 4: Acquisition des codes de télécommande (ui32Data)

Acquisition de codes de télécommande (ui32Data)
Acquisition de codes de télécommande (ui32Data)
Acquisition de codes de télécommande (ui32Data)
Acquisition de codes de télécommande (ui32Data)
Acquisition de codes de télécommande (ui32Data)
Acquisition de codes de télécommande (ui32Data)
Acquisition de codes de télécommande (ui32Data)
Acquisition de codes de télécommande (ui32Data)

Il existe trois façons d'acquérir un code de clé de télécommande respectif;

  1. Par comptage de bits avec un oscilloscope,
  2. Recherchez-le sur un site Web,
  3. Décodez-le directement à partir du flux de données dans le logiciel.

Par comptage de bits avec une portée

Ce n'est pas une méthode efficace car elle prend un certain temps et nécessite potentiellement plus d'une tentative, mais elle peut être très précise. Il est également utile pour valider visuellement les codes obtenus à l'aide des méthodes 2 et 3, ainsi que pour déterminer les particularités d'une télécommande. À titre d'exemple lorsque vous maintenez enfoncé un bouton sur une télécommande Apple IR. La télécommande émettra initialement une séquence de commandes, puis la suivra avec une séquence compressée répétée de 0xF….

Recherchez-le sur un site Web

La base de données de codes de contrôle à distance sur le site Web Linux Infrared Remote Control est une bonne source.

L'inconvénient, cependant, est que vous devrez peut-être essayer quelques codes jusqu'à ce que vous en trouviez un qui fonctionne pour vous. Vous devrez peut-être également interpréter certaines des représentations des codes pour les convertir en leur forme hexadécimale équivalente.

Décodez-le directement à partir du flux de données

En utilisant le circuit de l'image 1 ci-dessus en conjonction avec l'exemple de bibliothèque IRremote 'IRrecvDumpV2.ino', il est possible de décoder le flux de données directement depuis la télécommande. L'image 2 montre une télécommande de téléviseur Samsung décodée pour une pression sur un bouton marche/arrêt dans la fenêtre du terminal Arduino IDE.

Récepteur/Émetteur combiné

Les images 3 et 4 ci-dessus décrivent une solution qui permet à la fois la réception et la transmission de la commande IR pour permettre un prototypage facile.

Pour décoder les pressions sur les boutons de la télécommande IR, vous devrez flasher l'Arduino avec l'exemple 'IRrecvDumpV2.ino' fourni avec la bibliothèque IRremote.

Cela fonctionne aussi bien pour la transmission si les commandes IR. Une led rouge est incluse comme indication visuelle que l'appareil est en action.

Étape 5: Comment tester votre périphérique esclave I2C

Comment tester votre périphérique esclave I2C
Comment tester votre périphérique esclave I2C
Comment tester votre périphérique esclave I2C
Comment tester votre périphérique esclave I2C

En utilisant le code source ici et le circuit décrit ci-dessus dans l'image 1, programmez l'Arduino 'Master' avec 'IR_Remote_Sim_Test.ino' et l'Arduino 'Slave' avec 'IR_Remote_Sim.ino'.

En supposant que vous ayez un téléviseur Sony Bravia, un boîtier Sky HD et une barre de son Sony BT, appuyez sur le bouton 1 et votre téléviseur passera à BBC1 (canal 101). Appuyez sur le bouton 2 et votre barre de son se mettra en sourdine. Appuyez à nouveau et il sera désactivé.

Pendant l'exécution de la séquence de transmission IR, la LED3 s'allumera pour indiquer que l'esclave est occupé et la LED1 clignotera en ligne avec le processus de transmission IR.

Bien sûr, si vous n'avez pas configuré le même système de divertissement que ci-dessus, vous pouvez reprogrammer l'esclave avec 'IRrecvDumpV2.ino', décoder les commandes à distance qui vous intéressent, puis les programmer dans 'IR_Remote_Sim_Test.ino' pour votre scénario donné.

L'image 2 montre la vue d'ensemble du logiciel de test au niveau du système entre le maître et l'esclave.

Étape 6: rétrécir votre conception

Réduire votre conception
Réduire votre conception

Ok, donc en supposant que vous ayez suivi cette instructable en s'appuyant sur deux Arduinos pour contrôler vos appareils domestiques n'est pas l'utilisation la plus efficace de votre stock Arduino. Par conséquent, si vous construisez le circuit montré dans l'image ci-dessus et suivez les instructions ici pour programmer l'ATMega328P avec 'IR_Remote_Sim.ino', vous pourrez réduire l'ensemble du système aux composants minimaux. Cela vous permettra d'intégrer votre conception dans un autre système.

Étape 7: Conclusion

Conclusion
Conclusion
Conclusion
Conclusion

La solution est stable et fonctionne bien, elle est intégrée dans un autre système depuis quelques semaines maintenant sans aucun problème.

J'ai choisi l'Arduino Uno R3 car je voulais un appareil doté de suffisamment de RAM pour pouvoir disposer d'un tampon de boutons d'une profondeur raisonnable. J'ai opté pour une taille de tampon de 20 paquets (MAX_SEQUENCES).

Le shield Hybrid TX/RX que j'ai fabriqué s'est également avéré très utile lors du décodage des télécommandes Sony et Sky. Bien que je doive avouer utiliser mon oscilloscope numérique de temps en temps pour vérifier que la commande IR décodée par logiciel était la même que celle provenant de l'IR reçu (TSOP38328).

La seule chose que j'aurais fait différemment aurait été d'utiliser le circuit d'entraînement à courant constant pour la led IR, comme indiqué ci-dessus sur la photo 2.

Un autre point à noter est que tous les émetteurs IR ne sont pas modulés avec 38KHz, le TSOP38328 est optimisé pour 38KHz.

Étape 8: Références utilisées

IRRemote.h

  • Par: z3t0
  • Objectif: Bibliothèque distante infrarouge pour Arduino: envoyer et recevoir des signaux infrarouges avec plusieurs protocoles
  • De:

Bibliothèque à distance IR

  • z3t0.github.io/Arduino-IRremote/
  • https://arcfn.com/2009/08/multi-protocol-infrared-remote-library.html

Capteur récepteur IR (infrarouge) - TSOP38238 (équivalent)

https://cdn-shop.adafruit.com/datasheets/tsop382.pdf

Pour éviter le remplissage de la structure de données aux limites des mots

  • https://github.com/esp8266/Arduino/issues/1825
  • https://github.com/tuanpmt/esp_bridge/blob/master/modules/include/cmd.h#L15
  • https://stackoverflow.com/questions/11770451/what-is-the-meaning-of-attribute-packed-aligned4

Bonne source de détails à distance IR

https://www.sbprojects.com/knowledge/ir/index.php

I2C

  • https://playground.arduino.cc/Main/WireLibraryDetailedReference
  • https://www.arduino.cc/en/Reference/WireSend

Base de données des télécommandes IR

  • https://www.lirc.org/
  • https://lirc-remotes.sourceforge.net/remotes-table.html

Fiche technique BC337

https://www.onsemi.com/pub/Collateral/BC337-D. PDF

Fiche technique 1N4148

https://www.vishay.com/docs/81857/1n4148.pdf

Conseillé: