Indholdsfortegnelse:

Universal TV -fjernbetjening - Ardiuino, infrarød: 5 trin
Universal TV -fjernbetjening - Ardiuino, infrarød: 5 trin

Video: Universal TV -fjernbetjening - Ardiuino, infrarød: 5 trin

Video: Universal TV -fjernbetjening - Ardiuino, infrarød: 5 trin
Video: How to use Arduino as TV Remote Controller with Infrared 2024, November
Anonim
Universal TV -fjernbetjening - Ardiuino, infrarød
Universal TV -fjernbetjening - Ardiuino, infrarød

Hej! I denne instruktive vil jeg vise dig, hvordan du bygger og programmerer din egen universelle fjernbetjening, der fungerer med de fleste ting, der bruger en infrarød fjernbetjening, og som også vil "lytte" og afkode et infrarødt signal sendt af forskellige andre fjernbetjeninger.

Lidt baggrund for, hvad der inspirerede mig til at bygge denne fjernbetjening - jeg, ligesom de fleste af jer, mister konstant mine fjernbetjeninger, og denne katastrofe er ret frustrerende, så jeg regner med at løse det! Jeg har bygget denne fjernbetjening og diskret integreret den i min specialbyggede sengestel (jeg er også træarbejder) - jeg kan ikke miste fjernbetjeningen, hvis den er en del af min sengestel!

Forbrugsvarer

Ting du skal bruge: -Arduino UNO eller Nano - kilometertal kan variere med andre brædder

-Lodløst brødbræt (eller loddet stripboard, hvis du gerne vil gøre det mere permanent)

-Jumperwires i forskellige farver og længder

-Momentale trykknapper (5) (du kan tilføje flere knapper, men du skal bruge digitale ben, da alle undtagen 1 af de analoge ben bruges - du skal undersøge, om du skal bruge pull up -modstande korrekt eller træk modstande ned, og afbryd trykknapperne)

-10K Ohm modstand (5) (hvis du vil have flere trykknapper, skal du bruge flere af disse)

-470 Ohm modstand (2)

-Infrarød LED

-Rød LED

-Infrarød sensor (jeg brugte varenummer VS1838B, du kunne bruge en anden, bare tjek pin-out)

(Valgfrit) Loddejern, Lodde, Loddeflux.

Trin 1: Opbygning af kredsløbet:

Bygger kredsløbet
Bygger kredsløbet

1). Jeg kan altid lide at starte med at lægge mine komponenter ud, da dette altid driver layoutet på brødbrættet.

-Trykknapper

-LEDS: den røde LED og IR LED er forbundet sammen, så du kan se, hvad IR LED gør.

-Sensor

2). Modstande

- De fem 10K modstande, vi har knyttet til trykknapperne, kaldes "pull down" modstande. Træk ned modstande sørg for, at når der ikke trykkes på en trykknap, får den tilsvarende Arduino pin 0 Volt (eller i det mindste tæt på den). For mere information om pull down (eller pull up) modstande her er en dybdegående guide:

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

Disse modstande er muligvis ikke helt nødvendige, men hvis du får "spøgelse" -skub, skyldes det mere end sandsynligt kapacitiv kobling og nedtrækningsmodstande, der forhindrer dette.

3). Kredsløb

4). 5V og jordledninger

Brug det medfølgende billede til reference! vær dog ikke bange for at ændre det til dine behov!

Trin 2: Kode:

#include const int RECV_PIN = 7; // IR sensor læs pin int Knap1 = A4; // længst til venstre int knap2 = A3; // 2. fra venstre int Knap3 = A2; // Mellem int knap4 = A1; // 2. til højre int Knap5 = A0; // Længst til højre int LED = 3; // IR LED & Rød LED int val = 0; // Ændring af værdi IRsend irsend; IRrecv irrecv (RECV_PIN); decode_results resultater;

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 hjælp af analog læsning i stedet for digital læsning for at undgå problemer med kapacitans. hjælper også med at afbryde knapperne. // Ved at have analog aflæsning på 900 giver mulighed for lidt vrimlerum i værdierne, hvilket betyder, at infrasignalet sendes, selvom der ikke anvendes en fuld 5V på stiften. // men 900 er høj nok til ikke at læse fejlagtigt på grund af kapacitiv koblingsforsinkelse (100);} // RGB Strip Til og fra {if (analogRead (Button5)> 900) {for (int i = 0; i <3; i ++) // ændring af værdien i "i <3" ændrer antallet af gange, signalet gentages med det samme. så "i <2" gentager signalet to gange. // du skal muligvis lege med dette nummer, hvis dit tv ikke reagerer, generelt fungerer 1 eller 3 mest, hvis de ikke gør det, kan du prøve ulige tal. // du har muligvis også brug for at lege med værdierne for intra -forsinkelsestimering, f.eks. for mine TV 10 -værker, men 30 gør det ikke. {irsend.sendSony (0xa90, 12); // Sony TV strømkode, til mit tv skal kode sendes 3x3, så 3 pulser, tre separate gange forsinkelse (10); // "intra signal delay" for (int i = 0; i <3; i ++) {irsend.sendSony (0xa90, 12); // "12" er bitnummeret, forskellige protokoller kræver forskellige bitnumre. NEC er 32, Sony er 12, kan du slå op på de andre forsinkelse (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 Volumen ned forsinkelse (100);}}} forsinkelse (100);} hvis (irrecv.decode (& resultater)) // nedenstående del af koden giver dig mulighed for at fortolke infrarøde signaler fra forskellige fjernbetjeninger. {Serial.println (results.value, HEX); // det genererer proceduren "NEC, Sony, Etc.." og en tv -kode "c90, a90, FF02FD" du skal tilføje 0x foran på tv -kodeomskifteren (results.decode_type) {case DENON: Serial.println ("DENON"); pause; sag NEC: Serial.println ("NEC"); pause; sag PANASONIC: Serial.println ("PANASONIC"); pause; sag SONY: Serial.println ("SONY"); pause; sag RC5: Serial.println ("RC5"); pause; sag JVC: Serial.println ("JVC"); pause; sag SANYO: Serial.println ("SANYO"); pause; sag MITSUBISHI: Serial.println ("MITSUBISHI"); pause; sag SAMSUNG: Serial.println ("SAMSUNG"); pause; sag LG: Serial.println ("LG"); pause; sag RC6: Serial.println ("RC6"); pause; kasse OPFAT: Serial.println ("FAT"); pause; case SHARP: Serial.println ("SHARP"); pause; case WHYNTER: Serial.println ("WHYNTER"); pause; sag AIWA_RC_T501: Serial.println ("AIWA_RC_T501"); pause; standard: sag UKendt: Serial.println ("UKendt"); pause;} irrecv.resume ();}}

Trin 3: Kode i dybden: Afsendelse af IR -signaler

Jeg refererer til kodelinjer efter deres linjenummer - brug dette link for at følge med:

pastebin.com/AQr0fBLg

Først skal vi inkludere IR Remote Library med z3t0.

Her er et link til biblioteket:

github.com/z3t0/Arduino-IRremote

Hvis du har brug for en guide til, hvordan du korrekt downloader et bibliotek og installerer det i IDE:

www.arduino.cc/en/guide/libraries

Linje 1 inkluderer biblioteket.

Dernæst skal vi deklarere et par variabler, linje 2-12 gør dette.

Vi bruger "cost int" til at definere variabler, der ikke ændres, alle undtagen ét falder i denne kategori.

Vi bruger "int" til at definere variabler, der vil ændre sig.

Vi skal bruge en pin med puls med modulering (PWM) til vores LED -pin - enhver pin, der har "~" ved siden af, vil være tilstrækkelig i min kode - vi bruger digital pin 3.

Dernæst skal vi lave noget opsætning - denne kode kører kun én gang, når Arduino tændes eller nulstilles.

Bemærk, at vi definerer vores input og output (15-20), fyrer den serielle skærm (21) op, aktiverer IR-sensoren (22) og fortæller Arduino at blinke den indbyggede LED, når vi får et signal i sensoren (23).

Dernæst vil vi bygge vores loop op - denne kode kører gentagne gange og går fra toppen til bunden en håndfuld gange i sekundet.

På linje 25 bruger vi en if -sætning, dette fortæller Arduinoen "se efter disse specifikke kriterier, hvis kriterierne er opfyldt, gør denne specifikke ting". I dette tilfælde er kriterierne analogRead (knap1)> 900 eller med andre ord - "Arduino, se på knap1, som vi definerede som pin A4 tidligere, hvis det analoge signal, der modtages, er større end 900, skal du fortsætte til vores næste instruktion, hvis ikke, fortsæt venligst ". Der er lidt at pakke ud her, så lad os dykke ned: et analogt signal på Arduino er en værdi, der er lig med eller mindre end 5V, hvor 5V er lig med 1023, og 0V er lig med 0. En given given spænding mellem 0 og 5V kan defineres med et tal, og med lidt matematik kan vi finde ud af det tal, eller omvendt, en spænding. Divider 1024 (vi inkluderer 0 som en enhed) med 5, hvilket giver os 204,8. For eksempel bruger vi tallet 900, for at oversætte det til spænding, dividerer vi simpelthen 900 med 204,8, hvilket giver os ~ 4,4V. Vi fortæller Arduino at lede efter en spænding større end ~ 4,4 volt, og hvis det er det, skal du gøre vores næste instruktion.

