Torneo de robots medievales - Shield Imagina Arduino

La pasada primavera (2015) construimos en el taller un par de robots. Son los robots Dracduino y Jordiduino, es decir las reencarnaciones de Sant Jordi y el dragón. Están construidos sobre la base de un Arduino UNO y una Shield Imagina Arduino del equipo de Robolot. Se mueven mediante dos servos de rotación continua.

El caballero dispone de una espada que sube y baja mediante un servo. El dragón dispone de una nariz con la que ataca a su contrincante. El punto débil del caballero se encuentra en su parte delantera y acciona un pequeño final de carrera. El punto débil del dragón se encuentra en su parte superior. Como el dragón está más protegido, durante el combate acostumbra a ganar. No es un combate amañado, pero si ligeramente injusto.

Los robots se controlan mediante bluetooth con una aplicación para teléfonos móviles, como la bluecontrol.

Este puente que se ve al lado del modulo Bluetooth, en la imagen siguiente, se ha de retirar para cargar el programa desde el ordenador y volver a poner para que el Bluetooth se pueda utilizar.

A continuación se puede ver un vídeo del combate que tuvo lugar durante la celebración de Sant Jordi en el centro en donde trabajo.

Programa de los robots

Se trata de un programa de control de un robot (JordiDuino) con Bluetooth, mediante la aplicación "Blue Control".

Este vídeo nos muestra como trabaja esta aplicación, pero no en nuestro robot ni de la misma manera exactamente.

En nuestro caso las cuatro flechas nos permiten avanzar, retroceder, girar a la izquierda y a la derecha. El punto verde central detiene las dos ruedas. La tecla A levanta la espada y la tecla C la baja para intentar matar a DracDuino.

Se utiliza con una placa Arduino UNO y una shield Imagina Arduino de Picaxe.es.

En el pin 2 está conectada una entrada digital con un final de carrera. Si su entrada tiene un valor alto (HIGH) el robot se detiene durante un tiempo de 200 segundos.

Las dos ruedas del robot se mueven con dos motores de corriente continua, mediante un integrado de puente en H, L293DD, que les proporciona hasta un amperio por canal. La rueda de la derecha se controla con los pines 7 y 8 y la rueda izquierda con los pines 12 y 13.

La espada del robot se controla con un servo conectado al pin 6.

El módulo de Bluetooth utiliza los mismos pines del puerto serie de comunicación con el ordenador a través del cable USB. Por esta razón para cargar el programa en Arduino hemos de retirar el módulo Bluetooth o el puente correspondiente.

El programa es el siguiente:

#include <Servo.h>

Servo espada;

void setup(){

pinMode(2,INPUT);

pinMode(3,OUTPUT);

pinMode(7,OUTPUT);

pinMode(8,OUTPUT);

pinMode(12,OUTPUT);

pinMode(13,OUTPUT);

espada.attach(6);

Serial.begin(9600);

}

void loop(){

char dato = Serial.read();

//Mover hacia adelante

if(dato == 'U'){

//Rueda derecha

digitalWrite(7,HIGH);

digitalWrite(8,LOW);

//Rueda izquierda

digitalWrite(12,LOW);

digitalWrite(13,HIGH);

}

//Mover hacia atras

if(dato == 'D'){

//Rueda derecha

digitalWrite(7,LOW);

digitalWrite(8,HIGH);

//Rueda izquierda

digitalWrite(12,HIGH);

digitalWrite(13,LOW);

}

//Girar a la derecha

if(dato == 'R'){

//Rueda derecha

digitalWrite(7,LOW);

digitalWrite(8,HIGH);

//Rueda izquierda

digitalWrite(12,LOW);

digitalWrite(13,HIGH);

}

//Girar a la izquierda

if(dato == 'L'){

//Rueda derecha

digitalWrite(7,HIGH);

digitalWrite(8,LOW);

//Rueda izquierda

digitalWrite(12,HIGH);

digitalWrite(13,LOW);

}

//Parar las dos ruedas

if(dato == 'C'){

//Rueda derecha

digitalWrite(7,LOW);

digitalWrite(8,LOW);

//Rueda izquierda

digitalWrite(12,LOW);

digitalWrite(13,LOW);

}

//Levantar la espada

if(dato == 'a'){

espada.write(0);

}

//Bajar la espada

if(dato == 'b'){

espada.write(90);

}

//Muerte del caballero. Se activa al presionar el pulsador del pin 2.

if(digitalRead(2) == HIGH){

muerte();

}

}

void muerte(){

//Paro de las dos ruedas

//Rueda derecha

digitalWrite(7,LOW);

digitalWrite(8,LOW);

//Rueda izquierda

digitalWrite(12,LOW);

digitalWrite(13,LOW);

//Levantar la espada

espada.write(0);

//Intermitencia durante mucho tiempo (200 segundos)

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

digitalWrite(3,HIGH);

delay(200);

digitalWrite(3,LOW);

delay(200);

}

}