martes, 17 de abril de 2018

Arduino - Receptor de sensores de temperatura comerciales 433MHz

Página principal

Arduino

Receptor de sensores de temperatura

comerciales 433MHz

xsetaseta@gmail.com

Había visto hace tiempo un artículo donde se exponía la posibilidad de escuchar los sensores de temperaturas comerciales de las estaciones meteorológicas. Yo tengo un par de estaciones de ese tipo, y como curiosidad descubrí que funcionaban en la misma frecuencia y eran compatibles. Para que funcionasen los dos sensores a la vez debía cambiar el canal en los sensores.



Por suerte las dos estaciones meteorológicas tenían el mismo tipo de sensor y eran compatibles.

Estos sensores funcionan en la frecuencia de 433.xxxMHz , si no es muy selectivo el receptor puede recibir señales en toda la banda.
Tengo dos tipos de receptores, el uno es mas sensible que otro, aunque un poco mas caro lo recomiendo.
En el mercado chino existen numerosos receptores, algunos funcionan a 351MHz, y otros están sintonizados mal.  En la parte de bibliografía pongo el enlace del que me ha funcionado bien (2€).


Recomiendo este por ser mas sensible.


Montado el circuito receptor y alimentado a 5V me puse a estudiar los datos recibidos.

Gráfica de datos recibidos.


Después un estudio interprete las señales de este modo, tuve suerte, acerté.


Estudiando los datos mandados y con bastante trabajo, pude determinar la estructura de los datos.

Los datos emitidos se repiten varias veces, de esta forma podemos asegurarnos que el valor es correcto, no se si tiene verificación vía CRCs.
He de reconocer que tuve suerte, no estaban codificados como en algunos emisores.
También he descubierto que los datos extras son el estado de la batería.


Circuito montado con su antena.


Detalle del circuito, he quitado componentes usados en el desarrollo.

Al usar la interrupción INT0 para decodificar la señal, he configurado el pin D2 como entrada y conectado la salida DATA del receptor al pin D2.

void setup(void)
{
  Serial.begin(9600);
  Serial.println("Int433");
  pinMode(2, INPUT);
  pinMode(IN_READ, INPUT);

  cli();                // Disable INT
  EIMSK |= (1 << INT0);  // Enable external interrupt INT0
  EICRA |= (1 << ISC01); // Trigger INT0   en bajada
  sei();
}


El programa en el arduino se encarga de interpretar la señales y mandar los datos vía serie.
Int433
Canal,2,Grados,202,Extra,15
Canal,2,Grados,202,Extra,15
Canal,2,Grados,202,Extra,15
Canal,2,Grados,202,Extra,15
Canal,2,Grados,202,Extra,15
Canal,2,Grados,202,Extra,15
Canal,2,Grados,202,Extra,15
Canal,2,Grados,202,Extra,15
Canal,1,Grados,216,Extra,18
Canal,1,Grados,216,Extra,2
Canal,1,Grados,216,Extra,2
Canal,1,Grados,216,Extra,2
Canal,1,Grados,104,Extra,1
Canal,1,Grados,216,Extra,2
Canal,1,Grados,216,Extra,2
Canal,1,Grados,216,Extra,2
Canal,1,Grados,216,Extra,2
Datos recibidos vía serie

Para hacer un poco mas vistoso la visión de los datos, realicé en Gambas3 (Visual Basic Linux) un programa.


Las gráficas de la señales están realizadas mediante Osciloscopio Hantek6022BL y PulseView bajo Linux (Debian8_32bits).

PROGRAMAS

Hasta pronto.
JUAN GALAZ

Bibliografía:

setacom.html
hantek.html
https://fetzerch.github.io/2014/11/15/reveng433/
https://es.aliexpress.com/item/1pair-2pcs-433mhz-rf-transmitter-and-receiver-kit-For-Wireless-Power-switch-socket-remote-control-LED/32311933574.html?spm=a2g0s.9042311.0.0.lWlrua

miércoles, 11 de abril de 2018

Arduino - Comunicación Serie por Software - Interrupciones

Página principal


Arduino
Comunicación Serie por Software

Interrupciones
xsetaseta@gmail.com

Debía realizar un análisis de unas señales que transmitían códigos. Para obtener los datos de estas señales debía decodificar los diferentes impulsos de estas señales. El chip decodificador debía ser un arduino, y como nunca había realizado este trabajo, debía experimentar un patron de señales conocidas, y la mas conocida era la comunicación serie.
El estándar serie  es bien conocido, su decodificación normalmente se hace vía hardware, aunque a baja velocidad también se puede decodificar vía Software. Esta es una práctica de decodificación mediante programa de una señal con el protocolo serie, (USART) universal synchronous and asynchronous receiver-transmitter.

Imagen de una señal serie.


Tiempo de la señal Start a una velocidad de 300bps.


Tiempo de la señal Stop a una velocidad de 300bps.

La señal representada corresponde a una señal serie de 8 bits y 1 bits de parada.

Para decodificar esta señal he utilizado dos métodos diferentes:
El primer método cheque continuamente un Pin del arduino, que debemos determinar en el Setup.
El segundo método solo se interrumpe la ejecución del programa si existe un cambio en el Pin2, el cual genera la interrupción 0.

Modo 1.
Creamos una interrupción que continuamente mira el estado del pin que se designa como entrada.
 
  SRetardoStop = SRetardo * 10;

  SRetardoMax = SRetardo * 14;
  // initialize Timer1
  cli();          // disable global interrupts
  TCCR1A = 0;     // set entire TCCR1A register to 0
  TCCR1B = 0;     // same for TCCR1B
  TCCR1B |= (1 << WGM12); // turn on CTC mode:
  TCCR1B |= (1 << CS10);  //sin prescaler
  OCR1A = Scontador;   //contador
  TIMSK1 |= (1 << OCIE1A); // enable timer compare interrupt:
  sei();          // enable global interrupts

Vemos como utilizamos el Timer1, le asignamos un valor al contador, cuando el contador llegue a cero produce una interrupción, carga de nuevo el valor del contador, y se ejecuta la rutina de la interrupción.
La rutina de la interrupción es donde se estudia la señal del pin y se llama:
ISR(TIMER1_COMPA_vect)
{
}

Gráfica del chequeo de señal y la toma de valores de la señal.


Modo 2.
Para este caso no existe ninguna temporización, el programa utiliza la interrupción externa Int0 que se encuentra en el Pin 2 del arduino.
El programa solo se interrumpe cuando detecta un cambio de señal en el Pin 2 del arduino.
bool SetupSerie2(unsigned int  baud)
{
  pinMode(2, INPUT);
  digitalWrite(2, HIGH); // Enable pull-up resistor
  cli();                 // Enable global interrupts
  EIMSK |= (1 << INT0);  // Enable external interrupt INT0
  EICRA |= (1 << ISC00); // Trigger INT0 on Change
  sei();
......

La rutina de la interrupción es donde se estudia los tiempos del cambio de señal del Pin 2 del arduino y se llama:
ISR(INT0_vect)
{

}


En los dos casos cuando se ha completado la lectura de un byte,  se pone la variable SDatoEstado = 1; .
En el bucle del programa principal que chequea continuamente el SDatoEstado = 1; , mediante la rutina  SerialAvailable() ,cuando detecta un carácter válido, se obtiene el byte  mediante la rutina SerialGet().
Para esta práctica no he querido crear un buffer que sería lo normal, pues si se entretiene mucho el programa principal pudiera sobrescribirse los datos.
En ambos casos a velocidades superiores a 4800 bps, me producían errores, se mezclaban las interrupciones, no he querido profundizar en su posible solución.

Para entender la interrupciones en el arduino, estuve buscando en internet un tutorial, encontrando este:
https://arduinodiy.wordpress.com/2012/02/28/timer-interrupts/
en plan atrevido, realicé una traducción, espero que no sea muy mala. TRADUCCION

Las gráficas de la señales están realizadas mediante Osciloscopio Hantek6022BL y PulseView bajo Linux (Debian8_32bits).

PROGRAMAS

Hasta pronto.
JUAN GALAZ

Bibliografía:

https://aprendiendoarduino.wordpress.com/2016/11/13/interrupciones/
https://arduinodiy.wordpress.com/2012/02/28/timer-interrupts/
http://www.engblaze.com/we-interrupt-this-program-to-bring-you-a-tutorial-on-arduino-interrupts/


lunes, 2 de abril de 2018

Osciloscopio Hantek6022BL en Linux OpenHantek y PulseView

Página principal
Osciloscopio Hantek6022BL
en
Linux

OpenHantek y PulseView
xsetaseta@gmail.com

Después de medio año con mi osciloscopio digital Hantek6022BL me surgió el tener que analizar unas señales digitales.
En un anterior artículo realizaba mi experiencia tras una semana utilizando el osciloscopio.
Primera-semana-con-el-osciloscopio.html
Como hacía tiempo que no había mirado sobre algún programa que bajo linux se pudiese hacer uso del osciloscopio, me puse a mirar.
Efectivamente, había novedades:
En primer lugar era el http://openhantek.org/ , ya tenía soporte para el Hantek6022BL .
El programa openhantek es un programa que realiza el soporte de varios osciloscopios digitales USB, hasta hace poco no soportaba el Hantek6022BL, pero ahora lo soporta bastante bien.
Desde la página web solo podemos bajar el código fuente, no existen binarios.
Después de muchas pruebas, descubrí que debido a las dependencias en la librería QT ("Minimum supported Qt5 version is 5.4.0!"), debemos tener un Debian9,  Mint18, Ubuntu 17.10 . Intente por todos los medios intentar compilarlo en Debian 8, pero me fué imposible. Con anteriores versiones de openhantek si se podía compilar para Debian 8, pero no tenía soporte para el Hantek6022BL.
Para la compilación debemos seguir los siguientes pasos:
Después de ver como compila sin errores, no habrá creado el ejecutable en  el directorio openhantek .
Si intentamos ejecutarlo, veremos que nuestro osciloscopio no es detectado.
Deberemos añadir al directorio /lib/udev/rules.d/ algunos ficheros para que nuestro Hantek6022BL  USB sea reconocido.
Debemos copiar el fichero  firmware/60-hantek.rules/lib/udev/rules.d/
Volvemos a ejecutar el programa con el USB desconectamos.
Una vez con el programa funcionando, conectamos el USB y veremos como nos aparece nuestro 6022BL.
Ya podemos ver como nos funciona el programa con nuestro Hantek6022BL. Tendremos que activar un canal.
Para que nos reconozca el osciloscopio debemos tener el botón que se encuentra al lado del conector USB, metido (modo H) antes de conectar el USB.


Hantek6022BL funcionando en linux bajo openhantek

Para el que no quiera complicarse en compilar tengo los ficheros en:
https://drive.google.com/drive/folders/1zfv4cq8lpocLDWRQydqtaIDuZbndaVit?usp=sharing

He compilado OpenHantek para Mint18 64bits , Ubuntu 17.10 64bits, Debian 9.4 32bits.
Debemos de dar permisos de ejecución a los ficheros ejecutables.


Para analizar señales digitales con el Hantek6022BL teníamos saleae  desde la página  https://www.saleae.com/downloads , pero solo funcionaba en 64bits.
Como normalmente trabajo en Debian 32bits, este programa no me servia, debía encontrar una solución.
Buscando encontré un programa PulseView ,que hacía uso del programa sigrok para capturar señales digitales , https://sigrok.org/wiki/Main_Page.
Este es un interface gráfico para representar señales digitales y analizar protocolos.
Para este caso no me he complicado mucho, he bajado los ficheros binarios que se encuentran en https://sigrok.org/wiki/Downloads. existen versiones para 32bits y 64bits.
Para que nos reconozca el osciloscopio debemos tener el botón que se encuentra al lado del conector USB, sacado (modo L) antes de conectar el USB.
Al igual que en el modo analógico, deberemos añadir al directorio /lib/udev/rules.d/ algunos ficheros para que nuestro Hantek6022BL  USB sea reconocido. Los tengo recopilados en https://drive.google.com/drive/folders/1zfv4cq8lpocLDWRQydqtaIDuZbndaVit?usp=sharing , son todos los que terminan en *.rules .
Aquí me he encontrado un error en el reconocimiento de dispositivo, tarde algún tiempo en encontrar la solución.
Arrancamos el programa  ./PulseView-NIGHTLY-i686.AppImage
Veremos que no detecta el Hantek6022BL.
Sin salir del programa desconecte el USB del osciloscopio y vuelva a conectar.
Ahora salir del programa y volver a entra, verás que ahora si lo detecta y funciona.


Pulseview funcionando con  Hantek6022BL

Espero que le haya ayudado a alguien.

Hasta pronto.
JUAN GALAZ

Bibliografía:
http://openhantek.org/
https://sigrok.org/wiki/Main_Page
https://sigrok.org/wiki/PulseView