miércoles, 3 de junio de 2015

Foltoy, el robot que espía a los peques


¿Qué es un robot?

Un robot es un dispositivo electrónico y generalmente mecánico capaz de desempeñar tareas automáticamente, ya sea por medio de supervisión humana directa, a través de un programa predefinido o siguiendo un conjunto de reglas generales establecidas. Hay una gran variedad de robots diseñados para diferentes tareas y sectores: brazos robóticos para el montaje de vehículos, robots de limpieza…

El “FolToy” nace de la idea de dos alumnos con la finalidad de crear un proyecto visual, que se moviese, que llamara la atención de la gente y que fuera algo demostrable. Foltoy tendrá controlado en todo momento al objeto o color identificado





El robot está construido con piezas de plástico, PLA o ABS. Nos decidimos por las piezas de plástico por la sencillez y facilidad que teníamos en Don Bosco de usar las impresoras 3D. Las piezas de plástico son ligeras y lo suficientemente rígidas para la estructura del FolToy. Las piezas de plástico están impresas en la impresora 3D “Witbox BQ” que está en el taller. La unión de todas las piezas esta echo atraves de tornillos.



La estructura de Foltoy se compone de ruedas para los servos y para la rueda trasera. Chasis superior e inferior para poder almacenar la batería y el transmisor de vídeo, y un soporte para acoplar la rueda trasera a la estructura. Todos los archivos serán descargables en formato .stl.

Los movimientos son posibles mediante los servos FUTABA S3003. Estos servos están limitados de giro a 180º y hemos tenido que modificarlos para que sean de giro continuo 360º. Los servos de por si tienen tres conexiones, alimentación (5V), masa y control pero nosotros solo hemos utilizado dos alimentación (5V) y masa.


Para las ruedas se colocó unas cubiertas de un coche teledirigido con la intención de que no se resbalase con el roce del suelo, sin esas cubiertas el movimiento del robot hubiese sido nula.



Para el proyecto se utilizó el ATMEGA 328P, extraído del Arduino UNO.  Hemos escogido el Arduino UNO porque era suficiente para la comunicación de la cámara Pixy mediante conexión ICSP, y con el programa adecuado será suficiente para controlar los servos con salidas PWN.


Pixy es una cámara inteligente que le asignas un color u objeto y es capaz de identificarlo.



Transmisor de vídeo sirve para pasar la imagen grabada mediante una cámara. El transmisor esta conectado con la cámara mediante un cable. La visualización de la imagen puede hacerse en un smartphone, tablet o dispositivo que tenga el sistema operativo Android o IOS. Descargando la aplicación "WIFI AVIN" y conectando nuestro dispositivo al wifi del transmisor seremos capaz de visualizar lo que la cámara ve. La aplicación "WIFI AVIN" nos ofrece la posibilidad de grabar lo que ve la cámara o incluso sacar foto.



Mientras uno de los miembros del grupo iba montando el esqueleto del robot, el otro iba haciendo los esquemas en el ISIS y viendo el funcionamiento de este. El ISIS nos proporcionó una idea general de cómo iba a ser el proyecto de forma visual.


Una vez tengamos el circuito completo con todos los componentes en el ISIS, volcaremos el programa al ARES. En el tenemos la posibilidad de seguir con la misma sesión pero para diseñar la PCB entera. Colocaremos los componentes dentro de un cuadro que limitará el tamaño de la placa, orientaremos los componentes de forma que queden accesibles como por ejemplo interruptor, pulsador o conector. Rutearemos las pistas automáticamente. Como el proyecto presentaba un número importante de componentes, el ruteado de las pistas tuvo que hacerse por las dos caras. Al completarse las pistas sin errores, y después de colocar en cada pin a soldar el pad deseado, este es el diseño de la placa que vamos a exportar.  


Programa Arduino:

Cuando tengamos toda la electrónica montada y soldada, cargaremos el programa que se incluye en la carpeta ArchivosFoltoy.zip. 

El programa que cargaremos está pensado para que la cámara Pixy envíe la señal al micro y salga la señal hacia los motores para que tenga en objetivo en todo momento el objeto identificado. Modificando el programa se pueden hacer algunos cambios, por ejemplo, distancia del objeto, velocidad de motores,...

Este es el programa de Foltoy:

//Pixy arduino robot
//Arduino IDE 1.0.6

#include <SPI.h>    //Declarar conexion pixy con arduino
#include <Pixy.h>  //Declarar la Pixy

Pixy pixy;
 //Define un objeto y una zona para seguir el objeto.
int signature = 1;
int x = 0;            //Posicion eje X
int y = 0;            //Posicion eje Y
int width = 0;        //Ancho del objeto
int height = 0;       //Altura del objeto

int area = 0;  //Define el area

int maxArea = 1000;    //Área objeto max
int minArea = 800;     //Área objeto min
int Xmin = 140;        //Min posicion X
int Xmax = 180;        //Max posicion X

int DerAlan = 2;        //aPhase en Pin D2
int DerAtra = 3;       //aEnable en Pin D3
int IzqAlan = 4;        //bPhase en Pin D4
int IzqAtra = 5;       //bEnable en Pin D5

//int Speed = 255;        //Velocidad del motor

//Marcha alante
void forward(){

  digitalWrite(DerAlan, HIGH);
  digitalWrite(DerAtra, LOW);
  digitalWrite(IzqAlan, HIGH);
  digitalWrite(IzqAtra, LOW);
  }

//Marcha atras
void backward(){

  digitalWrite(DerAlan, LOW);
  digitalWrite(DerAtra, HIGH);
  digitalWrite(IzqAlan, LOW);
  digitalWrite(IzqAtra, HIGH);
  }

//Girar derecha
void turnRight(){

  digitalWrite(DerAlan, LOW);
  digitalWrite(DerAtra, LOW);
  digitalWrite(IzqAlan, HIGH);
  digitalWrite(IzqAtra, LOW); 
  }

//Girar izquierda
void turnLeft(){

  digitalWrite(DerAlan, HIGH);
  digitalWrite(DerAtra, LOW);
  digitalWrite(IzqAlan, LOW);
  digitalWrite(IzqAtra, LOW);  
  }

//Parar
void brake(){

  digitalWrite(IzqAlan, LOW);
  digitalWrite(IzqAtra, LOW);  
  }



void setup()
{

//D2 - D5 declarar como salidas  
  pinMode(DerAlan, OUTPUT);
  pinMode(IzqAlan, OUTPUT);
  pinMode(DerAtra, OUTPUT);
  pinMode(IzqAtra, OUTPUT);
  
  brake();
  
  Serial.begin(9600);
  Serial.print("Starting...\n");

  
  pixy.init();
  
//Test de inicializacion 
  forward();
  delay(1000);
  brake();
  backward();
  delay(1000);
  brake();
  turnLeft();
  delay(1000);
  brake();
  turnRight();
  delay(1000);
  brake();
  delay(1000);
//Finalizar test de inicializacion 

}


//infinity loop
void loop()

  static int i = 0;

  uint16_t blocks;
  
  blocks = pixy.getBlocks();  //Recibir datos de la camara pixy
   
  signature = pixy.blocks[i].signature;    //Obtener firma del objeto identificado
  x = pixy.blocks[i].x;                    //Obtener la posicion X
  y = pixy.blocks[i].y;                    //Obtener la posicion Y
  width = pixy.blocks[i].width;            //Obtener el ancho
  height = pixy.blocks[i].height;          //Obtener la altura

//looking for signature 1
if(signature == 1){

  area = width * height;    //Calcular el area del objeto

  //Girar izquierdas si X < posicion Xmax
  if (x < Xmin){

    turnLeft();
  }

  //Girar derecha si posicion X > posicion Xmax
  else if (x > Xmax){

    turnRight();
   
  }

  //Marcha alante si el objeto es muy pequeño
  else if(area < minArea){
  
  forward(); 
  }

  //Marcha atras si el objeto es muy grande
  else if(area > maxArea){
  
  backward(); 
  }
  
  //Sino parar
  else if(area > minArea && area < maxArea && x > Xmin && x < Xmax){
  brake(); 
  }

}

else{

  brake();
  }
}
//Terminar


Descargar archivos del proyecto.


No hay comentarios:

Publicar un comentario