Después de tanto tiempo liado sin poder hacer nada por los exámenes, ahora parece que estoy algo más libre, así que voy a ir intentando explicar poco a poco (según yo lo vaya aprendiendo), como usar, de una forma básica el módulo bluetooth, unido a android.
Este es mi módulo bluetooth, comprado en DX, creo que era el más barato que había.
El conexionado es muy sencillo, solo hay que tener en cuenta que el emisor del arduino tiene que ir con el receptor del bluetooth y viceversa:
- Conectas Vcc del bluetooth a +5V
- GND a GND
- TX--->RX
- RX--->TX
Cuidado, es importante no confundir la polarización, invertir Vcc y gnd, ya que te cargarás el bluetooth, COMPROBADO.
Si la placa de arduino está alimentada, cuando lo conectes, empezará a parpadear una luz. Una vez aquí ya puedes sincronizar tu dispositivo con el móvil.
El nombre es linvor y el pin por defecto es 1234. Cuando lo sincronices, la luz que parpadeaba se quedará fija.
Una vez sincronizados los dos dispositivos, ¿qué hacemos?
Por Internet hay varios programas que sirven para hacer alguna cosa con ambos dispositivos (amarino, ArduinoCommander,...). Yo después de varios intentos con estos programas he decidido dejarlos de lado y crearme mi propio programa para android de una forma sencilla (uniendo bloques desde esta pagina), pero esto lo explicaré más tarde, ahora vamos a ver que comandos podemos usar para la comunicación. Es una comunicación serial, así que voy a ir explicando los distintos comandos que tiene arduino para la comunicación serial.
Antes de nada dejo este enlace para quien no sepa lo que son los baudios, y así no ande perdido. Como podreís observar, algunas definiciones son tal cual copiadas de la página oficial de arduino.
Mi dispositivo tiene una velocidad de serie de 9600 buadios, esto es necesario saberlo para así poder establecer la comunicación entre los dispositivos.
Comandos Comunicación Serial:
begin()
Usado para establecer la velocidad a la que se comunicarán nuestro dispositivos. La sintaxis es la siguiente:
Serial.begin(velocidad)
Las velocidades más comunes son:
300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600 o 115200.
Se suele poner en la parte del setup.
end()
Desactiva la comunicación serie, permitiendo a los pines RX and TX ser usados como entradas o salidas digitales. Para reactivar la comunicación serie, llama al método Serial.begin(). Sintaxis:
Serial.end()
available()
Devuelve el número de bytes (caracteres) disponibles para ser leidos por el puerto serie. Se refiere a datos ya recibidos y disponibles en el buffer de recepción del puerto (que tiene una capacidad de 128 bytes). Sintaxis:
Serial.available()
read()
Lee los datos que le llegan por el puerto serie. Sintaxis:
Serial.read()
Si no hay datos disponible devuelve -1; si hay algo disponible, va recibiendo datos byte a byte.
print()
Este comando imprime en el puerte serie. Puede tener dos sintaxis, dependiendo de si queremos o no dar formato a lo que imprimimos:
Serial.print(valor)
Ejemplos:
- Serial.print(78) imprime el número "78"
- Serial.print(1.23456) imprime el float"1.23"
- Serial.print(byte(78)) imprime el caracter "N" (cuyo código ASCII es 78)
- Serial.print('N') imprime el caracter "N"
- Serial.print("Hola Mundo") imprime la cadena "Hola Mundo."
Serial.print(valor,formato)
Ejemplos:
- Serial.print(78, BYTE) imprime el caracter "N"
- Serial.print(78, BIN) imprime "1001110"
- Serial.print(78, OCT) imprime "116"
- Serial.print(78, DEC) imprime "78"
- Serial.print(78, HEX) imprime "4E"
- Serial.print(1.23456, 0) imprime "1"
- Serial.print(1.23456, 2) imprime "1.23"
- Serial.print(1.23456, 4) imprime "1.2346"
println()
Es lo igual que print(), pero con la diferencia de que hace que lo próximo que se imprima en el puerto, sea en linea nueva. La sintaxis es la misma:
Serial.println(valor)
Serial.println(valor, formato)
El siguiente, es un sencillo ejemplo, cuya finalidad es imprimir lo que le llega por el puerto serie.
int dato;
void setup(){
Serial.begin(9600);
}
void loop(){
dato=Serial.read();
if(dato>0){
Serial.print(dato);
}
}
write()
Escribe datos binarios en el puerto serie. Estos datos se envían como un byte o una serie de bytes; para enviar los caracteres que representan los dígitos de un número usar funcion print () en su lugar. Sintaxis:
Serial.write(caracter)
Envia un solo byte
Serial.write(cadena)
Envia una cadena como serie de bytes
Serial.write(buf, longitud)
Envia un 'array', de una determinada longitud, como una serie de bytes
flush()
Vacía el búfer de entrada de datos en serie. Es decir, cualquier llamada a Serial.read () o Serial.available () devolverá sólo los datos recibidos después la llamada más reciente a Serial.flush (). Sintaxis:
Serial.flush()
Una vez llegado a este punto ya sabes todo lo que podemos hacer desde la parte de Arduino, ahora nos hace falta saber como enviar esto desde Android.
Primero vamos a crear el programa para nuestro arduino desde el IDE. Mi programa quiero que me permita encender y apagar 4 diodos. Mi programa es el siguiente:
int dato; //en esta variable almacenare el dato que obtengo del puerto serie
//asigno a cada led un pin
int ledAzul=10;
int ledRojo=11;
int ledNaranja=12;
int ledVerde=13;
//variables logicas para almacenar el estado de los leds (1=encendido,0=apagado)
boolean estadoAzul=0;
boolean estadoRojo=0;
boolean estadoVerde=0;
boolean estadoNaranja=0;
//inicializo el puerto serie y los pines de los diodos como de salida
void setup(){
Serial.begin(9600);
pinMode(ledAzul,OUTPUT);
pinMode(ledRojo,OUTPUT);
pinMode(ledVerde,OUTPUT);
pinMode(ledNaranja,OUTPUT);
}
void loop(){
//obtengo dato del puerto serie
dato=Serial.read();
//comprobamos si el dato es alguno de los valores que utilizo para cambiar de estado los diodos (1,2,3,4)
//si es asi, cambio el estado del diodo correspondiente
if(dato==1){
estadoVerde=!estadoVerde;
}else if(dato==2){
estadoNaranja=!estadoNaranja;
}else if(dato==3){
estadoRojo=!estadoRojo;
}else if(dato==4){
estadoAzul=!estadoAzul;
}
//les asigno a cada diodo su estado
digitalWrite(ledVerde,estadoVerde);
digitalWrite(ledAzul,estadoAzul);
digitalWrite(ledRojo,estadoRojo);
digitalWrite(ledNaranja,estadoNaranja);
//imprimimos lo que nos llega por el puerto serie (siempre que se envie algo)
if(dato>0){
Serial.print(dato);
}
}
Una vez definido el programa, lo debemos de compilar y subir a Arduino.
CUIDADO, en mi caso, si tengo conectado el bluetooth al arduiono, a la hora de pasar un programa, me da error, por lo que debo de desconectar de receptor de la placa e arduino( emisor del bluetooth) para evitar interferencias.
Una vez copiado el programa, tenemos que diseñar la aplicación para android.Para ello vamos a la página http://beta.appinventor.mit.edu/ allí asociamos (si teneis y si no la creais) vuestra cuenta de gmail.
Es un entorno bastante intuitivo. Lo primero de todo es crear un nuevo proyecto, le damos a My proyects y a nuevo, y escribimos un nu¡ombre, yo lo he llamado pruebas arduino.
En ese momento nos aparecerá algo como esto:
Esta pagina tiene varias partes:
- En la parte izquierda aparecen todos los objetos que podemos incluir en nuestra aplicación
- En la parte central aparece el entorno gráfico de nuestra aplicación
- En la parte central-derecha, aparece un listado de los objetos de nuestra aplicacion.
- En la parte derecha aparecen las propiedades de los objetos de nuestra aplicación.
La aplicación que vamos a desarrollar va a poder apgar/encender cuatro diodos de colores. Estos diodos yo los he colocado en las salidas de pwm 13 (el diodo verde), 12 (el naranja), 11 (el rojo) y 10 (el azul). Para encender cada uno vamos a utilizar un checbox. Entonces cogemos y arrastramos cuatro Checkbox a nuestra aplicación. para cambiarles de nombre vamos al listado de componentes y en la parte inferior le damos a Rename. TRambién podemos cambiarles el texto que muestran, en propiedades, text.Una vez hecho nos quedará algo así
Además de los CheckBox, tenemos que añadir un cliente de bluetooth, para ello vamos a Palette y pinchamos en Other Stuff, ahí buscamos BluetoothClient, y lo arrastramos a nuestra ventana. Además para establecer la conexión usaremos un botón, yo le he puesto de texto conectar. Una vez añadidos todos los objetos, tenemos que decirle al programa que queremos que haga cada uno. Para ello pulsamos en "Open Blocks Editor", para abrir esto es necesario tener java instalado en nuestro ordenador. Se nos descargar un archivo, le damos, y despues de acptar varias cosas, se nos abrirá algo como esto:
En esta otra pestaña será en la que programaremos las acciones. No lo haremos directamente con programación, si no de una forma más intuitiva, arrastrando bloques.
El panel lateral es donde se encuentran todos los bloques, los Built-In son los bloques de uso general (estructuras de programación típicas, listas, textos, números,...); en la pestaña My blocks nos aperecen las acciones que pueden realizar los objetos que tenemos en creados en nuestra aplicación.
Lo primero de todo queremos que al pulsar en el boton que hemos creado, se conecte al dispositivo:
-Arrastramos, dentro de nuestro boton, el primero bloque que nos aparece, el que pone click.
-Ahora vamos al bluetooth y vamos al que ponga Conect. Observamos que no lo podemos poner directamente, ya que no encajen, para que encajen, nos hace falta un bloque intermedio. Vamos a los generales, pulsamos en Definition y arrastramos el primero que nos aparece, hacemos encajar todos los bloques. hasta que nos quede algo como esto.
En el hueco que nos keda para encajar, tenemos que poner la mac de nuestro dispositivo, en mi caso es 00:12:11:23:28:27, añadimos un texto, y la ponemos tal cual.
Ahora tenemos que añadir las acciones de cada uno de nuestro checbox, para ello pinchamos en cada uno y seleccionamos el bloque que pone Changed. Queremos que envie un valor cada vez que cambie, asi que de subbloque le tenemos que poner uno del bluetooth que envie un digito, este es el que pone Send1ByteNumber. A cada uno checbox le ponemos que envie un numero distinto. AL final nos queda algo como esto:
Una vez acabado esto, tenemos varias posibilidades, desde la venta principal (la de diseño del programa) nos permite la opción de descargarnos la aplicación en este ordenador, solo tendriamos que copiarla e instalarla.
Otra opción más práctica es poder probar continuamente los cambios en nuestro terminal. Para esta opción necesitamos estar conectados con el ordenador y el movil en la misma red wifi. Además necesitamos descargarnos la aplicación del market MIT AICompanion. Una vez instalada la ejecutamos, nos pedira un código. Para obtenerlo vamos, en nuestro ordenador, a la ventana de los bloques y le damos, en la parte superior a Connetc to Device, y selecionamos WIFI, el codigo que nos da, lo metemos en la app y ya podremos probar continuamente los cambios que hagamos en la aplicación OnLine.
Para probar la app, le damos a conectar, dejara de parpadear la luz, y al tocar los checbox, cambiara el estado de las luces por arte de magia.
Espero que os haya sido útil esta información y que esto os sirva de base para desde ahi poder empezar a desarrollar, ya que a mi lo que en verdad me costó ha sido empezar y saber como comunicarme entre el movil y Arduino ya que me intentaba basar en aplicaciones ya hechas.
De todas formas, por si os sirve de ayuda, os adjunto un archivo con el programa para arduino la la aplicacion para android.
Cualquier fallo, duda, sugerencia, petencion... es agradecida.
Amigo primero que nada, Felicidades por este blog tan grandeoso, me ha ayudado bastante, GRACIAS, Ahora quisiera molestarte, no se si puedas ayudarme, te explico: Del lado de arduino tengo un potenciometro (obvio en la entrda analógica) y esos datos que leo quiero enviarlos a android pero de manera constante, pór ejemplo cada segundo, quisiera saber como puedo recibirlos en android y por ejemplo que la etiqueta se actualiza cada segundo o cada que reciba el valor, este es mi código en arduino:
ResponderEliminarfloat val;
int potPin=0;
float valF=0;
void setup()
{
Serial.begin(9600);
}
void loop()
{
val=analogRead(potPin);
valF=((val/4)/255)*5;
Serial.println(valF);
delay(1000);
}
Buenas noches Daviz, lo primero de todo darte las gracias ya que eres el primer comentario que recibo, y ademas es positivo, asi que perfecto. Ahora me pillas en un mal momento, ya que estas dos semanas estoy en época de exámenes en la uni, pero en cuanto acabe prometo intentar ayudarte lo más rápido y mejor que pueda.
EliminarGracias de nuevo.
Buenas Daviz, lo siento por la tardanza, me imagino que ya habrás resuelto tu duda, pero de todas formas quiero contestarte por si alguien más tiene el mismo problema. Acabo de publicar otro ejemplo de comunicación bluetooth más completo donde el móvil envía un comando, y la placa de Arduino le contesta (handshake), lo que se me ocurre que podías poner un timer en la Aplicación de Android, y cada vez que se complete el tiempo que fijes, le envíe un comando (lo que tu quieres) y el Arduino le conteste con el valor del puerto Analógico.
EliminarLo siento por la tardanza.
Gracias amigo!!! tu publicacion es excelente ya que me ha ayudado hasta conectar con wifi directamente desde mi tablet, sin necesidad de estar extrayendo la memoria. Mira tengo una duda tendras a la mano un pequeño ejemplo de comunicacion , en el cual mande datos desde el arduino via bluetooth hacia mi tablet ?
ResponderEliminarGracias y deseo que salgas bien en tus estudios.
Saludes amigo
Lo siento por la tardanza, acabo de publicar otro ejemplo donde se explica como "contestar" a mensajes con el Arduino que le lleguen desde Android
EliminarAmigo no me funciona. Ya hizo todo tal y como lo explicas, pero al momento de pinchar desde arduino no encienden los led. SE conecta y todo pero no funciona. Ayuda
ResponderEliminarBuenas lo siento por la tardanza, has conseguido hacerlo funcionar?? algún detalle más no vendría mal...
EliminarDisculpa tengo unas preguntas tal vez me puedas ayudar, quiero hacer esto pero al reves ja, que el arduino mande una señal,variable, que mande algo por bluetooth al celular android y que en lugar de pulsar algo en el movil visualicemos algo un texto, algun led dibujado en la pantalla, quisiera saber si se puede estoy atorado en un proyecto, espero y me alla explicado bien y me puedas ayudar je, un saludo y muy bien explicado tu tutorial.
ResponderEliminarComo le he comentado a Carloz, podrías poner un timer en la aplicación de Android y comprobar si hay algún mensaje pendiente de leer con BytesAvailableToReceive en tu aplicación de Android.
EliminarLo siento por la tardanza en contestar
ME SALE UN ERROR DE BLUETOOTH_ADMIN
ResponderEliminarME PODRIAS AYUDAR
Sigue el problema? si es así dame algún detalle más. Lo siento por la tardanza
EliminarYo tambien estoy interesado en lo que comenta DavizTheGoldman....
ResponderEliminarOk miraté si quieres el nuevo ejemplo que acabo de publicar, con eso creo que lo puedes conseguir.
Eliminaruna duda no entendi lo del la MAC de mi dispositivo me lo podrian explicar porfavor
ResponderEliminarBuenas, lo siento por la tardanza, si sigues teniendo problemas, lo acabo de explicar mejor en otro ejemplo que acabo de publicar.
Eliminarhola muchas gracias por hacer estos articulo despejan muchas dudas que tengo ,
ResponderEliminarte queria preguntar si se pude variar la intencidad del led desde android del el 0 al 255 y como se realiza de antemano gracias?
Hola, yo tengo un problema, ya compre 2 modulos diferentes de bluetooth, tengo el RN42 Y EL HC-06, he probado por separado cada modulo, conectando solo el pin de alimentacion y el pin de tierra. Al quererlo sincronizar con el telefono, lo hace pero el led nunca deja de parpadear, lo que significa que no hubo sincronizacion. Al probar con otro celular android, este dice "sincronizado pero sin conexion". Ambos funcionan con la misma contraseña y a 9600 baudios. Podrias ayudarme a identificar cual es el problema?
ResponderEliminarHola Álvaro , enhorabuena y gracias de antemano por tus conocimientos, quisiera preguntarte, como puedo controlar entre dos Arduinos vía bluetooth, el brillo o la intensidad de encendido de dos led, cada uno con un potenciometro distinto, me explico en un lado un Arduino Maestro con dos potenciometros, y en otro lado un Arduino esclavo con los dos led , un potenciometros encendería un led y el otro potenciometro para el otro led, podrías pasarme el código de Maestro y Esclavo por favor , gracias espero tu respuesta
ResponderEliminarHola Álvaro , enhorabuena y gracias de antemano por tus conocimientos, quisiera preguntarte, como puedo controlar entre dos Arduinos vía bluetooth, el brillo o la intensidad de encendido de dos led, cada uno con un potenciometro distinto, me explico en un lado un Arduino Maestro con dos potenciometros, y en otro lado un Arduino esclavo con los dos led , un potenciometros encendería un led y el otro potenciometro para el otro led, podrías pasarme el código de Maestro y Esclavo por favor , gracias espero tu respuesta
ResponderEliminar