Apropos næste instruktion (linje 25) ser vi irsend.sendNEC (0xFF02FD, 32). Dette siger "Arduino, send en moduleret puls, der følger NEC -protokollen, specifikt FF02FD -signalet, og sørg for, at den er 32 bit lang". Dette får vores IR LED til at flimre på en måde, som andre enheder kan forstå. Tænk på det lidt som Morse Code, men bare med usynligt lys! Der er mange forskellige protokoller derude, hver med hundredvis, hvis ikke tusinder af individuelle signaler, og hver med deres specifikke bitnummer - vores enhed vil være i stand til at genkende en stor mængde af disse signaler, men vi vil dykke ned i det senere!

På linje 28 har vi vores første forsinkelse - dette er her for at forhindre utilsigtede gentagelsessignaler, når først knappen er trykket og IR -signalet er sendt, har vi 100 millisekunder til at få fingeren væk fra knappen. det lyder ikke af meget tid, men i praksis ser det ud til at fungere fint. forsinkelsesfunktionen fortæller Arduinoen "gør ingenting for X millisekunder" og som reference er de 1000 millisekunder på et sekund.

Gå videre til vores næste knap på linje 29, knap5 (jeg havde oprindeligt 4 knapper på denne fjernbetjening, tilføjede en femte, så derfor er vi ude af drift). Dette er i ånden det samme som knap 1, men med et par vigtige forskelle. Den første forskel, du vil se, er en for statement - dette er i det væsentlige en anden loop - en loop med en anden større loop, loopception. Specifikt har vi "for (int i = 0; i <3; i ++)", læs dette som "Arduino, lad os starte med 0, gentag følgende instruktioner, indtil vi når til 3 gange". Funktionen for bruges, fordi mange enheder er programmeret til at lede efter et gentaget signal, og i vores tilfælde her, 3 gange. Du kan ganske enkelt ændre nummer 3 til et andet nummer, hvis din enhed kræver en anden gentagelsesplan. En anden vigtig forskel med knap5 er, at den gentages igen, 3 gange eller 3x3. Med andre ord sender vi signalet 3 gange, venter 10 millisekunder, sender det igen 3 gange, venter yderligere 10 millisekunder og sender det derefter 3 gange igen. Denne form for kommunikation er almindelig for at tænde og slukke for enheder og kan bare være det, dit tv eller din enhed kræver - nøglen til dette er at lege med alle variablerne, indtil du får det ønskede resultat. Skift værdien for kort forsinkelse, ændr værdien for gentagelse, send 6 partier i stedet for 3 osv. Enheder er bevidst programmeret med vilkårlige signalregler, forestil dig, om din fjernsyns fjernbetjening sendte det samme typesignal som din soundbar; hver gang du skiftede kanal på dit tv, lukkede din soundbar - derfor er der forskellige signalregler.

De næste tre knapper er programmeret med de samme principper, i det mindste delvist, beskrevet ovenfor - så vi kan springe helt ned til linje 55.

Trin 4: Kode i dybden: Modtagelse af IR -signaler

Kode i dybden: Modtagelse af IR -signaler
Kode i dybden: Modtagelse af IR -signaler

På linje 55 begynder vi at programmere Arduino til at fortolke IR -signaler sendt af andre fjernbetjeninger - dette er nødvendigt, så du kan finde ud af de protokoller og signaler, som dine fjernbetjeninger bruger. Den første kodelinje på linje 55 er, hvis (irrecv.decode (& resultater) læser dette som "Arduino, kig efter en IR -kode, hvis du finder en, skal du returnere en sand værdi, hvis intet findes, returnere falsk. Når det er sandt, optag oplysningerne i "resultater" ".

Ved at gå videre til linje 56 har vi Serial.println (results.value, HEX) der siger "Ardunio, udskriv resultaterne i den serielle skærm i et HEX -format". Hex, der betyder hexadecimal, er en måde, hvorpå vi kan forkorte en binær streng (bare 0'er og 1'er) til noget, der er lidt lettere at skrive. For eksempel er 101010010000 "a90", koden, der bruges til at slukke og tænde mit tv, og 111111110000001011111101 er 0xFF02FD, som styrer min RGB -strip. Du kan bruge ovenstående diagram til at konvertere binær til hex og omvendt, eller du kan bruge følgende link:

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

Ned til linje 57 har vi en ny funktion, kaldet en switch case.

I hovedsagen giver en switch case os mulighed for at specificere forskellige instruktioner baseret på resultaterne af en given variabel (case). pausen forlader switch -sætningen og bruges i slutningen af hver sætning.

Vi bruger switch -kassen her til at ændre, hvordan vi udskriver i den serielle skærm baseret på de protokoller, vores Arduino sanser fra de forskellige fjernbetjeninger.

Trin 5: Konklusion

Hvis du har et spørgsmål - er du velkommen til at kontakte mig her! Jeg er glad for at prøve at hjælpe dig bedst muligt.

Jeg håber, at du har lært noget, som du kan bruge til at gøre dit liv lidt bedre!

-RB

Anbefalede: