Академический Документы
Профессиональный Документы
Культура Документы
1
2
3
int pot=0;
void setup(){
blue.begin(9600);
blue.println("Conectado");
void loop(){
pot=analogRead(0);
10
blue.println(pot);
11
delay(1000);
12
13
Para conectarnos con el mdulo bluetooth desde el ordenador tendremos que aadirlo como si
se tratase de un telfono mvil o cualquier otro dispositivo bluetooth normal y corriente,
utilizando la clave de emparejamiento 1234.
Ahora vamos a enviar un 1 para encender el LED conectado a la placa Arduino y un 0 para
apagarlo. Si enviamos una cadena de caracteres el programa leer cada uno de ellos por
orden (001101 > Apagado-Apagado-Encendido-Encendido-Apagado-Encendido).
El cdigo es el siguiente:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
El mtodo para conectarnos a travs de bluetooth con nuestra placa arduino es exactamente
igual al seguido para leer la informacin pero en este caso no recibiremos ningn mensaje
sino que escribiremos un 1 y se lo enviaremos, veremos que nos devuelve un mensaje
confirmando que se ha recibido la orden y que se ha encendido el led. Para apagarlo
enviaremos un 0.
2.
3.
Enviar un comando AT\r\n para comprobar que estemos en modo de comando AT.
La siguiente lista es una compilacin de los comandos que consideramos importantes
AT\r\n
AT+ROLE=1\r\n
AT+ROLE=0\r\n
AT+VERSION?\r\n
AT+UART=115200,1,2\r\n
en modo puente
AT+PIO=10,1\r\n
Existen otros comandos AT que estn documentados en la hoja de datos que proveen
nuestros amigos de iTeadStudio. Podemos encontrar la hoja de datos (datasheet) del HC-05
en la siguiente direccin:
http://biblioteca.geekfactory.mx/Bluetooth_Bee_Pro/datasheet_hc-05.pdf
Es importante notar que al mdulo HC-05 no le agradan los caracteres \r o \n sueltos al
finalizar un comando. Siempre debemos mandarle \r\n para finalizar cada comando, por
lo que debemos configurar nuestro programa de terminal serial para que siempre
enve \r\n al final de cada linea. Si utilizamos el Monitor Serial del IDE de arduino hay
que configurarlo de la siguiente forma:
Realizando pruebas con un mdulo HC-06 y una tarjeta USB serial con FT-232RL
El mdulo HC-06 acepta un set muy bsico de comandos (algo raros por cierto), que permite
pocas configuraciones, pero que sin duda ser util para personalizar este econmico mdulo y
configurarlo para satisfacer las necesidades de la aplicacin.
Los comandos que soporta son:
Prueba de funcionamiento:
Envar: AT
Recibe: OK
Configurar el Baudrate:
Envar: AT+BAUD<Numero>
Recibe: OK<baudrate>
Configurar el Nombre de dispositivo Bluetooth:
Envar: AT+NAME<Nombre>
Recibe: OKsetname
Enviar: AT+VERSION
Recibe: Linvor1.8
Si ya hemos trabajado con comandos AT observaremos que los comandos estan lejos del
estndar, lo ms obvio es que:
Hay que tener cuidado de introducir TODAS LAS LETRAS DEL COMANDO en
MAYUSCULAS, ya que de lo contrario, no funcionarn.
Conexin de un mdulo HC-06 a Arduino. Hay que revisar la correspondencia de pines en la serigrafa, ya que
puede variar dependiendo del proveedor o lote.
En este caso estamos utilizando el hardware de UART, por lo que la comunicacin con la PC
no ser posible. Para poder utilizar la UART para comunicarse con la PC mediante USB, es
necesario utilizar un UART emulado por software, de manera que los pines de comunicacin
con el mdulo bluetooth queden en pines distintos.
El cdigo para la comunicacin a travs del bluetooth es idntico al que utilizaramos para
comunicarnos con la PC va USB. El siguiente ejemplo permite encender o apagar el led de la
tarjeta arduino mediante el mdulo bluetooth. El cdigo funciona de la siguiente manera:
1
2
3
4
5
6
7
8
9
1
0
1
1
1
2
1
3
1
4
1
5
1
6
1
7
1
8
1
9
2
0
2
1
2
2
2
3
2
4
2
5
2
6
2
7
2
8
2
9
3
0
3
1
3
2
3
3
3
4
3
5
3
6
3
7
3
8
3
9
4
EMULAR UNA
* UART POR SOFTWARE.
*
* El funcionamiento es sencillo:
*
* Enviar un caracter 'A' para encender el led
* Enviar un caracter 'a' para apagar el led
*
*/
char rxChar;
// Variable para recibir datos del puerto serie
int ledpin = 13; // Pin donde se encuentra conectado el led (pin 13)
// Configurar el arduino
void setup()
{
// Pin 13 como salida
pinMode(ledpin, OUTPUT);
// Comunicacin serie a 9600 baudios
Serial.begin(9600);
}
// Ciclo infinito, programa principal
void loop()
{
// Si hay datos disponibles en el buffer
if( Serial.available() )
{
// Leer un byte y colocarlo en variable
rxChar = Serial.read();
// Procesar comando de un solo byte
if( rxChar == 'A' )
{
digitalWrite(ledpin, HIGH);
Serial.println("ON");
}
else if ( rxChar == 'a' )
{
digitalWrite(ledpin, LOW);
Serial.println("OFF");
}
}
// Podemos hacer otras cosas aqu
delay(100);
}
0
4
1
4
2
4
3
4
4
4
5
4
6
4
7
4
8
4
9
5
0
5
1
5
2
5
3
5
4
5
5
5
6
5
7
Conclusin
Como podemos observar, los mdulos HC-05 y HC-06 son bastante sencillos de configurar
para usarse con el microcontrolador de nuestra preferencia. El HC-06 es el modelo ms
sencillo, presentando menos opciones para su configuracin, pero siendo bastante util y
econmico para conectar nuestros dispositivos con microcontroladores a la PC, tablets,
celulares, etc. El HC-05 por otra parte, nos permite hacer algunas cosas que su hermano
menor no permite, como enlaces punto a punto entre dos mdulos y tambin teniendo un
juego de comandos ms completo y un poco ms formal, con algunas caractersticas
interesantes como el control de pines de GPIO.
ARDUINO BLUETOOTH
Modulo Bluetooth HC-05:
Primero tenemos que configurar el modulo Bluetooth. En este caso tenemos el Modulo HC-05.
El modulo de bluetooth HC-05 soporta los voltajes de entrada de 3.3 y 5V.
Circuito:
#define RxD 10
#define TxD 11
#define RST 5
#define KEY 4
void setup()
{
pinMode(RST, OUTPUT);
pinMode(KEY, OUTPUT);
digitalWrite(RST, LOW);
digitalWrite(KEY, HIGH);
digitalWrite(RST, HIGH);
delay(500);
BTSerial.flush();
delay(500);
BTSerial.begin(38400);
Serial.begin(9600);
Serial.println("Enter AT commands:");
BTSerial.print("AT\r\n");
delay(100);
void loop()
{
if (BTSerial.available())
Serial.write(BTSerial.read());
if (Serial.available())
BTSerial.write(Serial.read());
AT+NAME=
MINOMBRE
Un dato muy importante el HC-05 funciona como esclavo y maestro.
sketch:
#include <SoftwareSerial.h>
#include <Servo.h> // Libreria de servos
#define RxD 0
#define TxD 1
#define RST 5 // Encendido del Modulo
#define KEY 4
void setup()
{
pinMode(RST, OUTPUT);
pinMode(KEY, OUTPUT);
// Estado inicial
digitalWrite(RST, LOW);
// Modo Comunicacion
digitalWrite(KEY, LOW);
// Encendemos el modulo.
digitalWrite(RST, HIGH);
myservo1.attach(9);
void loop(){
if (BTSerial.available()>3){
byte b[4];
b[0]= BTSerial.read();
b[1]= BTSerial.read();
b[2]= BTSerial.read();
b[3]= BTSerial.read();
int numero = (b[3] & 0xFF) + ((b[2] & 0xFF) << 8) + ((b[1] &
0xFF) << 16)
+ ((b[0] & 0xFF) << 24);
recepcion = numero;
BTSerial.flush();
Serial.println(recepcion);
sketch:
#include <SoftwareSerial.h>
#define RxD 0
#define TxD 1
#define RST 5 // Encendido del Modulo
#define KEY 4
byte recepcion=0; // almacena el valor enviado desde el emisor
int LedPin =
digital 13
13;
int Led1 = 9;
// DEFINICION DE VARIABLES
int ValorPot = 0;
int ValPapertrino = 0;
int ValLed2 = 0;
PaperDimmer
int ValLed3 = 0;
PaperDimmer
// FUNCION INICIAL
void setup()
pinMode(RST, OUTPUT);
pinMode(KEY, OUTPUT);
// Estado inicial
digitalWrite(RST, LOW);
// Modo Comunicacion
digitalWrite(KEY, LOW);
// Encendemos el modulo.
digitalWrite(RST, HIGH);
BTSerial.begin(9600);
BTSerial.flush();
delay(500);
// CICLO PRINCIPAL
void loop()
{
if (BTSerial.available()>3){
byte b[4];
b[0]= BTSerial.read();
b[1]= BTSerial.read();
b[2]= BTSerial.read();
b[3]= BTSerial.read();
int numero = (b[3] & 0xFF) + ((b[2] & 0xFF) << 8) + ((b[1] &
0xFF) << 16)
+ ((b[0] & 0xFF) << 24);
recepcion = numero;
BTSerial.flush();
if (numero>0){
ValLedPin=!ValLedPin;
//
// si tiene un valor de 1
// activa la entrada Led1 del
}
else {
digitalWrite (Led1,LOW);
// si el valor es distinto a 1
// desactiva Led1
ValLed2=ValPapertrino & 2;
triac con 010
if (ValLed2 == 2) {
digitalWrite (Led2,HIGH);
PaperDimmer
// si tiene un valor de 2
// activa la entrada Led2 del
}
else {
digitalWrite(Led2,LOW);
// si el valor es distinto a 2
// desactiva Led2
ValLed3=ValPapertrino & 4;
triac con 100
if (ValLed3 == 4) {
// si tiene un valor de 4
digitalWrite (Led3,HIGH);
paperDimmer
}
else {
digitalWrite (Led3,LOW);
// si el valor es distinto a 4
// desactiva Led3
}
}
}
}
13;
int Led1 = 9;
// DEFINICION DE VARIABLES
int ValorPot = 0;
int ValPapertrino = 0;
int ValLed2 = 0;
PaperDimmer
int ValLed3 = 0;
PaperDimmer
// FUNCION INICIAL
void setup()
Serial.begin(9600);
// Inicializar las salidas:
pinMode(LedPin, OUTPUT);
pinMode(Led1, OUTPUT);
pinMode(Led2, OUTPUT);
pinMode(Led3, OUTPUT);
}
// CICLO PRINCIPAL
void loop() {
byte brightness;
if (Serial.available()) {
brightness = Serial.read();
if (brightness>0){
ValLedPin=!ValLedPin;
ValPapertrino = ValorPot/(255/7);
pot a 0-7
//
// si tiene un valor de 1
// activa la entrada Led1 del
}
else {
digitalWrite (Led1,LOW);
}
// si el valor es distinto a 1
// desactiva Led1
ValLed2=ValPapertrino & 2;
triac con 010
if (ValLed2 == 2) {
digitalWrite (Led2,HIGH);
PaperDimmer
// si tiene un valor de 2
// activa la entrada Led2 del
}
else {
digitalWrite(Led2,LOW);
// si el valor es distinto a 2
// desactiva Led2
ValLed3=ValPapertrino & 4;
triac con 100
if (ValLed3 == 4) {
digitalWrite (Led3,HIGH);
paperDimmer
// si tiene un valor de 4
// activa la entrada Led3 del
}
else {
digitalWrite (Led3,LOW);
}
}
}
}
// si el valor es distinto a 4
// desactiva Led3
Sketch:
// DEFINICION ENTRADAS/SALIDAS
int LedPin =
digital 13
13;
int Led1 = 2;
int Led2 = 3;
int Led3 = 4;
int PotPin = 0;
potenciometro
// DEFINICION DE VARIABLES
int ValorPot = 0;
int ValPapertrino = 0;
int ValLed2 = 0;
PaperDimmer
int ValLed3 = 0;
PaperDimmer
// FUNCION INICIAL
void setup()
// CICLO PRINCIPAL
void loop() {
ValLedPin=!ValLedPin;
ValorPot = analogRead(PotPin);
potencimetro
ValPapertrino = ValorPot/(1024/7);
pot a 0-7
//
// si tiene un valor de 1
// activa la entrada Led1 del
}
else {
digitalWrite (Led1,LOW);
// si el valor es distinto a 1
// desactiva Led1
ValLed2=ValPapertrino & 2;
triac con 010
if (ValLed2 == 2) {
digitalWrite (Led2,HIGH);
PaperDimmer
// si tiene un valor de 2
// activa la entrada Led2 del
}
else {
digitalWrite(Led2,LOW);
// si el valor es distinto a 2
// desactiva Led2
ValLed3=ValPapertrino & 4;
triac con 100
if (ValLed3 == 4) {
digitalWrite (Led3,HIGH);
paperDimmer
// si tiene un valor de 4
// activa la entrada Led3 del
}
else {
digitalWrite (Led3,LOW);
// si el valor es distinto a 4
// desactiva Led3
}
}
Para este caso ser a una direccin especfica. Comando: AT+CMODE=0 Se conecta el bluetooth
a la direccin Mac del esclavo, los ceros a la izquierda se omiten. La direccin MAC, como se
menciono anteriormente, viene en un valor hexadecimal el cual se depuro quedando en este
ejemplo como 74-e5-43-89-60-5c y se debe introducir en el formato ####,##,!!!!!!.Para este
ejemplo queda de la siguiente manera: Comando: AT+BIND=74e5,43,89605c.
Circuito:
Sketch Arduino:
#define LED 13
#define DEBUGOUTPUT 0
#define GREENLED1
#define GREENLED2
#define GREENLED3
#define YELLOWLED1 6
#define YELLOWLED2 7
#define YELLOWLED3 8
#define YELLOWLED4 9
#define REDLED1
10
#define REDLED2
11
#define REDLED3
12
#define powercontrol 10
// checksum variables
byte generatedChecksum = 0;
byte checksum = 0;
int payloadLength = 0;
byte payloadData[64] = {
0};
byte poorQuality = 0;
byte attention = 0;
byte meditation = 0;
// system variables
long lastReceivedPacket = 0;
//////////////////////////
// Microprocessor Setup //
//////////////////////////
void setup() {
pinMode(GREENLED1, OUTPUT);
pinMode(GREENLED2, OUTPUT);
pinMode(GREENLED3, OUTPUT);
pinMode(YELLOWLED1, OUTPUT);
pinMode(YELLOWLED2, OUTPUT);
pinMode(YELLOWLED3, OUTPUT);
pinMode(YELLOWLED4, OUTPUT);
pinMode(REDLED1, OUTPUT);
pinMode(REDLED2, OUTPUT);
pinMode(REDLED3, OUTPUT);
pinMode(LED, OUTPUT);
Serial.begin(BAUDRATE);
////////////////////////////////
////////////////////////////////
byte ReadOneByte() {
int ByteRead;
while(!Serial.available());
// USB
ByteRead = Serial.read();
#if DEBUGOUTPUT
Serial.print((char)ByteRead);
USB serial (for debug purposes)
#endif
return ByteRead;
/////////////
//MAIN LOOP//
/////////////
void loop() {
if(ReadOneByte() == 170) {
if(ReadOneByte() == 170) {
payloadLength = ReadOneByte();
//Payload
return;
generatedChecksum = 0;
payloadData[i] = ReadOneByte();
payload into memory
generatedChecksum += payloadData[i];
//Read
checksum = ReadOneByte();
checksum byte from stream
//Read
//Take
if(checksum == generatedChecksum) {
poorQuality = 200;
attention = 0;
meditation = 0;
switch (payloadData[i]) {
// Parse the
case 2:
i++;
poorQuality = payloadData[i];
bigPacket = true;
break;
case 4:
i++;
attention = payloadData[i];
break;
case 5:
i++;
meditation = payloadData[i];
break;
case 0x80:
i = i + 3;
break;
case 0x83:
i = i + 25;
break;
default:
break;
} // switch
} // for loop
#if !DEBUGOUTPUT
if(bigPacket) {
if(poorQuality == 0)
digitalWrite(LED, HIGH);
else
digitalWrite(LED, LOW);
Serial.print("PoorQuality: ");
Serial.print(poorQuality, DEC);
Serial.print(attention, DEC);
lastReceivedPacket = millis();
Serial.print("\n");
switch(attention / 10) {
case 0:
digitalWrite(GREENLED1, HIGH);
digitalWrite(GREENLED2, LOW);
digitalWrite(GREENLED3, LOW);
digitalWrite(YELLOWLED1, LOW);
digitalWrite(YELLOWLED2, LOW);
digitalWrite(YELLOWLED3, LOW);
digitalWrite(YELLOWLED4, LOW);
digitalWrite(REDLED1, LOW);
digitalWrite(REDLED2, LOW);
digitalWrite(REDLED3, LOW);
break;
case 1:
digitalWrite(GREENLED1, HIGH);
digitalWrite(GREENLED2, HIGH);
digitalWrite(GREENLED3, LOW);
digitalWrite(YELLOWLED1, LOW);
digitalWrite(YELLOWLED2, LOW);
digitalWrite(YELLOWLED3, LOW);
digitalWrite(YELLOWLED4, LOW);
digitalWrite(REDLED1, LOW);
digitalWrite(REDLED2, LOW);
digitalWrite(REDLED3, LOW);
break;
case 2:
digitalWrite(GREENLED1, HIGH);
digitalWrite(GREENLED2, HIGH);
digitalWrite(GREENLED3, HIGH);
digitalWrite(YELLOWLED1, LOW);
digitalWrite(YELLOWLED2, LOW);
digitalWrite(YELLOWLED3, LOW);
digitalWrite(YELLOWLED4, LOW);
digitalWrite(REDLED1, LOW);
digitalWrite(REDLED2, LOW);
digitalWrite(REDLED3, LOW);
break;
case 3:
digitalWrite(GREENLED1, HIGH);
digitalWrite(GREENLED2, HIGH);
digitalWrite(GREENLED3, HIGH);
digitalWrite(YELLOWLED1, HIGH);
digitalWrite(YELLOWLED2, LOW);
digitalWrite(YELLOWLED3, LOW);
digitalWrite(YELLOWLED4, LOW);
digitalWrite(REDLED1, LOW);
digitalWrite(REDLED2, LOW);
digitalWrite(REDLED3, LOW);
break;
case 4:
digitalWrite(GREENLED1, HIGH);
digitalWrite(GREENLED2, HIGH);
digitalWrite(GREENLED3, HIGH);
digitalWrite(YELLOWLED1, HIGH);
digitalWrite(YELLOWLED2, HIGH);
digitalWrite(YELLOWLED3, LOW);
digitalWrite(YELLOWLED4, LOW);
digitalWrite(REDLED1, LOW);
digitalWrite(REDLED2, LOW);
digitalWrite(REDLED3, LOW);
break;
case 5:
digitalWrite(GREENLED1, HIGH);
digitalWrite(GREENLED2, HIGH);
digitalWrite(GREENLED3, HIGH);
digitalWrite(YELLOWLED1, HIGH);
digitalWrite(YELLOWLED2, HIGH);
digitalWrite(YELLOWLED3, HIGH);
digitalWrite(YELLOWLED4, LOW);
digitalWrite(REDLED1, LOW);
digitalWrite(REDLED2, LOW);
digitalWrite(REDLED3, LOW);
break;
case 6:
digitalWrite(GREENLED1, HIGH);
digitalWrite(GREENLED2, HIGH);
digitalWrite(GREENLED3, HIGH);
digitalWrite(YELLOWLED1, HIGH);
digitalWrite(YELLOWLED2, HIGH);
digitalWrite(YELLOWLED3, HIGH);
digitalWrite(YELLOWLED4, HIGH);
digitalWrite(REDLED1, LOW);
digitalWrite(REDLED2, LOW);
digitalWrite(REDLED3, LOW);
break;
case 7:
digitalWrite(GREENLED1, HIGH);
digitalWrite(GREENLED2, HIGH);
digitalWrite(GREENLED3, HIGH);
digitalWrite(YELLOWLED1, HIGH);
digitalWrite(YELLOWLED2, HIGH);
digitalWrite(YELLOWLED3, HIGH);
digitalWrite(YELLOWLED4, HIGH);
digitalWrite(REDLED1, HIGH);
digitalWrite(REDLED2, LOW);
digitalWrite(REDLED3, LOW);
break;
case 8:
digitalWrite(GREENLED1, HIGH);
digitalWrite(GREENLED2, HIGH);
digitalWrite(GREENLED3, HIGH);
digitalWrite(YELLOWLED1, HIGH);
digitalWrite(YELLOWLED2, HIGH);
digitalWrite(YELLOWLED3, HIGH);
digitalWrite(YELLOWLED4, HIGH);
digitalWrite(REDLED1, HIGH);
digitalWrite(REDLED2, HIGH);
digitalWrite(REDLED3, LOW);
break;
case 9:
digitalWrite(GREENLED1, HIGH);
digitalWrite(GREENLED2, HIGH);
digitalWrite(GREENLED3, HIGH);
digitalWrite(YELLOWLED1, HIGH);
digitalWrite(YELLOWLED2, HIGH);
digitalWrite(YELLOWLED3, HIGH);
digitalWrite(YELLOWLED4, HIGH);
digitalWrite(REDLED1, HIGH);
digitalWrite(REDLED2, HIGH);
digitalWrite(REDLED3, HIGH);
break;
case 10:
digitalWrite(GREENLED1, HIGH);
digitalWrite(GREENLED2, HIGH);
digitalWrite(GREENLED3, HIGH);
digitalWrite(YELLOWLED1, HIGH);
digitalWrite(YELLOWLED2, HIGH);
digitalWrite(YELLOWLED3, HIGH);
digitalWrite(YELLOWLED4, HIGH);
digitalWrite(REDLED1, HIGH);
digitalWrite(REDLED2, HIGH);
digitalWrite(REDLED3, HIGH);
break;
#endif
bigPacket = false;
else {
// Checksum Error
*
Pages
Contacto
Xbee y Arduino
Arduino Ethernet
Tutorial Arduino
Talleres de Arduino
Raspberry Pi
Arduino Bluetooth
Spark Core (Arduino + Wifi)
Arduino Pro mini
Search Results