Innholdsfortegnelse:

Universal TV -fjernkontroll - Ardiuino, infrarød: 5 trinn
Universal TV -fjernkontroll - Ardiuino, infrarød: 5 trinn

Video: Universal TV -fjernkontroll - Ardiuino, infrarød: 5 trinn

Video: Universal TV -fjernkontroll - Ardiuino, infrarød: 5 trinn
Video: Превращаем в инфракрасный пульт, "любое устройство" IR remote infrared jack 3.5 Audio wav Arduino 2024, Juli
Anonim
Universal TV -fjernkontroll - Ardiuino, infrarød
Universal TV -fjernkontroll - Ardiuino, infrarød

Hallo! I denne instruksen vil jeg vise deg hvordan du bygger og programmerer din egen universelle fjernkontroll som fungerer med det meste som bruker en infrarød fjernkontroll, og som også vil "lytte" og dekode et infrarødt signal sendt av forskjellige andre fjernkontroller.

Litt bakgrunn av det som inspirerte meg til å bygge denne fjernkontrollen - jeg, som de fleste av dere, mister fjernkontrollene mine hele tiden, og denne ulykken er ganske frustrerende, så jeg tror vi kan løse det! Jeg har bygget denne fjernkontrollen og diskret innebygd den i min spesialbygde sengsramme (jeg er også en trearbeider) - jeg kan ikke miste fjernkontrollen hvis den er en del av sengen min!

Rekvisita

Ting du trenger: -Arduino UNO eller Nano - kjørelengde kan variere med andre brett

-Solderless brødbrett (eller loddetinn stripboard hvis du vil gjøre det mer permanent)

-Gensere i forskjellige farger og lengder

-Morsomme trykknapper (5) (du kan legge til flere knapper, men du må bruke digitale pinner, siden alle unntatt 1 av de analoge pinnene brukes - du må undersøke om du bruker trekkmotstandene riktig., eller trekk ned motstander, og avbryt trykknappene)

-10K Ohm motstand (5) (hvis du vil ha flere trykknapper, trenger du flere av disse)

-470 Ohm motstand (2)

-Infrarød LED

-Rød LED

-Infrarød sensor (jeg brukte delenummer VS1838B, du kan bruke en annen, bare sjekk pin-out)

(Valgfritt) Loddejern, Lodde, Loddeflux.

Trinn 1: Bygg kretsen:

Bygg kretsen
Bygg kretsen

1). Jeg liker alltid å begynne med å legge ut komponentene mine, da dette alltid driver oppsettet på brødbrettet.

-Trykke knapper

-LEDER: den røde LED og IR LED er koblet sammen, slik at du kan se hva IR LED gjør.

-Sensor

2). Motstander

- De fem 10K -motstandene vi har festet til trykknappene kalles "pull down" -motstander. Trekk ned motstander sørg for at når en trykknapp ikke trykkes, får den tilsvarende Arduino -pinnen 0 volt (eller i det minste i nærheten av den). For mer informasjon om nedtrekksmotstander (eller trekk opp) er det en grundig veiledning:

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

Disse motstandene er kanskje ikke helt nødvendige, men hvis du får "spøkelses" dytt, er det mer enn sannsynlig forårsaket av kapasitiv kobling og nedtrekksmotstander som forhindrer dette.

3). Kretsledninger

4). 5V og jordledninger

Bruk det medfølgende bildet som referanse! ikke vær redd for å endre det etter dine behov!

Trinn 2: Kode:

#include const int RECV_PIN = 7; // IR sensor les pin int Button1 = A4; // Lengst til venstre int Button2 = A3; // 2. fra venstre int Knapp3 = A2; // Middle int Button4 = A1; // 2. til høyre int Button5 = A0; // Lengst til høyre int LED = 3; // IR LED og rød LED int val = 0; // Endre verdi IRsend irsend; IRrecv irrecv (RECV_PIN); resultater for dekoderesultater;

