Anda di halaman 1dari 65

ENVIAR DATOS DESDE ARDUINO Y RECIBIRLOS EN EL PC:

Vamos a enviar un valor de 0 a 1023 que obtendremos girando el potencimetro conectado a


la placa Arduino, los valores se enviaran cada segundo. Para ello utilizaremos el siguiente
cdigo:
?

1
2
3

//Enviar datos con modulo Bluetooth para Arduino http://zygzax.com/


#include <SoftwareSerial.h>
SoftwareSerial blue(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.

En el programa de desarrollo de Arduino seleccionaremos el puerto serie que corresponde a la


comunicacin bluetooth con este mdulo, en mi caso (Sistema operativo Mac) el puerto es:
/dev/tty.HC-07-DevB.
El ltimo paso para leer la informacin que est transmitiendo nuestra placa Arduino es abrir el
monitor serie del programa de desarrollo de Arduino y seleccionar 9600 baud y ya
deberamos ver la informacin.

ENVIAR DATOS DESDE EL PC A ARDUINO

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

//Recibir datos con modulo Bluetooth para Arduino http://zygzax.com/


#include <SoftwareSerial.h>
char rec;
SoftwareSerial blue(2,3);
void setup(){
pinMode(13,OUTPUT);
blue.begin(9600);
blue.println("Conectado");
}
void loop() {
if(blue.available()){
rec=blue.read();
switch(rec){
case '0':
digitalWrite(13,LOW);
delay(500);
blue.println("Led off");
break;
case '1':
digitalWrite(13,HIGH);
delay(500);
blue.println("Led on");
break;
default:
delay(500);
blue.print(rec);
blue.println(" no es una orden valida. Introduzca 0 o 1");
}
}
}

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.

Interfaz de configuracin de comandos AT en HC05


El puerto serie en modo de configuracin para el HC-05 debe configurarse de la siguiente
manera: 34800 bps, 8 bits de datos, Sin paridad, Sin control de flujo. Para entrar al modo
de comandos AT seguimos los siguientes pasos:
1.

Poner a estado alto en el pin 34 (PIO11)

2.

Conectar la alimentacin del mdulo (o resetearlo de preferencia)

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

Comando para colocar el mdulo en modo Maestro (Master)

AT+ROLE=0\r\n

Comando para colocar el mdulo en modo Esclavo (Slave)

AT+VERSION?\r\n

AT+UART=115200,1,2\r\n

Comando de prueba, debe responder con OK\r\n

Obtener la versin del firmware


Configurar el modo de funcionamiento del puerto serie

en modo puente

AT+PIO=10,1\r\n

Colocar el pin de IO de propsito general a nivel alto

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:

Interfaz de configuracin de comandos AT en HC06


El HC-06 tiene un firmware distinto y tambin un funcionamiento distinto en cuanto a su
modo de configuracin. Para poder configurar el HC-06 es necesario que esteNO este
emparejado ni siendo usado por ningun dispositivo. De igual forma que el HC-05 es
necesario conectarlo a la PC y usar un programa de terminal para darle instrucciones de
configuracin (Comandos AT), aunque tambin podemos escribir un programa de arduino o en
un microcontrolador para configurarlo.
Para conectarlo con la PC utilizamos un adaptador USB serial como se muestra en la foto:

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>

El parmetro nmero es un caracter hexadecimal de 1 a c que corresponden


a los siguientes Baud Rates: 1=1200, 2=2400, 3=4800, 4=9600, 5=19200, 6=38400, 7=57600,
8=115200, 9=230400, A=460800, B=921600, C=1382400

Recibe: OK<baudrate>
Configurar el Nombre de dispositivo Bluetooth:

Envar: AT+NAME<Nombre>

Recibe: OKsetname

Configurar el cdigo PIN de emparejamiento:

Envar: AT+PIN<pin de 4 digitos>

Recibe: OK<pin de 4 digitos>

Obtener la version del firmware:

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:

No es necesario finalizar el comando con \r\n, pero si es necesario ingresar los


comandos con todos los caracteres seguidos sin pausas. NO hay necesidad de dar enter
para finalizar un comando. El modulo tiene un Temporizador que hace necesario introducir el
comando de una sola vez, sin pausas entre los caracteres.

Por lo anterior, si utilizamos un emulador de terminal hay que pegarlos en leste y no


escribirlos uno a uno con el teclado. Tambin podemos usar el monitor serial de Arduino
configurado como se muestra en la imgen ms arriba en este artculo.

Hay que tener cuidado de introducir TODAS LAS LETRAS DEL COMANDO en
MAYUSCULAS, ya que de lo contrario, no funcionarn.

Las respuestas no parecen respuestas estndar a comandos AT.

Conexin bsica con Arduino


Las conexiones para realizar con arduino son bastante sencillas. Solamente requerimos
colocar como mnimo la alimentacin y conectar los pines de transmisin y recepcin serial
(TX y RX). Hay que recordar que en este caso los pines se debe conectar cruzados TX
Bluetooth -> RX de Arduino y RX Bluetooth -> TX de Arduino. La siguiente imgen muestra
las conexiones bsicas para que funcione el mdulo

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:

Al envar el caracter E, se pone en estado alto la salida del pin 13

Al enviar el caracter A, se pone en estado lgico bajo la salida del pin 13

1
2
3
4
5
6
7
8
9
1
0

/************************* http://geekfactory.mx *******************************


*
* Sketch de prueba para modulos de bluetooth HC-05 y HC-06. Este programa puede
* controlar el led de la tarjeta arduino a travs de la conexin bluetooth. El
* programa puede ampliarse para controlar una mayor cantiad de salidas.
*
* ESTE SKETCH USA EL PUERTO SERIE (UART), MISMO QUE ES UTILIZADO PARA
* LA COMUNICACIN USB. EL USO DE BLUETOOTH O USB ES MUTUAMENTE EXCLUSIVO
* (NO SE PUEDEN USAR AMBOS AL MISMO TIEMPO).
*
* PARA USAR LA CONEXIN USB Y BLUETOOTH AL MISMO TIEMPO ES NECESARIO

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:

Sketch para configurar comandos AT:


#include <SoftwareSerial.h>

#define RxD 10
#define TxD 11
#define RST 5
#define KEY 4

SoftwareSerial BTSerial(RxD, TxD);

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());

En el monitor serial, modificamos los valores de velocidad a 9600 baud y a Ambos Nl y


CR, en este momento observaremos en la pantalla que dice: Enter AT commands: , si nosotros
mandamos el comando AT, nos debe responder OK.

Para configurar nuestro dispositivo bluetooth:


Saber el nombre del modulo.
AT+NAME?
Cambiar el nombre, en el ejemplo siguiente se cambia por MINOMBRE.

AT+NAME=

MINOMBRE
Un dato muy importante el HC-05 funciona como esclavo y maestro.

Como esclavo: espera que desde otro dispositivo nos conectemos.

Como maestro: el HC-05 se conecta a otro dispositivo.

Saber cmo est configurado con el comando: AT+ROLE?

Si nos contesta 0 esta en modo esclavo.

Si nos contesta 1 esta en modo maestro.

Por defecto viene en modo esclavo.

Cambiarlo al modo esclavo: Comando:AT+ROLE=0

Cambiarlo al modo maestro: Comando:AT+ROLE=1

Saber la contrasea del HC-05 Comando: AT+PSWD?

Por defecto suele venir la 1234 o la 0000.


Muestra la configuracin con la placa Arduino, por defecto viene configurado a una velocidad
de 9600. Comando: AT+UART?

Arduino bluetooth + Motor Servo

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

Servo myservo1; // variable servo


byte recepcion=0; // almacena el valor enviado desde el emisor
int myAngle1; // utilizada para pasar el valor a grados
SoftwareSerial BTSerial(RxD, TxD);
byte pinEstado = 0;

void setup()
{

pinMode(RST, OUTPUT);

pinMode(KEY, OUTPUT);

// Estado inicial

digitalWrite(RST, LOW);
// Modo Comunicacion
digitalWrite(KEY, LOW);

// Encendemos el modulo.
digitalWrite(RST, HIGH);

// Configuracion del puerto serie por software


// para comunicar con el modulo HC-05
BTSerial.begin(9600);
BTSerial.flush();
delay(500);

// Configuramos el puerto serie de Arduino para Debug


Serial.begin(9600);
//Serial.println("Ready");

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();

myAngle1=recepcion; // Volcado del dato recibido del emsior


myservo1.write(myAngle1);

Serial.println(recepcion);

Arduino Bluetooth + dimmer 220v

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

SoftwareSerial BTSerial(RxD, TxD);


byte pinEstado = 0;

int LedPin =
digital 13

13;

int Led1 = 9;

// LED conectado en placa al pin

// Entrada Led1 del PaperDimmer

int Led2 = 10;

// Entrada Led2 del PaperDimmer

int Led3 = 11;

// Entrada Led3 del PaperDimmer

// DEFINICION DE VARIABLES

int Temp = 20;


20ms)

// Espera siempre mayor que 20 (50Hz =>

int ValorPot = 0;

// Valor ledo del potencimetro

int ValPapertrino = 0;

// Valor transmitido al PaperDimmer

boolean ValLedPin = HIGH; // Valor de la salida LedPin13 del


Arduino
int ValLed1 = 0;
PaperDimmer

// Valor de la entrada Led1 del

int ValLed2 = 0;
PaperDimmer

// Valor de la entrada Led2 del

int ValLed3 = 0;
PaperDimmer

// Valor de la entrada Led3 del

// 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);

// Configuracion del puerto serie por software


// para comunicar con el modulo HC-05

BTSerial.begin(9600);
BTSerial.flush();
delay(500);

// Configuramos el puerto serie de Arduino para Debug


Serial.begin(9600);

// Inicializar las salidas:


pinMode(LedPin, OUTPUT);
pinMode(Led1, OUTPUT);
pinMode(Led2, OUTPUT);
pinMode(Led3, OUTPUT);
}

// 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;

// invierte el valor del pin13

digitalWrite(LedPin,ValLedPin); // y muestra que el programa


funciona
delay(Temp);
ValorPot = numero;
ValPapertrino = ValorPot/(100/7);
pot a 0-7

//

Escala el valor del

ValLed1 = ValPapertrino & 1;


triac con 001
if (ValLed1 == 1) {
digitalWrite(Led1,HIGH);
PaperDimmer

// Enmascara el valor del

// 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

// Enmascara el valor del

// 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) {

// Enmascara el valor del

// si tiene un valor de 4

digitalWrite (Led3,HIGH);
paperDimmer

// activa la entrada Led3 del

}
else {
digitalWrite (Led3,LOW);

// si el valor es distinto a 4
// desactiva Led3

}
}

}
}

Dimmer 220v con Arduino y Puredata

Sketch Dimmer 220v Serial:


Sketch dimmer 220v:
// DEFINICION ENTRADAS/SALIDAS
int LedPin =
digital 13

13;

// LED conectado en placa al pin

int Led1 = 9;

// Entrada Led1 del PaperDimmer

int Led2 = 10;

// Entrada Led2 del PaperDimmer

int Led3 = 11;

// Entrada Led3 del PaperDimmer

// DEFINICION DE VARIABLES

int Temp = 20;


20ms)

// Espera siempre mayor que 20 (50Hz =>

int ValorPot = 0;

// Valor ledo del potencimetro

int ValPapertrino = 0;

// Valor transmitido al PaperDimmer

boolean ValLedPin = HIGH; // Valor de la salida LedPin13 del


Arduino
int ValLed1 = 0;
PaperDimmer

// Valor de la entrada Led1 del

int ValLed2 = 0;
PaperDimmer

// Valor de la entrada Led2 del

int ValLed3 = 0;
PaperDimmer

// Valor de la entrada Led3 del

// 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;

// invierte el valor del pin13

digitalWrite(LedPin,ValLedPin); // y muestra que el programa


funciona
delay(Temp);
ValorPot = brightness;

// Lee el valor del potencimetro

ValPapertrino = ValorPot/(255/7);
pot a 0-7

ValLed1 = ValPapertrino & 1;


triac con 001
if (ValLed1 == 1) {
digitalWrite(Led1,HIGH);
PaperDimmer

//

Escala el valor del

// Enmascara el valor del

// 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

// Enmascara el valor del

// 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

// Enmascara el valor del

// si tiene un valor de 4
// activa la entrada Led3 del

}
else {
digitalWrite (Led3,LOW);
}
}
}
}

// si el valor es distinto a 4
// desactiva Led3

Arduino Dimmer 220v + potenciometro 10k

Sketch:

// DEFINICION ENTRADAS/SALIDAS

int LedPin =
digital 13

13;

// LED conectado en placa al pin

int Led1 = 2;

// Entrada Led1 del PaperDimmer

int Led2 = 3;

// Entrada Led2 del PaperDimmer

int Led3 = 4;

// Entrada Led3 del PaperDimmer

int PotPin = 0;
potenciometro

// La entrada analgica 0 para el

// DEFINICION DE VARIABLES

int Temp = 100;


=> 20ms)

// Espera siempre mayor que 20 (50Hz

int ValorPot = 0;

// Valor ledo del potencimetro

int ValPapertrino = 0;

// Valor transmitido al PaperDimmer

boolean ValLedPin = HIGH; // Valor de la salida LedPin13 del


Arduino
int ValLed1 = 0;
PaperDimmer

// Valor de la entrada Led1 del

int ValLed2 = 0;
PaperDimmer

// Valor de la entrada Led2 del

int ValLed3 = 0;
PaperDimmer

// Valor de la entrada Led3 del

// FUNCION INICIAL

void setup()

// Inicializar las salidas:


pinMode(LedPin, OUTPUT);
pinMode(Led1, OUTPUT);
pinMode(Led2, OUTPUT);
pinMode(Led3, OUTPUT);
}

// CICLO PRINCIPAL

void loop() {
ValLedPin=!ValLedPin;

// invierte el valor del pin13

digitalWrite(LedPin,ValLedPin); // y muestra que el programa


funciona
delay(Temp);

ValorPot = analogRead(PotPin);
potencimetro

// Lee el valor del

ValPapertrino = ValorPot/(1024/7);
pot a 0-7

ValLed1 = ValPapertrino & 1;


triac con 001
if (ValLed1 == 1) {
digitalWrite(Led1,HIGH);
PaperDimmer

//

Escala el valor del

// Enmascara el valor del

// 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

// Enmascara el valor del

// 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

// Enmascara el valor del

// si tiene un valor de 4
// activa la entrada Led3 del

}
else {
digitalWrite (Led3,LOW);

// si el valor es distinto a 4
// desactiva Led3

}
}

Neurosky + Arduino via bluetooth

Configurar modulo Bluetooth HC-o5 con Neurosky

Comando: AT+UART=57600,0,0 // Cambiamos la velocidad a la que opera el modulo,


originalmente lo tenamos a 9600 y lo cambiamos a 57600.
Para la conexin de nuestra diadema al HC-05, prestar atencin a los siguientes pasos:
Configuramos el modulo HC-05 como modo maestro Comando: AT+ROLE=1
Cambiamos la contrasea para que se puedan conectar, para este caso de la diadema
Mindwave es necesario que la contrasea sea (0000). AT+PSWD=0000
Preparamos el modulo para que se conecte a una direccin especifica,

//0 = Direccin especifica de dispositivo.

//1 = A cualquier dispositivo que se encuentre dispobible.

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 BAUDRATE 57600

#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;

boolean bigPacket = false;

//////////////////////////

// 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);

////////////////////////////////

// Read data from Serial UART //

////////////////////////////////

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() {

// echo the same byte out the

// Look for sync bytes

if(ReadOneByte() == 170) {

if(ReadOneByte() == 170) {

payloadLength = ReadOneByte();

if(payloadLength > 169)


length can not be greater than 169

//Payload

return;

generatedChecksum = 0;

for(int i = 0; i < payloadLength; i++) {

payloadData[i] = ReadOneByte();
payload into memory

generatedChecksum += payloadData[i];

//Read

checksum = ReadOneByte();
checksum byte from stream

//Read

generatedChecksum = 255 - generatedChecksum;


one's compliment of generated checksum

//Take

if(checksum == generatedChecksum) {

poorQuality = 200;

attention = 0;

meditation = 0;

for(int i = 0; i < payloadLength; i++) {


payload

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

// *** Add your code here ***

if(bigPacket) {

if(poorQuality == 0)

digitalWrite(LED, HIGH);

else

digitalWrite(LED, LOW);

Serial.print("PoorQuality: ");

Serial.print(poorQuality, DEC);

Serial.print(" Attention: ");

Serial.print(attention, DEC);

Serial.print(" Time since last packet: ");

Serial.print(millis() - lastReceivedPacket, 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

// end if else for checksum

} // end if read 0xAA byte

} // end if read 0xAA byte

*
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