Mostrando entradas con la etiqueta iremote. Mostrar todas las entradas
Mostrando entradas con la etiqueta iremote. Mostrar todas las entradas

jueves, 10 de diciembre de 2020

ARDUINO - SM1628 - TIMER - Mando IR

ARDUINO
SM1628
TIMER - Mando IR


 


Me gusta desmontar aparatos electrónicos para reciclar.
En este caso reutilizo la parte frontal de un TDT que lleva el CHIP SM1628.
En un anterior montaje había reutilizado otro panel de TDT que llevaba el CHIP CT1642, creando un reloj.
En este caso realizo un timer de cuenta atrás que al finalizar la cuenta se enciende un LED.
Lo peculiar de este montaje es que se programa mediante botones, y mandos a distancia de TV , marcas LG y Philips.
En principio intenté utilizar la librería TM1628, pero existe diferencias, por lo que tuve que realizar mis propias rutinas basadas en la anterior librería. Mas que diferencias en el CHIP, creo que el conexionado del display está forma diferente al normal.


Código segmentos.


Esquema de conexionado.


Circuito montado.

El montaje es interesante por aprovechar una placa reciclada con todo sus componentes, como botones, displays, receptor IR.


PROGRAMA

VIDEO



Saludos.
Juan Galaz

 
Bibliografía:

CT16rej.html
https://github.com/BlockThor/TM1628
http://blockduino.blogspot.com/2012/10/led-dvd-tm1628.html
https://github.com/javitrompix/TM1628R





 

miércoles, 16 de octubre de 2019

Arduino - COPIADOR CÓDIGOS INFRARROJOS

Página principal

Arduino

COPIADOR CÓDIGOS INFRARROJOS


En el anteriores artículos había realizado un receptor y emisor de infrarrojos  icur.html .
En estos artículos había utilizado la librería Iremote. Para este montaje no utilizo ninguna librería.
En este montaje realizo una copia de la señal digital, sin entender el código a que pertenece.

Voy a intentar explicar el funcionamiento del circuito.
-Se pulsa la pulsador 16 (es la tecla de memoria).
-Parpadea el Led testigo (PIN 13) esperando que se pulse el pulsador a memorizar.
-Se queda fijo el Led testigo, esperando a la señal infrarroja de cualquier mando.
-Cuando se pulsa la tecla de un mando cualquiera, empieza a copiar los códigos a la memoria EEPROM del arduino.
-Terminada la copia del código, el Led testigo se apaga parpadeando rápidamente.
-Si queremos emitir el código memorizado en el pulsador, solo tenemos que pulsarlo.

Debido a la capacidad reducida de la memoria EEPROM del arduino (1K), tenemos restringido la cantidad de códigos copiados.
Si hubiésemos utilizado la librería Iremore, hubiésemos podido memorizar cientos de teclas, pero como copiamos las formas de las señales digitales, necesitamos mucha mas memoria.
Para el protocolo RC5 se necesitan alrededor de 66 bytes, por lo cual se podrían almacenar 15 memorias.
Para otros protocolos  como el NEC , he utilizado 100 bytes, por lo cual se podrían almacenar 10 memorias.
Si por alguna razón queríamos mas memoria, deberíamos emplear memoria externa en el bus I2C, como las memorias 24LCxx.


Esquema del circuito.


Forma de las señales que transmite el circuito.
Se puede observar la seña digital que tiene que almacenarse en la memoria EEPROM.
Señales obtenidas con el programa PulseView en Debian10 y el osciloscopio
Hantek6022BL  

Como tenemos restringido el tamaño de la memoria (100 bytes), debemos inventar algún método para almacenar 100 unsigned int (200 bytes) en 100 bytes.
No se si ya existe, pero sobre la marcha me he invente para almacenar un 
unsigned int  en un byte, perdiendo algo de precisión.
Cuando nos fijamos en el protocolo NEC existen mucha variación entre diferentes tiempo entre pulsos, desde 0.56 mS hasta los 110 mS.
Almacenar estos datos en un byte sería imposible, por lo cual empleamos un truco.
Utilizar los bits D7 y D6 como nivel de multiplicación de los restantes bits D5-D0.


Valores para un protocolo NEC.

El resultado es muy bueno, un error menor de un 5%, para un ahorro de datos de un 50%.
Desde luego es la parte del programa del que me siento mas orgulloso.

Para obtener una frecuencia de 40 KHz he utilizado el contador 2 de ATMEGA328 con los siguientes parámetros:

// Clear Timer on Compare Match (CTC) Mode
  bitWrite(TCCR2A, WGM20, 0);
  bitWrite(TCCR2A, WGM21, 1);
  bitWrite(TCCR2B, WGM22, 0);
  //  bitWrite(TCCR2B, WGM23, 0);

  // Toggle OC1A and OC1B on Compare Match.
  bitWrite(TCCR2A, COM2A0, 1);
  bitWrite(TCCR2A, COM2A1, 0);
  bitWrite(TCCR2A, COM2B0, 1);
  bitWrite(TCCR2A, COM2B1, 0);

  // No prescaling
  bitWrite(TCCR2B, CS20, 1);
  bitWrite(TCCR2B, CS21, 0);
  bitWrite(TCCR2B, CS22, 0);

  OCR2A = 199;
  OCR2B = 199;
El valor de 199 viene de la formula:

x=(8000000/40000)-1=199

La salida de la señal 40000KHz se efectúa por el pin D3 del arduino.

Como la medida tiempo no es demasiado critico en este montaje, a nivel de programación no me he esforzado mucho en la optimización del código.
Existen muchas forma de optimizar, como por ejemplo colocar frecuON(void) y frecuOFF(void) en forma de #define, lo hace mucho mas rápido.




Circuito montado.


Detalle del circuito montado.

Lo bueno de este montaje es que se pueden mezclar diferentes tipos de protocolos en diferentes teclas.
Por ejemplo, Philips (RC5) y LG (NEC).
Me ha sorprendido lo bien que funciona este copiador de códigos infrarrojos.


PROGRAMA


Espero que les guste este montaje.

Saludos.
Juan Galaz


Bibliografía:
icur.html
ar_irb.html        ar_ira.html        ar_ir.html
https://en.wikipedia.org/wiki/RC-5
https://naylampmechatronics.com/blog/36_Tutorial-Arduino-y-control-remoto-Infrarrojo.html
https://www.sbprojects.net/knowledge/ir/rc5.php
http://lirc-remotes.sourceforge.net/
http://www.hifi-remote.com/sony/Sony_tv.htm

miércoles, 2 de octubre de 2019

Arduino - EMISOR INFRARROJOS

Página principal

Arduino

EMISOR INFRARROJOS


En el anterior artículo había realizado un receptor de infrarrojos  icur.html .
En este artículo realizo un emisor de infrarrojos. Para este montaje también utilizo la librería Iremote.
Lo primero que debo realizar es una matriz de pulsadores que lean un dato, que posteriormente se utilice para transmitir un código.
El método utilizado es el clásico de matriz de 4x4 pulsadores (16), que se leen secuencialmente.
Lo segundo a realizar es la parte de emisión de infrarrojos.
El utilizar las salidas del arduino para atacar directamente al diodo IR funciona, pero la intensidad que se necesita para los dos diodos IR (86mA) no los da el arduino.
La solución para este problema es utilizar un transistor que proporciona la intensidad necesaria.
He añadido un LED de testigo de emisión de la señal IR.

Esquema del circuito.






Forma de las señales que transmite el circuito.
Se puede observar la señal portadora de 40KHz.
Señales obtenidas con el programa PulseView en Debian10 y el osciloscopio
Hantek6022BL  


Circuito montado.

He creado dos programas.
El primero utilizo directamente la librería Iremote.
En el segundo utilizo todos las funciones de la librería Iremote, pero colocando todo en el propio programa.
Las dos funcionan bien, pero con el segundo programa no hace falta utilizar la librería Iremote, además de ocupar un poco menos.


PROGRAMA
LIBRERIA IREMOTE

Saludos.
Juan Galaz



Bibliografía:

https://en.wikipedia.org/wiki/RC-5
https://naylampmechatronics.com/blog/36_Tutorial-Arduino-y-control-remoto-Infrarrojo.html
https://www.sbprojects.net/knowledge/ir/rc5.php
http://lirc-remotes.sourceforge.net/
http://www.hifi-remote.com/sony/Sony_tv.htm

martes, 17 de septiembre de 2019

Arduino - RECEPTOR INFRARROJOS

Página principal

Arduino

RECEPTOR INFRARROJOS


Hace bastante años hice un montaje con receptor de infrarrojos, había utilizado la librería Iremote, he incluso había desarrollado mi propia rutina que no utilizaba ninguna librería.
ar_irb.html        ar_ira.html        ar_ir.html

Después de 8 años vuelvo hacer un receptor de infrarrojos, esta vez decodifica los números del 0 al 9, pero esta vez interpreta los códigos de un mando de TV Philips  y de TV LG.
Se vuelve a utilizar la librería Iremote, que funciona bastante bien, y simplifica la mucho programación.
El circuito se compone de un receptor de IR que detecta la luz infrarroja y filtra la portadora que se encuentra entre los  36KHz y 40KHz, proporcionándonos la señal digital que introducimos al PIN 11 del arduino.
El arduino interpreta la señal mediante la librería Iremote y nos devuelve los datos en una estructura de nombre   decode_results.
La estructura de datos es la siguiente:
decode_type_t          decode_type;  // UNKNOWN, NEC, SONY, RC5, ...
unsigned int           address;      // Used by Panasonic & Sharp [16-bits]
unsigned long          value;        // Decoded value [max 32-bits]
int                    bits;         // Number of bits in decoded value
volatile unsigned int  *rawbuf;      // Raw intervals in 50uS ticks
int                    rawlen;       // Number of records in rawbuf
int                    overflow;     // true iff IR raw code too long

Para el programa solo utilizo  decode_typevalue.
Dependiendo del tipo de mando y del valor devuelto, enciendo o apago un LED determinado.
El montaje es muy simple, pero bastante vistoso.
He realizado 2 programas, el uno enciende solo un LED cada vez, y el otro enciende o apaga cualquiera de los LEDs a la vez.
Para no tener que colocar una resistencia para cada LED, simplifico el montaje colocando una resistencia común a GND para todos los LEDS. Esto implica que dependiendo de los LEDS que estén encendidos, lucirán mas o menos.

Esquema del circuito



Circuito montado.



Forma de la señal con los códigos de
TV Philips  y de TV LG.



VIDEO

PROGRAMA
LIBRERIA IREMOTE






Saludos.
Juan Galaz



Bibliografía:

https://naylampmechatronics.com/blog/36_Tutorial-Arduino-y-control-remoto-Infrarrojo.html
https://www.sbprojects.net/knowledge/ir/rc5.php
http://lirc-remotes.sourceforge.net/
http://www.hifi-remote.com/sony/Sony_tv.htm