Hace tiempo que hice mi primer robot, pero este se quedó en el olvido y recientemente he querido retomarlo para un proyecto de orientación por GPS. De momento lo he estado montando para que detecte colisiones con objetos, pero además me comunique mediante bluetooth cuando detecta esas colisiones. He aquí los pasos que he ido siguiendo para montarlo:
Primero extraemos la electronica y nos quedamos con los cables de los motores del coche teledirigido, después añadimos un conector tamiya con fusible para la batería LIPO:
Nos hacemos con una placa Arduino y un motorshield, en la cual se pueden acoplar en sus pines los cables de los motores:
En el mercado existen multitud de módulos bluetooth, yo he comprado el de sure electronics por su sencillez tanto de montaje como de comunicaciones (va a 9600 bps). Dos cables van a los pines RX y TX de la arduino y otros dos van a la salida de 3,3 voltios y GND de la arduino. Para comunicarse con él en windows basta con el putty accediendo al puerto COM que se haya asociado a vuestra conexión bluetooth; si se trata de linux o mac podeis conectaros desde la consola con screen /dev/<dispositivo> 9600 siendo <dispositivo> el tty asociado a la conexión:
Montamos los bumpers. El cable suelto va a uno de los pines GND de la arduino, los otros dos cables van conectados a los pines EC1 y EC2 de la motorshield, que a su vez están conectados a los pines 4 y 5 de la arduino, por lo que se deberá activar la resistencia pull-up interna de esos pines:
Una batería LIPO para alimentar el conjunto, pegada con velcro para que se sujete bien a la vez que sea fácil quitarla para cargarla o sustituirla:
Aunque no es necesario, he puesto una cámara wireless alimentada con una pila de 9 voltios para grabar los movimientos. Al final el conjunto queda así:
Como el movimiento se demuestra andando, pongo un video de su funcionamiento (recomiendo agrandarlo para ver mejor los detalles). A la izquierda el putty mostrando los mensajes que envía la arduino a través de bluetooth, en el centro un video del cómo responde el robot y a la derecha otro video desde dentro del robot:
Finalmente dejo el código fuente del robot para el entorno Arduino:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
int dirA = 12; // sentido int dirB = 13; // direccion int speedA = 10; // velocidad del motor int speedB = 11; // parada o encendido de la dirección int bumperI = 5; // bumper izquierdo int bumperD = 4; // bumper derecho int boton2 = 6; // boton 2 de la motorshield int boton1 = 7; // boton 1 de la motorshield // El robot va hacia atrás void atras() { digitalWrite (dirA, HIGH); } // El robot va hacia alante void alante() { digitalWrite (dirA, LOW); } // El robot tuerce a la izquierda void izquierda() { digitalWrite (dirB, LOW); } // El robot tuerce a la derecha void derecha() { digitalWrite (dirB, HIGH); } void setup() { // Configuración de los pines de la motorshield pinMode (dirA, OUTPUT); pinMode (dirB, OUTPUT); pinMode (speedA, OUTPUT); pinMode (speedB, OUTPUT); // Configuración de los pines de los bumpers pinMode (bumperI, INPUT); pinMode (bumperD, INPUT); // Configuración de los botones de la motorshield pinMode (boton1, INPUT); pinMode (boton2, INPUT); // Configuración de las comunicaciones por bluetooth Serial.begin(9600); } void loop() { // Si se ha pulsado el boton de arranque if(digitalRead(boton1) == 0) { delay(200); // para evitar rebotes en el boton Serial.println("empiezo"); analogWrite(speedA, 100); // PWM a 100 } // Si se ha pulsado el boton de parada else if(digitalRead(boton2) == 0) { delay(200); // para evitar rebotes en el boton Serial.println("termino"); analogWrite(speedA, 0); // PWM a 0 } alante(); // Si se ha detectado una colisión por el flanco derecho if(digitalRead(bumperD) == 0) { Serial.println("choque derecha"); digitalWrite(speedB, HIGH); // Va hacia atrás a la derecha durante 1 segundo derecha(); atras(); delay(1000); // Va hacia alante a la izquierda durante medio segundo alante(); izquierda(); delay(500); digitalWrite(speedB, LOW); } // Si se ha detectado una colisión por el flanco izquierdo else if(digitalRead(bumperI) == 0) { Serial.println("choque izquierda"); digitalWrite(speedB, HIGH); // Va hacia atrás a la izquierda durante 1 segundo izquierda(); atras(); delay(1000); // Va hacia alante a la derecha durante medio segundo alante(); derecha(); delay(500); digitalWrite(speedB, LOW); } } |