jueves, 22 de marzo de 2012

Tutorial para hacer el Robot


TUTORIAL

Aquí os enseñaremos paso a paso a construir este robot siguiendo todo el proceso que realizamos.

Estos son todos los materiales que hemos utilizado:



Lo primero que hicimos fue hacer pruebas de conexiones con leds y resistencias en una placa para ir practicando y preparándonos para hacer el proyecto:


 


Una vez que tuvimos la soltura necesaria para conectar leds, resistencias y cables empezamos a programar el Arduino con el ordenador y conectarlo al chip para que empezara a funcionar:





Ahora vamos con la estructura, lo primero que hicimos fue montar las ruedas, los motores y el soporte ayudándonos de bridas, tornillos y tuercas:



Y aquí está la primera apariencia de nuestro robot, aunque por motivos varios decidimos cambiarla por la que veréis al final:



Esta es una foto de nuestro famoso Arduino:



Esto es lo que tuvimos que meter en nuestro Arduino para que se moviera y no se chocara contra las paredes:

 
const int numOfReadings = 10;                   // number of readings to take/ items in the array
int readings[numOfReadings];                    // stores the distance readings in an array
int arrayIndex = 0;                             // arrayIndex of the current item in the array
int total = 0;                                  // stores the cumlative total
int averageDistance = 0;                        // stores the average value

// Establecer los pins y las variables para el sensor de proximidad SRF05:

int echoPin = 12;                               // SRF05 echo pin (digital 2)
int initPin = 13;                               // SRF05 trigger pin (digital 3)
unsigned long pulseTime = 0;                    // stores the pulse in Micro Seconds
unsigned long distance = 0;                     // variable for storing the distance (cm)

int motor1Pin1 = 3;                             // pin 2 on L293D
int motor1Pin2 = 4;                             // pin 7 on L293D
int enable1Pin = 9;                             // pin 1 on L293D
int motor2Pin1 = 5;                             // pin 10 on L293D
int motor2Pin2 = 6;                             // pin  15 on L293D
int enable2Pin = 10;                            // pin 9 on L293D

void setup() {
  // Establecer los pins de salida de los motores:
  pinMode(motor1Pin1, OUTPUT);
  pinMode(motor1Pin2, OUTPUT);
  pinMode(enable1Pin, OUTPUT);
  pinMode(motor2Pin1, OUTPUT);
  pinMode(motor2Pin2, OUTPUT);
  pinMode(enable2Pin, OUTPUT);
  //Activar los pins para que el motor pueda girar:
  digitalWrite(enable1Pin, HIGH);
  digitalWrite(enable2Pin, HIGH);

  pinMode(initPin, OUTPUT);                     // set init pin 3 as output
  pinMode(echoPin, INPUT);                      // set echo pin 2 as input

  // Crear bucle de matriz para recorrer en iteración todos los elementos de la matriz

  for (int thisReading = 0; thisReading < numOfReadings; thisReading++) {
    readings[thisReading] = 0;
  }
}

void loop() {
  digitalWrite(initPin, HIGH);                  // send 10 microsecond pulse
  delayMicroseconds(10);                                // wait 10 microseconds before turning off
  digitalWrite(initPin, LOW);                   // stop sending the pulse
  pulseTime = pulseIn(echoPin, HIGH);           // Look for a return pulse, it should be high as the pulse goes low-high-low
  distance = pulseTime/58;                      // Distance = pulse time / 58 to convert to cm.
  total= total - readings[arrayIndex];          // subtract the last distance
  readings[arrayIndex] = distance;              // add distance reading to array
  total= total + readings[arrayIndex];          // add the reading to the total
  arrayIndex = arrayIndex + 1;                  // go to the next item in the array                                

  // Al final de la matriz (10 elementos) entonces inicio nuevo
  if (arrayIndex >= numOfReadings)  {
    arrayIndex = 0;
  }

  averageDistance = total / numOfReadings;      // calculate the average distance
  delay(10);

  // Calcula la distancia y se mueve de acuerdo con ella

  if (averageDistance <= 10){
    // Ir hacia atrás
    digitalWrite(motor1Pin1, HIGH);
    digitalWrite(motor1Pin2, LOW);
    digitalWrite(motor2Pin1, HIGH);
    digitalWrite(motor2Pin2, LOW);   

  }

  if (averageDistance <= 25 && averageDistance > 10) {
    // Girar
    digitalWrite(motor1Pin1, HIGH);
    digitalWrite(motor1Pin2, LOW);
    digitalWrite(motor2Pin1, LOW);
    digitalWrite(motor2Pin2, HIGH);
  }
  if (averageDistance > 25)   {
    // Ir hacia delante
    digitalWrite(motor1Pin1, LOW);
    digitalWrite(motor1Pin2, HIGH);
    digitalWrite(motor2Pin1, LOW);
    digitalWrite(motor2Pin2, HIGH);    

  }
}

Y aquí está nuestro chip que hizo que funcionara el Arduino y por ende, el robot. Tenía 16 patillas y aqui explico la función de cada una
  • Enable: Activa todas las patillas de su fila.
  • Input: Guía las órdenes para el motor desde el Arduino hasta el chip.
  • Output: Guía las órdenes para el motor desde el chip.
  • GND: Es el terminal negativo de la alimentación.
  • VS: Es el terminal positivo de la alimentación.
Y aquí os dejo la foto del chip y de sus patillas:




También tuvimos que conectar el sensor de proximidad para que no se chocara:



 Pongo dos fotos de las conexiones que tuvimos que hacer y aunque los nombres estén en inglés no hace falta traducirlos, y si queréis hacerlo tampoco es muy complicado:




Además de estas conexiones con cables, luego teniamos que soldar todos los cables que iban a los motores, los leds, el interruptor y el sensor de proximidad.

Una vez hechas todas las conexiones, algunas con empalmes por falta de cables más largos, terminamos de dar los retoques a la forma exterior de nuestro apreciado robot. Nosotros Queriamos que se pareciera a esto: 



Aunque finalmente ha quedado así:

En esta foto se puede ver el sensor y los leds (aunque apagados).


Aquí se ve nuestro interruptor que decide si funciona o no nuestro Volkswagen.



Esto es el coche visto desde abajo y se pueden ver las soldaduras de los motores y las bridas.



Y esta es nuestra puerta secreta por donde podemos arreglar algun pequeño fallo que se produzca.