Decodificación de controles remotos blancos o negros con Arduino
En este tutorial, aprenderemos cómo decodificar las teclas de los controles remotos infrarrojos en blanco y negro utilizando un Arduino y un receptor IR. Al final de este proyecto, podrás determinar qué tecla se ha pulsado en el control remoto y mostrar esa información en el monitor serie. Esto puede ser útil para controlar dispositivos con cualquier control remoto que tengas, como televisores u otros electrodomésticos (en el video a las 01:00).
Usaremos una configuración simple que incluye un Arduino, un módulo receptor de infrarrojos y el código necesario para decodificar las señales. El receptor de infrarrojos capturará las señales del control remoto, y el Arduino interpretará esas señales para determinar qué botón ha sido presionado. Este proyecto es sencillo y se puede adaptar para varios controles remotos.
Hardware Explicado
Los componentes principales de este proyecto incluyen la placa Arduino y un módulo receptor IR, que típicamente se designa como VS1838B. El Arduino servirá como el controlador principal, ejecutando el código que procesa las señales recibidas del control remoto. El receptor IR captura las señales infrarrojas emitidas por el control remoto y las convierte en un formato que el Arduino puede entender.
El VS1838B funciona en un rango de voltaje de 2.7V a 5.5V, lo que lo hace compatible con la mayoría de las placas Arduino. Puede detectar señales a una distancia de 10 a 15 metros, dependiendo de las condiciones. El receptor infrarrojo emite una señal digital que indica qué botón del control remoto ha sido presionado, permitiendo que el Arduino responda en consecuencia.
Detalles de la hoja de datos
| Fabricante | VS1838B |
|---|---|
| Número de parte | VS1838B |
| Voltaje de lógica/entrada-salida | 2.7-5.5 V |
| Tensión de alimentación | 5 V |
| Corriente de salida (por canal) | 1.5 mA |
| Distancia de recepción | 10-15 m |
| Frecuencia de entrada | 38 kHz |
| Corriente de reposo | 0.8 mA (típ.) |
| Ángulo de operación | 70 grados |
| Paquete | TO-220 |
- Asegúrese de suministrar el voltaje adecuado para evitar dañar el receptor IR.
- Mantenga el módulo receptor alejado de la luz solar directa o de fuentes fuertes de infrarrojos.
- Utiliza resistencias de pull-up si es necesario para estabilizar las lecturas de la señal.
- Las conexiones del cableado deben ser seguras para evitar señales intermitentes.
- Prueba diferentes controles remotos para ver qué tan bien funcionan con la configuración.
-
Deconding-IR-remote-main-1
Instrucciones de Cableado
Para conectar el receptor IR al Arduino, primero conecta el pin VCC del receptor IR al pin de 5V del Arduino. A continuación, conecta el pin GND del receptor a uno de los pines GND del Arduino. Finalmente, conecta el pin de señal (a menudo etiquetado como SIG o OUT) del receptor IR al pin digital 11 del Arduino.
Asegúrate de que las conexiones estén seguras, ya que las conexiones sueltas pueden llevar a lecturas inconsistentes. Si estás utilizando una versión PCB del receptor IR o un módulo desnudo, el cableado permanece igual; solo asegúrate de identificar los pines correctamente según la etiqueta del módulo (en el video a las 03:15).
Instalar la biblioteca IRremote
Iniciar el IDE de Arduino.Arduino.ccpara obtenerlo gratis) Haz clic en el ícono de la biblioteca a la izquierda y buscaIRremotey haz clic en "Instalar" para instalarlo.
#include <IRremote.h>Ejemplos de código y guía paso a paso
int RECV_PIN = 11;
const char type ='W'; // W for white, B for black
const boolean PCB = 0; // 1 for PCB, 0 for bare module
IRrecv irrecv(RECV_PIN);En este extracto, definimos el número de pin para el receptor IR conRECV_PINajustado a 11. También especificamos el tipo de control remoto que se está utilizando con eltypevariable, donde 'W' indica un control remoto blanco y 'B' indica un control remoto negro. ElPCBla variable distingue entre usar una versión de PCB del receptor o un módulo desnudo.
void setup() {
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver
}En elsetup()en la función, inicializamos la comunicación serie a 9600 baudios y comenzamos el receptor IR. Esto es crucial para monitorear la salida en el monitor serie, lo que nos permite ver qué tecla ha sido presionada.
void loop() {
if (irrecv.decode(&results)) {
robojaxValidateCode(results.value); // Validate the received code
irrecv.resume(); // Receive the next value
}
delay(100);
}El principalloop()verifica si el receptor IR ha decodificado una señal. Si lo ha hecho, llama alrobojaxValidateCodefunción para procesar el valor recibido y luego reanuda la escucha del siguiente señal. Eldelay(100)asegura que el bucle no se ejecute demasiado rápido, lo que puede ayudar con el procesamiento de señales.
Demostración / Qué Esperar
Una vez que todo esté configurado y el código esté subido, abre el monitor serial para ver la salida. Cuando presiones una tecla en el control remoto, deberías ver el nombre de la tecla correspondiente mostrado en el monitor. Si la tecla no es reconocida, mostrará "Tecla desconocida." Asegúrate de presionar las teclas firmemente, ya que las conexiones flojas pueden causar lecturas erróneas (en el video a las 05:40).
Si presionas una tecla continuamente, la salida puede mostrar valores repetidos o códigos hexadecimales. Este comportamiento es normal, y puedes modificar el código para filtrar estos señales continuas si lo deseas. Además, puedes ajustar el código para realizar acciones basadas en presiones de teclas específicas, como encender luces o controlar otros dispositivos.
Tiempos de video
- 00:00 Comenzar
- 00:56 Se Explica el Hardware
- 04:26 Explicación del cableado
- 05:20 Se explica el código
- 12:27 Demostración de decodificación de código
/*
* Original code and library from - http://arcfn.com
*
* This code decodes keys of Black IR remote and White IR remote
* sold on eBay for Arduino.
* You have to select the type of your remote as Black or White in the code below
* and also select your receiver 1838 either as PCB or bare module. See video for details
*
* Modified/Written by Ahmad Shamshiri
* on July 28, 2018 at 22:48 in Ajax, Ontario, Canada
* for Robojax.com
* Watch video instruction for this code:https://youtu.be/muAkBQb24NI
* Get other Arduino codes from Robojax.com
*
*/
#include <IRremote.h>
int RECV_PIN = 11;
const char type ='W';// W for white, B for black. Must keep single quotes like 'B' or 'W'
const boolean PCB = 0;// if receiver is PCB set to 1, if not set to 0. See video for details
IRrecv irrecv(RECV_PIN);
// this is array holding codes for White Remote when used with PCB version of receiver
unsigned int whiteRemotePCB[] ={
0xE318261B, // CH-
0x511DBB, // CH
0xEE886D7F, // CH+
0x52A3D41F, // |<<
0xD7E84B1B, // >>|
0x20FE4DBB, // >||
0xF076C13B, // -
0xA3C8EDDB, // +
0x12CEA6E6, // EQ
0xC101E57B, // 0
0x97483BFB, // 100+
0xF0C41643, // 200+
0x9716BE3F, // 1
0x3D9AE3F7, // 2
0x6182021B, // 3
0x8C22657B, // 4
0x488F3CBB, // 5
0x449E79F, // 6
0x32C6FDF7, // 7
0x1BC0157B, // 8
0x3EC3FC1B // 9
};
// this is array holding codes for White Remote when used with non-PCB version of receiver
unsigned int whiteRemote[] ={
0xFFA25D, // CH-
0xFF629D, // CH
0xFFE21D, // CH+
0xFF22DD, // |<<
0xFF02FD, // >>|
0xFFC23D, // >||
0xFFE01F, // -
0xFFA857, // +
0xFF906F, // EQ
0xFF6897, // 0
0xFF9867, // 100+
0xFFB04F, // 200+
0xFF30CF, // 1
0xFF18E7, // 2
0xFF7A85, // 3
0xFF10EF, // 4
0xFF38C7, // 5
0xFF5AA5, // 6
0xFF42BD, // 7
0xFF4AB5, // 8
0xFF52AD // 9
};
// key labels of white remote
String whiteRemoteKey[] ={
"CH-",
"CH",
"CH+",
"|<<",
">>|",
">||",
"-",
"+",
"EQ",
"0",
"100+",
"200+",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9"
};
// this is array holding codes for Black Remote when used with non-PCB version of receiver
unsigned int blackRemote[] ={
0xFF629D, // ^
0xFF22DD, // <
0xFF02FD, // OK
0xFFC23D, // >
0xFFA857, // v
0xFF6897, // 1
0xFF9867, // 2
0xF0C41643, // 3
0xFF30CF, // 4
0xFF18E7, // 5
0xFF7A85, // 6
0xFF10EF, // 7
0xFF38C7, // 8
0xFF5AA5, // 9
0xFF42BD, // *
0xFF4AB5, // 0
0xFF52AD // #
};
// this is array holding codes for Black Remote when used with PCB version of receiver
unsigned int blackRemotePCB[] ={
0x511DBB, // ^
0x52A3D41F, // <
0xD7E84B1B, // OK
0x20FE4DBB, // >
0xA3C8EDDB, // v
0xC101E57B, // 1
0x97483BFB, // 2
0xF0C41643, // 3
0x9716BE3F, // 4
0x3D9AE3F7, // 5
0x6182021B, // 6
0x8C22657B, // 7
0x488F3CBB, // 8
0x449E79F, // 9
0x32C6FDF7, // *
0x1BC0157B, // 0
0x3EC3FC1B // #
};
// Black remote key names
String blackRemoteKey[] ={
"^",
"<",
"OK",
">",
"v",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"*",
"0",
"#"
};
decode_results results;
void setup()
{
Serial.begin(9600);
// In case the interrupt driver crashes on setup, give a clue
// to the user what's going on.
Serial.println("Robojax Remote Decoder");
irrecv.enableIRIn(); // Start the receiver
}
void loop() {
if (irrecv.decode(&results)) {
//Serial.println(results.value, HEX);
robojaxValidateCode(results.value);// used the "robojaxValidateCode" below
irrecv.resume(); // Receive the next value
}
delay(100);
}
/*
* function: robojaxValidateCode
* validates the remote code and prints correct key name
* cd is code passed from the loop
* Written by A. S. for Robojax
*/
void robojaxValidateCode(int cd)
{
// Robojax IR Remote decoder
int found=0;
if(type =='W' && !PCB)
{
// Robojax IR White Remote decoder
// if type is set to 'W' (white remote) and PCB=0 then check Black remote code
for(int i=0; i< sizeof(whiteRemote)/sizeof(int); i++)
{
if(whiteRemote[i] ==cd)
{
Serial.print("Key pressed:");
Serial.println(whiteRemoteKey[i]);
found=1;
}// if matched
}// for
}else if(type =='W' && PCB){
// Robojax IR White Remote decoder
// if type is set to 'W' (white remote) and PCB=1 then check Black remote code
for(int i=0; i< sizeof(whiteRemotePCB)/sizeof(int); i++)
{
if(whiteRemotePCB[i] ==cd)
{
Serial.print("Key pressed:");
Serial.println(whiteRemoteKey[i]);
found=1;
}// if matched
}// for
}else if(type =='B' && PCB){
// Robojax IR White Remote decoder
// if type is set to 'B' (black remote) and PCB=1 then check Black remote code
for(int i=0; i< sizeof(blackRemotePCB)/sizeof(int); i++)
{
// Robojax IR black Remote decoder
if(blackRemotePCB[i] ==cd)
{
Serial.print("Key pressed:");
Serial.println(blackRemoteKey[i]);
found=1;
}// if matched
}// for
}else{
// if type is set to 'B' (black remote) and PCB =0 then check Black remote code
for(int i=0; i< sizeof(blackRemote)/sizeof(int); i++)
{
// Robojax IR black Remote decoder
if(blackRemote[i] ==cd)
{
if(blackRemoteKey[i] == "OK"){
digitalWrite(9,HIGH);
}
Serial.print("Key pressed:");
Serial.println(blackRemoteKey[i]);
found=1;
}// if matched
}// for
}// else
if(!found){
if(cd !=0xFFFFFFFF)
{
Serial.println("Key unknown");
}
}// found
}
Cosas que podrías necesitar
-
Amazonas
-
eBay
Recursos y referencias
Aún no hay recursos.
Archivos📁
No hay archivos disponibles.