Control mediante Bluetooth
En el siguiente ejemplo, se expondrá una configuración de prueba para realizar una conexión Bluetooth con Universal RC Transmitter y Arduino.
- Componentes:
1 - LED.
1 - Resistencia de 270 Ohm.
1 - Placa Arduino UNO o compatible.
1 - Módulo HC-05, HC-06 o similar.
2 - Servos.
Cables.
1 - Placa Protoboard.
1 - Dispositivo Android con Bluetooth activo y Universal RC Transmitter.
- Esquema de conexión propuesto:
- Conexiones:
El módulo Bluetooth HC-05 funciona mediante comunicaciones serie, de modo que este módulo es el que comunicará la placa Arduino con nuestro dispositivo Android y Universal RC Transmitter. En ese sentido es importante que conecte el pin RX de la placa Arduino al pin TX del módulo HC-05 y el pin TX de la placa Arduino al pin RX del módulo HC-05. El resto de conexiones se identifican fácilmente: El cable rojo conecta el pin de 5V (o pin positivo de alimentación) de la placa Arduino a los pines de Vcc o alimentación de ambos servos y del módulo HC-05. El cable negro por su parte, que actúa como cable de retorno de corriente (o "negativo"), conectando el pin de GND (o 0 Voltios) de la placa Arduino a los pines de GND de ambos servos y del módulo HC-05.
Por otro lado se usarán los pines 2 y 3 de la placa Arduino como terminales de control de señal para ambos servos. Por tanto dichos pines serán de salida (output).
Por defecto la velocidad de comunicación del módulo HC-05 será de 9600 baudios. Teniendo en cuenta este parámetro, el retardo recomendado que debe usarse en Universal RC Transmitter será de unos 10 ms (milisegundos).
Desde Universal RC Transmitter en su dispositivo Android se establecerá la siguiente Secuencia de Transmisión General y el siguiente retardo mencionado:
Como puede verse la secuencia a transmitir será:
239,ST1V,ST1H,B8
Siendo 239 el caracter de sincronismo que deberá ser detectado por el código en ejecución de la placa Arduino.
A partir del dicho caracter 239, se tiene la información del canal 1 vertical (que controlará el primer servo), el canal 1 horizontal (que controlará el segundo servo) y finalmente el botón 8 (B8) que será el que ordene encender o apagar el LED.
Por su parte la configuración de los respectivos canales 1 vertical y horizontal en Universal RC Transmitter, deberá ser aproximadamente ésta:
En cuanto a la configuración del botón B8, se desea que cuando esté en ON, se envíe el caracter '1' y cuando esté en OFF, se envíe el caracter '0'. Acudiendo a la tabla ASCII, se comprueba que ambos caracteres se corresponden con los códigos 49 y 48 de dicha tabla respectivamente. Por tanto, para el botón B8 se habrá de tener:
- Recomendaciones importantes:
1 - Se recomienda emparejar previamente el dispositivo HC-05 con su dispositivo Android (use una contraseña por defecto 1234 o 0000)
2 - Dependiendo del modelo, es posible que los servos que utilice consuman un volumen de corriente considerable, lo cual podría recalentar el regulador de la placa Arduino y finalmente provocaría un malfuncionamiento de ésta, deteniéndose la conexión Bluetooth al cabo de unos minutos. Para evitarlo, se recomienda alimentar los servos por separado y no desde la placa Arduino, aunque por facilidad de comprensión en el esquema de conexión propuesto, ambos servos se han dispuesto alimentados desde el pin de 5 voltios de la placa Arduino.
- Código fuente para la placa Arduino:
/** Bluetooh LED + 2 Servos* JBDreams Apps* https://sites.google.com/site/jbdreamsapps/*/#include <Servo.h>#define MAXCHN 13// Servos#define S1 2#define S2 3unsigned char valor[MAXCHN+1]; // Buffer de datos recibidosfloat grados; Servo Servo1; Servo Servo2;char data = 0; // Variable para guardar los datos recibidosvoid setup(){ Serial.begin(9600); // Establece la velocidad en baudios para la transmisión en serie con el dispositivo Bluetooth pinMode(13, OUTPUT); // Establece el pin 13 como pin de salida int i; for (i=0;i<MAXCHN;i++) { valor[i]=0; // Inicializa los valores de todos los canales (valor) } valor[i]=0; // Inicializa un valor adicional de sincronismo (valor que en lo sucesivo será de 239) // Servos Servo1.attach(S1); Servo2.attach(S2); Servo1.write(90); Servo2.write(90); }void loop(){ int i; if(Serial.available() > 0) // Comprueba que hay datos recibidos { data = Serial.read(); // Lee los datos recibidos en "data" Serial.print(data); // Envía los datos de vuelta por si se desearan comprobar // Ahora hay que almacenarlo en un Buffer de MAXCHN elementos: // Bucle para hacer sitio al siguiente valor leído: for(i=0; i<MAXCHN; i++) { valor[i]=valor[i+1]; // Desplaza todos los bytes de la info de canales una posición <-- } valor[i]=(unsigned char)data; // Carga el nuevo byte en el Buffer if (valor[0]==239) // Si se detecta el caracter de sincronismo, se analiza el resto { // de la secuencia para realizar el control de los servos y el LED.
// 239,ST1V,ST1H,B8 Serial.print("\n"); // Actualiza los servos Servos: grados=180*((float)valor[1]/255.0); Servo1.write((int)grados); grados=180*((float)valor[2]/255.0); Servo2.write((int)grados); // Actualiza el LED: if(valor[3] == '1') // Comprueba si el valor de "data" es igual a '1' digitalWrite(13, HIGH); // Si el valor es '1' entonces el LED será ENCENDIDO. else if(valor[3] == '0') // Comprueba si el valor de "data" es igual a '0' digitalWrite(13, LOW); // Si el valor es '0', entonces apagará el LED. } }}
Video demostrativo: