Innehållsförteckning:

Universal TV -fjärrkontroll - Ardiuino, infraröd: 5 steg
Universal TV -fjärrkontroll - Ardiuino, infraröd: 5 steg

Video: Universal TV -fjärrkontroll - Ardiuino, infraröd: 5 steg

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

Hej! I denna instruerbara, ska jag visa dig hur du bygger och programmerar din egen universella fjärrkontroll som fungerar med det mesta som använder en infraröd fjärrkontroll, och som också "lyssnar" och avkodar en infraröd signal som skickas av olika andra fjärrkontroller.

Lite bakgrund till vad som inspirerade mig att bygga den här fjärrkontrollen - jag, som de flesta av er, tappar mina fjärrkontroller ständigt, och denna olycka är ganska frustrerande, så jag tänker att jag kan lösa det! Jag har byggt den här fjärrkontrollen och diskret inbäddat den i min specialbyggda sängram (jag är också en träarbetare) - jag kan inte tappa fjärrkontrollen om den är en del av min sängram!

Tillbehör

Saker du behöver: -Arduino UNO eller Nano - körsträcka kan variera med andra brädor

-Lödlös brödbräda (eller lödbar bandbräda om du vill göra den mer permanent)

-Tröjor i olika färger och längder

-Momentära tryckknappar (5) (du kan lägga till fler knappar, men du måste använda digitala stift, eftersom alla utom 1 av de analoga stiften används - du måste se till att du korrekt använder pull -up -motstånd, eller dra ned motstånden, och tryck ner tryckknapparna)

-10K Ohm motstånd (5) (om du vill ha fler tryckknappar behöver du fler av dessa)

-470 Ohm motstånd (2)

-Infraröd LED

-Röd LED

-Infraröd sensor (jag använde artikelnummer VS1838B, du kan använda en annan, kolla bara pin-out)

(Valfritt) Lödkolv, Löd, Lödflöde.

Steg 1: Bygga kretsen:

Bygga kretsen
Bygga kretsen

1). Jag gillar alltid att börja med att lägga ut mina komponenter, eftersom detta alltid driver layouten på brödbrädan.

-Trycka på knappar

-LEDS: den röda lysdioden och IR -lysdioden är anslutna parallellt, så att du kan se vad IR -lysdioden gör.

-Sensor

2). Motstånd

- De fem 10K -motstånden som vi har kopplat till tryckknapparna kallas "pull down" -motstånd. Dra ned motstånden se till att när en tryckknapp inte trycks in får motsvarande Arduino -stift 0 volt (eller åtminstone nära den). För mer information om pull down (eller pull up) motstånd här är en djupgående guide:

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

Dessa motstånd är kanske inte helt nödvändiga, men om du får "spök" -tryck orsakas det mer än troligt av kapacitiv koppling och neddragningsmotstånd förhindrar detta.

3). Kretsledningar

4). 5V och jordledningar

Använd bilden som referens! var inte rädd för att ändra det för dina behov!

Steg 2: Kod:

#include const int RECV_PIN = 7; // IR -sensor läs stift int Knapp1 = A4; // Längst längst vänster int Knapp2 = A3; // 2: a från vänster int Knapp3 = A2; // Mitt int -knapp4 = A1; // 2: a till höger int Knapp5 = A0; // Längst till höger int LED = 3; // IR LED & Röd LED int val = 0; // Ändra värde IRsend irsend; IRrecv irrecv (RECV_PIN); resultat avkodningsresultat;

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); // använder analog läsning i stället för digital läsning för att undvika problem med kapacitans. hjälper också till att avbryta knapparna. // Med analog läsning på 900 möjliggör viss vridning i värdena, vilket betyder att infrasignalen kommer att skickas även om en fullständig 5V inte appliceras på stiftet. // men 900 är tillräckligt hög för att inte läsa felaktigt på grund av kapacitiv kopplingsfördröjning (100);} // RGB Strip On & off {if (analogRead (Button5)> 900) {for (int i = 0; i <3; i ++) // Om du ändrar värdet i "i <3" ändras antalet gånger signalen upprepas omedelbart. så "i <2" kommer att upprepa signalen två gånger. // du kan behöva leka med det här numret om din TV inte svarar, vanligtvis fungerar 1 eller 3 mest, om de inte gör det, prova udda tal. // du kan också behöva spela med värdena för fördröjning av intrasignaler, till exempel för min TV 10 fungerar, men 30 gör det inte. {irsend.sendSony (0xa90, 12); // Sony TV -strömkod, för min TV måste koden skickas 3x3, så 3 pulser, tre separata gånger fördröjning (10); // "intra signal delay" för (int i = 0; i <3; i ++) {irsend.sendSony (0xa90, 12); // "12" är bitnumret, olika protokoll kräver olika bitnummer. NEC är 32, Sony är 12, du kan slå upp de andra fördröjningen (10); för (int i = 0; i 900) {för (int i = 0; i 900) {för (int i = 0; i 900) {för (int i = 0; i <3; i ++) {irsend.sendSony (0xc90, 12); // Sony TV -ström Volym nedfördröjning (100);}}} fördröjning (100);} om (irrecv.decode (& resultat)) // nedanstående del av koden gör att du kan tolka infraröda signaler från olika fjärrkontroller. {Serial.println (results.value, HEX); // det kommer att generera proceduren "NEC, Sony, Etc.." och en TV -kod "c90, a90, FF02FD" du måste lägga till 0x på framsidan av TV -kodbrytaren (results.decode_type) {case DENON: Serial.println ("DENON"); ha sönder; fall NEC: Serial.println ("NEC"); ha sönder; fall PANASONIC: Serial.println ("PANASONIC"); ha sönder; case SONY: Serial.println ("SONY"); ha sönder; fall RC5: Serial.println ("RC5"); ha sönder; fall JVC: Serial.println ("JVC"); ha sönder; fall SANYO: Serial.println ("SANYO"); ha sönder; fall MITSUBISHI: Serial.println ("MITSUBISHI"); ha sönder; fall SAMSUNG: Serial.println ("SAMSUNG"); ha sönder; fodral LG: Serial.println ("LG"); ha sönder; fall RC6: Serial.println ("RC6"); ha sönder; skålen SKÅL: Serial.println ("SKÅL"); ha sönder; fall SHARP: Serial.println ("SHARP"); ha sönder; fall WHYNTER: Serial.println ("WHYNTER"); ha sönder; fall AIWA_RC_T501: Serial.println ("AIWA_RC_T501"); ha sönder; standard: fall okänt: Serial.println ("Okänt"); break;} irrecv.resume ();}}

Steg 3: Kod i djupet: Skicka IR -signaler

Jag kommer att hänvisa till kodrader efter deras radnummer - för att följa med, använd den här länken:

pastebin.com/AQr0fBLg

Först måste vi inkludera IR Remote Library med z3t0.

Här är en länk till biblioteket:

github.com/z3t0/Arduino-IRremote

Om du behöver en guide om hur du laddar ner ett bibliotek korrekt och installerar det i IDE:

www.arduino.cc/en/guide/libraries

Rad 1 inkluderar biblioteket.

Därefter måste vi deklarera några variabler, rad 2-12 gör detta.

Vi använder "cost int" för att definiera variabler som inte kommer att förändras, alla utom en faller i denna kategori.

Vi använder "int" för att definiera variabler som kommer att förändras.

Vi måste använda en stift med puls med modulering (PWM) för vår LED -stift - alla stift som har "~" bredvid det kommer att räcka, i min kod - vi använder digital stift 3.

Därefter måste vi göra lite inställningar - den här koden körs bara en gång när Arduino startas eller återställs.

Lägg märke till att vi definierar våra ingångar och utgångar (15-20), startar seriell bildskärm (21), aktiverar IR-sensorn (22) och säger åt Arduino att blinka den inbyggda lysdioden närhelst vi får en signal i sensorn (23).

Därefter kommer vi att bygga ut vår slinga - den här koden körs upprepade gånger, går uppifrån och ner en handfull gånger i sekunden.

På rad 25 använder vi ett if -uttalande, detta berättar för Arduino "leta efter dessa specifika kriterier, om dessa kriterier är uppfyllda, gör den här specifika saken". I det här fallet är kriterierna analogRead (Knapp1)> 900, eller med andra ord - "Arduino, titta på knapp1, som vi definierade som stift A4 tidigare, om den analoga signalen som tas emot är större än 900, fortsätt till våra nästa instruktioner, om inte, gå vidare ". Det finns lite att packa upp här, så låt oss dyka in: en analog signal på Arduino är ett värde som är lika med eller mindre än 5V, med 5V lika med 1023 och 0V lika med 0. Varje given spänning mellan 0 och 5V kan definieras med ett tal, och med lite matematik kan vi räkna ut det talet, eller vice versa, en spänning. Dela 1024 (vi inkluderar 0 som enhet) med 5, vilket ger oss 204,8. Till exempel använder vi talet 900, för att översätta det till spänning delar vi helt enkelt 900 med 204,8, vilket ger oss ~ 4,4V. Vi säger åt Arduino att leta efter en spänning som är större än ~ 4,4 volt, och om det är det, gör vår nästa instruktion.

På tal om nästa instruktion (rad 25) ser vi irsend.sendNEC (0xFF02FD, 32). Detta säger "Arduino, skicka en modulerad puls som följer NEC -protokollet, specifikt FF02FD -signalen, och se till att den är 32 bitar lång". Detta kommer att få vår IR -LED att flimra på sätt som andra enheter kan förstå. Tänk på det lite som Morse Code, men bara med osynligt ljus! Det finns många olika protokoll där ute, var och en med hundratals om inte tusentals individuella signaler, och var och en med sitt specifika bitnummer - vår enhet kommer att kunna känna igen en stor mängd av dessa signaler, men vi kommer att dyka in i det senare!

På rad 28 har vi vår första fördröjning - detta är här för att förhindra oavsiktliga upprepningssignaler, när knappen trycks in och IR -signalen skickas har vi 100 millisekunder för att få bort fingret från knappen. det låter inte som mycket tid, men i praktiken verkar det fungera bra. fördröjningsfunktionen berättar för Arduino "gör ingenting för X millisekunder" och som referens är de 1000 millisekunder på en sekund.

Gå vidare till vår nästa knapp på rad 29, knapp 5 (jag hade ursprungligen 4 knappar på den här fjärrkontrollen, lade till en femte, så det är därför vi är ur funktion). Detta är i anda samma sak som knapp 1, men med några viktiga skillnader. Den första skillnaden du ser är en for statement - detta är i huvudsak en annan loop - en loop med en annan större loop, loopception. Specifikt har vi "för (int i = 0; i <3; i ++)", läs detta som "Arduino, låt oss börja med 0, upprepa följande instruktioner tills vi når 3 gånger". Funktionen för används eftersom många enheter är programmerade för att leta efter en upprepad signal, och i vårt fall här, 3 gånger. Du kan helt enkelt ändra nummer 3 till ett annat nummer om din enhet kräver ett annat upprepningsschema. En annan viktig skillnad med knapp 5 är att den upprepas igen, 3 gånger eller 3x3. Med andra ord skickar vi signalen 3 gånger, väntar 10 millisekunder, skickar den igen 3 gånger, väntar ytterligare 10 millisekunder och skickar den sedan 3 gånger igen. Denna typ av kommunikation är vanlig för att slå på och stänga av enheter och kan bara vara vad din TV eller enhet kräver - nyckeln till detta är att leka med alla variabler tills du får önskat resultat. Ändra det korta fördröjningsvärdet, ändra värdet för upprepning, skicka 6 satser istället för 3, etc. Enheter är avsiktligt programmerade med godtyckliga signalregler, tänk om din TV -fjärrkontroll skickade samma typsignal som din soundbar; varje gång du bytte kanal på din TV stängdes din soundbar av - det är därför det finns olika signalregler.

De tre nästa knapparna är programmerade med samma principer, åtminstone delvis, beskrivna ovan - så att vi kan hoppa ända ner till rad 55.

Steg 4: Kod i djupet: Ta emot IR -signaler

Kod i djupet: Ta emot IR -signaler
Kod i djupet: Ta emot IR -signaler

På rad 55 börjar vi programmera Arduino för att tolka IR -signaler som skickas av andra fjärrkontroller - detta är nödvändigt så att du kan räkna ut de protokoll och signaler som dina fjärrkontroller använder. Den första kodraden på rad 55 är om (irrecv.decode (& resultat) läser detta som "Arduino, leta efter en IR -kod, om du hittar en, returnera ett sant värde, om ingenting hittas, returnera false. När det är sant, spela in informationen till "resultat" ".

Vidare till rad 56 har vi Serial.println (results.value, HEX) där det står "Ardunio, skriv ut resultaten i seriell bildskärm i ett HEX -format". Hex, som betyder hexadecimal, är ett sätt att förkorta en binär sträng (bara 0: or och 1: or) till något som är lite lättare att skriva. Till exempel är 101010010000 "a90", koden som används för att slå av och på min TV och 111111110000001011111101 är 0xFF02FD, som styr min RGB -remsa. Du kan använda diagrammet ovan för att konvertera binärt till hex, och vice versa, eller så kan du använda följande länk:

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

Ned till rad 57 har vi en ny funktion, kallad ett switch case.

I huvudsak tillåter ett switchfall oss att specificera olika instruktioner baserat på resultaten av en given variabel (case). pausen lämnar switch -satsen och används i slutet av varje sats.

Vi använder switchväskan här för att ändra hur vi skriver ut i den seriella bildskärmen baserat på de protokoll som vår Arduino känner av från de olika fjärrkontrollerna.

Steg 5: Slutsats

Om du har en fråga - hör av dig till mig här! Jag är glad att försöka hjälpa dig så gott jag kan.

Jag hoppas att du har lärt dig något som du kan använda för att göra ditt liv lite bättre!

-RB

Rekommenderad: