5

Construir un robot bluetooth con Arduino y Python

bluetooth_portada

Saludos, homo fabers. Hace algunos días Trandsductor publicaba este tutorial sobre el módulo Bluetooth HC 06. Después de mucho insistir, y a pesar de que es anti-python, conseguí convencerle para que me ayudara a hacer este tutorial: un robot teledirigido vía Bluetooth con Arduino, Python.

Vamos a programar el robot para recibir órdenes por Bluetooth (adelante, atrás, gira…) y después escribiremos un programa en Python para mover al robot con las flechas del teclado. Es la monda, ya veréis.


 

¿Qué necesito?

Primero mirarse el tutorial que escribió Transductor para entender cómo funciona el módulo y cómo configurarlo. Y cómo no, tener un módulo HC 06.

En el ordenador hay que tener instalado el programa Blueman, y las librerías de python pyserial y pygame.

Como microcontrolador usaremos Arduino. Yo tengo una Arduino UNO r3.

También es necesario un chasis con motores para el robot. Puede ser prefabricado o construido a piezas, no importa. Hay muchos tipos de chasis y controladores de motores, así que no voy a hablar del montaje ni de cómo controlar los motores. Sólo será necesaria una función para cambiar la velocidad, algo de este estilo:

motores(int m1, int m2);

Dónde m1 y m2 es la velocidad de los motores. Os dejo para vosotros escribirla.

Y, por último, un poco de música. ¿Qué tal algo del s. XVII? ¿Giacomo Carissimi,por ejemplo?


 Conexiones de la antena

Primero hay que conectar la antena Bluetooth a Arduino. Las conexiones serán estas:

  • VCC -> Arduino 3.3v
  • GND -> Arduino GND
  • RXD -> Arduino TX
  • TXD -> Arduino RX

 Código de Arduino

Para cargarlo hay que desconectar la antena de los pines TX y RX.


int val;

void setup()
{
  Serial.begin(9600);
  delay(7000);
 
}

void loop()
{
  if(Serial.available() >= 1)
  {
    val = Serial.read();
 
    if(val == 'a')
    {
      motores(250,250);
    }
    else if(val == 'i')
    {
      motores(-250, 250);
    }
    else if(val == 's')
    {
      motores(0,0);
    }
    else if(val == 'r')
    {
      motores(-250,-250);
    }
    else if(val == 'd')
    {
      motores(250,-250);
    }
  }
}

¿Qué hace este programa? Explicación para impacientes: Lee carácteres por Serial (la antena está conectada a los pines de comunicación Serial) y según lo que vaya recibiendo cambia la dirección de los motores. O los detiene.

Ahora viene la explicación larga.

La función void setup() inicia la comunicación Serial a 9600 baud y espera 7 segundos. Así hay tiempo a conectar la antena.

void setup()
{
  Serial.begin(9600);
  delay(7000);
 
}

En el bucle principal se lee el Serial y si se está recibiendo algo útil (Serial.available() >= 1), se guarda dentro de la variable val. Después se compara val con diversos carácteres para ver en qué dirección tiene que ir el robot (‘a’->adelante, ‘i’->izquierda, ‘d’->derecha, ‘r’->retroceder y ‘s’->stop).

void loop()
{
  if(Serial.available() >= 1)
  {
    val = Serial.read();
 
    if(val == 'a')
    {
      motores(250,250);
    }
    else if(val == 'i')
    {
      motores(-250, 250);
    }
    else if(val == 's')
    {
      motores(0,0);
    }
    else if(val == 'r')
    {
      motores(-250,-250);
    }
    else if(val == 'd')
    {
      motores(250,-250);
    }
  }
}

Emparejar Arduino y el Ordenador

Para que el robot y el ordenador se comuniquen, primero deben emparejarse. Si no, no aceptarán datos el uno del otro. Estos pasos están en el tutorial de antes, pero he querido recordarlos.

Abrimos Blueman, el gestor de Bluetooth. Primero hay que buscar los dispositivos con Bluetooth próximos. Le damos a “Search”:

blueman_search

Aparecerá una lista. Hay que darle con el botón derecho al nombre de la antena y seleccionar “Pair”.

captura_pair

Pedirá introducir el Pin de la antena antes de conectarse. Una vez emparejado, hay que pusar otra vez y seleccionar la opción “Dev B”. Esto permite comunicarse con la antena a través de Serial.

captura_devBArriba a la derecha de la pantalla aparecerá un mensaje con la dirección del dispositivo. La mía es /dev/rfcomm0.


Programa con Python

Con la librería pygame el programa leerá el teclado. Si se pulsa una flecha, el programa enviará un carácter por serial al robot a la dirección /dev/rfcomm0. Si se deja de presionar una tecla, se enviará el comando de parada. Con la tecla ‘escape’ se sale del programa.

Tenéis que cambiar ‘/dev/rfcomm0’ de la línea 4 por la dirección de vuestra antena. Se sale del programa con ESCAPE.

import serial
import pygame

ser = serial.Serial('/dev/rfcomm0', 9600)

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption('Robot!')
pygame.mouse.set_visible(1)

val = '-'

while val != 'stop':
    events = pygame.event.get()
    for event in events:
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_UP:
                        ser.write('a')
                elif event.key == pygame.K_LEFT:
                        ser.write('i')
            elif event.key == pygame.K_RIGHT:
                ser.write('d')
            elif event.key == pygame.K_DOWN:
                ser.write('r')
            elif event.key == pygame.K_ESCAPE:
                    val = 'stop'
        if event.type == pygame.KEYUP:
            ser.write('s')

Las dos primeras líneas sirven para llamar a las librerías:


import pygame

import pyserial

Ahora hay que iniciar el Serial:

ser = serial.Serial('/dev/rfcomm0', 9600)

Iniciamos pygame con algunos parámetros estándar para dibujar una ventana y mostrar el ratón.


pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption('Robot!')
pygame.mouse.set_visible(1)

Ahora el programa mira si ha pasado algun evento (se ha desplazado el mouse, se ha cambiado el estado de una tecla…). Si se ha pulsado una tecla (pygame.KEYDOWN), mira que tecla es y si es una flecha envía la dirección por serial. Si es la tecla ESCAPE cierra.

Si se ha dejado de pulsar una tecla (pygame.KEYUP), envia la instrucción de parada por Serial.

while val != 'stop':
    events = pygame.event.get()
    for event in events:
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_UP:
                        ser.write('a')
                elif event.key == pygame.K_LEFT:
                        ser.write('i')
            elif event.key == pygame.K_RIGHT:
                ser.write('d')
            elif event.key == pygame.K_DOWN:
                ser.write('r')
            elif event.key == pygame.K_ESCAPE:
                    val = 'stop'
        if event.type == pygame.KEYUP:
            ser.write('s')

Y ya hemos acabado. ¡Buf! Ahora sólo queda ejecutar el programa por terminal y jugar con el robot.

Si algo no funcionó bien o hay alguna duda que no podéis solucionar, planteadla en los comentarios.

Gl4r3

Brillante, luminosa y cegadora a veces, Glare es tan artista como técnica. Le encanta dar rienda suelta a sus módulos de imaginación y desdibujar los ya de por si delgados límites que separan el mundo de la electrónica y el arte. Su mayor creación hasta la fecha es un instrumento capaz de convertir los colores y la luz en música. Cuándo sus circuitos no están trabajando en una nueva obra electrónica, le gusta dedicar sus ciclos a la lectura o a documentar sus invenciones para beneficio de los humanos. Sus artilugios favoritos son aquellos que combinan una funcionalidad práctica con un diseño elegante y artístico.

Deja un comentario

5 Comentarios en "Construir un robot bluetooth con Arduino y Python"

avatar
más nuevos primero más antiguos primero
Andres
Humano

Hola como seria para usarlo el app echo en python desde el celular y asi controlarlo con el blueetooh del mismo.

Leiner Barrios
Humano

Como configuro el modulo HC 06 con windows 10????

John
Humano
Buenas ROBOLOGS ,les escribo en vuestro Blog me comentaron vosotros que no contestan por correo privado si no mas bien por este medio les comento la inquietud. He estado buscando sobre la comunicación Bluetooth con la Raspberry Pi.El proyecto que tengo realizando es poder controlar un chasis de robot 4wd(4 ruedas) con la Raspberry pi B + con el lenguaje de programación en Python con la libreria (import serial).Cree una App personal realizando este mismo proyecto con (Arduino Uno) con el modulo (Bluetooth HC-06) no tuve ningún problema en la comunicación por el puerto serial (RX,TX) pude lograr la comunicación… Leer más »
N4n0
Admin

Hola, John! No sabría decirte cuál puede ser el problema con tu Dongle USB. Puede que sea problema de drivers o que el modelo no es compatible…

Pero si no consigues hacer funcionar el Dongle, ¿por qué no pruebas de controlar la Raspberry Pi a través del módulo HC 06? Conéctalo a los pines UART y escribir un código con pyserial para recibir carácteres.

https://electrosome.com/uart-raspberry-pi-python/