Skip to main content

4.1 Arduino y móvil

Existen módulos adicionales que se pueden conectar a la placa básica Arduino que pueden dotar de una gran funcionalidad a los proyectos que queramos realizar. En esta práctica utilizaremos un módulo Bluetooth que nos permite establecer una comunicación inalámbrica con el entorno, el dispositivo elegido más fácil va a ser un móvil.

Conocimiento previo

  • Programación básica Arduino
  • Uso de librerías externas y comunicación serie (para configuración de parámetros).

Objetivos

  • Conectar el módulo Bluetooth a Arduino.
  • Realizar programas para comunicar Arduino con el exterior vía Bluetooth.
  • Configurar los parámetros del módulo de Bluetooth (avanzado).

Lista de materiales:

  • Arduino UNO.
  • Módulo Bluetooth.
  • Móvil con Android

via GIPHY

Teoría Bluetooth

ONDAS:

Una onda es una señal que se propaga por un medio. Por ejemplo el sonido, que es una onda mecánica que viaja usando el aire o cualquier otro material. Pero en el caso de las señales eléctricas pueden ser enviadas por el cable o a través del vacío (no necesitan un medio para transmitirse).

Dependen de 3 parámetros principalmente:

Amplitud: altura máxima de la onda. Hablando de sonido representaría el volumen. Si nos referimos a una onda eléctrica estaríamos representando normalmente el voltaje.

Longitud de onda λ: distancia entre el primer y último punto de un ciclo de la onda (que normalmente se repite en el tiempo).

Frecuencia f : Número de veces que la onda repite su ciclo en 1 segundo (se mide en hertzios).

Periodo T es simplemente es la inversa de la frecuencia. T=1/f

La relación entre ellas es muy fácil pues las ondas electromagnéticas viajan a la velocidad de la luz c y si velocidad es espacio/tiempo luego c = λ/T luego c= λ*f

Dentro del espectro electromágnético encontramos diferentes tipos de señales dependiendo de las características de su onda.

TRANSMISIÓN INALÁMBRICA: BLUETOOTH.

  • Hoy en día, este grupo está formado por miles de empresas y se utiliza no sólo para teléfonos sino para cientos de dispositivos.
  • Su curioso nombre viene de un antiguo rey Noruego y Danés, y su símbolo, de las antiguas ruinas que representan ese mismo nombre. 
  • Bluetooth es una red inalámbrica de corto alcance pensada para conectar pares de dispositivos y crear una pequeña red punto a punto, (sólo 2 dispositivos).
  • Utiliza una parte del espectro electromagnético llamado “Banda ISM”, reservado para fines no comerciales de la industria, área científica y medicina. Dentro de esta banda también se encuentran todas las redes WIFI que usamos a diario. En concreto funcionan a 2,4GHz.

Hay 3 clases de bluetooth que nos indican la máxima potencia a la que emiten y por tanto la distancia máxima que podrán alcanzar:

También es muy importante la velocidad a la que pueden enviarse los datos con este protocolo:

Recuerda que:

  • Mbps : Mega Bits por segundo.
  • MBps: Mega Bytes por segundo.

¿Te atreves a calcularlo .... ?

¿Cuantos ciclos por segundo tendrán las ondas que están en la Banda ISM?

¿Cuál es el periodo de esas ondas?

Solución


a)2.4G

b) λ=c/f= 12.5cm

¿Te atreves a calcularlo...?

¿A qué distancia y cuanto tiempo tardarían en enviarse los siguientes archivos por Bluetooth?

  1. Un vídeo de 7Mb usando versión 2 clase 2
  2. Una imagen de 2.5Mb usando versión 3 clase 1
  3. Un archivo de texto de 240KB usando versión 1 clase 1

Módulo Bluetooth

Vamos a utilizar en estos ejemplos un módulo esclavo de bluetooth JY-MCU o también HC-06 muy común y económico. Es posible usar otros módulos ya que existe un mercado de desarrollo continuo, en cualquier caso el funcionamiento básico es el mismo. Dicho módulo por tratarse de un módulo esclavo, está configurado para conectarse a un maestro y recibir órdenes de él.  

Inicialmente no necesitas configurarlo, sino que al cargar el código desde el ordenador, conectarás el módulo y este empezará a parpadear indicando que está buscando un master al que conectarse, (por ejemplo tu teléfono o una llave bluetooth usb conectado a un pc).

Como ya sabrás los dispositivos de este tipo tienen que “emparejarse” y tienen que compartir una contraseña para que los datos puedan intercambiarse. Por defecto, estos módulos tienen la contraseña 1234, aunque tanto esto como el nombre, pueden ser actualizados mediante unos comandos especiales, llamados AT y que veremos un poco más adelante.

