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

Oude afstandsbedieningen hergebruiken

Componenten en benodigdheden

Arduino Nano R3
× 1
5 mm LED:rood
Eén rode voor de status-LED, daarna is de kleur niet echt belangrijk - u hoeft alleen kunnen identificeren welke actief is.
× 3
5 mm LED:groen
Kleur is niet echt belangrijk - je moet alleen kunnen identificeren welke actief is
× 1
5 mm LED:geel
Kleur is niet echt belangrijk - je moet alleen kunnen identificeren welke actief is
× 1
Blauwe LED
Kleur is niet echt belangrijk - je moet alleen kunnen identificeren welke actief is
× 2
Soldeerloze breadboard op ware grootte
× 1
Jumperdraden (algemeen)
× 1
Toggle-schakelaar, (uit)-aan
Elke SPST-tuimelschakelaar werkt
× 1
SparkFun Breadboard-voedingsstick 5V/3,3V
Optioneel als je 5 volt van een andere bron kunt leveren of als je het via de USB-aansluiting van je computer gebruikt ,
× 1
IR-ontvanger (algemeen)
Ik heb een KY-022 37,9 KHz infrarood IR-sensorontvanger gebruikt die ik van Amazon heb gekocht
× 1

Over dit project

Met dit project kun je overtollige afstandsbedieningen van oude videorecorders, tv's, dvd-spelers, enz. hergebruiken.

U kunt de afstandsbedieningen gebruiken om apparaten zoals lampen, verwarmingen, enz. aan te zetten met relais, vermogenstransistors of iets anders dat een 5-volt signaal kan bedienen. Zoals hier getoond, schakelt het gewoon tot 6 LED's. Het idee is om de schets- en breadboard-lay-out te bieden, zodat de signalen die naar de LED's worden gestuurd, parallel kunnen worden verzonden met wat de gebruiker zich ook voorstelt!

Zoals ontworpen, leest het 6 IR-codes van elke afstandsbediening en "onthoudt" ze. Ik gebruik graag de Dights 1, 2, 3, 4, 5, 6 -- maar elke zes toetsen zullen werken. Merk op dat elke andere toets met een andere IR-code dan de 6 bekende codes als reset werkt en alle uitgangen uitschakelt. Ik bereik dit door de codes als lange gehele getallen naar het EEPROM-geheugen op het Ardunio-bord te schrijven. Elk neemt 4 bytes in beslag, maar aangezien de UNO en NANO elk 1024 bytes EEPROM-geheugen hebben, is er voldoende ruimte. Dit geheugen houdt het vast door middel van resets en power-offs, zoals je zou verwachten. Het hele ding zou op een enkel breadboard passen, behalve de tuimelschakelaar. Aan deze schakelaar kunnen pinnen worden gesoldeerd om deze op het breadboard op te nemen. Ik was lui en gebruikte tape om het tijdens de ontwikkeling op mijn bureau te houden.

Ik heb het geprobeerd met vijf verschillende oude overschotten, en ze presteren allemaal hetzelfde. De "gotcha" waarmee ik worstelde, was strooilicht of zwakkere signalen van sommige afstandsbedieningen. Om dit op te lossen, heb ik de ontvanger "LED" voorzichtig naar beneden gebogen tot ongeveer 45 graden, en ik heb er een klein zelfgemaakt karton en plakbanddoosje overheen gelegd, met één uiteinde open. Het lijkt de codes consequent te vangen en van 5 tot 8 voet of meer. Ik heb geen enkele misser gehad in meer dan vijf dagen van testen en aanpassen van het programma.

Gebruik de "leer" positie om het te programmeren. Je gaat van de "run"-modus naar de "learn"-modus door een tuimelschakelaar om te draaien. Met deze schakelaar gaat een rode modusindicator-LED branden, wat aangeeft dat hij klaar is om te luisteren. Het knippert LED 1 en je drukt op een toets op je afstandsbediening. De knipperende LED 1 is geprogrammeerd om op die code te reageren. Zodra hij de code herkent, knippert de modusindicator-LED een seconde of twee snel (zo snel dat het lijkt alsof hij trilt!) en gaat hij verder naar de volgende LED. Dit gaat door totdat ze alle zes zijn geprogrammeerd. Vervolgens knippert de modusindicator-LED langzaam met intervallen van één seconde om aan te geven dat het systeem moet worden omgeschakeld naar de bedrijfsmodus.

Ik ontdekte bij het programmeren dat de meest voorkomende fout was om te vergeten je vinger naar het volgende cijfer op de afstandsbediening te verplaatsen. Zo kunnen eenvoudig twee uitgangen met dezelfde code worden geprogrammeerd. Elke keer dat het opstart, zoekt het naar dergelijke duplicaten. Als het ze vindt, knippert het een paar keer met de "aanstootgevende" LED's om aan te geven dat herprogrammering nodig kan zijn. Het kan echter zijn dat een persoon meerdere sleutels wil die hetzelfde doen, zodat herprogrammering niet wordt afgedwongen.

Modusstatus, fouten, enz. worden aangegeven door de knippersnelheid van de RODE status-LED. Alle informatie die wordt aangegeven door de knipperende LED's, enz., wordt naar de seriële monitor gestuurd. Ik heb het ingesteld om LED-reeksen van flitsen te gebruiken, zodat een gebruiker het zonder computer kan instellen. De berichten die naar de seriële monitor worden gestuurd, zijn gemakkelijker te volgen dan te onthouden wat knipperende LED's met verschillende snelheden betekenen. Aangezien dit normaal gesproken maar een paar keer wordt geprogrammeerd, is het waarschijnlijker om het op uw pc aan te sluiten en de tekst op de seriële monitor te bekijken.

Er zijn veel checks and balances in de schetscode. Ze zijn goed gedocumenteerd (hoop ik!), dus ik zal de details hier niet geven. Gebruikers die bekend zijn met C, C++ en de Arduino IDE moeten de code gemakkelijk kunnen volgen en desgewenst wijzigingen kunnen aanbrengen.

Aanvulling: Ik heb dit getest met 5 relais parallel met LED's 1 tot en met 5 en het werkt zoals verwacht. Ze schakelen allemaal een 120 VAC-tafellamp in, dus het circuit werkt zoals verwacht. Ik had geen relais meer, dus je moet aannemen dat het 6e signaal ook zal werken. Let op:dit is slechts een proof of concept. Ik moest de signalen van de eerste vier uitgangen omkeren met een CD4011 quad NAND-poort omdat ze sluiten op 0 volt in plaats van op 5 volt. Het enkele relais werkt op een + 5-volt signaal, er was dus geen signaalinversie nodig. Wees voorzichtig bij het wisselen van netspanning. Ze hebben een hoog voltage en kunnen een zware schok geven of zelfs dodelijk zijn!

Denk eraan, dit is slechts een voorbeeld. Gebruik je fantasie welke apparaten je op de 6 uitgangen moet aansluiten. Geniet ervan!

Code

  • Schets voor herbestemming van IR-afstandsbediening
