Inhoudsopgave:

Universele tv-afstandsbediening - Ardiuino, infrarood - Ajarnpa
Universele tv-afstandsbediening - Ardiuino, infrarood - Ajarnpa

Video: Universele tv-afstandsbediening - Ardiuino, infrarood - Ajarnpa

Video: Universele tv-afstandsbediening - Ardiuino, infrarood - Ajarnpa
Video: How to use Arduino as TV Remote Controller with Infrared 2024, Juli-
Anonim
Universele TV-afstandsbediening - Ardiuino, Infrarood
Universele TV-afstandsbediening - Ardiuino, Infrarood

Hallo! In deze instructable laat ik je zien hoe je je eigen universele afstandsbediening kunt bouwen en programmeren die werkt met de meeste dingen die een infraroodafstandsbediening gebruiken, en die ook zal "luisteren" en een infraroodsignaal decoderen dat door verschillende andere afstandsbedieningen wordt verzonden.

Een beetje achtergrondinformatie over wat me inspireerde om deze afstandsbediening te bouwen - ik verlies, zoals de meesten van jullie, constant mijn afstandsbedieningen, en deze calamiteit is behoorlijk frustrerend, dus ik denk dat we het kunnen oplossen! Ik heb deze afstandsbediening gebouwd en discreet ingebed in mijn op maat gemaakte bedframe (ik ben ook een houtbewerker) - ik kan de afstandsbediening niet kwijtraken als deze deel uitmaakt van mijn bedframe!

Benodigdheden

Dingen die je nodig hebt:-Arduino UNO of Nano - kilometerstand kan variëren met andere boards

- Soldeerloze breadboard (of soldeerbaar stripboard als je het permanenter wilt maken)

-Jumperdraden in verschillende kleuren en lengtes

- Kortstondige drukknoppen (5) (u kunt meer knoppen toevoegen, maar u moet digitale pinnen gebruiken, aangezien alle analoge pinnen behalve 1 worden gebruikt - u moet ervoor zorgen dat u op de juiste manier pull-upweerstanden gebruikt, of trek weerstanden naar beneden en debounce de drukknoppen)

-10K Ohm weerstand (5) (als je meer drukknoppen wilt, heb je er meer nodig)

-470 Ohm weerstand (2)

-Infrarood LED

-Rode LED

-Infraroodsensor (ik gebruikte onderdeelnummer VS1838B, je zou een andere kunnen gebruiken, controleer gewoon de pin-out)

(Optioneel) Soldeerbout, soldeer, soldeerflux.

Stap 1: Het circuit bouwen:

Het circuit bouwen
Het circuit bouwen

1). Ik begin altijd graag met de lay-out van mijn componenten, omdat dit altijd de lay-out op het breadboard bepaalt.

-Drukknoppen

-LEDS: de rode led en IR-led zijn in tandem bedraad, zodat u kunt zien wat de IR-led doet.

-Sensor

2). Weerstanden

- De vijf 10K-weerstanden die we aan de drukknoppen hebben bevestigd, worden "pull-down"-weerstanden genoemd. Pull-down weerstanden zorgen ervoor dat wanneer een drukknop niet wordt ingedrukt, de bijbehorende Arduino-pin 0 Volt krijgt (of in ieder geval dichtbij). Voor meer informatie over pull-down (of pull-up) weerstanden is hier een uitgebreide gids:

www.electronics-tutorials.ws/logic/pull-up…

Deze weerstanden zijn misschien niet helemaal nodig, maar als u "spook"-pushingen krijgt, wordt dit meer dan waarschijnlijk veroorzaakt door capacitieve koppeling en voorkomen pull-down-weerstanden dit.

3). Circuit draden

4). 5V en aardingsdraden

Gebruik de meegeleverde afbeelding ter referentie! wees echter niet bang om het te veranderen voor uw behoeften!

Stap 2: Coderen:

#include const int RECV_PIN = 7; // IR-sensor lees pin int Button1 = A4;// Meest links int Button2 = A3; // 2e van links int Button3 = A2; // Middelste int Button4 = A1; // 2e van rechts int Button5 = A0; // Verste naar rechts int LED = 3; // IR LED & Rode LED int val = 0; // Veranderende waarde IRsend irsend; IRrecv irrecv(RECV_PIN); decode_results resultaten;

