Construire votre propre télécommande de téléviseur au moyen d'un Arduino? Bonne idée!
Vous pourriez, par exemple, réunir sur une même télécommande les fonctions les plus utilisées de plusieurs télécommandes différentes (oui, je connais l'existence des télécommandes universelles, mais c'est une solution beaucoup trop simple!). Ou encore construire une télécommande qui limitera automatiquement le temps d'utilisation du téléviseur, l'éteignant au bout d'un certain délai, ou refusant de le mettre en marche aux heures interdites... Ça pourrait aussi être un dispositif qui allume et éteint automatiquement le téléviseur en votre absence, pour que les cambrioleurs ne sachent pas que vous êtes parti en voyage depuis 3 semaines.
1° Décoder le signal
Lorsque vous appuyez sur un bouton de votre télécommande, celle-ci s'allume et s'éteint plusieurs fois très rapidement de façon à envoyer un message codé à votre téléviseur (ça ressemble un peu à du code morse). Le rayonnement infrarouge est invisible à l'oeil nu, mais si vous observez l'extrémité de votre télécommande au moyen d'une caméra numérique, vous devriez voir la LED s'allumer brièvement lorsque vous appuyez sur un de ses boutons (par contre vous ne percevez pas les clignotements car ils sont trop rapides).
Pour contrôler votre téléviseur, l'Arduino devra alimenter une LED infrarouge de façon à ce qu'elle émette exactement le même signal.
La première étape consiste donc à capter ce signal et à l'analyser. Pour ce faire, il vous faut un capteur infrarouge modulé à 38 kHz qui devrait faire l'affaire pour la plupart des télécommandes (dans certains cas, plus rares, il vous en faudra un modulé à 56 kHz). J'ai utilisé le
TSOP4836 de Vishay, mais il existe bien sûr d'autres possibilités (j'avais précédemment tenté l'expérience avec le KSM-2012 de Kodenshi sans le moindre succès).
Le circuit ci-dessous est sorti tout droit de la datasheet du TSOP4836; il sera peut-être un peu différent si vous utilisez un autre modèle. La sortie du capteur est normalement haute (5 V) mais elle devient basse (0 V) sur réception d'un signal infrarouge qui oscille à 38 kHz. Lorsqu'on appuie sur un bouton de la télécommande en pointant cette dernière vers le capteur, la tension de sortie du capteur va changer de valeur très rapidement (ce que vous pouvez vérifier si vous disposez d'un oscilloscope à mémoire).
Mais pour décoder ce signal, l'Arduino est encore plus pratique qu'un oscilloscope! Surtout si vous avez préalablement installé
la librairie IRRemote mise au point par Ken Shirriff. (Je suis toujours un peu dérouté par l'interface du site GitHub: il y a un bouton "ZIP" qui vous permet de downloader tous les fichiers nécessaires en un seul clic).
Une fois la librairie IRRemote installée dans votre répertoire "Libraries", vous branchez votre capteur infrarouge à l'arduino (la sortie du capteur va à l'entrée 11 de l'Arduino), vous téléversez dans l'Arduino le sketch "IRrecvDump" disponible dans le menu des exemples sous l'onglet IRRemote, vous affichez le moniteur série (en vous assurant qu'il est bien réglé à 9600 bauds), et vous appuyez sur un bouton de la télécommande en visant le capteur.
Voici ce qu'affiche le moniteur série lorsque j'appuie sur le bouton "channel up" de ma télécommande:
Decoded NEC: FDB04F (32 bits)
Raw (68): 4450 8950 -4500 550 -550 600 -500 600 -550 550 -550 600 -500 600 -550 550 -550 600 -500 600 -1650 600 -1650 550 -1700 600 -1650 550 -1650 550 -1700 600 -500 550 -1700 550 -1700 550 -550 550 -1700 550 -1700 550 -550 550 -550 550 -600 550 -550 550 -550 550 -1700 550 -550 550 -600 550 -1650 600 -1650 550 -1700 550 -1650 600
La librairie a reconnu le protocole NEC à 32 bits, et la commande se traduit par la valeur hexadécimale "FDB04F". C'est tout ce que j'ai besoin de savoir; puisque le protocole a été reconnu, je n'ai nullement besoin d'utiliser les données brutes qui apparaissent dans les lignes suivantes.
2° Émettre le signal
Pour émettre le signal, le circuit est simple: une LED infrarouge branchée à la sortie 3 de l'Arduino. On parle souvent d'une résistance de protection de 100 Ω, mais j'ai constaté deux inconvénients: le signal émis par la LED est peu intense, et la transition entre les signaux numériques "hauts" et "bas" est plus lente (courbe exponentielle déterminée par la constante RC du circuit). Puisque la LED infrarouge ne fonctionne pas en continu, vous pouvez vous permettre de diminuer considérablement cette résistance de protection.
Lorsque la LED pointe vers le téléviseur, le sketch suivant change de chaîne toutes les 5 secondes (le signal est envoyé 3 fois de suite pour chaque changement de chaîne).:
Include IRremote.h
IRsend irsend;
void loop() {
for (int i = 0; i < 3; i++) {
irsend.sendNEC(0xFDB04F, 32);
delay(40);
}
delay(5000);
}
En plus de NEC, d'autres protocoles sont aussi reconnus par la librairie IRRemote: Sony SIRC, Philips RC5, Philips RC6.
Il reste quand même la possibilité que le protocole utilisé par votre télécommande ne soit pas reconnu par la librairie IRRemote: il faut alors utiliser les données brutes (les délais pendant lesquels la LED est allumée ou éteinte) mais comme il ne sont qu'approximatifs, ça peut devenir plus délicat: ce sera le sujet de ma prochaine rubrique.
Plus d'informations sur la librairie IRRemote.
Plus d'informations sur les différents protocoles de télécommandes
Yves Pelletier (Twitter:
@ElectroAmateur)