Arduino tiene 2 pines que permiten enviar y transmitir datos serie (uno datos tras otro). Lo usamos continuamente cuando enviamos un programa desde nuestro ordenador a Arduino o cuando hacemos una lectura desde el monitor serie (con un Serial.print();**).

Arduino tiene definidos estos pines como:

  • pin digital 0: RX <-  (Arduino recibe a través de este pin).
  • pin digital 1: TX -> (Arduino envía a través de este pin).

El módulo bluetooth tiene 4 patillas. 2 para la alimentación y 2 para la comunicación.

Es MUY IMPORTANTE conectar de manera correcta estos pines con Arduino para la correcta comunicación. La patilla que emite los datos (TX) en el bluetooth debe estar conectada a la que recibe los datos (RX) en Arduino, y viceversa. Aunque el módulo funciona a 3.3v, normalmente las placas comerciales, (como la que estamos usando), llevan un regulador y las podemos conectar directamente a los 5v de Arduino.

Conexión en Edubásica

La conexión es muy fácil, ya tiene JP6 para conectarlo diréctamente, con la luz led mirando hacia dentro de la placa:

Conexión sin Edubásica

Es también simple, utilizando una placa Protoboard [descarga .fzz] pero intercambiando Rx y Tx es decir Rx del HC-06 con Tx del Arduino y Tx del HC-06 con Rx del Arduino.

Ordenes

Si la luz está intermitente, el módulo no está vinculado, si está encendido permanente, ya está vinculado.

Una vez vinculado, la orden es sencilla:

_dato = Serial.read();_

donde dato es tipo byte : byte dato;

Ten en cuenta que estamos usando los 2 mismos pines que Arduino usa para la comunicación USB con el ordenador (0, 1), así que no puedes usar el monitor serie para visualizar los datos utilizando el Bluetooth. Igualmente la velocidad tiene que ser igual para entenderse, no pueden ser diferentes.

La APP

Interactuar con el medio es uno de los objetivos primordiales de Arduino. En esta unidad vamos a ver cómo nos podemos comunicar con un dispositivo móvil, posibilitando así el control remoto de la placa. 

La comunicación con Arduino es muy sencilla, el uso común de este dispositivo, será como receptor o emisor de datos. 

En nuestro caso usaremos caracteres (bytes)  que enviaremos desde un master, como un teléfono móvil. Hay muchas aplicaciones gratuitas para enviar datos, por ejemplo, para dispositivos Android podemos utilizar de manera gratuita. Podemos usar cualquier APP que emita un código por Bluetooth.

Arduino Bluetooth Control

Esta APP es muy completa y configurable, aquí para descargarla de Google Play.

El código de programa que tenemos que cargar en el Arduino se basa en escuchar de forma continua el puerto serie. Cuando llegue el dato, se ejecutará la acción que le indiquemos. ¡¡así de sencillo !!

via GIPHY

Vincular móvil

Hay que vincular nuestro móvil y nuestra APP de Android con el Arduino, para ello sigue este sencillo tutorial:

Montaje 1 Encender LEDs

El objetivo de esta práctica es encender los LEDs de EDUBASICA con el móvil:

  • Cuando se pulsa la flecha arriba, la APP lanza el dato U y tiene que encenderse el led ROJO.
  • Cuando se pulsa el botón flecha derecha, la APP lanza el dato Ry tiene que encenderse el led AMARILLO.
  • Cuando se pulsa la flecha abajo, la APP lanza el dato Dy tiene que encenderse el led VERDE.
  • Cuando se pulsa la flecha izquierda, la APP lanza el dato Ly tienen que apagarse todos.

SIN EDUBASICA

No pasa nada, con una placa Protoboard pon 3 leds en D3,D4 y D5 y el módulo Bluetooth.

CON EDUBÁSICA

No hay que hacer nada especial, sólo conectar el módulo Bluetooth

RESULTADO

El vídeo está realizado con otra APP ya desfasada, pero sirve igual de ejemplo, es increible, sólo pasó un mes !

PROGRAMA

Este es el programa que tienes que cargar en el Arduino. Súbelo, empareja tu móvil como hemos visto aquí y conseguirás que la APP encienda los leds como en el vídeo.

```cpp+lineNumbers:true //PROGRAMA DONDE SE ENCIENDEN LOS LEDS DE EDUBASICA SEGÚN LA APP /////////////////// // // FLECHA ARRIBA -> SE ENCIENDE EL LED ROJO // FLECHA DERECHA-> SE ENCIENDE EL LED AMARILLO // FLECHA ABAJO -> SE ENCIENDE EL LED VERDE // FLECHA IZQUIERDA -> SE APAGAN // /////////////////////////////////////////////////////////////////////////////////////////////// int ledArriba = 5; //LED ROJO DE EDUBASICA int ledDerecha = 4; //LED AMARILLO DE EDUBASICA int ledAbajo = 3; // LED VERDE DE EDUBASICA ////////////////////////////////////////////////////////////////////////////////////////////// void setup() { Serial.begin(9600); pinMode(ledArriba,OUTPUT); pinMode(ledAbajo,OUTPUT); pinMode(ledDerecha,OUTPUT); } ///////////////////////////////////////////////////////////////////////////////////////////////////// void loop() {

if(((Serial.read())==('U'))){ digitalWrite(ledArriba, HIGH); digitalWrite(ledAbajo, LOW); digitalWrite(ledDerecha, LOW); } if(((Serial.read())==('D'))){ digitalWrite(ledArriba, LOW); digitalWrite(ledAbajo, HIGH); digitalWrite(ledDerecha, LOW); } if(((Serial.read())==('R'))){ digitalWrite(ledArriba, LOW); digitalWrite(ledAbajo, LOW); digitalWrite(ledDerecha, HIGH); } if(((Serial.read())==('L'))){ digitalWrite(ledArriba, LOW); digitalWrite(ledAbajo, LOW); digitalWrite(ledDerecha, LOW); }

}

```

Montaje 1bis Encender LEDs sin EDUBASICA

Este ejemplo es más avanzado, pero no se puede hacer con edubásica: Vamos a ver un ejemplo implementando un mosaico de LEDs:

Las conexiones serán las siguientes:

El objetivo es que según la tecla que presionemos en la aplicación “Blue Control”, se encenderá el led correspondiente: (arriba, abajo, izquierda, derecha y centro). Además si pulsamos alguno de los botones laterales, los leds deberán realizar una animación de todos los leds:

  • Encendido de los leds en sentido horario.
  • Encendido de los leds en sentido antihorario.
  • Encendido intermitente de los leds exteriores y el interior.
  • Encendido intermitente de todos los leds.

INVENTA MÁS ANIMACIONES PARA INCLUIRLAS EN LOS BOTONES QUE SOBRAN EN LA APLICACIÓN

Para simplificar el código, hemos creado funciones para ejecutar cada una de las animaciones, estas funciones están al final del programa.

La lectura se hace mediante 2 funciones:

  • La función Serial.available() nos indica si hay un dato disponible en el puerto serie (verdadero/falso)
  • Con la función dato = Serial.read(); guardamos el dato en una variable (de typo byte)

Con esto tendremos el código ASCII del  caracter enviado por el maestro, por ejemplo si hemos enviado una A tendremos el 65, B = 66, a = 97, b = 98, ... (ascii.cl/es/)

Lo único que nos queda es comparar el dato recibido y elegir la acción que tiene que hacer Arduino.

Programa

//LEDS CONECTADOS EN FORMA DE ESTRELLA Y UNO EN EL CENTRO
//mEDIANTE BLUETERM ENVIAMOS CARACTERES (SEGUN LAS TECLAS) Y SE
//ENCIENDEN / APAGAN LOS LEDS SELECCIONADOS
int ledArriba = 2;
int ledCentro = 6;
int ledAbajo = 4;
int ledDerecha = 3;
int ledIzquierda = 5;
byte dato;
////////////////////////////////////////////////////////////////////////
void setup() {
Serial.begin(9600);
pinMode(ledArriba,OUTPUT);
pinMode(ledAbajo,OUTPUT);
pinMode(ledIzquierda,OUTPUT);
pinMode(ledDerecha,OUTPUT);
pinMode(ledCentro,OUTPUT);
}
void loop() {
  if (Serial.available()) //Guardamos en la variable dato el valor leido
        dato= Serial.read();
   //Comprobamos el dato
   switch(dato)
       {//Si recibimos una  ...
         case 85: //ARRIBA
         {
           digitalWrite(ledArriba, HIGH);
           digitalWrite(ledAbajo, LOW);
           digitalWrite(ledDerecha, LOW);
           digitalWrite(ledIzquierda, LOW);
           digitalWrite(ledCentro, LOW);

         break;
       }
         case 68: //"U": ABAJO
         {
           digitalWrite(ledArriba, LOW);
           digitalWrite(ledAbajo, HIGH);
           digitalWrite(ledDerecha, LOW);
           digitalWrite(ledIzquierda, LOW);
           digitalWrite(ledCentro, LOW);

           break;
         }
           case 67: //"D": CENTRO
         {
           digitalWrite(ledArriba, LOW);
           digitalWrite(ledAbajo, LOW);
           digitalWrite(ledDerecha, LOW);
           digitalWrite(ledIzquierda, LOW);
           digitalWrite(ledCentro, HIGH);

           break;
         }
         case 76: //"L": IZQ
         { 
           digitalWrite(ledArriba, LOW);
           digitalWrite(ledAbajo, LOW);
           digitalWrite(ledDerecha, LOW);
           digitalWrite(ledIzquierda, HIGH);
           digitalWrite(ledCentro, LOW);
           break;
         }
         case 82: //"R": DCH
         {
           digitalWrite(ledArriba, LOW);
           digitalWrite(ledAbajo, LOW);
           digitalWrite(ledDerecha, HIGH);
           digitalWrite(ledIzquierda, LOW);
           digitalWrite(ledCentro, LOW);
           break;
         }
         case 97: //Recibimos "a"
         {
            sentidoReloj();
            break;
         }
         case 98: //Recibimos "b"
         {
           sentidoContrario();
           break;           
         }
         case 99: //Recibimos "c"
         {
           fueraDentro();
           break;          
         }
}
}

void sentidoReloj(){
   digitalWrite(ledArriba, HIGH);   
  delay(100);                  
  digitalWrite(ledArriba, LOW);    
  delay(10); 
  digitalWrite(ledDerecha, HIGH);   
  delay(100);                  
  digitalWrite(ledDerecha, LOW);    
  delay(10); 
  digitalWrite(ledAbajo, HIGH);   
  delay(100);                  
  digitalWrite(ledAbajo, LOW);    
  delay(10); 
  digitalWrite(ledIzquierda, HIGH);   
  delay(100);                  
  digitalWrite(ledIzquierda, LOW);    
  delay(10); 
 }

void sentidoContrario(){
  digitalWrite(ledArriba, HIGH);   
  delay(100);                  
  digitalWrite(ledArriba, LOW);    
  delay(10); 
  digitalWrite(ledIzquierda, HIGH);   
  delay(100);                  
  digitalWrite(ledIzquierda, LOW);    
  delay(10); 
  digitalWrite(ledAbajo, HIGH);   
  delay(100);                  
  digitalWrite(ledAbajo, LOW);    
  delay(10); 
  digitalWrite(ledDerecha, HIGH);   
  delay(100);                  
  digitalWrite(ledDerecha, LOW);    
  delay(10); 
  }
void fueraDentro(){
 digitalWrite(ledArriba, HIGH);                     
  digitalWrite(ledDerecha, HIGH);    
  digitalWrite(ledAbajo, HIGH);                     
  digitalWrite(ledIzquierda, HIGH);
  delay(1000);
  digitalWrite(ledArriba, LOW);   
  digitalWrite(ledDerecha, LOW); 
  digitalWrite(ledAbajo, LOW); 
  digitalWrite(ledIzquierda, LOW);
  delay(10);
  digitalWrite(ledCentro, HIGH);   
  delay(1000);                  
  digitalWrite(ledCentro, LOW);    
  delay(10); 
}

Configuracion avanzada

Si quieres modificar cosas como la velocidad de conexión, el nombre o la contraseña de tu módulo, aquí te dejamos un código para que subas a tu arduino y mediante el monitor serie lo configures.

Nota: No se pretende que realices el montaje, pero creemos que es importante que veas que el módulo Bluetooth no es cerrado en su configuración.

Para ello hemos creado un nuevo puerto serie para que no interfiera con el USB y podamos usarlo simultáneamente, lo haremos en las patillas 10 y 11.

Deberás conectar el módulo como ves en la figura, y luego cargar el código. Una vez súbido, abre la consola serie y (EN MAYÚSCULAS) ejecuta los comandos que necesites.

Una vez finalizado, puedes desconectar el módulo BT y usarlo con normalidad.

```cpp

include

SoftwareSerial Serial1(11, 10); //10:TX DEL MODULO, 11:RX DEL MODULO String command = ""; // guardará la respuesta desde el BT void setup()
{ Serial.begin(9600); //CONEXION SERIE USB CON ORDENADOR Serial1.begin(9600); //CONEXION SERIE PARA EL MODULO BT Serial.println("Terminal para configurar BT(JY-MCU)"); Serial.println("Comandos AT. USA MAYUSCULAS"); Serial.println("-----------------------------------"); Serial.println("Comando, Respuesta, Paramentros"); Serial.println("AT, OK,--Verifica la conexión--"); Serial.println("AT+VERSION,--Devuelve la version--"); Serial.println("AT+BAUDx, OKxxxx, Set x to: 1=1200 \ 2=2400 3=4800 4=9600 5=19200 6=38400 7=57600 8=115200 \ --para cambiar la velocidad--"); Serial.println("AT+NAMEstring, nombrenuevo (20max)"); Serial.println("AT+PINxxxx, Cambia el pin (1234 por defecto)"); Serial.println("AT+ROLEx,1=MASTER/0=SLAVE --SOLO MASTER"); Serial.println(); }

void loop() { //Chequear si hay datos desde BT if (Serial1.available()) { while(Serial1.available()) { command += (char)Serial1.read(); } Serial.println(command); command = ""; } //Chequear si hay datos desde USB if (Serial.available()){ delay(10); // necesita un pequeño delay Serial1.write(Serial.read()); } } ```