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 cómo 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 contraseña del HC-05 Comando: AT+PSWD?
Por defecto suele venir la “1234″ o la “0000″.
Muestra la configuración 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 = 13; // LED conectado en placa al pin digital 13 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; // Espera siempre mayor que 20 (50Hz => 20ms) int ValorPot = 0; // Valor leído del potenciómetro int ValPapertrino = 0; // Valor transmitido al PaperDimmer boolean ValLedPin = HIGH; // Valor de la salida LedPin13 del Arduino int ValLed1 = 0; // Valor de la entrada Led1 del PaperDimmer int ValLed2 = 0; // Valor de la entrada Led2 del PaperDimmer int ValLed3 = 0; // Valor de la entrada Led3 del 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); // 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); // Escala el valor del pot a 0-7 ValLed1 = ValPapertrino & 1; // Enmascara el valor del triac con 001 if (ValLed1 == 1) { // si tiene un valor de 1 digitalWrite(Led1,HIGH); // activa la entrada Led1 del PaperDimmer } else { // si el valor es distinto a 1 digitalWrite (Led1,LOW); // desactiva Led1 } ValLed2=ValPapertrino & 2; // Enmascara el valor del triac con 010 if (ValLed2 == 2) { // si tiene un valor de 2 digitalWrite (Led2,HIGH); // activa la entrada Led2 del PaperDimmer } else { // si el valor es distinto a 2 digitalWrite(Led2,LOW); // desactiva Led2 } ValLed3=ValPapertrino & 4; // Enmascara el valor del triac con 100 if (ValLed3 == 4) { // si tiene un valor de 4 digitalWrite (Led3,HIGH); // activa la entrada Led3 del paperDimmer } else { // si el valor es distinto a 4 digitalWrite (Led3,LOW); // desactiva Led3 } } } }
Dimmer 220v con Arduino y Puredata
Sketch Dimmer 220v Serial:
Sketch dimmer 220v:
// DEFINICION ENTRADAS/SALIDAS
int LedPin = 13; // LED conectado en placa al pin digital 13 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; // Espera siempre mayor que 20 (50Hz => 20ms) int ValorPot = 0; // Valor leído del potenciómetro int ValPapertrino = 0; // Valor transmitido al PaperDimmer boolean ValLedPin = HIGH; // Valor de la salida LedPin13 del Arduino int ValLed1 = 0; // Valor de la entrada Led1 del PaperDimmer int ValLed2 = 0; // Valor de la entrada Led2 del PaperDimmer int ValLed3 = 0; // Valor de la entrada Led3 del 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; // invierte el valor del pin13 digitalWrite(LedPin,ValLedPin); // y muestra que el programa funciona delay(Temp); ValorPot = brightness; // Lee el valor del potenciómetro ValPapertrino = ValorPot/(255/7); // Escala el valor del pot a 0-7 ValLed1 = ValPapertrino & 1; // Enmascara el valor del triac con 001 if (ValLed1 == 1) { // si tiene un valor de 1 digitalWrite(Led1,HIGH); // activa la entrada Led1 del PaperDimmer } else { // si el valor es distinto a 1 digitalWrite (Led1,LOW); // desactiva Led1 } ValLed2=ValPapertrino & 2; // Enmascara el valor del triac con 010 if (ValLed2 == 2) { // si tiene un valor de 2 digitalWrite (Led2,HIGH); // activa la entrada Led2 del PaperDimmer } else { // si el valor es distinto a 2 digitalWrite(Led2,LOW); // desactiva Led2 } ValLed3=ValPapertrino & 4; // Enmascara el valor del triac con 100 if (ValLed3 == 4) { // si tiene un valor de 4 digitalWrite (Led3,HIGH); // activa la entrada Led3 del paperDimmer } else { // si el valor es distinto a 4 digitalWrite (Led3,LOW); // desactiva Led3 } } } }
Arduino Dimmer 220v + potenciometro 10k
Sketch:
// DEFINICION ENTRADAS/SALIDAS int LedPin = 13; // LED conectado en placa al pin digital 13 int Led1 = 2; // Entrada Led1 del PaperDimmer int Led2 = 3; // Entrada Led2 del PaperDimmer int Led3 = 4; // Entrada Led3 del PaperDimmer int PotPin = 0; // La entrada analógica 0 para el potenciometro // DEFINICION DE VARIABLES int Temp = 100; // Espera siempre mayor que 20 (50Hz => 20ms) int ValorPot = 0; // Valor leído del potenciómetro int ValPapertrino = 0; // Valor transmitido al PaperDimmer boolean ValLedPin = HIGH; // Valor de la salida LedPin13 del Arduino int ValLed1 = 0; // Valor de la entrada Led1 del PaperDimmer int ValLed2 = 0; // Valor de la entrada Led2 del PaperDimmer int ValLed3 = 0; // Valor de la entrada Led3 del PaperDimmer // 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); // Lee el valor del potenciómetro ValPapertrino = ValorPot/(1024/7); // Escala el valor del pot a 0-7 ValLed1 = ValPapertrino & 1; // Enmascara el valor del triac con 001 if (ValLed1 == 1) { // si tiene un valor de 1 digitalWrite(Led1,HIGH); // activa la entrada Led1 del PaperDimmer } else { // si el valor es distinto a 1 digitalWrite (Led1,LOW); // desactiva Led1 } ValLed2=ValPapertrino & 2; // Enmascara el valor del triac con 010 if (ValLed2 == 2) { // si tiene un valor de 2 digitalWrite (Led2,HIGH); // activa la entrada Led2 del PaperDimmer } else { // si el valor es distinto a 2 digitalWrite(Led2,LOW); // desactiva Led2 } ValLed3=ValPapertrino & 4; // Enmascara el valor del triac con 100 if (ValLed3 == 4) { // si tiene un valor de 4 digitalWrite (Led3,HIGH); // activa la entrada Led3 del paperDimmer } else { // si el valor es distinto a 4 digitalWrite (Led3,LOW); // 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 teníamos a 9600 y lo cambiamos a 57600.
Para la conexión de nuestra diadema al HC-05, prestar atención a los siguientes pasos: Configuramos el modulo HC-05 como modo maestro Comando: AT+ROLE=1
Cambiamos la contraseña para que se puedan conectar, para este caso de la diadema Mindwave es necesario que la contraseña sea (0000). AT+PSWD=0000
Preparamos el modulo para que se conecte a una dirección especifica,
- //0 = Dirección especifica de dispositivo.
- //1 = A cualquier dispositivo que se encuentre dispobible.
Para este caso será a una dirección específica. Comando: AT+CMODE=0 Se conecta el bluetooth a la dirección Mac del esclavo, los ceros a la izquierda se omiten. La dirección 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 3 #define GREENLED2 4 #define GREENLED3 5 #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); // USB } //////////////////////////////// // Read data from Serial UART // //////////////////////////////// byte ReadOneByte() { int ByteRead; while(!Serial.available()); ByteRead = Serial.read(); #if DEBUGOUTPUT Serial.print((char)ByteRead); // echo the same byte out the USB serial (for debug purposes) #endif return ByteRead; } ///////////// //MAIN LOOP// ///////////// void loop() { // Look for sync bytes if(ReadOneByte() == 170) { if(ReadOneByte() == 170) { payloadLength = ReadOneByte(); if(payloadLength > 169) //Payload length can not be greater than 169 return; generatedChecksum = 0; for(int i = 0; i < payloadLength; i++) { payloadData[i] = ReadOneByte(); //Read payload into memory generatedChecksum += payloadData[i]; } checksum = ReadOneByte(); //Read checksum byte from stream generatedChecksum = 255 - generatedChecksum; //Take one's compliment of generated checksum if(checksum == generatedChecksum) { poorQuality = 200; attention = 0; meditation = 0; for(int i = 0; i < payloadLength; i++) { // Parse the payload switch (payloadData[i]) { 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 }