void setup () {pinMode (Button1, INPUT); pinMode (Button2, INPUT); pinMode (Button3, INPUT); pinMode (Button4, INPUT); pinMode (Button5, INPUT); pinMode (LED, OUTPUT); Serial.begin (9600); irrecv.enableIRIn (); irrecv.blink13 (true);} void loop () {{{if (analogRead (Button1)> 900) irsend.sendNEC (0xFF02FD, 32); // ved å bruke analog lesing i stedet for digital lesing for å unngå problemer med kapasitiv kapasitet. hjelper også med å avbryte knappene. // Å ha analog lesing på 900 gir mulighet for litt vrikkerom i verdiene, noe som betyr at infra -signalet vil bli sendt selv om en full 5V ikke blir påført pinnen. // men 900 er høy nok til å ikke lese feil på grunn av kapasitiv koblingsforsinkelse (100);} // RGB Strip På og av {if (analogRead (Button5)> 900) {for (int i = 0; i <3; i ++) // Hvis du endrer verdien i "i <3", endres antallet ganger signalet gjentas umiddelbart. så "i <2" vil gjenta signalet to ganger. // Du må kanskje leke med dette nummeret hvis TV -en ikke svarer. Vanligvis fungerer 1 eller 3 mest, hvis de ikke gjør det, kan du prøve oddetall. // Du må kanskje også leke med intra -signalforsinkelsestidsverdiene, for eksempel for TV -10 -verkene mine, men 30 gjør det ikke. {irsend.sendSony (0xa90, 12); // Sony TV -strømkode, for min TV må koden sendes 3x3, så 3 pulser, tre separate forsinkelser (10); // "intra signal delay" for (int i = 0; i <3; i ++) {irsend.sendSony (0xa90, 12); // "12" er bitnummeret, forskjellige protokoller krever forskjellige bitnumre. NEC er 32, Sony er 12, du kan slå opp de andre forsinkelsen (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 strøm Volum ned forsinkelse (100);}}} forsinkelse (100);} hvis (irrecv.decode (& resultater)) // delen nedenfor av koden lar deg tolke infrarøde signaler fra forskjellige fjernkontroller. {Serial.println (results.value, HEX); // det vil generere prosedyren "NEC, Sony, Etc.." og en TV -kode "c90, a90, FF02FD" du må legge til 0x foran på TV -kodebryteren (results.decode_type) {case DENON: Serial.println ("DENON"); gå i stykker; case NEC: Serial.println ("NEC"); gå i stykker; sak PANASONIC: Serial.println ("PANASONIC"); gå i stykker; case SONY: Serial.println ("SONY"); gå i stykker; sak RC5: Serial.println ("RC5"); gå i stykker; sak JVC: Serial.println ("JVC"); gå i stykker; sak SANYO: Serial.println ("SANYO"); gå i stykker; sak MITSUBISHI: Serial.println ("MITSUBISHI"); gå i stykker; case SAMSUNG: Serial.println ("SAMSUNG"); gå i stykker; tilfelle LG: Serial.println ("LG"); gå i stykker; sak RC6: Serial.println ("RC6"); gå i stykker; tilfelle oppvask: Serial.println ("oppvask"); gå i stykker; case SHARP: Serial.println ("SHARP"); gå i stykker; case WHYNTER: Serial.println ("WHYNTER"); gå i stykker; sak AIWA_RC_T501: Serial.println ("AIWA_RC_T501"); gå i stykker; standard: sak UKjent: Serial.println ("UKjent"); pause;} irrecv.resume ();}}

Trinn 3: Kode i dybde: Sende IR -signaler

Jeg vil referere til kodelinjer etter deres linjenummer - for å følge med, bruk denne lenken:

pastebin.com/AQr0fBLg

Først må vi inkludere IR Remote Library med z3t0.

Her er en lenke til biblioteket:

github.com/z3t0/Arduino-IRremote

Hvis du trenger en guide for hvordan du laster ned et bibliotek og installerer det i IDE:

www.arduino.cc/en/guide/libraries

Linje 1 inkluderer biblioteket.

Deretter må vi deklarere noen få variabler, linje 2-12 gjør dette.

Vi bruker "cost int" til å definere variabler som ikke vil endres, alle unntatt ett faller i denne kategorien.

Vi bruker "int" for å definere variabler som vil endres.

Vi må bruke en pinne med puls med modulering (PWM) for LED -pinnen vår - enhver pinne som har "~" ved siden av den vil være tilstrekkelig, i min kode - vi bruker digital pin 3.

Deretter må vi gjøre noen oppsett - denne koden vil bare kjøre en gang når Arduino slås på eller tilbakestilles.

Legg merke til at vi definerer våre innganger og utganger (15-20), skyter opp den serielle skjermen (21), aktiverer IR-sensoren (22) og ber Arduino om å blinke den innebygde LED-en når vi får et signal i sensoren (23).

Deretter skal vi bygge ut løkken vår - denne koden vil kjøre gjentatte ganger, gå fra toppen til bunnen en håndfull ganger i sekundet.

På linje 25 bruker vi en if -setning, dette forteller Arduino "se etter disse spesifikke kriteriene, hvis kriteriene er oppfylt, gjør denne spesifikke tingen". I dette tilfellet er kriteriene analogRead (Button1)> 900, eller med andre ord - "Arduino, Se på knapp1, som vi definerte som pin A4 tidligere, hvis det analoge signalet som mottas er større enn 900, fortsett til våre neste instruksjoner, hvis ikke, vær så snill å gå videre ". Det er litt å pakke ut her, så la oss dykke ned: et analogt signal på Arduino er en verdi lik eller mindre enn 5V, med 5V lik 1023 og 0V lik 0. Enhver gitt spenning mellom 0 og 5V kan defineres med et tall, og med litt matematikk kan vi finne ut det tallet, eller omvendt, en spenning. Del 1024 (vi inkluderer 0 som en enhet) med 5, det gir oss 204,8. For eksempel bruker vi tallet 900, for å oversette det til spenning, deler vi ganske enkelt 900 med 204,8, og gir oss ~ 4,4V. Vi forteller Arduinoen å se etter en spenning som er større enn ~ 4,4 volt, og hvis det er det, gjør vi vår neste instruksjon.

Når vi snakker om neste instruksjon (linje 25), ser vi irsend.sendNEC (0xFF02FD, 32). Dette sier "Arduino, send en modulert puls som følger NEC -protokollen, spesielt FF02FD -signalet, og sørg for at den er 32 bit lang". Dette vil få vår IR -LED til å flimre slik andre enheter kan forstå. Tenk på det litt som Morse Code, men bare med usynlig lys! Det er mange forskjellige protokoller der ute, hver med hundrevis om ikke tusenvis av individuelle signaler, og hver med sitt spesifikke bitnummer - enheten vår vil kunne gjenkjenne en stor mengde av disse signalene, men vi skal dykke ned i det senere!

På linje 28 har vi vår første forsinkelse - dette er her for å forhindre utilsiktede repetisjonssignaler, når knappen trykkes og IR -signalet sendes, har vi 100 millisekunder for å få fingeren av knappen. Dette høres ikke ut som mye tid, men i praksis ser det ut til å fungere bra. forsinkelsesfunksjonen forteller Arduino "gjør ingenting for X millisekunder" og som referanse er de 1000 millisekunder på et sekund.

Gå videre til vår neste knapp på linje 29, knapp 5 (jeg hadde opprinnelig 4 knapper på denne fjernkontrollen, lagt til en femte, så derfor er vi ute av drift). Dette er i ånden det samme som knapp 1, men med noen få viktige forskjeller. Den første forskjellen du ser er en for -setning - dette er egentlig en annen sløyfe - en sløyfe med en annen større løkke, loopception. Spesielt har vi "for (int i = 0; i <3; i ++)", les dette som "Arduino, la oss starte med 0, gjenta følgende instruksjoner til vi kommer til 3 ganger". For -funksjonen brukes fordi mange enheter er programmert til å lete etter et gjentatt signal, og i vårt tilfelle her, 3 ganger. Du kan ganske enkelt endre tallet 3 til et annet nummer hvis enheten krever en annen repetisjonsplan. En annen viktig forskjell med knapp 5 er at den gjentas igjen, 3 ganger eller 3x3. Med andre ord sender vi signalet 3 ganger, venter 10 millisekunder, sender det igjen 3 ganger, venter ytterligere 10 millisekunder, og sender det deretter 3 ganger igjen. Denne typen kommunikasjon er vanlig for å slå enheter på og av, og kan bare være det TV -en eller enheten krever - nøkkelen til dette er å leke med alle variablene til du får ønsket resultat. Endre verdien for kort forsinkelse, endre verdien for gjentagelse, send 6 partier i stedet for 3, etc. Enheter er med vilje programmert med vilkårlige signalregler, tenk deg om TV -fjernkontrollen sendte samme typesignal som lydfeltet; hver gang du byttet kanal på TV -en din, stenges lydfeltet - det er derfor det er forskjellige signalregler.

De tre neste knappene er programmert med de samme rektorene, i det minste delvis beskrevet ovenfor - slik at vi kan hoppe helt ned til linje 55.

Trinn 4: Kode i dybde: Motta IR -signaler

Kode i dybde: Motta IR -signaler
Kode i dybde: Motta IR -signaler

På linje 55 begynner vi å programmere Arduino for å tolke IR -signaler sendt av andre fjernkontroller - dette er nødvendig, slik at du kan finne ut protokollene og signalene som fjernkontrollene dine bruker. Den første kodelinjen på linje 55 er hvis (irrecv.decode (& results) leser dette som "Arduino, se etter en IR -kode, hvis du finner en, returner en sann verdi, hvis ingenting ble funnet, returner false. Når det er sant, registrer informasjonen til "resultater" ".

Når vi går videre til linje 56, har vi Serial.println (results.value, HEX) som sier "Ardunio, skriv ut resultatene i den serielle skjermen i et HEX -format". Hex, som betyr heksadesimal, er en måte vi kan forkorte en binær streng (bare 0 og 1) til noe som er litt lettere å skrive. For eksempel er 101010010000 "a90", koden som brukes til å slå TVen på og av, og 111111110000001011111101 er 0xFF02FD, som styrer min RGB -stripe. Du kan bruke diagrammet ovenfor til å konvertere binær til hex, og omvendt, eller du kan bruke følgende lenke:

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

Ned til linje 57 har vi en ny funksjon, kalt en switch case.

I hovedsak lar en switch case oss spesifisere forskjellige instruksjoner basert på resultatene av en gitt variabel (case). pause går ut av switch -setningen, og brukes på slutten av hver setning.

Vi bruker bryterhuset her for å endre hvordan vi skriver ut i den serielle skjermen basert på protokollene Arduino vår sanser fra de forskjellige fjernkontrollene.

Trinn 5: Konklusjon

Hvis du har et spørsmål - ta gjerne kontakt med meg her! Jeg er glad for å prøve å hjelpe deg så godt jeg kan.

Jeg håper du har lært noe du kan bruke for å gjøre livet ditt litt bedre!

-RB

Anbefalt: