Reconocimiento de colores con Pixy


En efecto, si no tenemos demasiado tiempo  para experimentar con algoritmos de reconocimiento de imágenes con opencv o similares ,por ejemplo para integrar  la visión artificial en un robot que siga una linea, hay un producto llamado   Pixy2    que puede hacer todo eso y mas. Además, esta segunda version,  es más rápida, más pequeña y más potente que el Pixy original, agregando algoritmos de seguimiento / seguimiento de línea, así como otras características  (de  hecho la velocidad de procesamiento  en tiempo real   se ha mejorado en 60 fotogramas por segundo)

Como  puede  suponer  Pixy2  incorpora una cámara  y  una fuente de luz , y con todo  este hw puede detectar líneas, intersecciones y pequeños códigos de barras, diseñados para robots que siguen líneas.

Precisamente  por la utilidad de integrarlo en pequeños robots ,se han agregado algoritmos de seguimiento a la detección de objetos basada en color. Ademas tampoco descuidan su conexión con otras placas pues proporcionan bibliotecas mejoradas y simplificadas para Arduino, Raspberry Pi.

Veamos a continuación   mas detalles sobre esta interesante  placa

 

Hablamos de una placa  bastante pequeña(de unos 8x7cm) ,  tanto que incluso se puede conectar varios Pixy2 a un microcontrolador pues  Pixy2 es más pequeño, más rápido y más potente que el Pixy original. 

Este sistema de visión inteligente plug-and-play para Arduino-compatibles, Raspberry Pi u otros microcontroladores / sistemas de computadora.

 Al igual que su predecesor, Pixy2 puede aprender a detectar objetos que le enseñe, simplemente presionando un botón. Además, Pixy2  implementa nuevos algoritmos que detectan y rastrean las líneas para su uso con robots de seguimiento de línea (  incluso con  los nuevos algoritmos también pueden detectar intersecciones y «señales de tráfico».)

 

Aunque la nueva cámara puede funcionar hasta 60 fps, se  ejecuta aproximadamente la mitad de esa velocidad y existen múltiples opciones para el ajuste fino del reconocimiento de objetos, todo  ello  para  mejorar la precisión   el reconocimiento de imágenes   ya que la cámara no esta diseñada para la grabación de imágenes pero si  pasará el centro X, Y, y el ancho, la altura de un objeto, y lo hace muy bien.

La nueva version  Pixy2  lleva  modo de seguimiento de línea y fuente de luz LED integrada simplificando  su programación recibiendo solo los objetos que le interesan.

Se puede utilizar el controlador que desee pues incluye bibliotecas de software para Arduino, Raspberry Pi y BeagleBone Black.

Si lo conectamos a  un pc, podemos instalar la utilidad de configuración (se ejecuta en Windows, MacOS y Linux) asi como el sw  Pixy2 CMUCam5, un sensor de imagen para su microcontrolador que puede enseñarle qué buscar.También es una gran mejora con respecto a las versiones anteriores de Pixy CMUCam, que agrega una mayor flexibilidad cuando se trata de cambios de iluminación y exposición. También puede recordar siete firmas de colores diferentes, encuentre cientos de objetos en a visión del robot es fácil: presione el botón para enseñarle a Pixy2 un objeto

Por ello el   Pixy2   es un sensor de imagen con un potente procesador que puede programar para enviar solo la información que está buscando para que su microcontrolador no se vea abrumado por los datos  ya que Pixy2 exporta su información en una variedad de formas útiles (UART serie, SPI, I2C, salida digital o salida analógica) para que su microcontrolador o microcomputadora pueda comunicarse fácilmente mientras realiza otras tareas.

Las coordenadas  enviadas  desde   Pixy2  pueden decirle a su robot qué hacer, como girar a la izquierda, girar a la derecha, disminuir la velocidad, etc. Y Pixy2 hace todo esto a 60 cuadros por segundo, para que su robot también pueda ser rápido. Pixy2 utiliza el tono y la saturación como su principal medio de detección de imágenes, en lugar del RGB normal. Esto significa que la iluminación o la exposición no afectarán la detección de Pixy2 de un elemento, lo cual es un problema frustrante con muchos sensores de imagen. .

 

 

Vamos  a ver un ejemplo publicado en instructables.com  de un interesante  robot seguidor que implementa  esta tecnologia  creado  por chaabani houssem 

Necesitaremos  al menos los  siguientes componentes:

  • 1 Arduino mega (o en su defecto un Arduno uno o Arduino nano … )
  • Pixy2  
  • 2 motores  paso  a paso
  • 2 ruedas y sus engranajes 
  • Un l293d
  • Una batería de  9v  (o   cualquiera que pueda reciclar 

 

Podemos  enseñar cualquier objeto a pixy a través de este enlace:

http: //cmucam.org/projects/cmucam5/wiki/Teach_Pixy …

Para controlar  los dos motores usaremos un famoso controlador , el CI   l293d

Este circuito integrado     de 16 pines ofrece los siguintes carasterciticas: 

  • Capacidad del canal: 600 mA de corriente de salida / canal.
  • Sistema de activación.
  • Pico de salida de corriente: 1,2 A / canal (no repetitivo).
  • Protección contra sobretemperatura.
  • Entrada lógica «0» a 1,5 V (alta inmunidad al ruido).

Picture of Build the Robot

Conectemos  los pines del L293D   a un  Arduino   de la siguiente manera :

  • Pin  1 al pin Arduino 2.
  • Pin 2 al pin 3 de Arduino.
  • Entrada 3 al pin 4 de Arduino.
  • Entrada 4 al pin Aduino 5.

Con estas conexiones ya  se puede probar el robot como verificar el avance, probar el giro a la izquierda o  el giro a la derecha y la parada.

Si todo va  bien ahora ya puede agregar pixy, pero para que  funcione el robot  antes tendrá que  programar Arduino  para  que  en función de la  salida de  Pixy2   de las  ordenes oportunas a los motores

Como  ejemplo de código  vamos a ver  una demostracion de como podemos  controlar lso dos motores usando  unicamente la informacion apoportada por Pixy2  

 

//definición de  puertos  que se usaran

int mg2 = 4;

int mg1 = 5;

int md1 = 3;

int md2 = 2;

int enag= 6;

//librerias  externas

#include <Wire.h>

#include <Pixy.h>

//llamada a las primitivas de Pixy

Pixy pixy;




//definición de puertos 

void setup()
{
pinMode(enag, OUTPUT);

pinMode(md1, OUTPUT);

pinMode(md2, OUTPUT);

pinMode(mg1, OUTPUT);

pinMode(mg2, OUTPUT);

//sacamos  por consola de Arduino mensajes de depuración

Serial.begin(9600);

Serial.print("Arrancando...\n");

pixy.init();

}







//comienzo del programa  principal

void loop()
{

static int i = 0;

int j;

uint16_t blocks;

char buf[32];


blocks = pixy.getBlocks();

if (blocks)

{
i++;

// Hacer esto cada 50 cuadros porque si se  supero colapsaria Arduino


if (i%50==0)

{
sprintf(buf, "Detected %d:\n", blocks);
Serial.print(buf);


//bucle for que recorre todos lox bloques enviados por Pixy
for (j=0;  j<blocks;    j++) 

{

sprintf(buf, " block %d: ", j);

Serial.print(buf);  //sacamos las salida por consola

pixy.blocks[j].print();

}


}

if((pixy.blocks[0].x>120)&&(pixy.blocks[0].x<190))
{
go();  //avanzar
}

if((pixy.blocks[0].x<120) && (pixy.blocks[0].x>10))
{

gauche();//girar a derecha

}

if(pixy.blocks[0].x>190)
{

droite();} //girar  a izda
}

else
{

o9if();//hacia atras

}
}






//giro a la derecha
void droite()
{
analogWrite(enag,210);
analogWrite(mg1,0);
analogWrite(mg2,0);
analogWrite(md1,255);
analogWrite(md2,0);
delay(30);
}




//giro a al izda

void gauche()
{
analogWrite(enag,210);
analogWrite(mg1,255);
analogWrite(mg2,0);
analogWrite(md1,0);
analogWrite(md2,0);
delay(30);
}




//hacia atras
void o9if()

{
analogWrite(mg1,0);
analogWrite(mg2,0);
analogWrite(md2,0);
analogWrite(md1,0);
delay(30);
}

//avanzar

void go ()
{
analogWrite(enag,210);
analogWrite(mg1,255);
analogWrite(mg2,0);

analogWrite(md1,255);
analogWrite(md2,0);
delay(30);
}

 

Y   ahora en un vídeo podemos ver el robot   funcionando:

 

En general,   Pixy2   es un excelente sistemas de visión inteligente introductorio  pues  podemos dar seguimiento de objetos a un  robot de manera mucho más fácil que usar un pc de una sola placa con OpenCV (más requisitos de menor potencia) pues se conecta fácilmente a un Arduino Nano o Uno (entre otros sistemas)  gracias  a los ejemplos de código que proporcionan que  ayudan a ponerlo en marcha rápidamente .Ademas es  muy fácil configurarlo utilizando las instrucciones en su sitio web pues hay ejemplos integrados en su software.

 

Humanoide casero


Todos los  dos de abril se celebra el Arduino Day o día Arduino (o Genuino) en todo el mundo, así que esta ocasión  nos asombraron con un sofisticado robot humanoide construido con Arduino y Raspberry Pi  fabricado por el Maker Luisrobots en su casa mediante un Arduino Mega y una Raspberry Pi 2.

Como en otros montajes parecidos una vez mas la placa Arduino Mega se encarga de controlar la mecatronica   y la Raspberry Pi es la  encargada de controlar las cámaras, el altavoz, la tarjeta de sonido y el  micrófono que lleva el robot.

Lo han bautizado como Zeus y es capaz de caminar y hablar, midiendo 1,21 mts de altura y pesa un poco más de 8 kgs.

Además de las placas Arduino y Raspberry Pi, Zeus está equipado con varios módulos más  como un módulo transceptor nRF24L01, un shield Bluefruit EZ-Link para la comunicación y  un BN055 para la orientación absoluta

Por supuesto también usa   servos para las manos,brazos, cuello y piernas

 

El conjunto se completa un 5A UBEC para la regulación del voltaje así como  varios tipos de sensores , una cámara , altavoces,etc

 

En la página de Facebook de su creador hay mas información de este estupendo montaje.