Télécommande TV Arduino Personnalisée – Alimentation Batterie, Boîtier Imprimé 3D
Composants et Fournitures
| Composant | Quantité |
|---|---|
| Arduino UNO | 1 |
| Batterie 9V (générique) | 1 |
| Connecteur 9V vers Jack Barrel | 1 |
| Émetteur IR (générique) | 1 |
| Vis Machine M3 | 4 |
| Vis Machine M2.5 | 3 |
| Écrou M3 | 4 |
| Écrou M2.5 | 3 |
| Résistance Traversante 47 Ω | 2 |
| Plaque de Prototypage 2.54 mm | 1 |
| Bouton Poussoir PCB | 6 |
| Connecteur Mâle 36 Positions 1 Rangée Long (0.1") | 1 |
Outils et Machines Nécessaires
- Imprimante 3D (générique)
- Fer à Souder (générique)
- Fil à Souder Sans Plomb
- Filament PLA, diamètre 1.75 mm
À Propos du Projet
Introduction
La télécommande de ma copine a cessé de fonctionner. Elle aurait pu en acheter une bon marché en magasin, mais elle a pensé : nous sommes tous les deux ingénieurs, faisons la nôtre ensemble !
Comme nous avons des compétences complémentaires, c'était une façon différente et amusante de passer du temps pendant le confinement et d'apprendre comment fonctionne cette technologie quotidienne.
Et avoir une petite imprimante 3D à la maison a aussi joué un rôle.
Fonctionnement
Lecture des Boutons
Pour éviter des résistances supplémentaires, le design repose sur les résistances de pull-up internes de l'Arduino. Si la télécommande n'est pas en mode veille (voir ci-dessous), l'état de chaque bouton est scruté à chaque cycle de boucle. Pour éviter les comptages multiples, une routine de débouncing simple est implémentée exploitant la fonction millis().
Envoi des Signaux Infrarouges
La communication infrarouge est gérée par la bibliothèque IRremote.h (bravo aux développeurs !). Il suffit de configurer le protocole pour notre TV (chaque fabricant a son propre protocole) et de chercher sur Google les codes HEX des différentes commandes souhaitées pour les associer aux boutons. Côté circuit, pour que les commandes de la bibliothèque pilotent effectivement la LED IR, celle-ci doit être connectée à la broche 3 de l'Arduino UNO (PWM).
Actuellement, le code est écrit pour trois types de TV différents, sélectionnables en commentant/décommentant une directive #define au début du code.
Économie de Batterie
Pour réduire la consommation, plusieurs stratégies sont implémentées, exploitant les commandes des bibliothèques avr/sleep.h et avr/power.h.
- Tous les périphériques et interfaces inutilisés (ADC, SPI, TWI, timer1, USART) sont désactivés dans
setup(). - La LED intégrée sur la broche PWM 13 est aussi éteinte.
- Nous avons aussi décidé de dessouder la LED d'alimentation de l'Arduino UNO, qui sinon reste toujours allumée (opération non recommandée).
- Exploitant
millis(), si aucun bouton n'est pressé pendant 5 secondes, la télécommande entre en mode veille, dont elle sort quand le bouton On/Off est à nouveau pressé.
Construction
Assemblage Électronique
Tout le circuit est embarqué sur une plaque de prototypage conçue pour s'adapter sur les connecteurs de l'Arduino UNO. Au fer à souder, les boutons ont été soudés en tenant compte de leur position finale sur la télécommande. Sur la face inférieure, les deux résistances 47Ω ont été soudées en parallèle pour obtenir le courant souhaité dans la LED IR.
Avec le fil à souder, des pistes ont été faites sur la plaque pour connecter les broches des boutons et la LED IR aux connecteurs mâles.
Ainsi, la plaque ressemble à un shield qui s'emboîte sur l'Arduino UNO via les connecteurs, assurant toutes les connexions correctes.
Boîtier : CAO et FAO
Le boîtier a été conçu pour contenir la batterie, l'assemblage Arduino UNO + plaque de prototypage, n'exposant que les boutons sur le dessus et la LED IR sur la face avant.
Le boîtier se compose de deux parties, conçues avec SolidWorks, pré-traitées avec Ultimaker Cura et imprimées en 3D en PLA sur une Anycubic Mega Zero.
L'Arduino UNO est fixé à la base par 3 vis M2.5 qui s'insèrent dans des trous d'alignement extrudés depuis l'intérieur de la base. Une fois l'Arduino fixé, la LED IR dépassera de la plaque de prototypage pour s'aligner avec le trou prévu. Pour la maintenir en position lors de l'assemblage des deux parties, trois mini-poteaux sont ajoutés pour éviter les mouvements latéraux des pattes de la LED. La batterie est insérée par pression dans son emplacement dédié.
Le couvercle est conçu pour n'exposer que les boutons, et à côté de chacun, un symbole est gravé dans le couvercle pour indiquer la fonction de chaque bouton.
Base et couvercle sont assemblés avec 4 vis M3.
Galerie Photos
Photos du montage, boîtier, électronique, assemblage final.
Code
TV_remote.ino (Arduino)
#include
#include
#include
// Définition des broches
// Une LED IR doit être connectée à la broche PWM 3 de l'Arduino
#define OnOff 1
#define Source 0
#define CH_plus 4
#define CH_minus 5
#define Vol_plus 6
#define Vol_minus 7
#define Interrupt_Pin 2 // Seules broches 2 ou 3 sur Arduino Uno
// Définition modèle TV
//#define LG_TV
//#define SAMSUNG_TV
#define SONY_TV
// Définition des codes
#ifdef LG_TV
unsigned long on_off_code = 551489775; // HEX 20DF10EF
unsigned long vol_plus_code = 551502015; // HEX 20DF40BF
unsigned long vol_minus_code = 551534655; // HEX 20DFC03F
unsigned long ch_plus_code = 551485695; // HEX 20DF00FF
unsigned long ch_minus_code = 551518335; // HEX 20DF807F
unsigned long source_code = 551538735; // HEX 20DFD02F
#endif
#ifdef SAMSUNG_TV
unsigned long on_off_code = 3772793023; // HEX E0E040BF
unsigned long vol_plus_code = 3772833823; // HEX E0E0E01F
unsigned long vol_minus_code = 3772829743; // HEX E0E0D02F
unsigned long ch_plus_code = 3772795063; // HEX E0E048B7
unsigned long ch_minus_code = 3772778743; // HEX E0E008F7
unsigned long source_code = 3772809343; // HEX E0E0807F
#endif
#ifdef SONY_TV
unsigned long on_off_code = 2704; // HEX A90
unsigned long vol_plus_code = 1168; // HEX 490
unsigned long vol_minus_code = 3216; // HEX C90
unsigned long ch_plus_code = 144; // HEX 090
unsigned long ch_minus_code = 2192; // HEX 890
unsigned long source_code = 2640; // HEX A50
#endif
// Activer Debug
//#define DEBUG
IRsend irsend; // Création objet IR
unsigned long debounce_time;
unsigned long last_time;
void setup() {
analogWrite(13, 0); // Éteindre LED intégrée
pinMode(OnOff, INPUT_PULLUP);
pinMode(Source, INPUT_PULLUP);
pinMode(CH_plus, INPUT_PULLUP);
pinMode(CH_minus, INPUT_PULLUP);
pinMode(Vol_plus, INPUT_PULLUP);
pinMode(Vol_minus, INPUT_PULLUP);
pinMode(Interrupt_Pin, INPUT_PULLUP);
// Économie d'énergie
power_adc_disable(); // Désactiver ADC
power_spi_disable(); // Désactiver SPI
power_timer1_disable(); // Désactiver timer 1 (0 pour millis(), 2 pour irremote.h)
power_usart0_disable(); // Désactiver série
power_twi_disable(); // Désactiver TWI
#ifdef DEBUG
Serial.begin(9600);
#endif
}
void loop() {
// Vérifier OnOff
if (!digitalRead(OnOff)) {
debounce_time = millis();
while (millis() - debounce_time < 40) { ; }
if (!digitalRead(OnOff)) {
#ifdef LG_TV
irsend.sendNEC(on_off_code, 32);
#endif
#ifdef SAMSUNG_TV
irsend.sendSAMSUNG(on_off_code, 32);
#endif
#ifdef SONY_TV
irsend.sendSony(on_off_code, 12);
#endif
last_time = millis();
#ifdef DEBUG
Serial.println("OnOff");
#endif
}
}
// Vérifier Source
if (!digitalRead(Source)) {
debounce_time = millis();
while (millis() - debounce_time < 40) { ; }
if (!digitalRead(Source)) {
#ifdef LG_TV
irsend.sendNEC(source_code, 32);
#endif
#ifdef SAMSUNG_TV
irsend.sendSAMSUNG(source_code, 32);
#endif
#ifdef SONY_TV
irsend.sendSony(source_code, 12);
#endif
last_time = millis();
#ifdef DEBUG
Serial.println("Source");
#endif
}
}
// Vérifier CH_plus
if (!digitalRead(CH_plus)) {
debounce_time = millis();
while (millis() - debounce_time < 40) { ; }
if (!digitalRead(CH_plus)) {
#ifdef LG_TV
irsend.sendNEC(ch_plus_code, 32);
#endif
#ifdef SAMSUNG_TV
irsend.sendSAMSUNG(ch_plus_code, 32);
#endif
#ifdef SONY_TV
irsend.sendSony(ch_plus_code, 12);
#endif
last_time = millis();
#ifdef DEBUG
Serial.println("CH+");
#endif
}
}
// Vérifier CH_minus
if (!digitalRead(CH_minus)) {
debounce_time = millis();
while (millis() - debounce_time < 40) { ; }
if (!digitalRead(CH_minus)) {
#ifdef LG_TV
irsend.sendNEC(ch_minus_code, 32);
#endif
#ifdef SAMSUNG_TV
irsend.sendSAMSUNG(ch_minus_code, 32);
#endif
#ifdef SONY_TV
irsend.sendSony(ch_minus_code, 12);
#endif
last_time = millis();
#ifdef DEBUG
Serial.println("CH-");
#endif
}
}
// Vérifier Vol_plus
if (!digitalRead(Vol_plus)) {
debounce_time = millis();
while (millis() - debounce_time < 40) { ; }
if (!digitalRead(Vol_plus)) {
#ifdef LG_TV
irsend.sendNEC(vol_plus_code, 32);
#endif
#ifdef SAMSUNG_TV
irsend.sendSAMSUNG(vol_plus_code, 32);
#endif
#ifdef SONY_TV
irsend.sendSony(vol_plus_code, 12);
#endif
last_time = millis();
#ifdef DEBUG
Serial.println("Vol+");
#endif
}
}
// Vérifier Vol_minus
if (!digitalRead(Vol_minus)) {
debounce_time = millis();
while (millis() - debounce_time < 40) { ; }
if (!digitalRead(Vol_minus)) {
#ifdef LG_TV
irsend.sendNEC(vol_minus_code, 32);
#endif
#ifdef SAMSUNG_TV
irsend.sendSAMSUNG(vol_minus_code, 32);
#endif
#ifdef SONY_TV
irsend.sendSony(vol_minus_code, 12);
#endif
last_time = millis();
#ifdef DEBUG
Serial.println("Vol-");
#endif
}
}
// Mode veille après 5s d'inactivité
if (millis() - last_time > 5000) {
#ifdef DEBUG
Serial.println("Going to sleep...");
#endif
going_to_sleep();
#ifdef DEBUG
Serial.println("Waking up...");
#endif
}
}
// Fonction Mode Veille
void going_to_sleep() {
sleep_enable();
attachInterrupt(digitalPinToInterrupt(Interrupt_Pin), wake_up, LOW);
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_cpu();
}
// Fonction Réveil
void wake_up() {
sleep_disable();
detachInterrupt(digitalPinToInterrupt(Interrupt_Pin));
}
Pièces Personnalisées et Boîtiers
Fichiers CAO SolidWorks pour boîtier 2 parties (base + couvercle) imprimés en PLA.
Schémas
Schéma de câblage : LED IR sur broche 3, 6 boutons sur broches 0,1,4,5,6,7 avec pull-up internes, 2 résistances 47Ω en parallèle pour LED IR, interrupteur réveil sur broche 2.
Processus de fabrication
- Système de contrôle d'accès intégré QR, RFID et vérification de température
- Capturer les commandes de télécommande IR sur Raspberry Pi sans LIRC : Approche Python UART
- PiCy : Construisez votre propre petit robot Raspberry Pi
- Construire un jeu gyroscopique temps réel avec Arduino Nano et capteur MPU-6050
- Caméra de sécurité ESP32 à détection de mouvement pour Discord
- Construire une Tirelire Intelligente : Contrôler un Accepteur de Pièces avec Arduino Nano
- Unopad : contrôleur MIDI Arduino fluide pour Ableton Live
- Tour CNC Millport SmartLathez 1740 – Précision et puissance
- 5 avantages clés du contrôle de production à distance pour l'industrie moderne