Comunicación Bluetooth-Serie con Arduino

Esta es mi segunda demo de comunicación a través del puerto serie con Arduino. Arduino, para el que no lo sepa es una plataforma de desarrollo con microcontroladores con licencia GNU. …

Arduino cuenta con una gran comunidad, esto creo que es debido sobre todo al precio y la comodidad de tener el programador con conexión USB integrado en la placa y así como los puertos de entrada y salida de conexión rápida mediante pines, además el mismo USB sirve como puerto serie para comunicarse con el microcontrolador. Por si esto fuera poco, lleva una toma de corriente con un regulador de tensión que llega a soportar tensiones entre 6 y 20V, aunque lo recomendado es entre 7 y 12V, de esta forma la placa puede funcionar de forma autónoma sin depender de un ordenador. Es casi como un Lego Mindstorm, para iniciarse no es necesario ni un soldador.
Para el proyecto presente he usado la interfaz Bluetooth-Serie GP-GC021, la ventaja de esta interfaz es que en el sistema maestro creamos una asociación Bluetooth y durante la programación solo es necesario abrir el puerto asociado como si fuera un COM standard.

La conexión realizada es directa BT-TX a ARD-RX y BT-RX a ARD-TX a través de un interruptor que cuando se deja pulsado corta la comunicación, esto es para no interferir durante la programación de la unidad. La alimentación es tomada del pin de 3.3V de la placa.


Como circuito de pruebas he construido un array de LEDs N-común.



He realizado un modelo cliente-servidor, donde el servidor se encuentra en la placa. Este está programado en el pseudo-lenguaje C proporcionado por Arduino. Para comenzar las comunicaciones serie hay que configurar el puerto serie de la placa, esto se hace en procedimiento setup:

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

A continuación, en el procedimiento loop, tan solo debemos realizar las lecturas y escrituras correspondientes sobre Serial:

if(Serial.available()>0) dato = Serial.read();
Serial.write(dato);

Cliente

El cliente lo he programado en C#, ha sido mi primera toma de contacto con este lenguaje y sobre todo lo que he hecho ha sido jugar un poco con las opciones que me daba.
La primera demo la hice en C++ en modo consola, esta la he hecho con interfaz gráfica y apta para Windows Mobile. Al igual que en Java, en C# el mismo programa puede funcionar tanto en el PC con Windows como en el PocketPC, yo he usado Visual Studio, pero se supone que el mismo programa compilado con Mono funcionaría también en Linux y MacOS.
Configuración del puerto:
Este es el procedimiento asociado a las opciones despleglables del botón COM, las opciones van desde COM0 a COM8

private void menuItem1_click(object sender, EventArgs e)
{
     /*ATENCION: SerialPort port es una variable de clase, la coloco aquí solo como orientación.*/
     SerialPort port;   //identificador del puerto 
     String port_name;  //nombre del puerto (COM0 a COM8)
     //si ya existia el puerto, lo cerramos
     if (port!=null && port.IsOpen) port.Close();
     MenuItem mi = (MenuItem)sender;  //identificamos el botón pulsado
     port_name = mi.Text; 
     //configuración del puerto
     port = new SerialPort(port_name, 9600, Parity.None, 8, StopBits.One); 
     port.ReadTimeout = 200; 
     port.WriteTimeout = 200;
     port.DtrEnable = false;
     port.RtsEnable = false;
     //abrir el puerto configurado
     try 
     {   
          this.button4.Text = "WAIT";
          port.Open();
          this.button4.Text = "Puerto OK";
     }
     catch (System.IO.IOException exc)
     {
          this.button4.Text = "ERROR Puerto";
     }
     catch (UnauthorizedAccessException exc)
     {
          this.button4.Text = "ERROR Puerto";
     }
}

Para las escrituras:

port.Write("3");

y así de fácil es trabajar con el puerto serie.
Pero hay una cosa más muy importante:
el botón FLASH trabaja con una orden (le he dado el código 3) y una cadena con números del 000 al 999, el problema esta en que el puerto serie de Arduino trabaja asincronamente y el timeout no se puede configurar, lo que hace que si no hay datos el programa salta la instrucción Serial.read() y continúa con la siguiente. Los datos viajan al puerto serie a una velocidad de 9600bps, lo que implica que cada carácter (de 8 bits) tarda en llegar 833 microsegundos, mientras tanto, el microcontrolador trabaja a una frecuencia de 16 MHz lo que contando con que cada microinstrucción tarde 4 ciclos de reloj en completarse, que serían 25 microsegundos, a este le da tiempo a ejecutar alrededor de 33 microinstrucciones. Esto quiere decir que es muy importante meter un delay para cuando leamos datos en instrucciones independientes. Ademas hay que contar con que trabajamos con sistemas operativos multitarea y que el cliente puede tardar mas de lo estimado en ejecutar la siguiente instrucción.

Archivo ejecutable BT_Ard

Anuncios

19 pensamientos en “Comunicación Bluetooth-Serie con Arduino

  1. anonymous

    Burt writes:Eh, el video es privado, no puedo verlo u_U.Por otro lado, estoy en Málaga hasta el domingo de la semana que viene, a ver si nos vemos eh 😛

    Responder
  2. anonymous

    Misael writes:Hola me encanta este proyecto, yo estoy intentado realizar la comunicacion y ni eso consigo!!!…Espero que no te importe si te hago una pregunta, ¿sabrias decirme si se te empareja el modulo bluetooth con el movil? te aparece como conectado?A mi se me empareja una vez introducida la contraseña 1234 pero al intentar enviar datos desde el movil me aparece desconectado. un saludo y mil gracias.

    Responder
  3. gatodrolo

    pues si, lo primero que hago es emparejar los dispositivos, que es donde se introduce la contraseña, después se supone de que tienes un puerto COM asociado con el dispositivo recién emparejado, pero hasta aquí el dispositivo aparece desconectado. Es cuando desde el programa servidor (en mi caso) abre el puerto COM (la linea port.Open(); ) cuando se conecta el bluetooth.

    Responder
  4. anonymous

    Misael writes:WAy !!! muchisimas gracias por contestar !!!…eso me aclara algunas dudas, el mio se empareja pero cuando intento enviar datos desde el terminal bluetooth me dice que esta desconectado :(…TE importaria subir el soft que tienes hecho para probarlo en mi movil, te lo agradeceria enormemente. Un saludo.

    Responder
  5. gatodrolo

    Ok, aquí esta, en la última linea del post. Espero que siga funcionando bien, porque tiene ya varios meses y no recuerdo si toqué algo, aun así la parte que abre el puerto COM debería de funcionar ya que esa es seguro que sigue intacta. El mismo programa también te debería de funcionar en el PC, al menos a mi me funciona.

    Responder
  6. anonymous

    Misael writes:Bieenn!!!! si que funciona!!! que alegria, es algo que tiene mi soft que esta mal,he probado con el PC y soft y funciona perfectamente, pero mediante un terminal bluetooth de aplicacion android no me funciona, quizas no abra el puerto o no sepa el puerto por cual debe enviar la informacion.Muchisimas gracias por tu ayuda !!!!…seguire investigando Un saludo.

    Responder
  7. gatodrolo

    De nada, me alegro que te haya funcionado, el código principal de la aplicación es el de arriba, todo lo demás tiene solo la definición de los botones y a cada botón un port.write(""); asociado. Y en android no funcionará porque habría que compilarlo con Mono (http://www.mono-project.com/Main_Page), yo no lo he probado porque ahora mismo no es mi prioridad. Un saludo!

    Responder
  8. anonymous

    Anonymous writes:No me refiero a la alimentacion. si no al nivel TTL en RX y TX del arduino para el GPGC. Acabo de hacer la recomendacion del datasheet 2 transistores y la resistencia, para conectar el MCU que trabaja a 5v con el GPGC. si me funciona pero, ahora que lo hice supngo que te funciona asi directo porque han de tener activadas las resistencias pullup internas en el atmega, no crees? imagino que los tresholds y niveles logicos son aceptados.Intente subir el sketch por bluetooth y no se comunica. Se supone que pin 0 y 1 son los mismos del FTDI no?. Sera problem con mi dongle bluetooth?, porque es el mentado bluesolei y pinches drivers no me gustan, por lo que les puse los del windows mdcom algo asi no recuerdo. Pero si me conecto por hyperterminal si tengo comunicacion con el arduino.

    Responder
  9. gatodrolo

    Respecto a los niveles TTL, solo puedo decir OOOPSS!!, es que ni siquiera se me pasó por la cabeza el que uno va a 5V y el otro a 3.3V. Un pequeño fallo.. porque al fin y al cabo, como se ve en el vídeo, funciona. Pero si tuviera que estar transmitiendo continuamente datos (como por ejemplo streaming de audio), quizás se calentase demasiado y comenzaría a fallar. Ya hice un circuito para realizar esta conversión con el puerto serie de una Fonera (router de FON), así que lo correcto sería usarlo aquí también.Yo tampoco he conseguido subir un sketch a través del bluetooth, por eso tengo el pulsador para activar o desactivar el módulo, pero creo que al igual que tengo que desconectar este para programar con el FTDI, habría que desconectar el FTDI para grabar con bluetooth.

    Responder
  10. anonymous

    Anonymous writes:He estado revisando el datasheet del duemilanove, siento que el asunto esta en el reset pin. a ese llega el RTS y el DTR del FDTI, quiza le falte resetearse, porque intente solo usanto tx y rx, y parece que si sube algo, porque el sketch que tenia previamente ya no estaba, es decir, despues del intento, ya no hacia lo que tenia programado previamente. Tambien busque un poco, y tambien es posible. El bootloader viene a otro baud rate, si cambiaramos a 9600 podria ser lo que falta.

    Responder
  11. anonymous

    AMeRu writes:Hola, estoy trabajando con Arduino y Android, pero para una comunicación bluetooth, pero realmente desconozco el código para poder lograrlo, mi verdadero interés es saber como recibir señales digitales de un arduino en un dispositivo móvil por bluetooth, es decir, leer información y no enviarla, podrías ayudarme???

    Responder
  12. anonymous

    Javier writes:Buenos dias.Muy interesante el proyecto , enhorabuena.Pero ¿cómo se conecta el modulo BT a la placa arduino?un saludo

    Responder
  13. gatodrolo

    El módulo utiliza 4 cables, +3.3V, GND, TXD y RXD. Estos últimos van cruzados con el RXD y TXD de la placa de Arduino. Como ya me comentó otra persona, los TXD y RXD de Arduino van a 5V y los del Bluetooth a 3.3V. Yo lo conecté mal, pero ha funcionado hasta ahora. Si lo haces igual puede que funcione o puede que se queme.

    Responder

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s