Taula de continguts:

Comandament universal de TV - Ardiuino, infraroig: 5 passos
Comandament universal de TV - Ardiuino, infraroig: 5 passos

Vídeo: Comandament universal de TV - Ardiuino, infraroig: 5 passos

Vídeo: Comandament universal de TV - Ardiuino, infraroig: 5 passos
Vídeo: Умный ик пульт от Яндекс. Или точная его копия за полцены. (умный дом) 2024, Desembre
Anonim
Comandament universal de TV: Ardiuino, infraroig
Comandament universal de TV: Ardiuino, infraroig

Hola! En aquest instructiu, us mostraré com construir i programar el vostre propi comandament a distància universal que funcioni amb la majoria de coses que utilitzen un comandament a distància per infraroig, i que també "escoltarà" i descodificarà un senyal d'infrarojos enviat per altres comandaments a distància.

Una mica d’antecedents d’allò que m’ha inspirat a construir aquest comandament a distància: jo, com la majoria de vosaltres, perdo els comandaments a distància constantment, i aquesta calamitat és força frustrant, així que suposo que ho deixo solucionar. He construït aquest comandament a distància i l'he incrustat discretament al marc del llit personalitzat (també sóc treballador de la fusta). No puc perdre el comandament si forma part del marc del meu llit.

Subministraments

Coses que necessiteu: -Arduino UNO o Nano: el quilometratge pot variar amb altres taules

- Tauler de pa sense soldadura (o tauler de soldadura si es vol fer més permanent)

-Jumperwires de diversos colors i longituds

-Pulsadors momentanis (5) (podeu afegir més botons, però haureu d'utilitzar pins digitals, ja que s'utilitzen tots els pins analògics excepte 1). Haureu de mirar d'assegurar-vos que utilitzeu correctament les resistències pull up, o arrossegueu les resistències i rebutgeu els polsadors)

-Resistència de 10 K ohmis (5) (si voleu més botons, en necessitareu més)

-470 ohm resistència (2)

-LED d'infrarojos

-LED vermell

-Sensor d'infrarojos (he utilitzat el número de peça VS1838B, en podríeu fer servir un altre, només heu de comprovar el pin-out)

(Opcional) Soldador, soldador, flux de soldadura.

Pas 1: construcció del circuit:

Construint el circuit
Construint el circuit

1). Sempre m'agrada començar a dissenyar els meus components, ja que això sempre condueix el disseny a la taula de treball.

-Pulsadors

-LED: el LED vermell i el LED IR estan connectats en tàndem, de manera que podeu veure què fa el LED IR.

-Sensor

2). Resistències

- Les cinc resistències de 10K que hem connectat als botons de polsadors s’anomenen resistències “pull down”. Tireu cap avall les resistències assegureu-vos que quan no es prem un botó, el pin Arduino corresponent aconsegueix 0 volts (o almenys a prop seu). Per obtenir més informació sobre les resistències de baixada (o de pujada), aquí teniu una guia en profunditat:

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

És possible que aquestes resistències no siguin del tot necessàries, però si obteniu empentes "fantasmes", és més que probable que es produeixin per un acoblament capacitiu i les resistències de baixada ho impediran.

3). Cable de circuit

4). 5V i cables de terra

Utilitzeu la imatge proporcionada com a referència. No tingueu por de canviar-lo per les vostres necessitats.

Pas 2: Codi:

#include const int RECV_PIN = 7; // Pin de lectura del sensor IR int Botó1 = A4; // Botó int més a l'esquerra2 = A3; // 2n des de l'esquerra int Botó3 = A2; // Botó int mig4 = A1; // 2n a la dreta int Botó5 = A0; // Mès a la dreta int LED = 3; // LED IR i LED vermell int val = 0; // Canvi de valor IRsend irsend; IRrecv irrecv (RECV_PIN); resultats decode_results;

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); // utilitzar lectura analògica en lloc de lectura digital per evitar problemes de capacitat captiva. també ajuda a rebutjar els botons. // El fet de tenir una lectura analògica a 900 permet una mica d’espai en els valors, és a dir, el senyal infra s’enviarà fins i tot si no s’aplica un pin complet de 5V. // però 900 és prou alt per no llegir-lo de manera errònia a causa del retard d’acoblament capacitiu (100);} // RGB Strip On & off {if (analogRead (Button5)> 900) {for (int i = 0; i <3; i ++) // canviar el valor a "i <3" canviarà el nombre de vegades que es repeteix immediatament el senyal. de manera que "i <2" repetirà el senyal dues vegades. // és possible que hàgiu de jugar amb aquest número si el vostre televisor no respon, en general, 1 o 3 funcionen més, si no, proveu els números senars. // és possible que també hàgiu de jugar amb els valors de sincronització del retard de senyal intra, per exemple, per al meu TV 10, però 30 no. {irsend.sendSony (0xa90, 12); // Codi d'alimentació de Sony TV, per al meu televisor, el codi s'ha d'enviar 3x3, de manera que es produeixen 3 polsos, tres vegades endarrerits (10); // "retard de senyal intra" per a (int i = 0; i <3; i ++) {irsend.sendSony (0xa90, 12); // "12" és el número de bits, diferents protocols requereixen diferents números de bits. NEC té 32 anys, Sony té 12 anys, podeu cercar els altres endarreriments (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); // Retard de baixada de volum de Sony TV (100);}}} retard (100);} if (irrecv.decode (& results)) // la part inferior del codi us permet interpretar els senyals infrarojos de diversos comandaments a distància. {Serial.println (results.value, HEX); // generarà el procediment "NEC, Sony, Etc.." i un codi de TV "c90, a90, FF02FD", haureu d'afegir 0x a la part frontal del commutador de codi de TV (result.decode_type) {case DENON: Serial.println ("DENON"); trencar; cas NEC: Serial.println ("NEC"); trencar; cas PANASONIC: Serial.println ("PANASONIC"); trencar; cas SONY: Serial.println ("SONY"); trencar; cas RC5: Serial.println ("RC5"); trencar; cas JVC: Serial.println ("JVC"); trencar; cas SANYO: Serial.println ("SANYO"); trencar; cas MITSUBISHI: Serial.println ("MITSUBISHI"); trencar; cas SAMSUNG: Serial.println ("SAMSUNG"); trencar; cas LG: Serial.println ("LG"); trencar; cas RC6: Serial.println ("RC6"); trencar; cas DISH: Serial.println ("DISH"); trencar; cas SHARP: Serial.println ("SHARP"); trencar; cas WHYNTER: Serial.println ("WHYNTER"); trencar; cas AIWA_RC_T501: Serial.println ("AIWA_RC_T501"); trencar; per defecte: cas desconegut: Serial.println ("desconegut"); trencar;} irrecv.resume ();}}

Pas 3: Codi en profunditat: enviament de senyals IR

Em referiré a les línies de codi pel seu número de línia; per seguir-ho, utilitzeu aquest enllaç:

pastebin.com/AQr0fBLg

En primer lloc, hem d’incloure la biblioteca remota IR per z3t0.

Aquí teniu un enllaç a la biblioteca:

github.com/z3t0/Arduino-IRremote

Si necessiteu una guia sobre com descarregar correctament una biblioteca i instal·lar-la a l'IDE:

www.arduino.cc/en/guide/libraries

La línia 1 inclou la biblioteca.

A continuació, hem de declarar algunes variables, les línies 2-12 ho fan.

Utilitzem "cost int" per definir variables que no canviaran, excepte una caiguda d'aquesta categoria.

Utilitzem "int" per definir variables que canviaran.

Hem d’utilitzar un pin amb pols amb modulació (PWM) per al nostre pin LED: qualsevol pin que tingui "~" al costat serà suficient, al meu codi, utilitzem el pin 3 digital.

A continuació, hem de fer alguna configuració: aquest codi només s’executarà una vegada que l’Arduino s’engegui o es reiniciï.

Tingueu en compte que estem definint les nostres entrades i sortides (15-20), activant el monitor sèrie (21), activant el sensor IR (22) i dient a l’Arduino que parpellegi el LED de bord sempre que rebem un senyal al sensor (23).

A continuació, crearem el nostre bucle: aquest codi s'executarà repetidament, anant de dalt a baix un grapat de vegades per segon.

A la línia 25, fem servir una sentència if, que indica a Arduino que "cerqueu aquest criteri específic, si es compleix aquest criteri, feu això". En aquest cas, el criteri és analogRead (Button1)> 900, o dit d’una altra manera: "Arduino, mira el botó1, que hem definit anteriorment com a pin A4, si el senyal analògic rebut és superior a 900, seguiu les nostres instruccions següents, en cas contrari, continueu ". Hi ha una mica per desempaquetar aquí, així que permetem endinsar-nos: un senyal analògic a l’Arduino és un valor igual o inferior a 5V, amb 5V igual a 1023 i 0V igual a 0. Qualsevol voltatge donat entre 0 i 5V es pot definir mitjançant un nombre, i amb una mica de matemàtiques, podem esbrinar aquest número, o viceversa, un voltatge. Dividiu 1024 (incloem 0 com a unitat) per 5, cosa que ens dóna 204,8. Per exemple, fem servir el número 900 per traduir-lo a voltatge, simplement dividim 900 per 204,8, donant-nos ~ 4,4V. Li estem dient a Arduino que busqui un voltatge superior a ~ 4,4 volts i, si és així, feu la nostra següent instrucció.

Parlant de les properes instruccions (línia 25), veiem irsend.sendNEC (0xFF02FD, 32). Això diu "Arduino, envieu un impuls modulat que segueixi el protocol NEC, específicament el senyal FF02FD, i assegureu-vos que tingui 32 bits de longitud". Això farà que el nostre LED IR parpellegi de la manera que altres dispositius puguin entendre. Penseu-ho una mica com el codi Morse, però només amb llum invisible. Hi ha molts protocols diferents, cadascun amb centenars, si no milers de senyals individuals, i cadascun amb el seu número de bits específic; el nostre dispositiu serà capaç de reconèixer una gran quantitat d’aquests senyals, però ens endinsarem en això més endavant.

A la línia 28, tenim el nostre primer retard: això és aquí per evitar que es repeteixin senyals involuntaris, un cop premut el botó i enviat el senyal IR, tenim 100 mil·lisegons per treure el dit del botó. no sembla gaire temps, però a la pràctica sembla que funciona bé. la funció de retard indica a Arduino que "no faci res per X milisegons" i, per referència, són 1.000 mil·lisegons en un segon.

Passant al nostre següent botó de la línia 29, el botó 5 (originalment tenia 4 botons en aquest comandament, en vaig afegir un cinquè, per això, estem fora de servei). Això, en esperit, és el mateix que el botó 1, però amb algunes diferències clau. La primera diferència que veureu és una sentència for, que és essencialment un altre bucle, un bucle amb un altre bucle més gran, loopception. Concretament tenim "for (int i = 0; i <3; i ++)", llegiu-ho com "Arduino, comencem per 0, repetiu les instruccions següents fins que arribem a 3 vegades". La funció for s'utilitza perquè molts dispositius estan programats per buscar un senyal repetit, i en el nostre cas aquí, 3 vegades. Simplement podeu canviar el número 3 per un número diferent si el dispositiu demana una programació de repetició diferent. Una altra diferència clau amb el botó 5 és que es repeteix de nou, 3 vegades o 3x3. Dit d’una altra manera, enviem el senyal 3 vegades, esperem 10 mil·lisegons, l’enviem de nou 3 vegades, esperem 10 milisegons més i l’enviem 3 cops de nou. Aquest tipus de comunicació és habitual per encendre i apagar els dispositius i pot ser el que demana el vostre televisor o dispositiu; la clau és jugar amb totes les variables fins obtenir el resultat desitjat. Canvieu el valor de retard curt, canvieu el valor de repetició, envieu 6 lots en lloc de 3, etc. Els dispositius es programen amb regles de senyal arbitràries intencionadament, imagineu-vos si el comandament a distància del televisor ha enviat el mateix tipus de senyal que la barra de so; cada vegada que canvieu el canal del televisor, la barra de so s'apaga; per això hi ha diferents regles de senyal.

Els tres botons següents es programen amb els mateixos principals, almenys en part, descrits anteriorment, de manera que podem saltar fins a la línia 55.

Pas 4: Codi en profunditat: recepció de senyals IR

Codi en profunditat: recepció de senyals IR
Codi en profunditat: recepció de senyals IR

A la línia 55, comencem a programar l'Arduino per interpretar els senyals IR enviats per altres comandaments a distància; això és necessari perquè pugueu esbrinar els protocols i els senyals que utilitzen els comandaments a distància. La primera línia de codi de la línia 55 és si (irrecv.decode (i resultats) es llegeix com "Arduino, cerqueu un codi IR, si en trobeu un, torneu un valor vertader, si no es troba res, torneu a fals. Quan sigui cert, registreu la informació en "resultats" ".

Passant a la línia 56, tenim Serial.println (results.value, HEX) que diu "Ardunio, imprimeix els resultats al monitor sèrie en format HEX". Hex, que significa hexadecimal, és una manera de reduir una cadena binària (només 0 i 1) en una cosa una mica més fàcil d’escriure. Per exemple, 101010010000 és "a90", el codi que s'utilitza per apagar i encendre el televisor i 111111110000001011111101 és 0xFF02FD, que controla la meva banda RGB. Podeu utilitzar el gràfic anterior per convertir el binari en hexadecimal i viceversa, o bé podeu utilitzar el següent enllaç:

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

Fins a la línia 57, tenim una nova funció, anomenada switch case.

Bàsicament, un cas de commutació ens permet especificar diferents instruccions en funció dels resultats d’una variable determinada (cas). el salt surt de la sentència switch i s'utilitza al final de cada sentència.

Aquí fem servir la funda del commutador per canviar la manera d’imprimir al monitor sèrie en funció dels protocols que Arduino detecta des dels diversos comandaments a distància.

Pas 5: Conclusió

Si teniu alguna pregunta, no dubteu a contactar-me aquí. Estic encantat d’intentar ajudar-vos el millor que pugui.

Espero que hagueu après alguna cosa que pugueu fer per millorar la vostra vida.

-RB

Recomanat: