martes, 24 de marzo de 2015

Arduino - Visual Basic- Control radio rda5807

Como no solo de Linux vive el  mundo, he realizado los programas para Windows

Continuación de:
http://seta43.blogspot.com.es/2015/03/radio-rda5807-y-arduino-nano-control.html

Posteriormente he realizado dos programas de control bajo Windows.

El primero realizado con rapidq, es un compilador de basic gratis, está medio abandonado pero funciona.
Probado bajo linux con wine y también funciona.


El el segundo con Visual Basic 6, ya es un poco viejo el compilador, pero es el que tengo.




He realizado una modificación en la parte de arduino para que funcione el programa hecho con rapidq, por lo cual recomiendo que cambies el programa del arduino.

PROGRAMA_WINDOWS


Un saludo
Juan Galaz

jueves, 19 de marzo de 2015

Radio RDA5807 y arduino nano. Control mediante PC.

Arduino nano
Radio RDA5807
Control mediante un PC


Este montaje es una continuación del montaje http://seta43.duckdns.org/radiofm.html , pero ahora el control se realiza mediante el PC.
He elegido el arduino nano por ser muy pequeño, y como se ve se coloca en una pequeña placa de circuito impreso.
Queda tan pequeño el montaje que se puede colocar en una pequeña caja, en la cual tenga una entrada usb (que alimenta el circuito y hace de control), y una salida de audio.
El programa se realiza en gambas sobre linux, posteriormente haré uno para windows.
Es un programa lo mas sencillo posible, no tiene RDS, ni memorias, detecta en que puerto serie se encuentra la radio y se conecta.
Muchas distribuciones linux como debian, tienen vedado el acceso a los puertos serie.
Para poder tener acceso a los puertos serie, se debe añadir al grupo tty o dialout mediante las ordenes:
    usermod -a -G tty usuario
    usermod -a -G dialout usuario
El coste del montaje es muy bajo, arduino nano 3€ , RDA5807 1,5€.


Esquema del montaje


Circuito realizado


Programa gambas

PROGRAMAS


Saludos.
Juan Galaz


Bibliografía:

http://arduino.vom-kuhberg.de/index.php
http://seta43.duckdns.org/radiofm.html
http://seta43.duckdns.org/rards.html

jueves, 12 de marzo de 2015

Servidor de temperatura con ESP8266 Y ARDUINO

SERVER WEB CON ESP8266 Y ARDUINO
Servidor de temperatura
ds18B20


Existe una versión nueva que funciona con un arduino Nano.
Versión actual 17/12/2015 - Arduino NANO - SERVER WEB con ESP8266 - Servidor de temperatura-ds18B20. http://seta43.blogspot.com.es/2015/12/server-web-con-esp8266-y-arduino-nano.html

El otro día me llego el modulo ESP8266 con el cual se puede tener acceso a wifi mediante comandos AT y utilizando un puerto serie. El modulo por si solo tiene un microcontrolador de 32 y el chip de wifi, por lo que puede trabajar sin ningún chip adicional, existe hasta un lenguaje para trabajar con el, pero eso esta fuera de mi montaje, yo lo voy a utilizar para controlarlo mediante el arduino.
Este montaje me ha llevado mucho tiempo, muchos dolores de cabeza, mas de lo que yo creí.

-El primer problema con el modulo es su alimentación, funciona con 3.3V , lo normal en estos dispositivos. Lo normal sería utilizar los 3.3V que nos proporciona el arduino, pero lo que ocurre con este dispositivo, es que puede llega a consumir hasta 215mA, y esto no los puede entregar la placa de arduino. Existen dos opciones, utilizar un alimentador externo de 3.3V, o emplear un viejo truco de electrónicos, el utilizar la caída de tensión (0.7V) de los diodos de silicio. He empleado dos diodos en serie que producen una caída de tensión de 1,4V que restados a los 5V del arduino nos proporciona una tensión de 3.6V con la que podemos alimentar el módulo. Normalmente esta tipo de módulos tiene una cierta tolerancia en cuanto a la alimentación, el que no se quiera arriesgar que utilice otro diodo en serie, bajando de esta forma la alimentación a 2.9V. He colocado un condensador en los 3.6V para aplanar la alimentación.
-El segundo problema que nos encontramos es el adaptar la señal del módulo ESP8266 que funciona a 3.3V con el del arduino que funciona a 5V. En teoría el módulo admite los niveles del arduino sin ningún tipo de adaptador, y así funcionaba con el arduino duemilanove, pero con el MEGA no funcionaba, por lo que tuve que hacer el adaptador de niveles con resistencias.
Ahora ya tenemos alimentado el módulo y adaptada la señal TX3 del arduino para que se comunique bien con el módulo. La señal TX del modulo se conecta directamente a la entrada RX3 del arduino, no hace falta ningún adaptador.
En un primer momento quería realizar el montaje con un arduino duemilanove utilizando la emulación del puerto serie mediante software, utilizando la librería SoftwareSerial, pero me fue imposible por varias razones. El buffer que utiliza esta librería es de 64 bytes, se puede aumentar modificando el fichero SoftwareSerial.h , y cambiando la linea #define _SS_MAX_RX_BUFF 64, por la cantidad que queramos. Pero no llegaba a la cantidad necesaria para que funcionara bien. Para comprobar esto y hacer practicas con los comandos podemos probar este código, y veremos lo que pasa cuando la cantidad de datos que manda el modulo son muchos, no los puede procesar.

Programa para arduino uno utilizando emulación serie mediante software.
#include <SoftwareSerial.h>
SoftwareSerial BT1(3, 2); // RX | TX

void setup()
  {  Serial.begin(9600);
     BT1.begin(9600);
  }

void loop()
  {
     if (BT1.available())
         { char c = BT1.read() ;
           Serial.print(c);
         }
     if (Serial.available())
         {  char c = Serial.read();
            BT1.print(c);
         }
   }

Respuesta de la tarjeta módulo ESP8266 a una petición web mediante la emulación serie mediante software.
+IPD,3,342:GET /HolaArduino HTTP/1.1
Host: 192.168.1.102:4040
User-Agetoa01i ;:. o11r/0Iel0
e /,ltxl,lixq,;8c-g:-s0n;5;.c-o:idtCcnel
Podemos observar como se pierden los datos cuando los datos mandados por el módulo son muchos. Si aumentamos el buffer se pierden menos, pero ni siquiera podemos ver el OK de final de transmisión.
Os aconsejo la página http://www.prometec.net/arduino-wifi/ , donde explica como se realiza la conexión a un router, y vemos los problemas que tiene.
Después de muchos dolores de cabeza, decidí el utilizar el arduino MEGA que tiene 4 puertos serie. Utilizando el puerto 3 por hardware del arduino MEGA se realizara todo el montaje, donde los bytes no se pierden, y se puede realizar todas la pruebas con normalidad.

Programa arduino MEGA para practicar los comandos AT del módulo ESP8266
void setup() {
  // initialize both serial ports:
  Serial.begin(9600);
  Serial3.begin(9600);
}

void loop()
{
 
  if (Serial3.available())
  {
    int inByte = Serial3.read();
    Serial.write(inByte);
   }

  if (Serial.available())
  {
    int inByte = Serial.read();
    Serial3.write(inByte);
   }
}
Para ver los comandos traducidos del módulo ESP8266 recomiendo la página http://granabot.es/modulo-wifi-esp8266/  donde están traducidos al español, es una muy buena página.
Ya tenemos comunicado el módulo ESP8266 a el arduino MEGA, y todas las ordenes AT funcionan perfectamente. Todo no puede ser perfecto, algunas veces el módulo se bloquea y no funciona el reseteo por software, hay que buscar un método para que sea por hardware.
He utilizado es utilizar el pin 12 del arduino para resetear el módulo, este se resetea cuando se pone a cero el pin RST del ESP8266, por seguridad los he unido mediante una resistencia de 1K.
El programa.
Lo primero que debemos hacer con el módulo es realizar la conexión con el router.
//  WIFI_SSID  WIFI_CLAVE
String cmd="AT+CWJAP=\"setamodem\",\"contraseña\"\r\n";

int connectWiFi()
{
  int error;
    error=0;
    Serial.println("WIFI_CONECTAR"); 
    Serial3.println("AT+RST");  readS(4000);
    if(!sendOrden("AT+CWMODE=1\r\n","OK","AT+CWMODE=1",200)) error++; 
    if(!sendOrden(cmd,"OK","setamodem",2000)) error++;
    if(!sendOrden("AT+CWMODE=3\r\n","OK","AT+CWMODE=3",200)) error++;  
    if(!sendOrden("AT+CIFSR\r\n","OK","AT+CIFSR",200)) error++;  
    if(!sendOrden("AT+CIPMUX=1\r\n","OK","AT+CIPMUX=1",200)) error++;  
    if(!sendOrden("AT+CIPSERVER=1,4040\r\n","OK","AT+CIPSERVER",200)) error++;
    if(!sendOrden("AT+CIPSTO=30\r\n","OK","AT+CIPSTO=15",200)) error++;
    Serial.println("FIN_WIFI");
    return(error);
}
En esta función se realizan todos los pasos para la conexión, y verifica que no existe error.
El error se devuelve en la función, que el programa lo procesa activando el pin 13 del arduino si se encuentra conectado al router. Es la forma de verificar visualmente la conexión mediante un Led.
De vez en cuando el módulo ESP8266 no responde, y se desconecta del router, esto hay que monitorizarlo, y volver a conectarse si está desconectado.

Monitorización de la conexión cada 30 segundos.
delay(1); time--;
if(time<1)
      {     
       time=30000;
       //dectecta si sigue conectado
        if(!sendOrden("AT+CWJAP?\r\n","OK","conectado",200))
             if(connectWiFi())
               {
                 Serial.println("Reseteo HART");
                 digitalWrite(ledReset, LOW);
                 delay(800);
                 digitalWrite(ledReset, HIGH);          
               }
      }
Como voy voy a realizar un servidor web que visualice la temperatura de varios sensores ds18B20 , utilizo la monitorización cada 30 segundos para realizar la toma de temperatura de los sensores.
En el bucle principal del programa se chequea los datos que proceden del módulo ESP8266. Cuando aparece la cadena +IPD , se procesa la petición, sirviendo la página web.

Chequeo de los datos que proceden del módulo ESP8266.
if (Serial3.available())
         {         
          digitalWrite(ledPin, LOW);        
          readS(200);      
          z=response.indexOf("+IPD");
          if(z>0)
              {                         
                Serial.print("Encontrado +IPD en ");  Serial.println(z);
                Serial.print("IPD="); ipd = response.substring(z+5,z+6).toInt(); Serial.println(ipd);
                //espera al OK de fin de cabecera
                sendOrden("","OK","ipd",200);    
                paginaWeb(ipd);
                readS(200);              
              }
          digitalWrite(ledPin, HIGH);                 
         } 

Visión en un navegador
Montaje eléctrico
La explicación del programa es fácil, pero la realización es difícil, los tiempos de respuesta del módulo son variables, y se tiene que esperar hasta que el módulo responda.
Y para colmo el módulo se bloquea y se desconecta con facilidad si mandas varias peticiones web a la vez.
Esta es mi experiencia con el módulo ESP8266, un dolor de cabeza, espero que le sirva a alguien.

Saludos.
Juan Galaz
Bibliografía:


domingo, 1 de febrero de 2015

Añadiendo dos sensores de temperatura DS18B20

Añadiendo dos sensores de temperatura DS18B20

El  DS18B20 es un sensor de temperatura que puede tener una resolución de 12bits.
Lo bueno de este sensor es que funciona con solo dos cables, se alimenta del propio bus de datos, y podemos tener en varios en el mismo cable de dos hilos. Recomiendo leer varios tutoriales sobre el funcionamiento del sistema de comunicaciones OneWire, http://en.wikipedia.org/wiki/1-Wire .


Conexionado del DS18B20.


DS18B20 conectado con dos cables.


Montaje con los dos sensores de temperatura DS18B20



PROGRAMA


Saludos
Juan Galaz

domingo, 18 de enero de 2015

Arduino-Reloj con TFT color 1.8"

Página principal


Arduino
Reloj con TFT color 1.8"

xsetaseta@gmail.com

Me llegó hace tiempo un LCD de TFT color de 1.8", pero no conseguía hacerlo funcionar, ya lo daba por perdido.
Navegando por internet, descubrí esta página http://www.prometec.net/tft-spi18/ , en la cual utilizaba el LCD que tenía yo, y que le funcionaba perfectamente.
Monté el circuito tal y como lo decía y lo probé, funcionó a la primera, que alegría.
En mi ordenador donde trabajo , Debian 7, tengo  dos versiones de Arduino la que viene de serie la 1.0.1 y la 1.0.5 que instalé en mi directorio. Resultó que solo me funcionaba si la compilaba con la 1.0.1 , con la otra me daba bastantes errores, lo digo por si alguien le pasa lo mismo.
En la librería  Adafruit_QDTech existe un ejemplo de un reloj  TFT_Clock, pero el reloj toma la hora del compilador, por lo cual la hora siempre empezará el día de la compilación,  sirve solo como ejemplo.
Hace tiempo había hecho un reloj arnok.html, que utilizaba LCD 3310, de los que utilizaban los nokias, junto con un chip de reloj DS1302 
para mantener la hora.
En este montaje he añadido el reloj de tiempo real al ejemplo TFT_Clock, con lo cual se mantiene la hora aunque se apague el arduino.


Pin del TFT


Esquema del circuito.


Circuito montado.

PROGRAMA

LIBRERÍAS



Hasta pronto.
JUAN GALAZ

Bibliografía:
 http://www.prometec.net/tft-spi18/
 http://playground.arduino.cc/Main/DS1302
http://seta43.duckdns.org/arnok.html
 http://seta43.duckdns.org/electro.html

miércoles, 14 de enero de 2015

Receptor de FM para la frecuencia entre 50MHz y 108MHz.


Página principal
Arduino
Radio RDA5807 con RDS
LCD Nokia 3310
Parte 3
Receptor de FM para la frecuencia entre 50MHz y 108MHz.


Este montaje es una radio hecha con el chip RDA5807 y con  la visualización en un LCD 3310.
Es la continuación de mi anterior montaje rards.html , ahora el control se hace mediante botones.
Para este montaje he eliminado el decodificador de RDS.
El chip RDA5807 está diseñado para poder recibir señales de FM de cualquier parte del mundo.
Mediante el registro 03H  y los bits 3y2 se puede seleccionar las distintas banda de cada lugar del mundo.
Band Select.
00 = 87–108 MHz (US/Europe)
01 = 76–91 MHz (Japan)
10 = 76–108 MHz (world wide)
111 = 65 –76 MHz (East Europe) or 50-65MHz

El caso es que puedes tener un receptor de FM para la frecuencia entre 50MHz y 108MHz.
Le añadido un menú con varias opciones:
  • Búsqueda de emisoras.
  • Volumen del audio.
  • Banda.
  • Sintonía.

Recibiendo frecuencias entre 87-108Mhz


Recibiendo frecuencias entre 50-65Mhz


PROGRAMA


Saludos.
Juan Galaz


Bibliografía:

http://arduino.vom-kuhberg.de/index.php
http://seta43.duckdns.org/ardura.html
RADIO DATA SYSTEM- RDS- Por: Aitzol Zuloaga Izaguirre.
http://www.rds.org.uk/2010/Overview.htm




jueves, 8 de enero de 2015

Arduino-Radio RDA5807 con RDS-LCD Nokia 3310- Botones


Página principal
Arduino
Radio RDA5807 con RDS
LCD Nokia 3310
Parte 2


Este montaje es una radio hecha con el chip RDA5807 y con  la visualización en un LCD 3310.
Es la continuación de mi anterior montaje radiofm.html , ahora el control se hace mediante botones.
Le añadido un menú con varias opciones:
  • Búsqueda de emisoras.
  • Volumen del audio.
  • Información de la señal.
  • Sintonía.
Para el control mediante botones he utilizado el método de variar el voltaje en el pin A0 mediante resistencias y botones.
Es un método bastante sencillo y práctico, que permite mediante dos hilos, poder tener controlados bastantes botones.


Esquema del circuito.




Montaje de circuito.


Imagen del LCD

Se puede ver diferentes datos en el LCD, como pueden ser:

  • Nivel de señal.
  • Señal stereo o mono.
  • Volumen del audio.
  • Menú actual.
  • Frecuencia.
  • Nombre de la emisora.
  • Información que proporciona la emisora.

Señal de RDS.

Para el tipo de grupo solo he utilizado el  0000=Información básica de sintonía.



Primer menú de información.

Esta información se toma del código PI que transmite la emisora.




Segundo menú de información.



La cuestión de los datos que proporciona la emisora mediante el RDS es un tanto heterogénea.
La mayoría de las emisoras solo transmite en nombre de la emisora y las frecuencias alternativas.
En los datos que proporciona como frecuencias alternativas,  la mayoría carga una serie de frecuencia por defecto, las cuales solo 2 o 3 te sirvan.
El dato de hora y fecha es un tanto irregular, la mayoría no la transmite bien, y para colmo lo hace en modo de hora UTC, y la fecha en modo Juliano.
En la única emisora que pude implementar bien la hora, estaba adelantada en 5 minutos. Y en otras mandaban los datos erróneos.
Para la cuestión de la fecha, debías hacer unas cuantas operaciones en numero flotante, y he creído no necesario hacer complicado el programa.
El que quiera implementar el pasar la fecha de formato Juliano a modo DD/MM/YY  , puede ver el anexo G del  Maintenance of the RDS standard IEC 62106.

No he implementado la detección de errores en la señal RDS, por lo cual pueden aparecer datos erróneos.

El programa hecho en arduino esta lleno de comentarios y debug que me han ayudado para desarrollarlo.
No he querido eliminarlos debido a que sirven de ayuda para posibles cambios.

PROGRAMA


Saludos.
Juan Galaz


Bibliografía:

http://arduino.vom-kuhberg.de/index.php
http://seta43.duckdns.org/ardura.html
RADIO DATA SYSTEM- RDS- Por: Aitzol Zuloaga Izaguirre.
http://www.rds.org.uk/2010/Overview.htm