lunes, 30 de marzo de 2015

Arduino - Radio - wxWidgets - SDL

30/03/2015 -
Esta es la continuación de raardu.html
Como creo que C o C++ son los lenguajes mejores que existen para programar, he realizado también en estos lenguajes el programa de control de RadioARDU.
Lo que me satisface más, es el poder compilar para las dos plataformas, Linux o Windows, con solo cambiar la directiva YesWindows 0 por #define YesWindows 1 en el fichero define.h.
Como podéis observar son practicamente iguales para las dos plataformas.


wxWidgets -Linux wxWidgets -Windows

SDL - Linux SDL - Windows
PROGRAMA_wxWidgets
PROGRAMA_sdl


Saludos.
Juan Galaz

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://www.seta43.hol.es/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://www.seta43.hol.es/radiofm.html
http://www.seta43.hol.es/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: