Arduino (IoT): Simple Tutorial Bluetooth & Servo

Arduino Honduras Santiapps Marcio Valenzuela

Tutorial Bluetooth & Servo

 

Esta vez vamos a mover el Servo, pero en lugar de dejar los datos escritos adentro del código o usar el monitor serial para enviarlos al motor, los vamos a enviar desde un dispositivo con Bluetooth.
Usaremos el BT de un celular para enviar la data.  Para esto es necesario bajar una aplicación que envia datos por Bluetooth. Podríamos crear una pero se sale un poco del tema Arduino.  Además hay varias aplicaciones en las tiendas de apps que ya hacen eso.
Lo haremos con un Android pero también se puede desde una laptop o tablet.
Requerido
  1. Computadora (mac)
  2. Arduino MEGA (u otra similar como UNO)
  3. Breadboard
  4. Motor Servo
  5. Modulo Bluetooth HC-05 (u otro similar Master/Slave)
  6. Arduino IDE
Conexiones…los módulos BT son sencillos.
Arduino Bluetooth Servo Tutorial Santiapps Marcio Valenzuela
Arduino Bluetooth Servo Tutorial
Tienen sus pines 5V y GND y tienen pines de Rx y Tx.  Aquí es importante destacar 2 cosas:
Módulos son un componente que cumple una función específica, única y sencilla así como el sensor DHT11 o el modulo BT.  Los pines vienen “al aire” y fácilmente se les conectar los cables.  Los módulos son relativamente pequeños.
Shields son los mismos módulos integrados (soldados) a una tarjeta pequeña de circuito integrado.  Cumplen la misma función pero por le general traen una composición de pines idéntica a las tarjetas para las cuales fueron creadas.  Estas Shields están diseñadas para encajar directamente sobre la tarjeta microcontroladora.  Es decir los pines de la shield se alinean perfectamente con los de la tarjeta principal.  Por ejemplo una shield de BT para la UNO trae el mismo numero de pines y en la misma secuencia que la UNO.  Una shield BT para la UNO no encajar perfectamente con una MEGA.
El segundo punto importante a destacar es que las tarjetas están diseñadas para comunicarse via pero serial.  Para ello se necesita un pin de transmisión (Tx) y uno de recepción (Rx).  En la UNO son los pines 0&1.  Estos son hardware pins.  Sin embargo es posible crear software pies usando una library llamada software serial. Esto es común y lo usaremos porque piensen en lo siguiente:
La MEGA necesita una comunicación con la computadora.  Esto se logra vida un puerto serial pero en realidad conectamos a la computadora vida un cable USB.  Esto es porque en la tarjeta hay un componente llamado USB-to-Serial converter que hace el trabajo de convertir entre ambos protocolos.  Necesitamos esos pines 0&1 para transmisión de data entre la computadora y la tarjeta.  Así es como cargamos el código a la tarjeta y también como visualizamos la data en el monitor serial.  Pero ahora vamos a querer comunicarnos vía BT.  El modulo BT se tiene que comunicar con la tarjeta usando otros pines!  Por eso tendremos que crear software pies alternos.
Las conexiones son 4 del modulo BT al breadboard y a la MEGA:
– VCC es al 5V de la MEGA
– GND es al GND de la MEGA
– Tx es al Rx de la MEGA
– Rx es al Tx de la MEGA
Arduino Bluetooth Servo Tutorial Santiapps Marcio Valenzuela
Arduino Bluetooth Servo
OJO con el Tx/Rx de la MEGA.  En nuestro caso usamos un puerto serial de software y no de hardware.  Es decir que no usaremos los pines 0 (Rx) & 1 (Tx) en la MEGA.  En lugar de eso, usaremos los pines que designemos nosotros para poder ver los datos en el monitor serial (el cual usa los pines 0 & 1).  En nuestro código designamos los pines 10 & 11 como veremos a continuación.
Es necesario bajar una app gratuita en Android llamada BlueSPP.  Es una app que simplemente envía comandos a un dispositivo BT.  Puede ser cualquier app que envíe comandos a una terminal BT.  Creo que también hay para iOS.
Una vez descargada, es importante conectarse el modulo bluetooth el cual aparece como HC-05 y su clave de pairing por lo general es 1234.  Ahora estamos listos para enviar comandos al modulo BT.
Arduino Bluetooth Servo Tutorial Santiapps Marcio Valenzuela
Arduino Bluetooth Servo
Arduino Bluetooth Servo Tutorial Santiapps Marcio Valenzuela
Arduino Bluetooth Servo
Código

#include <Servo.h>
#include <SoftwareSerial.h>
SoftwareSerial bluetooth(11,10); //Rx, Tx method signature
Servo myServo;
void setup() {
delay(500); // esperar que arranque modulo BT
bluetooth.begin(9600); // Iniciar el BT
Serial.begin(57600);// Esto solo es para leer el Serial
myServo.attach(4, 1000, 2000); // Normalmente 544 & 2400
}
void loop() {
if(bluetooth.available()>0) {
char c = (char)bluetooth.read();
bluetooth.println(c);
if(c=='1') { // Si los datos leidos en el BT = 1
myServo.write(1000); //escribir esta posición
}
if(c=='0') { // Si los datos leídos son = 0
myServo.write(2000);
}
}
}
Resultado
Podríamos modificar el código para que envíe exactamente la posición que queremos también.  Lo dejaremos para otro tutorial mas avanzado pero básicamente involucra recibir carácter por carácter del BT, almacenando en un array y luego usándolo para mover el motor.

