Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Tv-afstandsbediening op batterijen met 3D-geprint hoesje

Componenten en benodigdheden

Arduino UNO
× 1
9V-batterij (algemeen)
× 1
9V naar Barrel Jack Connector
× 1
IR-zender (algemeen)
× 1
Machineschroef, M3
× 4
Machineschroef, M2.5
× 3
M3-moer
× 4
M2.5 moer
× 3
Through Hole Resistor, 47 ohm
× 2
Prototypingbord, 2,54 mm
× 1
PCB-drukknop
× 6
Mannelijke kop 36 Positie 1 rij - lang (0,1")
× 1

Benodigde gereedschappen en machines

3D-printer (algemeen)
Soldeerbout (algemeen)
Soldeerdraad, loodvrij
PLA-filament, diameter 1,75 mm

Over dit project

Inleiding

De afstandsbediening van de tv van mijn vriendin werkte niet meer. Ze had een goedkope vervanging kunnen kopen in een winkel in de buurt, maar toen dacht ze:we zijn allebei ingenieurs, laten we er samen een maken!

Omdat we behoorlijk complementair zijn in onze vaardigheden, was dit een andere, maar leuke manier om wat tijd door te brengen tijdens de lockdown en het gaf ons de kans om iets te leren over hoe deze alledaagse technologie werkt.

Oh, en het hebben van een kleine 3D-printer in huis speelde ook een rol.

Hoe het werkt

Allereerst, omdat we een eenvoudig ontwerp wilden maken op basis van de Arduino UNO, evalueerden we het minimale aantal commando's dat we nodig hadden om onze tv te bedienen. We waren van mening dat 6 commando's voldoende waren:AAN/UIT schakelen, Bronselectie, Ch+, Ch-, Vol+, Vol-.

Knop lezen

Om het gebruik van extra weerstanden te vermijden, is het ontwerp gebaseerd op de interne pull-up-weerstanden van de Arduino. Als de afstandsbediening niet in de slaapstand staat (zie hieronder), wordt elke knopstatus in elke luscyclus opgevraagd. Om te voorkomen dat meerdere hits worden geteld, wordt een eenvoudige debouncing-routine geïmplementeerd die gebruik maakt van de millis() functie.

Infraroodsignalen verzenden

Infraroodcommunicatie wordt afgehandeld door de IRremote.h bibliotheek (een pluim voor de codeurs!). Het enige wat we moesten doen was het protocol voor onze tv instellen (verschillende fabrikanten hebben hun eigen protocollen ontwikkeld) en op Google zoeken naar de codes in HEX van de verschillende commando's die we wilden gebruiken en deze aan de knoppen koppelen. Omdat het om het circuitontwerp gaat, moet deze worden aangesloten op pin3 van de Arduino UNO om de opdrachten uit de bibliotheek effectief te laten sturen op de IR-LED.

Momenteel is de code geschreven voor drie verschillende soorten tv, te selecteren door een #define te becommentariëren/verwijderen. richtlijn in het eerste deel van de code.

Batterij opslaan

Om het stroomverbruik te verminderen, zijn een paar strategieën geïmplementeerd, waarbij gebruik wordt gemaakt van de commando's van de avr/sleep.h en avr/power.h bibliotheken.

Alle ongebruikte randapparatuur en interfaces (ADC, SPI, TWI, timer1, usart) worden uitgeschakeld in de setup-routine. De ingebouwde LED op PWM pin13 is ook uitgeschakeld. We hebben ook besloten om de power-LED van de Arduino UNO te desolderen, die anders altijd aan is, hoewel dit geen aanbevolen bewerking is.

Ook het exploiteren van de millis() Als gedurende 5 seconden geen van de knoppen wordt ingedrukt, gaat de afstandsbediening in een slaapmodus, die wordt gewekt wanneer de aan/uit-knop opnieuw wordt ingedrukt.

Hoe het is gebouwd

Elektronica montage

Het hele circuit is ingebed op een prototyping-bord, ontworpen om op de Arduino UNO-headers te passen. Met behulp van een soldeerbout werden de knoppen gesoldeerd rekening houdend met de uiteindelijke positie op de afstandsbediening. Op het onderste gedeelte zijn de twee 47ohm weerstanden parallel gesoldeerd om de gewenste stroom door de IR LED te krijgen.

Met behulp van de soldeerdraad werden sporen gemaakt op het prototyping-bord om de knoppinnen en de IR-LED te verbinden met mannelijke pin-headers.

Op deze manier lijkt het bord op een schild dat op de Arduino UNO is gemonteerd met behulp van de pin-headers, waardoor alle juiste verbindingen worden gegarandeerd.

Behuizing CAD en CAM

De behuizing is ontworpen om de batterij, de Arduino UNO + prototyping-bordassemblage te bevatten, waardoor alleen de knoppen aan de bovenkant en de IR-LED aan de voorkant zichtbaar zijn.

De behuizing bestaat uit twee delen, ontworpen met SolidWorks CAD-software, voorbewerkt met Ultimaker Cura-slicingsoftware en uiteindelijk 3D-geprint in PLA met behulp van een Anycubic Mega Zero 3D-printer.

De Arduino UNO wordt aan de basis bevestigd met behulp van 3 M2.5-schroeven, die passen in uitlijngaten die zijn geëxtrudeerd vanuit de binnenkant van de basis. Zodra de Arduino is vastgezet, steekt de IR-LED buiten het prototypingbord uit, om het uit te lijnen met het daarvoor bestemde gat en om het op zijn plaats te houden tijdens het monteren van de twee delen van de behuizing, drie mini-posten zijn toegevoegd om te voorkomen dat zijwaartse bewegingen van de LED-kabels. De batterij is geperst in een speciale ruimte.

Het deksel is zo ontworpen dat alleen de knoppen zichtbaar zijn en naast elk ervan is een symbool in het deksel gegraveerd om de functie van elke knop aan te geven.

Bodem en deksel van de behuizing worden gemonteerd met 4 M3-schroeven.

Code

  • TV_remote.ino
TV_remote.inoArduino
#include #include #include // Pindefinitie// Een IR-LED moet worden aangesloten op Arduino PWM-pin 3#define OnOff 1# definieer bron 0#define CH_plus 4#define CH_minus 5#define Vol_plus 6#define Vol_minus 7#define Interrupt_Pin 2 //Alleen pin 2 of 3 op Arduino Uno// TV-modeldefinitie//#define LG_TV//#define SAMSUNG_TV#define SONY_TV// Codes definition#ifdef LG_TV unsigned long on_off_code =551489775; // HEX 20DF10EF niet-ondertekende lange vol_plus_code =551502015; //HEX 20DF40BF niet-ondertekende lange vol_minus_code =551534655; //HEX 20DFC03F niet-ondertekende lange ch_plus_code =551485695; //HEX 20DF00FF niet-ondertekende lange ch_minus_code =551518335; //HEX 20DF807F niet-ondertekende lange source_code =551538735; //HEX 20DFD02F#endif#ifdef SAMSUNG_TV unsigned long on_off_code =3772793023; // HEX E0E040BF niet-ondertekende lange vol_plus_code =3772833823; //HEX E0E0E01F niet-ondertekende lange vol_minus_code =3772829743; //HEX E0E0D02F niet-ondertekende lange ch_plus_code =3772795063; //HEX E0E048B7 niet-ondertekende lange ch_minus_code =3772778743; //HEX E0E008F7 niet-ondertekende lange source_code =3772809343; //HEX E0E0807F#endif#ifdef SONY_TV unsigned long on_off_code =2704; // HEX A90 niet-ondertekende lange vol_plus_code =1168; // HEX 490 niet-ondertekende lange vol_minus_code =3216; //HEX C90 niet-ondertekende lange ch_plus_code =144; // HEX 090 niet-ondertekende lange ch_minus_code =2192; //HEX 890 niet-ondertekende lange source_code =2640; //HEX A50#endif//Debug inschakelen//#define DEBUG//IRsend irsend; // Maak IR-object unsigned long debounce_time; unsigned long last_time; void setup () {analogeWrite (13,0); // draai van ingebouwde led //noInterrupts(); //onderbrekingen uitschakelen //CLKPR =_BV(CLKPCE); // schakel instellingen voor klokprescaler in // CLKPR =_BV (CLKPS0); //set klok prescaler =2 --> 8 MHz //interrupts(); pinMode (AanUit, INPUT_PULLUP); pinMode (Bron, INPUT_PULLUP); pinMode(CH_plus,INPUT_PULLUP); pinMode (CH_min, INPUT_PULLUP); pinMode (Vol_plus,INPUT_PULLUP); pinMode (Vol_min, INPUT_PULLUP); pinMode (Interrupt_Pin, INPUT_PULLUP); // energiebesparende power_adc_disable (); // schakel alle ADC's power_spi_disable (); // schakel SPI power_timer1_disable uit (); //disbale timer 1 (0 is voor millis(), 2 is voor irremote.h) power_usart0_disable(); // schakel seriële power_twi_disable uit (); // schakel TWI #ifdef DEBUG Serial.begin (9600) uit; #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(); //laatste keer dat een knop werd ingedrukt #ifdef DEBUG Serial.println ("OnOff"); #endif } } //check Source if (!digitalRead(Source)) { debounce_time =millis(); while (millis() - debounce_time <40) {; } if (!digitalRead(Bron)) { #ifdef LG_TV irsend.sendNEC(source_code, 32); #endif #ifdef SAMSUNG_TV irsend.sendSAMSUNG(broncode, 32); #endif #ifdef SONY_TV irsend.sendSony(broncode, 12); #endif last_time =millis(); //laatste keer dat er op een knop werd gedrukt #ifdef DEBUG Serial.println ("Bron"); #endif } } //check 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(); //laatste keer dat er op een knop werd gedrukt #ifdef DEBUG Serial.println ("CH+"); #endif } } //check 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(); //laatste keer dat er op een knop werd gedrukt #ifdef DEBUG Serial.println ("CH-"); #endif } } //check 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(); //laatste keer dat er op een knop werd gedrukt #ifdef DEBUG Serial.println ("Vol+"); #endif } } //check 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(); //laatste keer dat een knop werd ingedrukt #ifdef DEBUG Serial.println ("Vol-"); #endif } } if (millis()-last_time> 5000) { // er is 10 seconden lang niet op een knop gedrukt #ifdef DEBUG Serial.println("Ga slapen..."); #endif going_to_sleep(); // ga naar de slaapmodus #ifdef DEBUG Serial.println ("Wakker worden..."); #endif }}//Slaapmodus functionvoid going_to_sleep() { sleep_enable(); // schakel slaapmodus attachInterrupt (digitalPinToInterrupt (Interrupt_Pin), wake_up, LOW) in; //interrupt om wakker te worden --> configureer Interrupt Pin als een WIRED NOR!!! set_sleep_mode (SLEEP_MODE_PWR_DOWN); // volledige slaapmodus sleep_cpu (); // activeer slaapmodus}// Wake Up functionvoid wake_up () { sleep_disable (); // schakel de slaapmodus detachInterrupt (digitalPinToInterrupt (Interrupt_Pin)) uit; // verwijder de onderbreking}

Aangepaste onderdelen en behuizingen

Schema's

remote_sketch_r4f8a47oWX.fz

Productieproces

  1. Toegangscontrole met QR, RFID en temperatuurverificatie
  2. IR-afstandsbediening gebruiken met Raspberry Pi zonder LIRC
  3. PiCy – De kleine Raspberry Pi-aangedreven robot!
  4. Arduino-gyroscoopspel met MPU-6050
  5. Discord Beveiligingscamera met een ESP32
  6. Bedien muntvangers met Arduino
  7. Unopad - Arduino MIDI-controller met Ableton
  8. Arduino met Bluetooth om een ​​LED te bedienen!
  9. Eenvoudige obstakelsensor met Arduino
  10. Draaibank Met CNC
  11. 5 voordelen van productiecontrole op afstand