Cientificosaficionados.com

Los foros de los científicos aficionados de la red.
Fecha actual Mié Oct 21, 2020 6:22 am

Todos los horarios son UTC [ DST ]




Nuevo tema Responder al tema  [ 24 mensajes ]  Ir a página 1, 2, 3  Siguiente
Autor Mensaje
NotaPublicado: Lun Jul 15, 2019 1:11 pm 
Desconectado
Avatar de Usuario

Registrado: Dom Feb 11, 2007 10:16 pm
Mensajes: 4906
Ubicación: Islas Baleares, España
El otro día, al estar haciendo algunas pruebas con Arduino como receptor de infrarrojos, me di cuenta que el mando IR que normalmente viene con el Arduino Starter Kit, me cambiaba de repente el color de la lámpara que tengo a mi lado, en la que puse una bombilla de LED de Lidl, Livarno HG04230...

El mando a distancia del Starter Kit es éste:

Imagen


...Y si eso ocurría sin duda era porque el protocolo de señales de este mando y el de la lámpara es el mismo, el popular protocolo NEC...

Este protocolo funciona con una portadora de 38 Khz, y los bits de información vienen dados por la separación entre el flanco de subida de frames de impulsos de 560 uS de duración. Si la separación es de 2.250 uS es un 1, y si es de 1.120 uS es un 0...

Imagen


...Si descontamos la duración del "frame", que siempre es la misma (560 uS), el tiempo a 0 entre ellos será de 1.690 uS para el 1 lógico y 560 uS para el 0 lógico...

Continuará...

Saludos

_________________
La VIDA sólo es energía que ha aprendido a defenderse... (Anilandro)

*** La Web de Anilandro *** http://sites.google.com/site/anilandro


Arriba
 Perfil  
 
NotaPublicado: Lun Jul 15, 2019 3:01 pm 
Desconectado
Avatar de Usuario

Registrado: Dom Feb 11, 2007 10:16 pm
Mensajes: 4906
Ubicación: Islas Baleares, España
A la vez, el protocolo NEC está formado por la siguiente secuencia:

Imagen

1) Un frame de 9 mS

2) Un tiempo de espera de 4,5 mS

3) A continuación vienen 33 frames de 560 uS cuya separación define 32 bits, agrupados de la siguiente forma

4) 8 bits de dirección, seguidos de 8 bits complementarios de los anteriores. Estos bits de dirección normalmente valen 0 (00000000), y por lo tanto su complementario es 1 (11111111). Hasta ahora no he visto que estos bits de dirección se utilicen para el envío de comandos IR de control de electrodomésticos.

5) 8 bits de datos que contienen la orden que se envía, seguidos de 8 bits complementarios de los anteriores. Esta disposición de un valor seguido de su complementario es para ayudar al software receptor a identificar datos corrompidos durante la trasmisión, ya que para ser válido un byte más su complementario ha de sumar 255...

Continuará...

Saludos

_________________
La VIDA sólo es energía que ha aprendido a defenderse... (Anilandro)

*** La Web de Anilandro *** http://sites.google.com/site/anilandro


Arriba
 Perfil  
 
NotaPublicado: Lun Jul 15, 2019 7:35 pm 
Desconectado
Avatar de Usuario

Registrado: Dom Feb 11, 2007 10:16 pm
Mensajes: 4906
Ubicación: Islas Baleares, España
A la vez, en el Starter Kit el receptor es normalmente un TL1838B, que es mucho más que un fotodiodo o un fototransistor, ya que integra en su interior los necesarios amplificadores, filtros y conformadores de señal para que recuperar la secuencia de bits lo más fielmente posible...

Imagen


El montaje que utilizaremos para las experiencias con infrarrojos será de lo más sencillo... La salida del sensor TL1838B conectada al pin 11 del Arduino, la masa a GND y el positivo a +5V pero a través de una resistencia de 200Ω y un condensador de filtro de 4,7 uF...

Imagen


Saludos

_________________
La VIDA sólo es energía que ha aprendido a defenderse... (Anilandro)

*** La Web de Anilandro *** http://sites.google.com/site/anilandro


Arriba
 Perfil  
 
NotaPublicado: Mar Jul 16, 2019 8:38 am 
Desconectado
Avatar de Usuario

Registrado: Dom Feb 11, 2007 10:16 pm
Mensajes: 4906
Ubicación: Islas Baleares, España
Ahora podemos buscar algún programa monitor entre los propios "ejemplos" del IDE de Arduino, que nos mostrará en la ventana serie los códigos de cada tecla del mando a distancia que vayamos pulsando... Un resultado puede ser el siguiente:

Imagen


En este caso los valores nos los da en binario, el valor de pulsación de la tecla, más una serie de 1's que corresponden a las repeticiones. Cambiando la orden de impresión "Serial.print (dato, BIN);" por "Serial.print (dato, HEX);" obtendremos los valores en hexadecimal:

Imagen


El problema, que también reportan en foros, es que los datos son inseguros. Pulsando el mismo botón a veces salen valores distintos, y eso ocurre en un porcentaje demasiado alto como para ser fiable. Con todo, a base de repetir los resultados dudosos, reuní las equivalencias botón/dato para este mando a distancia concreto.

Imagen


Saludos

_________________
La VIDA sólo es energía que ha aprendido a defenderse... (Anilandro)

*** La Web de Anilandro *** http://sites.google.com/site/anilandro


Arriba
 Perfil  
 
NotaPublicado: Mar Jul 16, 2019 12:45 pm 
Desconectado
Avatar de Usuario

Registrado: Dom Feb 11, 2007 10:16 pm
Mensajes: 4906
Ubicación: Islas Baleares, España
El problema parecían ser las librerías IR, que además daban errores de compilación, con la dificultad añadida por la caprichosa forma cómo las busca el IDE de Arduino, ya que si tienes dos distintas, una en sus carpetas y la otra en el escritorio, nunca sabes cual realmente acaba cargando...

Esto lo he solucionado pasando de librerías y programando una función específica. En primer lugar he escrito un Monitor de tiempos de pulsos, ya que si bien el protocolo NEC los determina, es importante saber los valores reales que lee el Arduino...

Imagen


El programa usa "pulseIn(pin, HIGH)" para contar el tiempo en uSec que duran los impulsos. El conteo comienza cuando el pin 11 cae a 0, ya que el sensor IR es de lógica negativa. Entonces guarda en un array los uSec de los siguientes 33 pulsos, tras los cual los imprime en el PC.

El programa "IR_NEC_TimeMonitor_01" lo podéis bajar del Drive: https://bit.ly/30r0OkZ ...cuyos resultados he racionalidado y muestran el primer impulso de 4439 uS, los 0's lógicos sobre 580 de media y los 1's sobre 1680 uS. Los valores NEC estándar son: 4500, 560 y 1690 uS...

Imagen


Saludos

_________________
La VIDA sólo es energía que ha aprendido a defenderse... (Anilandro)

*** La Web de Anilandro *** http://sites.google.com/site/anilandro


Arriba
 Perfil  
 
NotaPublicado: Mar Jul 16, 2019 10:25 pm 
Desconectado
Avatar de Usuario

Registrado: Dom Feb 11, 2007 10:16 pm
Mensajes: 4906
Ubicación: Islas Baleares, España
Obtengo valores de otras teclas del mando IR y observo que están muy cerca de los estándar NEC. He escrito otro programa monitor que me da los códigos de la tecla que se activa, y con más seguridad que las librerías normalmente utilizadas...

La primera parte de mi programa es muy sencilla, un par de variables globales y la llamada a la función "Decode_IR_NEC()", que será la encargada de medir los tiempos en uS y convertirlos 0's y 1's lógicos, y luego estos a un número entero o hexadecimal...

Imagen


La función es más compleja y difícil de explicar, pero primero detecta el pulso largo de inicio, luego descarta 16 bits de direcciones y guarda por separado dos valores de 8 bits, el dato y su inverso, que utilizo para comprobar la integridad del anterior...

Imagen


Saludos

_________________
La VIDA sólo es energía que ha aprendido a defenderse... (Anilandro)

*** La Web de Anilandro *** http://sites.google.com/site/anilandro


Arriba
 Perfil  
 
NotaPublicado: Mié Jul 17, 2019 1:37 pm 
Desconectado
Avatar de Usuario

Registrado: Dom Feb 11, 2007 10:16 pm
Mensajes: 4906
Ubicación: Islas Baleares, España
El resultado es excelente, con buena señal IR no falla nunca, retornando el código de tecla, y cuando el mando está muy lejos y la señal llega mal, indica error, retornado un "-1". También detecta la repetición de tecla pulsada, retornado un "0"...

Con este programa, al primer intento he obtenido de nuevo los códigos, esta vez en decimal, que naturalmente coinciden con los códigos anteriores en binario y hexadecimal, que tuve que repetir bastantes veces hasta dar por seguros los valores.

Imagen


El programa lo he llamado ""IR_NEC_DecoderMonitor_01"", y puede bajarse desde mi Drive: https://t.co/iyEIxgCuob


Saludos...

_________________
La VIDA sólo es energía que ha aprendido a defenderse... (Anilandro)

*** La Web de Anilandro *** http://sites.google.com/site/anilandro


Arriba
 Perfil  
 
NotaPublicado: Jue Jul 18, 2019 11:02 am 
Desconectado
Avatar de Usuario

Registrado: Dom Feb 11, 2007 10:16 pm
Mensajes: 4906
Ubicación: Islas Baleares, España
Seguidamente, con el mismo programa he obtenido los códigos de las teclas del mando IR de la bombilla de Lidl...

Imagen


...Observando que algunos coinciden con el mando del Starter Kit de Arduino, por lo cual es explicable que éste afectara a la lámpara.

Otra cosa que veo es que hay un código, en concreto el de la tecla "Strobe" que es "0", y es que en realidad dicho código es distinto a su ausencia, y por tanto se debería poder utilizar. El problema es que en mi programa asigné el valor "0" para el código de repetición, el que se genera cuando se mantiene una tecla pulsada, y por tanto pueden interferirse. Por este motivo he modificado mi programa cambiando el código de repetición a -2.

La versión corregida del IR_NEC_DecoderMonitor_01 se puede bajar desde: https://t.co/iyEIxgCuob

Ahora lo siguiente será programar un emisor de IR en protocolo NEC, sin utilizar librerías. A ver que tal me sale...

Saludos

_________________
La VIDA sólo es energía que ha aprendido a defenderse... (Anilandro)

*** La Web de Anilandro *** http://sites.google.com/site/anilandro


Arriba
 Perfil  
 
NotaPublicado: Vie Jul 19, 2019 9:08 am 
Desconectado
Avatar de Usuario

Registrado: Dom Feb 11, 2007 10:16 pm
Mensajes: 4906
Ubicación: Islas Baleares, España
Hay dos sistemas básicos para generar la secuencia que enviaremos a un LED emisor de infrarrojos, o bien utilizar la orden "tone (pin, frecuencia)", que no es demasiado estable debido al firmware interno del Arduino, o mejor programar directamente los "timers" del microcontrolador Atmega328, opción que he elegido, pero como las explicaciones que he encontrado sobre "timers y preescalers" están algo confusas, de momento he utilizado una rutina original de Nick Gammon...

Imagen


Con esta rutina la señal continua de 38 Khz sale por el pin 11 y no puede interrumpirse. Para modular los IR con los pulsos concretos de la señal NEC, es necesario utilizar otro pin en lógica negativa (p.ej. 7), y que el LED emisor (con su resistencia en serie) esté conectado con el positivo al pin 11 y el negativo al pin 7.

Imagen


Saludos

_________________
La VIDA sólo es energía que ha aprendido a defenderse... (Anilandro)

*** La Web de Anilandro *** http://sites.google.com/site/anilandro


Arriba
 Perfil  
 
NotaPublicado: Vie Jul 19, 2019 10:02 pm 
Desconectado
Avatar de Usuario

Registrado: Dom Feb 11, 2007 10:16 pm
Mensajes: 4906
Ubicación: Islas Baleares, España
El programa emisor de prueba me ha salido bastante corto. El listado muestra la rutina de Timmer, el array que con contiene la orden NEC a enviar, y en el "loop()" la rutina de creación de los pulsos NEC, el de arranque de 9 mS + espacio de 4,5 mS, seguido de los 32 pulsos de 560 uS, separados por 560 uS si es 0 o 1690 si es 1...

Imagen


Este programa emite la rutina prefijada cada segundo (correspondiente al código para cambiar la bombilla de Lidl a color rojo), pero curiosamente sólo funciona cuando paso la mano por delante del LED IR, y no siempre, así como cuando utilizo otro mando IR de la tele o del aire acondicionado... Extraño

...Pienso que pueden ser dos cosas, o bien el "timming" real no es lo suficientemente exacto a causa de las funciones internas del Arduino, o es un problema analógico de modulación del LED o de intensidad de señal. Lo primero lo miraré con el analizador lógico y lo segundo con el osciloscopio...

Saludos

_________________
La VIDA sólo es energía que ha aprendido a defenderse... (Anilandro)

*** La Web de Anilandro *** http://sites.google.com/site/anilandro


Arriba
 Perfil  
 
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 24 mensajes ]  Ir a página 1, 2, 3  Siguiente

Todos los horarios son UTC [ DST ]


¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado


No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro

Buscar:
Desarrollado por phpBB® Forum Software © phpBB Group
Traducción al español por Huan Manwë para phpbb-es.com