Skip to main content

Reto: comunicación Bluetooth

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.


//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()); } } ```


Bluetooth maestro

Vamos a hacer una especial mención a este tipo de módulos.

Hemos comentado que las redes bluetooth se crean entre 2 dispositivos. Normalmente uno emite y el otro recibe, pero puede darse que los dos emitan y reciban. Para esto el módulo tiene que ser capaz de poder cambiar de modo master a slave. No todos los BT permiten hacer esto. Si compramos algún módulo económico para arduino, seguramente estaremos comprando un módulo SLAVE. Este sólo podrá recibir datos de otro dispositivo. Si queremos que nuestra arduino envíe datos deberemos usar un módulo MASTER.

El módulo master es físicamente igual que el esclavo , aunque incorpora un firmware distinto  HC-05 (firmware: las intrucciones que hacen que funcione al hardware). Otra diferencia es que lleva soldado al menos un pin más. Este pin llamado key, es necesario para que el módulo entre en modo de “comandos AT”, y así podamos programar su funcionamiento. Esto lo podemos hacer con el mísmo código que te hemos mostrado en el punto anterior. Para acceder a este modo especial en el master lo podemos hacer de 2 formas:

  1. Conectando Key a 3.3v y encender el módulo. Así funciona a 38400 bauds.
  2. Encendiendo el módulo y después conectando el key a 3.3v. Así funciona a 9600 bauds, (es más sencillo pues es el que usa por defecto).

Los comandos AT en HC-05, al contrario que en el HC-06 (esclavo), que es el que tendrá mucha gente , tienen que llevar el símbolo "=", por ejemplo:

En HC-06: AT+NAMEnombre

En HC-05: AT+NAME=nombre

El datasheet indica que por defecto vienen con el modo CMODE=1 (para conectarse a cualquier esclavo disponible), sin embargo hay que comporbarlo (AT+CMODE?) por si tienen el CMODE=0 por lo que se intenta conectar al último emparejado, (en este caso no se emparejaría con ningún esclavo), así que hay que cambiar el CMODE con AT+CMODE=1)

El HC-05 tiene 6 pines: