Table des matières:

Télécommande TV universelle - Ardiuino, infrarouge : 5 étapes
Télécommande TV universelle - Ardiuino, infrarouge : 5 étapes

Vidéo: Télécommande TV universelle - Ardiuino, infrarouge : 5 étapes

Vidéo: Télécommande TV universelle - Ardiuino, infrarouge : 5 étapes
Vidéo: How to use Arduino as TV Remote Controller with Infrared 2024, Juillet
Anonim
Télécommande TV universelle - Ardiuino, infrarouge
Télécommande TV universelle - Ardiuino, infrarouge

Salut! Dans cette instructable, je vais vous montrer comment créer et programmer votre propre télécommande universelle qui fonctionnera avec la plupart des choses qui utilisent une télécommande infrarouge, et qui « écoutera » et décodera également un signal infrarouge envoyé par diverses autres télécommandes.

Un peu d'arrière-plan de ce qui m'a inspiré pour construire cette télécommande - comme la plupart d'entre vous, je perds constamment mes télécommandes, et cette calamité est assez frustrante, alors je suppose que nous allons la résoudre ! J'ai construit cette télécommande et je l'ai discrètement intégrée dans mon cadre de lit sur mesure (je suis aussi menuisier) - je ne peux pas perdre la télécommande si elle fait partie de mon cadre de lit !

Fournitures

Choses dont vous aurez besoin:-Arduino UNO ou Nano - le kilométrage peut varier avec d'autres cartes

-Breadboard sans soudure (ou stripboard soudable si vous souhaitez le rendre plus permanent)

-Cavaliers de différentes couleurs et longueurs

-Boutons poussoirs momentanés (5) (vous pouvez ajouter plus de boutons, mais vous devrez utiliser des broches numériques, car toutes les broches analogiques sauf 1 sont utilisées - vous devrez vous assurer d'utiliser correctement les résistances de rappel, ou abaissez les résistances et anti-rebond des boutons poussoirs)

-10K Ohm résistance (5) (si vous souhaitez plus de boutons poussoirs, vous en aurez besoin de plus)

-470 Ohm résistance (2)

-LED infrarouge

-LED rouge

-Capteur infrarouge (j'ai utilisé le numéro de pièce VS1838B, vous pouvez en utiliser un autre, vérifiez simplement le brochage)

(Facultatif) Fer à souder, soudure, flux de soudure.

Étape 1: Construire le circuit:

Construire le circuit
Construire le circuit

1). J'aime toujours commencer par la disposition de mes composants, car cela entraîne toujours la disposition sur la maquette.

-Boutons poussoir

-LEDS: la LED rouge et la LED IR sont câblées en tandem, vous pouvez donc voir ce que fait la LED IR.

-Capteur

2). Résistances

- Les cinq résistances de 10K que nous avons attachées aux boutons poussoirs sont appelées résistances "pull down". Les résistances de tirage s'assurent que lorsqu'un bouton-poussoir n'est pas enfoncé, la broche Arduino correspondante obtient 0 volts (ou au moins près de celle-ci). Pour plus d'informations sur les résistances pull down (ou pull up), voici un guide détaillé:

www.electronics-tutorials.ws/logic/pull-up…

Ces résistances ne sont peut-être pas complètement nécessaires, mais si vous obtenez des poussées "fantômes", cela est plus que probablement causé par le couplage capacitif et les résistances d'abaissement l'empêchent.

3). Fils de circuits

4). 5V et fils de terre

Utilisez l'image fournie pour référence! n'ayez pas peur de le changer pour vos besoins cependant!

Étape 2: Coder:

#include const int RECV_PIN = 7; // Le capteur IR lit la broche int Button1 = A4; // Int Button2 le plus à gauche = A3; // 2ème en partant de la gauche int Button3 = A2; // Middle int Button4 = A1; // 2ème à droite int Button5 = A0; // Le plus à droite int LED = 3; // LED IR & LED rouge int val = 0; // Modification de la valeur IRsend irsend; IRrecv irrecv(RECV_PIN); decode_results résultats;