void setup() {pinMode(Knop1, INPUT); pinMode (Knop2, INPUT); pinMode (Knop3, INPUT); pinMode (Knop4, INPUT); pinMode (Knop5, INPUT); pinMode (LED, UITGANG); Serieel.begin(9600); onrecv.enableIRIn(); irrecv.blink13(true);} void loop() {{{if (analogRead(Button1)>900)irsend.sendNEC(0xFF02FD, 32); // gebruik analoog lezen in plaats van digitaal lezen om captive capaciteitsproblemen te voorkomen. helpt ook om de knoppen te debouncen. // Het hebben van analoog lezen op 900 zorgt voor wat speelruimte in de waarden, wat betekent dat het infra-signaal wordt verzonden, zelfs als er geen volledige 5V op de pin wordt toegepast. // maar 900 is hoog genoeg om niet foutief te lezen vanwege capacitieve koppelingsvertraging (100);}// RGB Strip On&off {if (analogRead (Button5)>900) {for (int i = 0; i < 3; i++) // Als u de waarde in "i < 3" wijzigt, verandert het aantal keren dat het signaal onmiddellijk wordt herhaald. dus "i < 2" zal het signaal twee keer herhalen. // misschien moet je met dit nummer spelen als je tv niet reageert, over het algemeen werken 1 of 3 het meest, als dat niet het geval is, probeer dan oneven nummers. // misschien moet u ook spelen met de timingwaarden voor intra-signaalvertraging, bijvoorbeeld voor mijn TV 10 werkt, maar 30 niet. {irsend.sendSony(0xa90, 12); // Sony TV-voedingscode, voor mijn tv moet de code 3x3 worden verzonden, dus 3 pulsen, drie afzonderlijke tijden vertraging (10); // "intra signaalvertraging" voor (int i = 0; i < 3; i++) {irsend.sendSony (0xa90, 12); // "12" is het bitnummer, verschillende protocollen vragen om verschillende bitnummers. NEC is 32, Sony is 12, je kunt de andere vertraging opzoeken (10); for (int i = 0; i 900) {for (int i = 0; i 900) {for (int i = 0; i 900) {for (int i = 0; i < 3; i++) {irsend.sendSony (0xc90, 12); // Sony TV power Volume Down delay(100);}}} delay(100);} if (irrecv.decode(&results)) // met het onderstaande gedeelte van de code kunt u infraroodsignalen van verschillende afstandsbedieningen interpreteren. { Serial.println (resultaten.waarde, HEX); // het genereert de procedure "NEC, Sony, Etc.." en een tv-code "c90, a90, FF02FD" die u 0x moet toevoegen aan de voorkant van de tv-codeschakelaar (results.decode_type) {case DENON: Serieel.println("DENON"); pauze; geval NEC: Serial.println ("NEC"); pauze; geval PANASONIC: Serial.println ("PANASONIC"); pauze; geval SONY: Serial.println ("SONY"); pauze; geval RC5: Serial.println ("RC5"); 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 RC6: Serial.println ("RC6"); pauze; geval SCHAAL: Serial.println ("SCHOTEL"); pauze; geval SHARP: Serial.println("SHARP"); pauze; geval WHYNTER: Serial.println ("WHYNTER"); pauze; geval AIWA_RC_T501: Serial.println ("AIWA_RC_T501"); pauze; standaard: hoofdletter ONBEKEND: Serial.println ("ONBEKEND"); breken;} onherstelbare.resume();}}

Stap 3: Diepte coderen: IR-signalen verzenden

Ik verwijs naar coderegels met hun regelnummer - gebruik deze link om mee te volgen:

pastebin.com/AQr0fBLg

Eerst moeten we de IR Remote Library van z3t0 opnemen.

Hier is een link naar de bibliotheek:

github.com/z3t0/Arduino-IRremote

Als je een handleiding nodig hebt over hoe je een bibliotheek op de juiste manier downloadt en installeert in de IDE:

www.arduino.cc/en/guide/bibliotheken

Lijn 1 omvat de bibliotheek.

Vervolgens moeten we een paar variabelen declareren, regels 2-12 doen dit.

We gebruiken "cost int" om variabelen te definiëren die niet veranderen, op één na vallen ze allemaal in deze categorie.

We gebruiken " int " om variabelen te definiëren die zullen veranderen.

We moeten een pin met puls met modulatie (PWM) gebruiken voor onze LED-pin - elke pin met "~" ernaast is voldoende, in mijn code - we gebruiken digitale pin 3.

Vervolgens moeten we wat instellingen uitvoeren - deze code wordt slechts één keer uitgevoerd wanneer de Arduino wordt ingeschakeld of opnieuw wordt ingesteld.

Merk op dat we onze ingangen en uitgangen (15-20) definiëren, de seriële monitor (21) opstarten, de IR-sensor (22) inschakelen en de Arduino vertellen om de ingebouwde LED te laten knipperen wanneer we een signaal in de sensor krijgen (23).

Vervolgens bouwen we onze lus uit - deze code zal herhaaldelijk worden uitgevoerd en een handvol keren per seconde van boven naar beneden gaan.

Op regel 25 gebruiken we een if-statement, dit vertelt de Arduino "zoek naar deze specifieke criteria, als aan die criteria wordt voldaan, doe dan dit specifieke ding". In dit geval is het criterium analogRead(Button1)>900, of met andere woorden - "Arduino, kijk naar button1, die we eerder als pin A4 hebben gedefinieerd, als het ontvangen analoge signaal groter is dan 900, ga dan verder met onze volgende instructies, zo niet, ga dan verder". Er is hier een beetje om uit te pakken, dus laten we erin duiken: een analoog signaal op de Arduino is een waarde gelijk aan of kleiner dan 5V, waarbij 5V gelijk is aan 1023 en 0V gelijk is aan 0. Elke gegeven spanning tussen 0 en 5V kan worden gedefinieerd door een getal, en met een beetje wiskunde kunnen we dat getal achterhalen, of omgekeerd, een spanning. Deel 1024 (we nemen 0 als eenheid op) door 5, dat geeft ons 204,8. We gebruiken bijvoorbeeld het getal 900, om dat in spanning te vertalen, delen we 900 eenvoudig door 204,8, wat ons ~ 4,4V geeft. We vertellen de Arduino om te zoeken naar een spanning van meer dan ~ 4,4 volt, en als dat zo is, voer dan onze volgende instructie uit.

Over de volgende instructies gesproken (regel 25), we zien irsend.sendNEC (0xFF02FD, 32). Dit zegt: "Arduino, stuur een gemoduleerde puls die het NEC-protocol volgt, met name het FF02FD-signaal, en zorg ervoor dat deze 32 bits lang is". Hierdoor zal onze IR LED flikkeren op een manier die andere apparaten kunnen begrijpen. Zie het een beetje als morsecode, maar dan met onzichtbaar licht! Er zijn veel verschillende protocollen, elk met honderden, zo niet duizenden individuele signalen, en elk met hun specifieke bitnummer - ons apparaat zal een groot aantal van deze signalen kunnen herkennen, maar daar zullen we later op ingaan!

Op regel 28 hebben we onze eerste vertraging - dit is hier om onbedoelde herhalingssignalen te voorkomen, zodra de knop is ingedrukt en het IR-signaal is verzonden, hebben we 100 milliseconden om onze vinger van de knop te halen. dit klinkt niet als veel tijd, maar in de praktijk blijkt het prima te werken. de vertragingsfunctie vertelt de Arduino "doe niets voor X milliseconden" en ter referentie, hun zijn 1000 milliseconden in een seconde.

Door naar onze volgende knop op regel 29, knop 5 (ik had oorspronkelijk 4 knoppen op deze afstandsbediening, een vijfde toegevoegd, dus daarom zijn we niet in orde). Dit is in de geest hetzelfde als knop 1, maar met een paar belangrijke verschillen. Het eerste verschil dat je zult zien is een for-statement - dit is in wezen een andere lus - een lus met in een andere grotere lus, loopception. Specifiek hebben we " for (int i = 0; i < 3; i++) ", lees dit als "Arduino, laten we beginnen bij 0, herhaal de volgende instructies totdat we bij 3 keer komen". De for-functie wordt gebruikt omdat veel apparaten zijn geprogrammeerd om te zoeken naar een herhaald signaal, en in ons geval hier 3 keer. U kunt het nummer 3 eenvoudig in een ander nummer veranderen als uw apparaat om een ander herhalingsschema vraagt. Een ander belangrijk verschil met button5 is dat het opnieuw wordt herhaald, 3 keer of 3x3. Met andere woorden, we sturen het signaal 3 keer, wachten 10 milliseconden, sturen het 3 keer opnieuw, wachten nog eens 10 milliseconden en sturen het dan nog 3 keer. Dit type communicatie is gebruikelijk voor het in- en uitschakelen van apparaten en is misschien precies wat uw tv of apparaat nodig heeft - de sleutel hiervoor is om met alle variabelen te spelen totdat u het gewenste resultaat krijgt. Wijzig de waarde voor korte vertraging, wijzig de waarde voor herhaling, stuur 6 batches in plaats van 3, enz. Apparaten zijn opzettelijk geprogrammeerd met willekeurige signaalregels, stel je voor dat je tv-afstandsbediening hetzelfde type signaal verzendt als je soundbar; elke keer dat je het kanaal op je tv verandert, wordt je soundbar uitgeschakeld - daarom zijn er verschillende signaalregels.

De volgende drie knoppen zijn geprogrammeerd met dezelfde principes, althans gedeeltelijk, zoals hierboven beschreven - dus we kunnen helemaal naar regel 55 overslaan.

Stap 4: Code in diepte: IR-signalen ontvangen

Code in diepte: IR-signalen ontvangen
Code in diepte: IR-signalen ontvangen

Op regel 55 beginnen we de Arduino te programmeren om IR-signalen te interpreteren die door andere afstandsbedieningen worden verzonden - dit is nodig zodat u de protocollen en signalen kunt achterhalen die uw afstandsbedieningen gebruiken. De eerste regel code op regel 55 is als (irrecv.decode(&results) lees dit als "Arduino, zoek naar een IR-code, als je er een vindt, retourneer een echte waarde, als er niets wordt gevonden, retourneer dan false. Indien waar, neem dan op de informatie in "resultaten"".

Als we verder gaan naar regel 56, hebben we Serial.println (results.value, HEX) met de tekst "Ardunio, print de resultaten in de seriële monitor in een HEX-indeling". Hex, wat hexadecimaal betekent, is een manier waarop we een binaire tekenreeks (alleen nullen en enen) kunnen inkorten tot iets dat iets gemakkelijker te typen is. 101010010000 is bijvoorbeeld "a90", de code die wordt gebruikt om mijn tv aan en uit te zetten, en 111111110000001011111101 is 0xFF02FD, die mijn RGB-strip bestuurt. U kunt de bovenstaande grafiek gebruiken om binair naar hex om te zetten en vice versa, of u kunt de volgende link gebruiken:

www.rapidtables.com/convert/number/hex-to-…

Tot regel 57 hebben we een nieuwe functie, een schakelkast genaamd.

In wezen stelt een schakelgeval ons in staat om verschillende instructies te specificeren op basis van de resultaten van een bepaalde variabele (geval). de break verlaat de switch-instructie en wordt aan het einde van elke instructie gebruikt.

We gebruiken hier de schakelkast om de manier waarop we printen in de seriële monitor te wijzigen op basis van de protocollen die onze Arduino van de verschillende afstandsbedieningen detecteert.

Stap 5: Conclusie

Als u een vraag heeft, kunt u hier contact met mij opnemen! Ik probeer je graag zo goed mogelijk te helpen.

Ik hoop dat je iets hebt geleerd dat je kunt gebruiken om je leven een beetje beter te maken!

-RB

Aanbevolen: