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