G049 Conectando Arduino al PC vía BlueTooth

Descripción
Una de las cosas más frecuentes cuando utilizas Arduino, es usarlo como Data Logger, es decir, como un sistema de recolección de datos procedentes de otro sistema cualquiera para su estudio o proceso posterior.

Una de las maneras más típicas es usar lector de tarjetas SD para que se pueda retirar al cabo de un tiempo, pero a nivel doméstico o a pequeña escala es más sencillo usar un enlace Bluetooth para recibir esos datos directamente en el PC y almacenarlos allí.

Una de las ventajas de tener una conexión inalámbrica entre PC y Arduino es el hecho de que es muy atractiva y compensa los inconvenientes.

Otra ventaja de este método es que se pueden gobernar circuitos de Arduino directamente desde un PC de control, ideal para domótica, adquisición de datos, pequeños robots o motores etc.

Conectar ei PC a Arduino por Bluetooth es tan fácil como lo ha sido para conectarlo a un teléfono móvil, y en muchas ocasiones bastante más práctico.

Así que vamos a instalar un adaptador > Bluetooth a nuestro PC Si en caso de no tenerlo incluido en el PC y luego vincularlo al módulo BT del Arduino.
 


Materiales
Placa de Arduino
1 módulo HC-05
4 Resistencias 330
4 Diodos LED (de distintos colores)
1 Adaptador Bluetooth para el PC
Protoboard, Cables para conexiones y un cable USB para conectar Arduino al PC y sirve además de alimentación.

Esquema
Vamos a reusar el mismo circuito que usamos en la sesión previa, pero con algunos cambios. De hecho hemos retirado tres resistencia ya que no vamos a tener encendido todos los diodos a la vez.



Montaje


Conexión de adaptador BlueTooth al PC
Una vez que conectemos el adaptador Bluetooth al PC deberíamos poder pinchar en los iconos inferiores a la derecha de Windows  y ver el símbolo de Bluetooth. Si no es así basta con desplegar  los iconos ocultos pichando en la flechita:


Si hacemos doble clic en el símbolo de Bluetooth y se abrirá la ventana de configuración para añadir dispositivos bluetooth

Pulsando sobre agregar dispositivos aparecerá el siguient cuadro de diálogo

y pulsamos con el ratón sobre Bluetooth y saldrá la siguiente ventana

Aquí esperamos hasta que salga el nombre de dispositivo o el nombre que le hayas dado al módulo HC-05, una vez te salga, pincha sobre él para emparejarlo y si es la primera vez te pedirá el PIN que le hayas configurado previamente. Introduces dicho PIN y listo.

Si no te sale el módulo la primera vez entonces tienes que bajar abajo a donde dice Detección de dispositivos Bluetooth y pulsa el botón para que aparezca la opción avanzados y quede igual que la siguiente imagen

Una vez realizado esto vuelve a intentar agregar dispositivo Bluetooth y verás que ahora si sale.  

Si ya has hecho este paso, para las proximas veces tu dispositivo quedará guardado y solo tiene que pulsar sobre él para emparejarlo. Si no es así pincha en los puntos suspensivos de la derecha y Quita el dispositivo y vuelve a emparejarlo usando los pasos anteriores.
 


Necesitamos ahora un programa de terminal serie que nos permita abrir una conexión con el adaptador BlueTooth del PC una vez vinculado a Arduino.  

Instalación y configuración del Programa PuTTY
Vamos a usar un programa que se llama Putty. Una búsqueda en Google de Putty os enviara rápidamente a su página de descarga.

Es un programa con muchas opciones y que sirve para casi cualquier cosa que envié datos en Stream, incluyendo puertas series, TCPIP y además  acepta conexiones seguras SSH, y encima es gratis.
Cuando arrancas Putty aparece esta ventana


En Conection type marca serial y saldrá lo siguiente

En mi caso he seleccionado Serial en COM14 por que windows ha asignado ese puerto a mi módulo HC-05 y 9600 de velocidad. 

Para saber que puerto ha asignado windows al módulo, pulsais windows+R  y en el cuadro de diálogo escribir 

explorer.exe shell:::{A8A91A66-3A7D-4424-8D24-04E180695C7A}

y cuando pulses aceptar te lleva a esta ventana


Dispositivos e impresoras versión antigua. Sobre el icono de tu BT pincha con el botón derecho y elige propiedades

Luego en el cuadro de diálogo pincha sobre la pestaña Servicios y te sale el puerto que necesitas saber

Si no te sale, marca la casilla de verificación y le das a aplicar y luego si que te saldrá.

Seguimos una vez puesto el puerto y la velocidad, nos vamos en la columna de la izquierda a la sección de Logging (Registro), conviene pedirle que guarde registro de todo el cruce de información entre el PC y Arduino vía BT, para que lo podamos ver más tarde.

Para ello en el apartado de Session logging remarco All session output. Luego le doy al botón Browser y seleccion la carpeta donde se va a guardar y también le pongo un nombre  al fichero que va a guardar todo en mi caso putty.log

También marco la opción Always overwrite it para que cada vez que abra el putty me machaque lo anterior, así no acumulo ficheros y no me pregunta cada vez si lo quiero sobreescribir.


Ahora en la columna de la izquierda nos vamos a Terminal, seleccionamos que fuerce el hecho en lo que recibimos y también en lo que enviamos. Para ello en el apartado discipline options, en Local Echo y en Local line echo seleccionamos en ambos casos Force on
 

Si ahora miramos el LED del módulo veremos que está parpadeando rápidamente. bien, seguimos.

Finalmente en la columna de la izquierda volvemos a la sección de Session y guardamos la configuración con un nombre para usarla en otro momento y pulsamos en save.  y verás que se añade a la lista el nombre de la configuración salvada. Ahora ya podemos pulsar el boto Open  para abrir la comunicación. 

PuTTY se abre siempre en blanco por defecto y solo hay que hecer doble click en el nombre que le has dado, en este caso sobre HC-05 de la lista. 

Ahora bien si lo que quieres es que tu configuración sea por defecto la que hemos configurado y que cada vez que se abra ya aparezca con esta configuración entonce antes de guardar nada, haz un solo click sobre Default Settings en la lista y se marcará en azul, luego pulsas sobre save y listo ya la configuración que has hecho se ha guardado para que sea la que salga siempre por defecto. 

A continuación le das a OPEN y a
l hacerlo veréis que el testigo piloto del módulo Bluetooth deja de parpadear quedándose apagado y comienza a parpardear cada dos segundo. Indica que se ha establecido la comunicación y además se ha abierto la pantalla negra de PuTTY
 


Código
El programa de gestión de la conexión es de lo más sencillo. Vamos a aceptar en el Arduino 3 órdenes que corresponden a los pines 13,12 y 11. Cuando recibamos un numero de pin, invertiremos el estado del mismo pasando el LED de apagado a encendido y viceversa.

Además, como queremos que nuestro Arduino nos envié datos al PC para su almacenamiento, estableceremos un programa que envié los valores de las puertas analógicas A0,A1 y A2, aun cuando no tienen nada conectado, por lo que serán valores aleatorios.


#include <SoftwareSerial.h>

// Definimos los pines RX y TX para el Bluetooth
// Recuerda: El pin 3 del Arduino va al TX del HC-05 y el pin 2 al RX del HC-05
SoftwareSerial BT1(3, 2);

unsigned long tiempoAnterior = 0; // Variable para controlar el envío cada 3 segundos

void setup() {  
  Serial.begin(9600);   // Monitor serie del PC (Cable USB)
  BT1.begin(9600);     // Velocidad del módulo Bluetooth (cambiar a 9600 si no comunica)
 
  // Configuramos los pines de los LEDs como salidas
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
 
  Serial.println("Sistema Bluetooth Inicializado. Esperando comandos...");
}

void loop() {
  // 1. LEER DEL BLUETOOTH (HC-05 / PuTTY) Y PROCESAR
  if (BT1.available()) {
    String B = GetLineBT(); // Leemos la línea completa adaptada a PuTTY
    Serial.print("Recibido por BT: ");
    Serial.println(B);      // Lo mostramos en el monitor serie del USB para depurar
   
    // Control de los LEDs (Invierte el estado actual del PIN)
    if (B == "13") {
      digitalWrite(13, !digitalRead(13));
    }
    if (B == "12") {
      digitalWrite(12, !digitalRead(12));
    }
    if (B == "11") {
      digitalWrite(11, !digitalRead(11));
    }
  }

  // 2. LEER DEL MONITOR SERIE (USB) Y MANDAR AL BLUETOOTH
  if (Serial.available()) {
    String S = GetLine();   // Leemos la línea de la consola de Arduino
    BT1.println(S);         // Se la enviamos a PuTTY
    Serial.println("Enviado a BT: " + S);
  }

  // 3. ENVIAR DATOS ANALÓGICOS CADA 3 SEGUNDOS (Sin bloquear con delay)
  if (millis() - tiempoAnterior >= 3000) {
    tiempoAnterior = millis(); // Actualizamos el temporizador
   
    BT1.println("Analog 0 = " + String(analogRead(A0)));
    BT1.println("Analog 1 = " + String(analogRead(A1)));
    BT1.println("Analog 2 = " + String(analogRead(A2)));
    BT1.println(".................");
  }
}

// FUNCIÓN: Lee el texto del Monitor Serie (USB) hasta encontrar un salto de línea (\n)
String GetLine() {
  String entrada = "";
  while (Serial.available() > 0) {
    char c = Serial.read();
    if (c == '\n') {
      break; // Fin de línea encontrado
    }
    if (c != '\r') { // Ignoramos el retorno de carro si lo hay
      entrada += c;
    }
    delay(2); // Pequeña pausa para dar tiempo a recibir el siguiente carácter
  }
  entrada.trim(); // Limpia espacios en blanco ocultos
  return entrada;
}

// FUNCIÓN MODIFICADA: Lee del Bluetooth buscando el retorno de carro (\r) que envía PuTTY
String GetLineBT() {
  String entrada = "";
  while (BT1.available() > 0) {
    char c = BT1.read();
    // PuTTY envía '\r' (retorno de carro) cuando pulsas Intro
    if (c == '\r') {
      break; // Fin de línea para PuTTY encontrado
    }
    if (c != '\n') { // Ignoramos el salto de línea por si acaso
      entrada += c;
    }
    delay(2); // Pequeña pausa para estabilidad en la lectura serie
  }
  entrada.trim(); // Limpia el string de cualquier residuo
  return entrada;
}
 

En el PuTTY empezará a aparecer cada 3 segundos  lo datos aleatorios dados por las puertas analógica de arduino. En el tiempo entre datos y datos, 3 segundo si escribimos el número del pin y pulsamos Intro, se encenderá el correspondiente LED en el circuito y para apagarlo haremos exactamente lo mismo. 

De esta forma estaremos recibiendo datos y tendremos control sobre los LEDs.

Vamos a añadir algo más al código.  Como vemos en el esquema, hemos añadido un LED rojo en el pin 6, la idea es que cada vez que arduino envíe datos de al PuTTY o cada vez que se envíe un comando para activar o desactivar un LED, el LED rojo brillará momentaneamente como testigo de que ha enviado o recibido información. El código es el siguiente
#include <SoftwareSerial.h>

// Definimos los pines RX y TX para el Bluetooth
SoftwareSerial BT1(3, 2);

unsigned long tiempoAnterior = 0;

void setup() {  
  Serial.begin(9600);  
  BT1.begin(9600);     // Recuerda cambiar a 9600 si tu HC-05 no responde
 
  // Configuramos los pines de los LEDs
  pinMode(13, OUTPUT); // LED Azul 1
  pinMode(12, OUTPUT); // LED Azul 2
  pinMode(11, OUTPUT); // LED Azul 3
  pinMode(6,  OUTPUT); // LED Rojo (Testigo de actividad Tx/Rx)
 
  Serial.println("Sistema Listo. LED Rojo en Pin 6 configurado como indicador de datos.");
}

void loop() {
  // 1. LEER DEL BLUETOOTH (RECEPCIÓN DE DATOS)
  if (BT1.available()) {
    String B = GetLineBT();
    Serial.println("Comando recibido: " + B);
   
    // Hacemos parpadear el LED rojo porque ha entrado un comando
    destelloActividad();
   
    // Control de los LEDs Azules
    if (B == "13") digitalWrite(13, !digitalRead(13));
    if (B == "12") digitalWrite(12, !digitalRead(12));
    if (B == "11") digitalWrite(11, !digitalRead(11));
  }

  // 2. LEER DEL MONITOR SERIE (USB)
  if (Serial.available()) {
    String S = GetLine();  
    BT1.println(S);        
    destelloActividad(); // Parpadeo si enviamos de forma manual desde el PC al BT
  }

  // 3. ENVIAR DATOS ANALÓGICOS CADA 3 SEGUNDOS (TRANSMISIÓN DE DATOS)
  if (millis() - tiempoAnterior >= 3000) {
    tiempoAnterior = millis();
   
    BT1.println("Analog 0 = " + String(analogRead(A0)));
    BT1.println("Analog 1 = " + String(analogRead(A1)));
    BT1.println("Analog 2 = " + String(analogRead(A2)));
    BT1.println(".................");
   
    // Hacemos parpadear el LED rojo porque el Arduino acaba de transmitir datos
    destelloActividad();
  }
}

// FUNCIÓN NUEVA: Hace dar un destello rápido al LED rojo del pin 6
void destelloActividad() {
  digitalWrite(6, HIGH); // Enciende el LED rojo
  delay(50);             // Mantiene el encendido 50 milisegundos (suficiente para verlo)
  digitalWrite(6, LOW);  // Apaga el LED rojo
}

String GetLine() {
  String entrada = "";
  while (Serial.available() > 0) {
    char c = Serial.read();
    if (c == '\n') break;
    if (c != '\r') entrada += c;
    delay(2);
  }
  entrada.trim();
  return entrada;
}

String GetLineBT() {
  String entrada = "";
  while (BT1.available() > 0) {
    char c = BT1.read();
    if (c == '\r') break;
    if (c != '\n') entrada += c;
    delay(2);
  }
  entrada.trim();
  return entrada;
}
De esta forma ahora no solo estaremos recibiendo datos y tendremos control sobre los LEDs, sino que cada vez que ocurra tendremos un testigo luminoso de ello.

No hay comentarios:

Publicar un comentario