Excelente!  Hemos ingresado al mundo de las comunicaciones.  Esto abre el abanico de oportunidades de proyectos:

  • Todo lo que hemos hecho hasta ahora lo podremos hacer via bluetooth, es decir, remotamente.
  • Piensa en los flujos de electricidad que puedes controlar hacia luces, motores, válvulas, juguetes, otros robots, sensores!
  • Mas importante, ya tenemos la base para otros tipos de comunicación los cuales exploraremos pronto; WiFi, GPRS etc.

Ahora compliquemos un poco un robot de sensores para luego poder complicar asi mismo sus habilidades de comunicación!

Advertisements

2 thoughts on “Arduino (IoT): Simple Tutorial Bluetooth & Servo

  1. Soy un seguidor de tu blog y creo que haces un trabajo excelente. Muchas felicidades!
    Tengo una duda, en el siguiente programa se trata de controlar por bluetooth las rejillas del aire acondicionado de casa mediante servos (5 servos). Al enviar las ordenes por bluetooth a vez arduino se vuelve un poco loco y se cuelga. ¿Podrias ver si es correcto el código? Llevo mucho tiempo intentado y no lo consigo. Muchas gracias.
    #include // Incluye la libreria Servo
    Servo servo1; // Crea el objeto servo1 con las caracteristicas de Servo
    Servo servo2; // Crea el objeto servo2 con las caracteristicas de Servo
    Servo servo3; // Crea el objeto servo3 con las caracteristicas de Servo
    Servo servo4; // Crea el objeto servo4 con las caracteristicas de Servo
    Servo servo5; // Crea el objeto servo5 con las caracteristicas de Servo

    char slider1 = ‘x’;

    void setup(){
    Serial.begin(9600);

    servo1.attach(3); // Asocia el servo1 al pin 3, define el min y max del ancho del pulso)
    servo2.attach(5); // Asocia el servo1 al pin 5, define el min y max del ancho del pulso)
    servo3.attach(6); // Asocia el servo1 al pin 6, define el min y max del ancho del pulso)
    servo4.attach(9); // Asocia el servo1 al pin 9, define el min y max del ancho del pulso)
    servo5.attach(10); // Asocia el servo1 al pin 10, define el min y max del ancho del pulso)
    }

    void loop(){
    if(Serial.available()>0){
    slider1 = Serial.read();
    }
    //—————- HAB 1 ———-
    if(slider1 == ‘a’){
    Serial.println(slider1);
    servo1.write(0);
    delay(30);
    }
    if(slider1 == ‘b’){
    Serial.println(slider1);
    servo1.write(45);
    delay(30);
    }
    if(slider1 == ‘c’){
    Serial.println(slider1);
    servo1.write(90);
    delay(30);
    }
    //—————- HAB 2 ———-
    if(slider1 == ‘d’){
    Serial.println(slider1);
    servo2.write(0);
    delay(30);
    }
    if(slider1 == ‘e’){
    Serial.println(slider1);
    servo2.write(45);
    delay(30);
    }
    if(slider1 == ‘f’){
    servo2.write(90);
    delay(30);
    }
    //—————- HAB 3 ———-
    if(slider1 == ‘g’){
    servo3.write(0);
    delay(30);
    }
    if(slider1 == ‘h’){
    servo3.write(45);
    delay(30);
    }
    if(slider1 == ‘i’){
    servo3.write(90);
    delay(30);
    }
    //—————- HAB 4 ———-
    if(slider1 == ‘j’){
    servo4.write(0);
    delay(30);
    }
    if(slider1 == ‘k’){
    servo4.write(45);
    delay(30);
    }
    if(slider1 == ‘l’){
    servo4.write(90);
    delay(30);
    }
    //—————- HAB 5 ———-
    if(slider1 == ‘m’){
    servo5.write(0);
    delay(30);
    }
    if(slider1 == ‘n’){
    servo5.write(45);
    delay(30);
    }
    if(slider1 == ‘o’){
    servo5.write(90);
    delay(30);
    }
    //—————- MEMOS ———-
    if(slider1 == ‘p’){
    servo1.write(0);
    delay(50);
    servo2.write(0);
    delay(50);
    servo3.write(90);
    delay(50);
    servo4.write(90);
    delay(50);
    servo5.write(90);
    delay(100);
    }
    if(slider1 == ‘q’){
    servo1.write(90);
    delay(50);
    servo2.write(90);
    delay(50);
    servo3.write(0);
    delay(50);
    servo4.write(0);
    delay(50);
    servo5.write(0);
    delay(100);
    }
    if(slider1 == ‘r’){
    servo1.write(90);
    delay(50);
    servo2.write(90);
    delay(50);
    servo3.write(90);
    delay(50);
    servo4.write(90);
    delay(50);
    servo5.write(90);
    delay(100);
    }

    }
    Atentamente,

    Arnau Ivern

    • Gracias! Bueno los servos son notoriamente inestables para detener una posición. En ese caso son mejores los stepper. Tienes un vídeo de lo que sucede? Que servos estas usando?

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s