IR Remote herbestemmingsschetsArduino
/* Schakel 6 LED's in met een IR-afstandsbediening om te illustreren hoe surpulus-afstandsbedieningen opnieuw kunnen worden gebruikt, zodat ze kunnen worden gebruikt om bijna elk apparaat te bedienen. Deze schets leert de codes van de fabrikant voor de 1,2,3,4,5,6 en 0-knoppen op elke IR-afstandsbediening wanneer de tuimelschakelaar in de "Learn"- of programmeerpositie staat. Deze waarden worden opgeslagen in de EEPROM van de Arduino Nano. Wanneer de tuimelschakelaar in de "Run"-modus wordt gezet, worden deze waarden gebruikt om te bepalen welke toets wordt ingedrukt. 6 bijbehorende LED's worden vervolgens met de afstandsbediening in- en uitgeschakeld. Dit is om te demonstreren hoe u de codes kunt leren en gebruiken, ongeacht het type IR-afstandsbediening. Naast LED's kunnen de uitgangen worden uitgebreid om apparaten met relais, hoogvermogentransistoren, enz. in of uit te schakelen. Paul M Dunphy VE1DX maart 2020 */ // Inclusief IR Remote Library ontwikkeld door Ken Shirriff#include // Geef de mogelijkheid om te lezen/schrijven naar de 1024 bytes van EEPROM#include long unsigned int intIRCode;long unsigned int savedIRCodes[6];long unsigned int dupeCheck[6]; // Definieer pin voor de IR-sensorconst int Recv_Pin =2; // Definieer pinconstanten om de LEDsconst int PinOne =12 te schakelen; const int PinTwo =11;const int PinThree =10; const int PinFour =9;const int PinFive =8; const int PinSix =7;// Definieer pinconstanten om de// status van Run/Learn-tuimelschakelaar te lezen en aan te geven.const int switchPin =4; const int statusPin =5; const unsigned long int repeatKeyPress =0xFFFFFFFF;boolean learnMode; // Wordt gebruikt om bij te houden in welke // modus we ons bevinden volgens de toggle switch.boolean first_iteration; // Definieer gehele getallen om de schakelstatussen van elke LED te onthouden. // Definieer IR-ontvanger en resultatenobjectenIRrecv irrecv(Recv_Pin);decode_results results;void EEPROMWritelong(int address, long value)// Schrijf een 4 byte (32bit) lang geheel getal naar de EEPROM// Omdat ze 4 bytes lang zijn, zijn ze opgeslagen op // adres naar adres + 3 { // Ontbind een lang geheel getal in 4 bytes met behulp van bitshift. // Eén =Meest significant -> Vier =Minst significante byte byte vier =(waarde &0xFF); byte drie =((waarde>> 8) &0xFF); byte twee =((waarde>> 16) &0xFF); byte één =((waarde>> 24) &0xFF); EEPROM.write (adres, vier); EEPROM.write (adres + 1, drie); EEPROM.write (adres + 2, twee); EEPROM.write (adres + 3, één); }long EEPROMReadlong(long address)// Lees een 4 byte (32bit) lang geheel getal uit de EEPROM.// Omdat ze 4 bytes lang zijn, werden ze opgeslagen op // adres naar adres + 3 { long four =EEPROM.read( adres); lange drie =EEPROM.lezen (adres + 1); lange twee =EEPROM.lezen (adres + 2); lange =EEPROM.lezen (adres + 3); // Monteer de bytes in een lang geheel getal en retourneer return ((vier <<0) &0xFF) + ((drie <<8) &0xFFFF) + ((twee <<16) &0xFFFFFF) + ((één <<24) &herhaalKeyPress); }int Flip_LED(int led, int toggle_state) {if(toggle_state==0) {digitalWrite(led, HIGH); toggle_state=1; } else { digitalWrite (led, LAAG); toggle_state=0; } return toggle_state; }void Reset() { // Schakel alle LED's uit en zet de schakelaar // vlaggen op uit (0) digitalWrite (PinOne, LOW); digitalWrite (PinTwo, LAAG); digitalWrite (PinThree, LAAG); digitalWrite (PinFour, LAAG); digitalWrite (PinFive, LAAG); digitalWrite (PinSix, LAAG); togglestate1 =0; togglestate2 =0; togglestate3 =0; togglestate4 =0; togglestate5 =0; togglestate6 =0; }void guessType() { Serial.print("Remote lijkt een "); switch (results.decode_type){ case NEC:Serial.println("NEC"); pauze; geval SONY:Serial.println("SONY"); pauze; geval RC5:Serial.println ("RC5 "); pauze; geval RC6:Serial.println ("RC6 "); pauze; geval SCHAAL:Serial.println("SCHOTEL"); pauze; case SHARP:Serial.println("SHARP"); pauze; geval JVC:Serial.println ("JVC "); pauze; geval SANYO:Serial.println ("SANYO "); pauze; geval MITSUBISHI:Serial.println ("MITSUBISHI "); pauze; geval SAMSUNG:Serial.println ("SAMSUNG "); pauze; behuizing LG:Serial.println ("LG "); pauze; geval WHYNTER:Serial.println ("WHYNTER "); pauze; geval AIWA_RC_T501:Serial.println ("AIWA_RC_T501"); pauze; geval PANASONIC:Serial.println("PANASONIC"); pauze; geval DENON:Serial.println ("DENON "); pauze; standaard:hoofdletter ONBEKEND:Serial.println("ONBEKEND"); pauze; } } int learnCodeRead(int pinCode) { if (irrecv.decode(&results)) { pinCode =results.value; } retourneer pincode; } void Confirm() { int i; for(i=0; i<=20; i++) {digitalWrite(statusPin, HIGH); vertraging (50); digitalWrite (statusPin, LAAG); vertraging (50); } digitalWrite(statusPin, HOOG); // Laat "Learn" LED hoog} void learn_Mode() {boolean goodCode; int i, j; int locatie; int-pinnen [6] ={12,11,10,9,8,7}; // Begin met luisteren naar elk in volgorde als (first_iteration) { Serial.println (); Serial.println("De leermodus binnengaan"); Serieel.println(); } intIRCode =0; locatie =0; goodCode =waar; j =0; while ((goodCode=true) en (j<=5)) { for(i=0; i<=25; i++) {digitalWrite(pins[j], HIGH); vertraging (200); intIRCode =leerCodeRead(intIRCode); digitalWrite (pinnen [j], LAAG); vertraging (200); intIRCode =leerCodeRead(intIRCode); goodCode =((intIRCode !=repeatKeyPress) en (intIRCode !=0)); if (goodCode) { i=30; // Truc om uit de lus te komen omdat 'break' // niet werkt op lussen } irrecv.resume(); // Begin opnieuw te luisteren } goodCode =(intIRCode !=repeatKeyPress en intIRCode !=0); if (goodCode) {if (j==0) { guessType(); } Serial.print("Schrijven naar EEPROM-locatie");Serial.print(locatie); Serial.print(" IR-code =");Serial.println(intIRCode,HEX); EEPROMWritelong(locatie, intIRCode); locatie =locatie + 4; j++; Bevestigen(); intIRCode =0; irrev.resume(); // Begin opnieuw te luisteren } } Serial.println(); Serial.println("Zet Arduino weer in run-modus."); while (digitalRead (switchPin) ==HOOG) {digitalWrite (statusPin, HOOG); vertraging (1000); digitalWrite (statusPin, LAAG); vertraging (1000); } Serieel.println(); Serial.println("Terugkeren naar run-modus."); // Waarschijnlijk hoeft het hier niet zo drastisch te zijn, maar // Dit is een "reset" om er zeker van te zijn dat we uit de leer //-modus komen en correct herstarten. Het is *waarschijnlijk* OK om // de volgende 4 regels te verwijderen. vertraging (50); Serieel.flush(); vertraging (50); asm vluchtig ("jmp 0"); } void run_Mode() { if (first_iteration) { Serial.println("Invoeren van run-modus"); } if (irrecv.decode(&results)) { if (results.value!=repeatKeyPress) { current_remote_code =results.value; Serial.print ("Toetsdruk gedetecteerd, IR-code ="); Serial.println (huidige_remote_code,HEX); if (current_remote_code ==remote_code_1) { togglestate1 =Flip_LED(PinOne,togglestate1); } else if (current_remote_code ==remote_code_2) { togglestate2 =Flip_LED(PinTwo,togglestate2); } else if (current_remote_code ==remote_code_3) { togglestate3 =Flip_LED(PinThree,togglestate3); } else if (current_remote_code ==remote_code_4) { togglestate4 =Flip_LED(PinFour,togglestate4); } else if (current_remote_code ==remote_code_5) { togglestate5 =Flip_LED(PinFive,togglestate5); } else if (current_remote_code ==remote_code_6) { togglestate6 =Flip_LED(PinSix,togglestate6); } anders { Reset(); } } vertraging (500); // Wordt gebruikt om de snelle reeks gegevens te omzeilen // als een knop wordt ingedrukt. Vertraagt ​​de responstijd // door een vertraging in de lus te introduceren. irrev.resume(); // Begin opnieuw te luisteren } } void setup () { first_iteration =true; int i,j,k; int locatie; int dupeFlash[6] ={12,11,10,9,8,7}; // Pin-nummers om te knipperen // als er duplicaten zijn gevonden Serial.begin (9600); onrecv.enableIRIn(); // Schakel de IR-ontvanger in /* Het volgende gedeelte van de code zou nooit de EEPROM moeten resetten. * Er verschijnen echter enkele nieuwe, standaard NANO's met hun EEPROM's ingesteld * op FFFFFFFF's. Dit is toevallig de code die door veel IR-afstandsbedieningen wordt verzonden wanneer * een toets wordt ingedrukt. Deze schets controleert op verschillende plaatsen op die code * en het zal niet goed werken als een "sleutel" een hex FFFFFFFF is toegewezen. Om * dit probleem te voorkomen, controleren we op FFFFFFFF's en als we er een vinden, stellen we * de 6 belangrijkste locaties in op Sony RM-YD104-codes. Als dit gebeurt, moet u, tenzij u * die specifieke afstandsbediening gebruikt, de schets in de modus "leren" * uitvoeren om deze te initialiseren. */// =============Begin nieuwe Arduino ==================boolean defaultToSony =false; lange unsigned int IRCode =0; locatie =0; for(i=0; i<=5; i++) {IRCode =EEPROMReadlong(locatie); if (IRCode==repeatKeyPress) { defaultToSony =true; } locatie =locatie + 4; } if (defaultToSony) { Serial.println("HEX FFFFFFFF gevonden in EEPROM-geheugen. Instellingscodes"); Serial.println ("voor een Sony RM-YD104-afstandsbediening. Draait nu de 'leer'-modus"); Serial.println("wordt aanbevolen tenzij dat de afstandsbediening is die je hebt."); EEPROMWritelong (0, 0x10); vertraging (50); EEPROMWritelong (4, 0x810); vertraging (50); EEPROMWritelong (8, 0x410); vertraging (50); EEPROMWritelong (12, 0xC10); vertraging (50); EEPROMWritelong (16, 0x210); vertraging (50); EEPROMWritelong (20, 0xA10); vertraging (50); } // =============Einde Nieuwe Arduino ==================// Stel LED-pinnen in als uitgangen pinMode (PinOne, OUTPUT); pinMode (PinTwo, UITGANG); pinMode (PinThree, UITGANG); pinMode (PinFour, UITGANG); pinMode (PinFive, UITGANG); pinMode (PinSix, UITGANG); Opnieuw instellen(); // Begin met ze allemaal uit pinMode (statusPin, OUTPUT); pinMode (switchPin, INPUT); // Ontvang codes van de laatst gebruikte externe Serial.println (); Serial.println ("Opgeslagen IR-afstandsbedieningscodes lezen . . . "); locatie =0; for(j=0; j<=5; j++) { savedIRCodes[j] =EEPROMReadlong(locatie); Serial.print ("Lezen van EEPROM-locatie ");Serial.print (locatie); Serial.print(" IR code =");Serial.println(savedIRCodes[j],HEX); locatie =locatie + 4; dupeCheck[j]=opgeslagen IRCodes[j]; // Bewaar een kopie voor duplicaatcontrole } // Zoek naar opeenvolgende duplicaatcodes die zijn toegewezen aan de //-uitgangen. We zoeken niet naar algemene duplicaten omdat // het onwaarschijnlijk is dat ze voorkomen. De ervaring heeft geleerd dat // tijdens het programmeren de meest waarschijnlijke fout is om twee keer op // dezelfde toets te drukken op bacl-to-back LED's. Als er duplicaten // worden gevonden, geef dit dan aan door de verdachte LED's te laten knipperen. // Er zijn slechts 6 LED's, dus er zijn slechts 21 vergelijkingen nodig // om duplicaten te vinden (6 + 5 + 4 + 3 + 2 + 1 =21). Deze // sectie kan worden verbeterd om naar eventuele duplicaten te zoeken door // eerst de array te sorteren, enz. for (i =0; i <5 - 1; i++) { for (j =i + 1; j <6; j++) ) { if (dupeCheck[i] ==dupeCheck[j]) { Serial.println("Dubbele codes gevonden. Stel voor om de leermodus opnieuw te starten"); for(k=0; k<=5; k++) {digitalWrite(dupeFlash[i],HIGH); digitalWrite(dupeFlash[j],HIGH); vertraging (1000); digitalWrite(dupeFlash[i],LOW); digitalWrite(dupeFlash[j],LOW); vertraging (1000); } } } } remote_code_1 =opgeslagenIRCodes[0]; remote_code_2 =opgeslagenIRCodes[1]; remote_code_3 =opgeslagenIRCodes[2]; remote_code_4 =opgeslagenIRCodes[3]; remote_code_5 =opgeslagenIRCodes[4]; remote_code_6 =opgeslagenIRCodes[5]; vertraging (1000); Serial.println("Opgeslagen codes gelezen."); Serieel.println(); } void loop() { // Controleer of de schakelaar aan of uit staat. Als het is ingeschakeld (in leermodus) // de switchPin is HOOG:leermodus =(digitalRead (switchPin) ==HOOG); if (learnMode) { first_iteration =true; Opnieuw instellen(); digitalWrite(statusPin, HOOG); // Zet de leermodus-LED aan:learn_Mode(); Opnieuw instellen(); first_iteration =onwaar; } else { digitalWrite (statusPin, LAAG); // Schakel de leermodus-LED uit:run_Mode(); first_iteration =onwaar; } }

Schema's


Productieproces

  1. Light Emitting Diode (LED)
  2. Bewaking op afstand van het weer met Raspberry Pi
  3. Raspberry Pi universele afstandsbediening
  4. Hartslagmeter op afstand
  5. Coffin Dance Melody
  6. Converteer je oude telefoon naar een externe schakelaar
  7. Afbeeldingen maken met één LED
  8. 8x LED-verlichting door geluid
  9. Arduino Quadruped
  10. Top 5 factoren voor het kiezen van een besturingsplatform
  11. Hoe oude machines veilig weg te gooien?