void setup() {pinMode(Button1, INPUT); pinMode(Bouton2, INPUT); pinMode(Bouton3, INPUT); pinMode(Bouton4, INPUT); pinMode(Button5, INPUT); pinMode (LED, SORTIE); Serial.begin(9600); irrecv.enableIRIn(); irrecv.blink13(true);} void loop() {{{if (analogRead(Button1)>900)irsend.sendNEC(0xFF02FD, 32); // utilisation de la lecture analogique au lieu de la lecture numérique pour éviter les problèmes de capacité captive. aussi, aide à faire rebondir les boutons. // Avoir une lecture analogique à 900 permet une certaine marge de manœuvre dans les valeurs, ce qui signifie que le signal infra sera envoyé même si un 5V complet n'est pas appliqué à la broche. //mais 900 est suffisamment élevé pour ne pas être lu de manière erronée en raison du retard de couplage capacitif (100);}//RGB Strip On&off {if (analogRead(Button5)>900) {for (int i = 0; i < 3; i++) // changer la valeur dans "i < 3" changera le nombre de fois où le signal est répété immédiatement. donc "i < 2" répétera le signal deux fois. // vous devrez peut-être jouer avec ce numéro si votre téléviseur ne répond pas, généralement, 1 ou 3 fonctionnent le mieux, sinon, essayez les nombres impairs. // vous devrez peut-être également jouer avec les valeurs de temporisation du retard intra-signal, par exemple, pour mon téléviseur 10 fonctionne, mais 30 ne le fait pas. {irsend.sendSony (0xa90, 12); // Code d'alimentation Sony TV, pour mon téléviseur, le code doit être envoyé 3x3, donc 3 impulsions, trois délais séparés (10); // "retard de signal intra" pour (int i = 0; i < 3; i++) {irsend.sendSony(0xa90, 12); // "12" est le numéro de bit, différents protocoles appellent des numéros de bits différents. NEC est 32, Sony est 12, vous pouvez rechercher les autres retards (10); for (int i = 0; i 900) {for (int i = 0; i 900) {for (int i = 0; i 900) {for (int i = 0; i < 3; i++) {irsend.sendSony (0xc90, 12); // Délai de réduction du volume du téléviseur Sony (100);}}} délai (100);} if (irrecv.decode(&results)) // la partie ci-dessous du code vous permet d'interpréter les signaux infrarouges de diverses télécommandes. { Serial.println(results.value, HEX); // il va générer la procédure "NEC, Sony, Etc.." et un code TV "c90, a90, FF02FD" il faudra ajouter 0x devant le switch Code TV (results.decode_type) {case DENON: Serial.println("DENON"); Pause; case NEC: Serial.println("NEC"); Pause; case PANASONIC: Serial.println("PANASONIC"); Pause; case SONY: Serial.println("SONY"); Pause; case RC5: Serial.println("RC5"); Pause; case JVC: Serial.println("JVC"); Pause; case SANYO: Serial.println("SANYO"); Pause; case MITSUBISHI: Serial.println("MITSUBISHI"); Pause; cas SAMSUNG: Serial.println("SAMSUNG"); Pause; cas LG: Serial.println("LG"); Pause; case RC6: Serial.println("RC6"); Pause; case DISH: Serial.println("DISH"); Pause; case SHARP: Serial.println("SHARP"); Pause; case POURQUOI: Serial.println("WHYNTER"); Pause; cas AIWA_RC_T501: Serial.println("AIWA_RC_T501"); Pause; par défaut: case UNKNOWN: Serial.println("UNKNOWN"); pause;} irrecv.resume();}}

Étape 3: Code en profondeur: Envoi de signaux IR

Je ferai référence aux lignes de code par leur numéro de ligne - pour suivre, utilisez ce lien:

pastebin.com/AQr0fBLg

Tout d'abord, nous devons inclure la bibliothèque à distance IR de z3t0.

Voici un lien vers la bibliothèque:

github.com/z3t0/Arduino-IRremote

Si vous avez besoin d'un guide sur la façon de télécharger correctement une bibliothèque et de l'installer dans l'IDE:

www.arduino.cc/en/guide/libraries

La ligne 1 comprend la bibliothèque.

Ensuite, nous devons déclarer quelques variables, les lignes 2 à 12 le font.

Nous utilisons " cost int " pour définir des variables qui ne changeront pas, toutes sauf une tombent dans cette catégorie.

Nous utilisons " int " pour définir les variables qui changeront.

Nous devons utiliser une broche avec impulsion avec modulation (PWM) pour notre broche LED - toute broche qui a "~" à côté suffira, dans mon code - nous utilisons la broche numérique 3.

Ensuite, nous devons effectuer une configuration - ce code ne s'exécutera qu'une seule fois lorsque l'Arduino sera mis sous tension ou réinitialisé.

Notez que nous définissons nos entrées et sorties (15-20), allumons le moniteur série (21), activons le capteur IR (22) et disons à l'Arduino de faire clignoter la LED intégrée chaque fois que nous recevons un signal dans le capteur (23).

Ensuite, nous allons construire notre boucle - ce code s'exécutera à plusieurs reprises, allant du haut vers le bas une poignée de fois par seconde.

À la ligne 25, nous utilisons une instruction if, cela indique à l'Arduino "recherchez ce critère spécifique, si ce critère est rempli, faites cette chose spécifique". Dans ce cas, le critère est analogRead(Button1)>900, ou en d'autres termes - "Arduino, regardez le bouton1, que nous avons défini plus tôt comme la broche A4, si le signal analogique reçu est supérieur à 900, veuillez passer à nos prochaines instructions, sinon, passez votre chemin". Il y a un peu à déballer ici, alors plongeons-nous: un signal analogique sur l'Arduino est une valeur égale ou inférieure à 5V, avec 5V égal à 1023 et 0V égal à 0. Toute tension donnée entre 0 et 5V peut être définie par un nombre, et avec un peu de maths, nous pouvons comprendre ce nombre, ou vice versa, une tension. Divisez 1024 (nous incluons 0 comme unité) par 5, cela nous donne 204,8. Par exemple, nous utilisons le nombre 900, pour traduire cela en tension, nous divisons simplement 900 par 204,8, ce qui nous donne ~4,4V. Nous disons à l'Arduino de rechercher une tension supérieure à ~ 4,4 volts, et si c'est le cas, effectuez notre prochaine instruction.

En parlant des instructions suivantes (ligne 25), nous voyons irsend.sendNEC(0xFF02FD, 32). Cela dit "Arduino, envoyez une impulsion modulée qui suit le protocole NEC, en particulier le signal FF02FD, et assurez-vous qu'il est long de 32 bits". Cela fera clignoter notre LED IR d'une manière que d'autres appareils peuvent comprendre. Pensez-y un peu comme le code Morse, mais juste avec une lumière invisible ! Il existe de nombreux protocoles différents, chacun avec des centaines, voire des milliers de signaux individuels, et chacun avec son numéro de bit spécifique - notre appareil sera capable de reconnaître une grande quantité de ces signaux, mais nous y reviendrons plus tard !

À la ligne 28, nous avons notre premier délai - c'est ici pour éviter les signaux répétés involontaires, une fois que le bouton est enfoncé et que le signal IR est envoyé, nous avons 100 millisecondes pour retirer notre doigt du bouton. cela ne semble pas beaucoup de temps, mais dans la pratique, cela semble bien fonctionner. la fonction de retard indique à l'Arduino "ne rien faire pendant X millisecondes" et pour référence, il s'agit de 1000 millisecondes par seconde.

Passons à notre bouton suivant à la ligne 29, le bouton 5 (j'avais à l'origine 4 boutons sur cette télécommande, j'en ai ajouté un cinquième, c'est pourquoi nous sommes en panne). Ceci, dans l'esprit, est la même chose que le bouton 1, mais avec quelques différences clés. La première différence que vous verrez est une instruction for - il s'agit essentiellement d'une autre boucle - une boucle avec dans une autre boucle plus grande, loopception. Plus précisément, nous avons " for (int i = 0; i < 3; i++) ", lisez ceci comme "Arduino, commençons à 0, répétez les instructions suivantes jusqu'à ce que nous arrivions à 3 fois". La fonction for est utilisée car beaucoup d'appareils sont programmés pour rechercher un signal répété, et dans notre cas ici, 3 fois. Vous pouvez simplement changer le numéro 3 en un numéro différent si votre appareil demande un programme de répétition différent. Une autre différence clé avec button5 est qu'il est répété à nouveau, 3 fois ou 3x3. En d'autres termes, nous envoyons le signal 3 fois, attendons 10 millisecondes, l'envoyons à nouveau 3 fois, attendons encore 10 millisecondes, puis l'envoyons à nouveau 3 fois. Ce type de communication est courant pour allumer et éteindre des appareils et peut être exactement ce que votre téléviseur ou appareil demande - la clé est de jouer avec toutes les variables jusqu'à ce que vous obteniez le résultat souhaité. Modifiez la valeur de délai court, modifiez la valeur de répétition, envoyez 6 lots au lieu de 3, etc. Les appareils sont intentionnellement programmés avec des règles de signal arbitraires, imaginez si la télécommande de votre téléviseur envoyait le même type de signal que votre barre de son; chaque fois que vous changez de chaîne sur votre téléviseur, votre barre de son s'éteint - c'est pourquoi il existe différentes règles de signal.

Les trois boutons suivants sont programmés avec les mêmes principes, au moins en partie, décrits ci-dessus - nous pouvons donc passer à la ligne 55.

Étape 4: Code en profondeur: Réception de signaux IR

Code en profondeur: réception de signaux IR
Code en profondeur: réception de signaux IR

À la ligne 55, nous commençons à programmer l'Arduino pour interpréter les signaux IR envoyés par d'autres télécommandes - cela est nécessaire pour que vous puissiez comprendre les protocoles et les signaux que vos télécommandes utilisent. La première ligne de code à la ligne 55 est si (irrecv.decode(&results) lit ceci comme "Arduino, recherchez un code IR, si vous en trouvez un, retournez une valeur vraie, si rien n'est trouvé, retournez false. Si vrai, enregistrez l'information en « résultats »".

Passant à la ligne 56, nous avons Serial.println(results.value, HEX) qui dit "Ardunio, imprime les résultats dans le moniteur série au format HEX". Hex, qui signifie hexadécimal, est un moyen de raccourcir une chaîne binaire (juste des 0 et des 1) en quelque chose d'un peu plus facile à taper. Par exemple, 101010010000 est "a90", le code utilisé pour allumer et éteindre mon téléviseur, et 111111110000001011111101 est 0xFF02FD, qui contrôle ma bande RVB. Vous pouvez utiliser le tableau ci-dessus pour convertir le binaire en hexadécimal, et vice versa, ou vous pouvez utiliser le lien suivant:

www.rapidtables.com/convert/number/hex-to-…

Jusqu'à la ligne 57, nous avons une nouvelle fonction, appelée boîtier de commutation.

Essentiellement, un cas de commutation nous permet de spécifier différentes instructions en fonction des résultats d'une variable donnée (cas). le break quitte l'instruction switch et est utilisé à la fin de chaque instruction.

Nous utilisons ici le boîtier du commutateur pour changer la façon dont nous imprimons sur le moniteur série en fonction des protocoles que notre Arduino détecte à partir des différentes télécommandes.

Étape 5: Conclusion

Si vous avez une question, n'hésitez pas à me contacter ici ! Je suis heureux d'essayer de vous aider du mieux que je peux.

J'espère que vous avez appris quelque chose que vous pouvez utiliser pour rendre votre vie un peu meilleure !

-RB

Conseillé: