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 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.
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
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
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.
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
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.
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 al 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
A continuación le das a OPEN y al 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