Tabla de contenido:

Control remoto universal de TV - Ardiuino, infrarrojos: 5 pasos
Control remoto universal de TV - Ardiuino, infrarrojos: 5 pasos

Video: Control remoto universal de TV - Ardiuino, infrarrojos: 5 pasos

Video: Control remoto universal de TV - Ardiuino, infrarrojos: 5 pasos
Video: Control remoto universal: Controla tu TV con Arduino 2024, Noviembre
Anonim
Control remoto universal de TV - Ardiuino, infrarrojos
Control remoto universal de TV - Ardiuino, infrarrojos

¡Hola! En este instructivo, le mostraré cómo construir y programar su propio control remoto universal que funcionará con la mayoría de las cosas que utilizan un control remoto infrarrojo, y que también "escuchará" y decodificará una señal infrarroja enviada por varios otros controles remotos.

Un poco de trasfondo de lo que me inspiró a construir este control remoto: yo, como la mayoría de ustedes, pierdo mis controles remotos constantemente, y esta calamidad es bastante frustrante, ¡así que imagino que vamos a resolverlo! He construido este control remoto y lo he incrustado discretamente en el marco de mi cama hecho a medida (también soy carpintero). ¡No puedo perder el control remoto si es parte del marco de mi cama!

Suministros

Cosas que necesitará: -Arduino UNO o Nano - el kilometraje puede variar con otras tablas

- Tablero de pruebas sin soldadura (o tablero de tira soldable si desea hacerlo más permanente)

-Alambres de puente de varios colores y longitudes

-Botones pulsadores momentáneos (5) (puede agregar más botones, pero deberá usar pines digitales, ya que se usan todos menos uno de los pines analógicos; deberá asegurarse de utilizar correctamente las resistencias pull up, o baje las resistencias y elimine el rebote de los botones)

-Resistencia de 10K Ohm (5) (si desea más botones, necesitará más de estos)

Resistencia de -470 ohmios (2)

-LED de infrarrojos

-LED rojo

-Sensor de infrarrojos (utilicé el número de pieza VS1838B, podría usar otro, solo verifique el pin-out)

(Opcional) Soldador, Soldadura, Fundente de Soldadura.

Paso 1: construcción del circuito:

Construyendo el circuito
Construyendo el circuito

1). Siempre me gusta comenzar con el diseño de mis componentes, ya que esto siempre impulsa el diseño en la placa de pruebas.

-Apretar botones

-LEDS: el LED rojo y el LED IR están conectados en tándem, para que pueda ver lo que hace el LED IR.

-Sensor

2). Resistencias

- Las cinco resistencias de 10K que hemos conectado a los botones pulsadores se denominan resistencias "pull down". Tire hacia abajo de las resistencias, asegúrese de que cuando no se presiona un botón, el pin Arduino correspondiente obtiene 0 voltios (o al menos cerca de él). Para obtener más información sobre las resistencias pull down (o pull up), aquí hay una guía detallada:

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

Es posible que estas resistencias no sean completamente necesarias, pero si está recibiendo empujes "fantasma", lo más probable es que sea causado por un acoplamiento capacitivo y las resistencias de bajada lo evitan.

3). Cables de circuito

4). 5V y cables de tierra

Utilice la imagen proporcionada como referencia. ¡No tenga miedo de cambiarlo para sus necesidades!

Paso 2: Código:

#include const int RECV_PIN = 7; // Pin de lectura del sensor de infrarrojos int Button1 = A4; // Más a la izquierda int Button2 = A3; // 2do desde la izquierda int Button3 = A2; // Middle int Button4 = A1; // 2do a la derecha int Button5 = A0; // Más a la derecha int LED = 3; // LED IR y LED rojo int val = 0; // Cambio de valor IRsend irsend; IRrecv irrecv (RECV_PIN); decode_results resultados;

