Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Télécommande TV alimentée par batterie avec boîtier imprimé en 3D

Composants et fournitures

Arduino UNO
× 1
Batterie 9V (générique)
× 1
Connecteur 9V vers Barrel Jack
× 1
Émetteur IR (générique)
× 1
Vis mécanique, M3
× 4
Vis mécanique, M2.5
× 3
Écrou M3
× 4
Écrou M2.5
× 3
Résistance à trou traversant, 47 ohms
× 2
Carte de prototypage, 2,54 mm
× 1
Bouton poussoir PCB
× 6
Male-Header 36 Position 1 Row - 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 de ce projet

Présentation

La télécommande du téléviseur de ma copine ne fonctionne plus. Elle aurait pu acheter un produit de remplacement bon marché dans un magasin à proximité, mais elle s'est ensuite dit :nous sommes tous les deux ingénieurs, créons-en un ensemble !

Comme nous sommes assez complémentaires dans nos compétences, c'était une façon différente mais amusante de passer du temps pendant le confinement et cela nous a donné l'occasion d'en apprendre un peu plus sur le fonctionnement de cette technologie au quotidien.

Oh, et avoir une petite imprimante 3D à la maison a également joué un rôle.

Comment ça marche

Tout d'abord, comme nous voulions faire une conception simple en s'appuyant sur l'Arduino UNO, nous avons évalué le nombre minimum de commandes dont nous avions besoin pour faire fonctionner notre téléviseur. Nous avons considéré que 6 commandes suffisaient :bascule ON/OFF, Sélection de la source, Ch+, Ch-, Vol+, Vol-.

Lecture des boutons

Pour éviter l'utilisation de résistances supplémentaires, la conception repose sur les résistances de rappel internes de l'Arduino. Si la télécommande n'est pas en mode veille (voir ci-dessous), l'état de chaque bouton est interrogé à chaque cycle de boucle. Pour éviter de compter plusieurs hits, une simple routine anti-rebond est implémentée en exploitant le millis() fonction.

Envoi de signaux infrarouges

La communication infrarouge est gérée par le IRremote.h bibliothèque (félicitations aux codeurs !). Il nous suffisait de configurer le protocole de notre téléviseur (différents fabricants ont développé leurs propres protocoles) et de rechercher sur Google les codes en HEX des différentes commandes que nous souhaitions utiliser et de les associer aux boutons. En ce qui concerne la conception du circuit, pour que les commandes de la bibliothèque pilotent efficacement la LED IR, celle-ci doit être connectée à la broche 3 de l'Arduino UNO.

Actuellement, le code est écrit pour trois types de téléviseurs différents, sélectionnables en commentant/décommentant un #define directive dans la première partie du code.

Batterie économie

Pour réduire la consommation électrique, quelques stratégies sont mises en œuvre, exploitant les commandes du avr/sleep.h et avr/power.h bibliothèques.

Tous les périphériques et interfaces inutilisés (ADC, SPI, TWI, timer1, usart) sont désactivés dans la routine de configuration. La LED intégrée sur la broche PWM 13 est également éteinte. Nous avons également décidé de dessouder la LED d'alimentation de l'Arduino UNO, qui sinon est toujours allumée, bien que ce ne soit pas une opération recommandée.

Aussi, en exploitant le millis() , si aucun bouton n'est enfoncé pendant 5 secondes, la télécommande entre en mode veille, à partir duquel elle est réveillée lorsque le bouton marche/arrêt est à nouveau enfoncé.

Comment c'est construit

Électronique assemblage

L'ensemble du circuit est intégré sur une carte de prototypage, conçue pour s'adapter aux en-têtes Arduino UNO. En utilisant un fer à souder, les boutons ont été soudés en tenant compte de la position finale sur la télécommande. Sur la partie inférieure, les deux résistances de 47 ohms ont été soudées en parallèle, afin d'obtenir le courant souhaité à travers la LED IR.

En utilisant le fil de soudure, des traces ont été faites sur la carte de prototypage pour connecter les broches du bouton et la LED IR aux en-têtes de broches mâles.

De cette façon, la carte ressemble à un blindage qui est monté sur l'Arduino UNO à l'aide des en-têtes de broche, assurant toutes les connexions correctes.

Enclos CAD et CAM

Le boîtier a été conçu pour contenir la batterie, l'ensemble carte de prototypage Arduino UNO +, exposant uniquement les boutons sur le dessus et la LED IR sur la face avant.

Le boîtier se compose de deux parties, conçues à l'aide du logiciel de CAO SolidWorks, prétraitées avec le logiciel de tranchage Ultimaker Cura et enfin imprimées en 3D en PLA à l'aide d'une imprimante 3D Anycubic Mega Zero.

L'Arduino UNO est fixé à la base à l'aide de 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 sécurisé, la LED IR fera saillie à l'extérieur de la carte de prototypage, afin de l'aligner avec le trou prévu à cet effet et de la maintenir en position lors de l'assemblage des deux parties du boîtier, trois mini-postes sont ajoutés pour éviter mouvements latéraux des fils LED. La batterie est emmanchée dans un espace dédié.

Le couvercle est conçu pour n'exposer que les boutons et à côté de chacun d'eux, un symbole est gravé dans le couvercle pour montrer la fonction de chaque bouton.

Le fond et le couvercle du coffret sont assemblés à l'aide de 4 vis M3.

Code

  • TV_remote.ino
TV_remote.inoArduino
#include #include #include // Définition de la broche// Une LED IR doit être connectée à la broche 3 de l'Arduino PWM#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 //Uniquement la broche 2 ou 3 sur Arduino Uno// Définition du modèle de téléviseur//#define LG_TV//#define SAMSUNG_TV#define SONY_TV// Définition des codes#ifdef LG_TV non signé long on_off_code =551489775; // HEX 20DF10EF long non signé vol_plus_code =551502015 ; //HEX 20DF40BF long vol_minus_code non signé =551534655; //HEX 20DFC03F long ch_plus_code non signé =551485695; //HEX 20DF00FF long ch_minus_code non signé =551518335; //HEX 20DF807F code_source long non signé =551538735; //HEX 20DFD02F#endif#ifdef SAMSUNG_TV long on_off_code non signé =3772793023; // HEX E0E040BF long vol_plus_code non signé =3772833823; //HEX E0E0E01F long vol_minus_code non signé =3772829743 ; //HEX E0E0D02F long ch_plus_code non signé =3772795063; //HEX E0E048B7 long ch_minus_code non signé =3772778743; //HEX E0E008F7 code_source long non signé =3772809343; //HEX E0E0807F#endif#ifdef SONY_TV long non signé on_off_code =2704; //HEX A90 long non signé vol_plus_code =1168; //HEX 490 long non signé vol_minus_code =3216; //HEX C90 long ch_plus_code non signé =144; //HEX 090 long ch_minus_code non signé =2192; //HEX 890 code_source long non signé =2640 ; //HEX A50#endif//Activer le débogage//#define DEBUG//IRsend irsend; //Créer un objet IR unsigned long debounce_time;unsigned long last_time;void setup() { analogWrite(13,0); //tour de la led intégrée //noInterrupts(); //désactiver les interruptions //CLKPR =_BV(CLKPCE); //activer les paramètres du pré-échelonneur d'horloge //CLKPR =_BV(CLKPS0) ; //définir le prééchelonneur d'horloge =2 --> 8 MHz //interruptions(); pinMode(OnOff, INPUT_PULLUP); pinMode(Source,INPUT_PULLUP); pinMode(CH_plus, INPUT_PULLUP); pinMode(CH_moins, INPUT_PULLUP); pinMode(Vol_plus, INPUT_PULLUP); pinMode (Vol_moins, INPUT_PULLUP); pinMode (Interrupt_Pin, INPUT_PULLUP); //économie d'énergie power_adc_disable(); //désactive tous les ADC power_spi_disable(); //désactiver SPI power_timer1_disable(); //disbale timer 1 (0 pour millis(), 2 pour irremote.h) power_usart0_disable(); //désactive le power_twi_disable(); //désactiver TWI #ifdef DEBUG Serial.begin(9600); #endif}void loop() { //check 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(); //dernière pression sur un bouton #ifdef DEBUG Serial.println("OnOff"); #endif } } //vérifier la 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(); //dernière pression sur un bouton #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(); //dernière pression sur un bouton #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(); //dernière pression sur un bouton #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(); //dernière fois qu'un bouton a été appuyé #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(); //dernière fois qu'un bouton a été appuyé #ifdef DEBUG Serial.println("Vol-"); #endif } } if (millis()-last_time> 5000) { //un bouton n'a pas été pressé pendant 10 s #ifdef DEBUG Serial.println("En veille..."); #endif va_s'endormir(); //passer en mode veille #ifdef DEBUG Serial.println("Réveil..."); #endif }}//Mode veille functionvoid going_to_sleep() { sleep_enable(); //activer le mode veille attachInterrupt(digitalPinToInterrupt(Interrupt_Pin), wake_up, LOW); //interruption pour le réveil --> configurez la broche d'interruption en tant que WIRED NOR !!! set_sleep_mode(SLEEP_MODE_PWR_DOWN); //mode veille complet sleep_cpu(); //activer le mode veille}//Fonction de réveilvoid wake_up() { sleep_disable(); //désactiver le mode veille detachInterrupt(digitalPinToInterrupt(Interrupt_Pin)); //supprimer l'interruption}

Pièces et boîtiers personnalisés

Schémas

remote_sketch_r4f8a47oWX.fz

Processus de fabrication

  1. Contrôle d'accès avec QR, RFID et vérification de la température
  2. Utilisation de la télécommande infrarouge avec Raspberry Pi sans LIRC
  3. PiCy – Le petit robot alimenté par Raspberry Pi !
  4. Jeu de gyroscope Arduino avec MPU-6050
  5. Caméra de sécurité Discord avec ESP32
  6. Contrôler l'accepteur de pièces avec Arduino
  7. Unopad - Contrôleur MIDI Arduino avec Ableton
  8. Tour avec CNC
  9. 5 avantages du contrôle de production à distance