configuración vacía () {pinMode (Botón1, ENTRADA); pinMode (Botón2, ENTRADA); pinMode (Botón3, ENTRADA); pinMode (Botón4, ENTRADA); pinMode (Botón5, ENTRADA); pinMode (LED, SALIDA); Serial.begin (9600); irrecv.enableIRIn (); irrecv.blink13 (verdadero);} bucle vacío () {{{if (analogRead (Button1)> 900) irsend.sendNEC (0xFF02FD, 32); // uso de lectura analógica en lugar de lectura digital para evitar problemas de capacitancia cautiva. también ayuda a eliminar el rebote de los botones. // Tener una lectura analógica a 900 permite cierto margen de maniobra en los valores, lo que significa que la señal de infrarrojos se enviará incluso si no se aplican 5V completos al pin. // pero 900 es lo suficientemente alto como para no leer erróneamente debido al retardo de acoplamiento capacitivo (100);} // RGB Strip On & Off {if (analogRead (Button5)> 900) {for (int i = 0; i <3; i ++) // cambiar el valor en "i <3" cambiará el número de veces que la señal se repite inmediatamente. por lo que "i <2" repetirá la señal dos veces. // es posible que deba jugar con este número si su televisor no responde, generalmente, 1 o 3 funcionan más, si no lo hacen, pruebe con números impares. // Es posible que también deba jugar con los valores de tiempo de retardo de la señal intra, por ejemplo, para mi TV 10 funciona, pero 30 no. {irsend.sendSony (0xa90, 12); // Código de alimentación de Sony TV, para mi TV, el código debe enviarse 3x3, por lo que 3 pulsos, tres tiempos de retraso separados (10); // "retardo de señal intra" para (int i = 0; i <3; i ++) {irsend.sendSony (0xa90, 12); // "12" es el número de bit, diferentes protocolos requieren diferentes números de bit. NEC es 32, Sony tiene 12, puede buscar el retraso de los demás (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)) // la siguiente parte del código le permite interpretar las señales infrarrojas de varios controles remotos. {Serial.println (resultados.valor, HEX); // generará el procedimiento "NEC, Sony, Etc.." y un código de TV "c90, a90, FF02FD". Deberá agregar 0x al frente del interruptor de código de TV (results.decode_type) {case DENON: Serial.println ("DENON"); rotura; caso NEC: Serial.println ("NEC"); rotura; caso PANASONIC: Serial.println ("PANASONIC"); rotura; caso SONY: Serial.println ("SONY"); rotura; caso RC5: Serial.println ("RC5"); rotura; caso JVC: Serial.println ("JVC"); rotura; caso SANYO: Serial.println ("SANYO"); rotura; caso MITSUBISHI: Serial.println ("MITSUBISHI"); rotura; caso SAMSUNG: Serial.println ("SAMSUNG"); rotura; caso LG: Serial.println ("LG"); rotura; caso RC6: Serial.println ("RC6"); rotura; case DISH: Serial.println ("PLATO"); rotura; case SHARP: Serial.println ("SHARP"); rotura; case WHYNTER: Serial.println ("WHYNTER"); rotura; caso AIWA_RC_T501: Serial.println ("AIWA_RC_T501"); rotura; predeterminado: caso DESCONOCIDO: Serial.println ("DESCONOCIDO"); romper;} irrecv.resume ();}}

Paso 3: Código en profundidad: envío de señales de infrarrojos

Me referiré a las líneas de código por su número de línea; para seguir, use este enlace:

pastebin.com/AQr0fBLg

Primero, necesitamos incluir la biblioteca remota IR de z3t0.

Aquí hay un enlace a la biblioteca:

github.com/z3t0/Arduino-IRremote

Si necesita una guía sobre cómo descargar correctamente una biblioteca e instalarla en el IDE:

www.arduino.cc/en/guide/libraries

La línea 1 incluye la biblioteca.

A continuación, necesitamos declarar algunas variables, las líneas 2-12 hacen esto.

Usamos "cost int" para definir variables que no cambiarán, todas menos una caen en esta categoría.

Usamos "int" para definir variables que cambiarán.

Debemos usar un pin con pulso con modulación (PWM) para nuestro pin LED - cualquier pin que tenga "~" al lado será suficiente, en mi código - usamos el pin digital 3.

A continuación, necesitamos realizar una configuración: este código se ejecutará solo una vez cuando el Arduino se encienda o se reinicie.

Tenga en cuenta que estamos definiendo nuestras entradas y salidas (15-20), activando el monitor en serie (21), habilitando el sensor de infrarrojos (22) y diciéndole al Arduino que haga parpadear el LED integrado cada vez que recibamos una señal en el sensor (23).

A continuación, construiremos nuestro bucle: este código se ejecutará repetidamente, yendo de arriba a abajo un puñado de veces por segundo.

En la línea 25, usamos una declaración if, esto le dice al Arduino "busque este criterio específico, si ese criterio se cumple, haga esto específico". En este caso, el criterio es analogRead (Button1)> 900, o en otras palabras - "Arduino, mire button1, que definimos como pin A4 anteriormente, si la señal analógica recibida es mayor que 900, continúe con nuestras siguientes instrucciones, si no, sigue adelante ". Hay un poco que desempacar aquí, así que vamos a sumergirnos: una señal analógica en el Arduino es un valor igual o menor a 5V, con 5V igual a 1023 y 0V igual a 0. Cualquier voltaje dado entre 0 y 5V se puede definir por un número, y con un poco de matemáticas, podemos calcular ese número, o viceversa, un voltaje. Dividir 1024 (incluimos 0 como unidad) por 5, lo que nos da 204,8. Por ejemplo, usamos el número 900, para traducir eso en voltaje, simplemente dividimos 900 entre 204.8, lo que nos da ~ 4.4V. Le estamos diciendo al Arduino que busque un voltaje superior a ~ 4,4 voltios, y si es así, siga la siguiente instrucción.

Hablando de las siguientes instrucciones (línea 25), vemos irsend.sendNEC (0xFF02FD, 32). Esto dice "Arduino, envíe un pulso modulado que siga el protocolo NEC, específicamente la señal FF02FD, y asegúrese de que tenga 32 bits de longitud". Esto hará que nuestro LED IR parpadee de una manera que otros dispositivos puedan entender. Piense en ello un poco como el código Morse, ¡pero solo con luz invisible! Hay muchos protocolos diferentes, cada uno con cientos, si no miles, de señales individuales, y cada uno con su número de bit específico; nuestro dispositivo podrá reconocer una gran cantidad de estas señales, ¡pero profundizaremos en eso más adelante!

En la línea 28, tenemos nuestro primer retraso: esto es aquí para evitar señales repetidas involuntarias, una vez que se presiona el botón y se envía la señal de infrarrojos, tenemos 100 milisegundos para quitar el dedo del botón. esto no parece mucho tiempo, pero en la práctica parece funcionar bien. la función de retardo le dice al Arduino "no hacer nada durante X milisegundos" y, como referencia, son 1000 milisegundos por segundo.

Pasando a nuestro siguiente botón en la línea 29, button5 (originalmente tenía 4 botones en este control remoto, agregué un quinto, por eso estamos fuera de servicio). Esto, en esencia, es lo mismo que el botón 1, pero con algunas diferencias clave. La primera diferencia que verá es una declaración for - este es esencialmente otro bucle - un bucle con otro bucle más grande, bucleception. Específicamente tenemos "for (int i = 0; i <3; i ++)", lea esto como "Arduino, comencemos en 0, repitamos las siguientes instrucciones hasta llegar a 3 veces". La función for se usa porque muchos dispositivos están programados para buscar una señal repetida, y en nuestro caso aquí, 3 veces. Simplemente puede cambiar el número 3 a un número diferente si su dispositivo requiere un horario de repetición diferente. Otra diferencia clave con button5 es que se repite nuevamente, 3 veces o 3x3. En otras palabras, enviamos la señal 3 veces, esperamos 10 milisegundos, la enviamos nuevamente 3 veces, esperamos otros 10 milisegundos y luego la enviamos 3 veces nuevamente. Este tipo de comunicación es común para encender y apagar dispositivos y podría ser simplemente lo que su televisor o dispositivo requiere; la clave para esto es jugar con todas las variables hasta que obtenga el resultado deseado. Cambie el valor de retardo corto, cambie el valor de repetición, envíe 6 lotes en lugar de 3, etc. Los dispositivos se programan intencionalmente con reglas de señal arbitrarias, imagínese si el control remoto de su televisor envía el mismo tipo de señal que su barra de sonido; Cada vez que cambia el canal en su televisor, su barra de sonido se apaga, por eso hay diferentes reglas de señal.

Los siguientes tres botones están programados con los mismos principios, al menos en parte, descritos anteriormente, por lo que podemos saltar hasta la línea 55.

Paso 4: Código en profundidad: recepción de señales de infrarrojos

Código en profundidad: recepción de señales de infrarrojos
Código en profundidad: recepción de señales de infrarrojos

En la línea 55, comenzamos a programar el Arduino para interpretar las señales de infrarrojos enviadas por otros controles remotos; esto es necesario para que pueda descubrir los protocolos y las señales que utilizan sus controles remotos. La primera línea de código en la línea 55 es if (irrecv.decode (& results) lea esto como "Arduino, busque un código IR, si encuentra uno, devuelva un valor verdadero, si no encuentra nada, devuelva falso. Cuando sea verdadero, registre la información en "resultados" ".

Pasando a la línea 56, tenemos Serial.println (results.value, HEX) que dice "Ardunio, imprime los resultados en el monitor serial en formato HEX". Hex, que significa hexadecimal, es una forma en que podemos acortar una cadena binaria (solo 0 y 1) en algo un poco más fácil de escribir. Por ejemplo, 101010010000 es "a90", el código que se usa para apagar y encender mi televisor, y 111111110000001011111101 es 0xFF02FD, que controla mi banda RGB. Puede usar la tabla anterior para convertir binario en hexadecimal, y viceversa, o puede usar el siguiente enlace:

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

Hasta la línea 57, tenemos una nueva función, llamada caja de interruptor.

Esencialmente, un caso de cambio nos permite especificar diferentes instrucciones basadas en los resultados de una variable dada (caso). la ruptura sale de la instrucción switch y se utiliza al final de cada instrucción.

Usamos el caso del interruptor aquí para cambiar la forma en que imprimimos en el monitor en serie según los protocolos que nuestro Arduino detecta desde los distintos controles remotos.

Paso 5: Conclusión

Si tiene alguna pregunta, no dude en comunicarse conmigo aquí. Me complace intentar ayudarlo lo mejor que pueda.

¡Espero que hayas aprendido algo que puedas usar para mejorar un poco tu vida!

-RB

Recomendado: