viernes, 16 de noviembre de 2012

bobinadora automatica

unos videos de una bobinadora automática echa por el alumno Sergio Secolo de la Escuela de Educación Secundaria Técnica Nº 2 "Ing. César Cipolletti" de bahia blanca.




 Y aca los dos videos que me mandaron para subir al blog



 


 

 Sorprende la calidad del armado de la maquina y el cableado de los componentes, realemente esta muy bien echo. FELICITACIONES!

jueves, 15 de noviembre de 2012

reconocer umbrales de color con Pygame y una webcam

pygame es una librería de python pensada para hacer vídeo juegos de una forma fácil, en sus ultimas versiones trae un modulo para manejar cámaras webs como las que podemos tener instaladas en una notebook.
Lo interesante, es que con esta librería podemos hacer cosas muy potentes para dotar de "inteligencia" a nuestro robot autonomo.
En este tutorial, voy a mostrar como manejar la libreria pygame.camera para levantar la camara web de una notebook y reconocer un umbral de color X y determinar su par ordenado (x,y) en la pantalla (con lo cual despues se puede tranquilamente mover nuestro robot).

ES IMPORTANTE TENER MINIMOS CONOCIMIENTOS DE PYTHON

Como recomendación instalar ipython y python-tools. ipython es un interprete python con múltiples opciones, la que mas me gusta es la de auto completado (me ahorra muchos dolores de cabeza). python-tools es una serie de herramientas para python, como idle, que es un interprete gráfico de python, con capacidad de auto completado y depuración de código que nos va a servir mucho para ir viendo el codigo.

#!/usr/bin/env python
import pygame
import pygame.camera
pygame.init()
pygame.camera.init()

Como podemos verlo principal es iniciar el pygame y pygame.camera, si todo arranca como corresponde, no debería pasar nada, todavía no declaramos nuestra pantalla ni capturamos las imágenes de la cámara.


#!/usr/bin/env python
import pygame
import pygame.camera
pygame.init()
pygame.camera.init()
######## declaro las variables necesarias ######################
# para manejar la ventana de pygame donde se mostraran las imagenes
Pantalla=pygame.display.set_mode((320,240),0)
# crea una tupla con las camaras reconocidas (el cero es la primer camara)
ListaCamaras=pygame.camera.list_cameras()
# instancia el objeto pygame.camera.Camera con la primer webcam 
# y una matriz de 320x240 pixeles
camara=pygame.camera.Camera(ListaCamaras[0],(320,240))
# inicio la camara
camara.start()


Con este código nuestra cámara ya esta iniciada y debería aparecer una ventana de pygame. Sin embargo la ventana apenas aparece, esta toda en negro y al rato desaparece, eso pasa porque no hicimos el bucle principal para controlar la camara.
Para no complicar el codigo fuente no voy a poner lineas de código para controlar errores ni cosas por el estilo (por ejemplo determinar si ListaCamaras tiene alguna cámara, o si tira un error camara.start() o cosas de esas). Por lo tanto el codigo siguiente si bien funciona, no es optimo (por ejemplo para cerrar la ventana hay que matar el proceso python).


#!/usr/bin/env python
import pygame
import pygame.camera
pygame.init()
pygame.camera.init()
######## declaro las variables necesarias ######################
# para manejar la ventana de pygame donde se mostraran las imagenes
Pantalla=pygame.display.set_mode((320,240),0)
# crea una tupla con las camaras reconocidas (el cero es la primer camara)
ListaCamaras=pygame.camera.list_cameras()
# instancia el objeto pygame.camera.Camera con la primer webcam 
# y una matriz de 320x240 pixeles
camara=pygame.camera.Camera(ListaCamaras[0],(320,240))
# inicio la camara
camara.start()
while True:
    imagen=camara.get_image()
    Pantalla.blit(imagen,(0,0))
    pygame.display.update()

¡Ya tenemos nuestra cámara!... y VIVE! muajua jua jua jua (risa malevola de cientifico loco).


Ahora solo falta reconocer un umbral de color. Para ello agregamos una variable mas a nuestro programa:

ccolor = pygame.transform.average_color(imagen, (160,120,10,10))

La variable ccolor captura un umbral de color de la imagen delimitada en por un rectangulo de 10x10 pixeles en la posicion x,y de 160x120 pixeles.
Con esa variable nosotros podemos usar para crear una mascara con pygame.mask.from_threshold.
con nuestra mascara, ya podemos contar la cantidad de pixeles y ver si pasa de cierta cantidad (se puede calibrar para obtner mejores resultados), y en base a eso obtener el par (x,y) del centro de nuestra mascara.

#!/usr/bin/env python
#!/usr/bin/env python
import pygame
import pygame.camera
pygame.init()
pygame.camera.init()
Pantalla=pygame.display.set_mode((320,240),0)
ListaCamaras=pygame.camera.list_cameras()
camara=pygame.camera.Camera(ListaCamaras[0],(320,240))
camara.start()
imagen=camara.get_image()
#obtenemos el umbral de color del centro de la escena en el primer cuadro
ccolor = pygame.transform.average_color(imagen, (160,120,10,10))
while True:
    imagen=camara.get_image()
    Pantalla.blit(imagen,(0,0))
    #creamos una mascara de la imagen con nuestro umbral 
    #(elimina todo menos el umbral)
    mask = pygame.mask.from_threshold(imagen, ccolor, (30,30,30))
    # se fija si la imagen tiene alguna conexion con nuestra mascara
    connected = mask.connected_component()
    # si los numeros de pixeles dentro de la mascara es mayor a 100
    if mask.count() > 100:
        # busca el centro
        coord = mask.centroid()
        #imprime el par ordenado x,y
        print coord
        # dibujo un circulo para poder ver las cordenadas que reconoce
        pygame.draw.circle(Pantalla, (0,255,0), coord, 10,5)
        pygame.display.flip()
    pygame.display.update()


Con esto capturamos el primer umbral de la imagen, antes de iniciar el bucle while. Esto puede ser medio molesto, en caso de que querramos elegir un punto de la pantalla y que el circulito ver (y posiblemente nuestro robot) pueda seguir colores arbitrarios.
Para eso seguiremos con las opciones de pygame y vamos a usar sus funciones para manejo del mouse.


    pygame.event.get()
    mouse= pygame.mouse.get_pressed()
    if mouse[0]==1:
        x,y=pygame.mouse.get_pos()
        ccolor = pygame.transform.average_color(imagen, (x,y,10,10))

Básicamente lo que hacemos es capturarlos eventos con pygame, gravar los "cliks" del raton en una lista y despues fijarnos si el boton esta presionado.

la variable mouse va a tener una lista de la siguiente forma : [0,0,0] donde cada cero es uno de los 3 botones del mouse (boton izquierdo, rueda del centro y boton derecho). Si el boton izquierdo esta presionado la lista quedaria: [1,0,0] enotnces con fijarnos en el primer elemento de la lista podemos saber si un boton del mouse fue presionado.
despues capturamos la posición x,y del puntero y volvemos a crear la variable ccolor con el umbral de color que queremos que siga nuestro robot.
el codigo completo quedaria asi:


#!/usr/bin/env python
import pygame
import pygame.camera
pygame.init()
pygame.camera.init()
Pantalla=pygame.display.set_mode((320,240),0)
ListaCamaras=pygame.camera.list_cameras()
camara=pygame.camera.Camera(ListaCamaras[0],(320,240))
camara.start()
imagen=camara.get_image()
ccolor = pygame.transform.average_color(imagen, (10,10,10,10))
while True:
    pygame.event.get()
    mouse= pygame.mouse.get_pressed()
    if mouse[0]==1:
        x,y=pygame.mouse.get_pos()
        ccolor = pygame.transform.average_color(imagen, (x,y,10,10))
    imagen=camara.get_image()
    Pantalla.blit(imagen,(0,0))
    mask = pygame.mask.from_threshold(imagen, ccolor, (30,30,30))
    connected = mask.connected_component()

    if mask.count() > 100:
        coord = mask.centroid()
        pygame.draw.circle(Pantalla, (0,255,0), coord, 10,5)
        pygame.display.flip()
    pygame.display.update() 
 



 Video de muestra del programa.

Capturando el par ordenado x,y podemos hacer cualquier cosa con nuestro robot, como seguir el punto, usar trigonometria para determinar distancias (usando un laser y matematica sencillas).
En el proximo tutorial veremos de mover nuestro robot en funcion de las imagenes de la camara.

un robot usando el umbral de color para reconocer vasos de distintos colores

viernes, 9 de noviembre de 2012

ICARO en la televisión

Acá un par de vídeos de ICARO en la televisión donde les hacen una entrevista a los chicos del colegio IPEM 320 jorge cafrune por el Futbol robot que diseñaron con icaro y una aparición estelar del proyecto ICARO y Conectar Igualdad en el programa Vision7 del canal publico.


 El futbol robot de los chicos del IPEM320.




 La estación robótica de conectar igualdad en Visión 7


domingo, 4 de noviembre de 2012

kit de robotica

La idea de diseñar un "kit" de robótica (como ya hay varios dando vueltas a nivel comercial) nunca me pareció interesante como trabajar con componentes reciclados, mas fáciles de conseguir, mas baratos y con un componente pedagogico mas interesante para trabajar donde la construcción del robot se vuelve un desafío en si mismo.
 Sin embargo, luego de tener unas charlas con gente de "Conectar igualdad" y del plan "Joaquin V Gonzalez" de la provincia de la Rioja, me comentaron que es bastante complicado implementar una lógica de trabajo asi y que no todos los docentes van a estar capacitados con la capacidad de conocimientos que se requieren para poder trabajar con "basura electronica".
Por eso la idea de desarrollar un Kit que tenga los componentes básicos de un robot sencillo, pero que también tenga la posibilidad de reutilizar los componentes para otro tipo de proyectos. Lo principal es que pueda ser fabricado a pequeña escala, con componentes de fabricación local (argentina) de fácil adquisición y con pocas herramientas.
Básicamente se trata de una plataforma echa de acrílico de 3 piezas (aunque tal ves lo ideal sera que fuera una sola pieza) con dos motores Ap&s sp4  de fabricación nacional. una placa ICARO y algunos sensores sencillos como Bumpers o CNY70 para hacer seguidores de linea.
La plataforma tiene que tener la posibilidad de funcionar de forma autonoma o poder soporta el peso de una netbook (OLPC Xo o del programa Conectar igualdad). Al principio use baterías de gel (las de las luces de emergencia), pero como hay que tener un cargador de batería  especial, preferi adaptar el proyecto para poder trabajar con 6 pilas AA (1,5 volt cada una o sea, 9 volts en total). La suma de las pilas recargables AA son mas caras que una batería de gel y duran menos, pero son muchisimo mas livianas y los cargadores para pilas son muy fáciles de encontrar en cualquier casa de fotografia o computación. Para las ruedas adapte ruedas de autos a radio control (son estándares) pero también se podría hacer con CDs viejos.

 
 la plataforma vista desde arriba (con una mini protoboard).


 Vista de costado (se puede ver entre las ruedas la batería de gel).


 En el lugar de la batería ahora va un portapilas de 6 pilas.

La idea es que se pueda usar cualquier tipo de "rueda loca" .




Primera prueba del robot, sin sensores.

Con un sensor CNY70 para hacer un final de carrera.


domingo, 28 de octubre de 2012

icaro y la musica

Esto es un proyecto música que tengo desde hace unos años llamado telharmonium.
Aprovechando el hardware de ICARO como plataforma fabrique un pequeño robot que toca un xilófono  con 2 servos Futaba. Un servo mueve la baqueta para hacer el golpe y otro servo mueve de isquierda a derecha para posicionar la baqueta en la pieza para golpear.
Para usar el xilófono, arme un programa en python que analiza  un archivo donde toma las cadenas de texto que representa cada golpe, los tiempos de espera en mili segundos y mediante un diccionario donde esta guardadas los grados de moviento, posiciona el servo, da un golpe (mueve el servo un mili segundo hacia abajo y después lo sube), y espera para mover o dar otro golpe.
de esta forma y con la velocidad de los servos futaba, se puede tener un BPM (beat por minuto) de 100 bpm (100 negras por minuto).
Bueno, aca el video por si alguien quiere escucharlo :-D




el video

jueves, 18 de octubre de 2012

ICARO en las escuelas

seguimos con noticias sobre el uso de icaro en los colegios.
Los chicos de la escuela rural de la carbonada se fueron de gira con su futbol robot y le hicieron modificaciones como, plottear toda la cancha para que quede mas linda, agregarle leds por todos lados y un sistema de pateo de la pelota con un servo motor futaba.

 Armando la canchita

 en el fondo se puede ver el modelo viejo de cancha

 cancha completamente plotteada.

con los leds.
detalle de los robots.

Tambien los chicos de la Escuela de Educación Secundaria Técnica Nº 2 "Ing. César Cipolletti" de bahia blanca estan trabajando con icaro.
estos son dos videos de Sergio Secolo, alumno de 5º año de la especialidad electrónica que hizo una matriz de leds controlada con icaro y una placa np03.


usando los 8 bits de la placa para multiplexar una matriz de 4x4 leds.


 
otro video donde se muestran distintos patrones.
 

lunes, 24 de septiembre de 2012

icaro en el FUDCON - Venezuela

del 23 al 25 de agosto del 2012 se llevo acabo en la ciudad de valencia (Venezuela) el congreso de usuarios y desarrolladores de Fedora (FUDCON), en estos congresos nos juntamos embajadores, empaquetadores, desarrolladores y usuarios en general para hablar de distintos proyectos enmarcados dentro de la distribución GNU/linux FEDORA.
Este tipos de congresos son muy interesantes para poder armar redes de trabajo, contactos y participar de distintas experiencias que se están dando dentro del software libre y FEDORA.
Para mi significo la posibilidad de volver a ver a grandes amigos de la comunidad FEDORA, no puedo dejar de agradecerle a Maria "tatica" Leandro por todo el apoyo para que pudiera viajar hasta Venezuela y por organizar todo el congreso con un gran esmero.


inicio del congreso

Robyn Bergeron dando la primer charla sobre FEDORA


Fedora y ARM

Gracias a Robyn Bergeron y Jared Smith  me regalaron una RASPBERRY-PI para hacer experimentos y trabajar sobre el uso de la GPIO (General Purpose Input/Output).
mi RASPBERRY-PI controlando a una placa NP05.
 
 una demostración para controlar 2 servos con python

La verdad que la experiencia fue muy motivadora, en las FUDCON van personas con un gran nivel tecnico y es la posibilidad de aprender de gente realmente muy capacitada y con ganas de compartir.
 FEDORA es una comunidad muy interesante para participar, donde la gente es de lo mas amable y colaborativa.


¡GRACIAS CHICOS DE FEDORA!

lunes, 10 de septiembre de 2012

nuevo pagina de ICARO

Esta es la nueva pagina del proyecto icaro:

http://roboticaro.org/

En este sitio vamos a ir concentrando toda la información del proyecto, datos y repositorios.
La idea fue de mi gran amigo Neville, que gestiono el dominio y el hosting, montamos un wordpress que enlaza con este blog y otros que vamos a ir agregando tipo planets. También una wiki donde poner documentación técnica y un sistema Question2Answer para poder hacer consultas tipo foro de preguntas y respuesta.

el sitio:

http://roboticaro.org/

la wiki (todavia muy en construcción):

http://roboticaro.org/wiki/index.php

El foro:

http://roboticaro.org/preguntas/

Me gustaría que las personas interesadas en el proyecto se inscriban en el sistema de preguntas y respuestas para poder canalizar las distintas cuestiones que pueden ir apareciendo (y que generalmente respondía por mail privado).



viernes, 7 de septiembre de 2012

Feria de ciencia en la carbonada

Los chicos del colegio rural la carbonada se presentaron a una feria de ciencia con dos robots para jugar al fútbol echos con ICARO.
Felicitaciones por el tercer lugar y por haber fabricado integramente todas las piezas del fútbol robot  sin ayuda externa y con partes recicladas.

Aca algunas fotos de los chicos









viernes, 3 de agosto de 2012

ICARO en Tecnopolis

La gente de conectar igualdad me invito a participar dentro de la feria  Tecnopolis con el proyecto ICARO.
La idea era fabricar unas plataformas móviles (parecidas a las del proyecto Butia). Como en la feria hay muchísimo transito de personas (y niños), pensamos en actividades simples donde los chicos controlaran una netbook del plan conectar igualdad y mediante una red wifi movieran el robot (usando sockets y un pequeño servidor escrito en python que desarrolle para tal motivo).

aca van algunas fotos de los robots que armamos:








y aca algunas del evento:






y un video:


sábado, 21 de julio de 2012

robot bipedo

La idea era poder fabricar un robot bípedo con la mínima cantidad de servos y usando solo los 5 conectores de la placa np05.
Si bien también se pueden usar los 8 conectores del PORTB (puerto de expansión) y los 8 conectores analógicos (PORTA), la meta era tener que tocar lo menos posible el código fuente C que usa icaro y no agregar mas electronica.

 Robot de frente

Otra visión del robot 

Detalle de los pies con los servos


Primeras pruebas de caminata.

En las primeras prueba, el robot solo caminaba para adelante. Después le agregue un sensor CNY70 para que detectara cuando esta cerca de una pared blanca y retrocediera.


 Configuración para que el robot camine para adelante

Para que el robot camine hay que hacer una serie de 6 movimientos con una pausa mínima de 200 Ms, para que retroceda hay que repetir a la inversa los movimientos del servo


 Configuración para que el robot gire


Como repetir cada uno de esos movimientos es muy incomodo y dificultaría la lectura del código final, para eso use llamadas a funciones.
Para hacer eso, grabamos nuestros bloques con la opción "guardar como función" dentro de la carpeta -función- de icaro-bloques (todavía es experimental pero funciona). Después usamos el bloque "incluir" para agregar esa función a nuestro código, y después para llamar a esa función, usamos los bloques "acción"

Robot que avanza y gira.

El paso siguiente fue ponerle un sensor cny70 para que detecte cuando choque con una pared blanca y retroceda.

 
Con un bloque "si".

Cuando el sensor cny70 toque una pared blanca retrocederá y girara  a la izquierda.

 Con el sensor cny70 en el frente 


 Vista de costado


Detalle del circuito del sensor con un cny70 y un CD40106


Vídeo del robot

domingo, 24 de junio de 2012

usando el puerto de expansion

La placa NP05 posee un puerto de expansión (concretamente el PORTB del micro controlador 18f4550) que se puede usar para tener salidas o entradas digitales de propósito general.
Con icaro-bloques se puede mandar información al puerto de expansión usando el bloque "activar".

Bloque "activar" con una variable como instrucción 


 al igual que en la placa NP03 de puerto serie, para activar los pines del puerto, hay que mandar un valor decimal que el micro controlador representara en valor binario, cada bit es uno de los pines del puerto, encendido o apagado.
Asi, para que se encienda el pin 1 del puerto haremos "activar 1" (00000001) el pin 2 "activar 2" (00000010), el pin 3 "activar 4" (00000100) y asi exponencial-mente hasta el pin 8 que es el valor 128 (10000000).
si bien se podría hacer un programa que simplemente enviara la señal activar ocho veces con los valores 1, 2, 4, 8, 16, 32, 64, 128, en el ejemplo siguiente preferí mostrar como usar una variable para generar un bucle donde en cada iteración la variable "a" se suma a si misma (un acumulador).



programa para encender leds en icaro-bloques

Con el programa anterior, si conectamos una placa con leds (el circuito es bastante simple y se puede hacer con una placa universal) veremos como cada led se va prendiendo en pasos hasta llegar al led 8 donde vuelve a empezar. Los programas en icaro-bloques por regla general son un bucle infinito donde se lee desde el bloque "inicio" hasta llegar al ultimo bloque pegado a la cadena, y luego vuelve a empezar, aunque hay formas para evitar eso (con bucles "while True" vacios al final).
 


Video del puerto de expansión contando 8 pasos


Este programa es para hacer un contador de 255 pasos,  es mas sencillo porque solo necesitamos que la variable se sume a si misma en cara iteración.
 
Programa en icaro-bloques para un contador de 255 pasos



Video del PORTB contado 255 pasos

Con este puerto de expansión se puede agregar funcionalidades a la placa icaro, como prender luces o reles (para manejar un motor de potencia por ejemplo), y con un poco de maña también 8 servos mas (aunque implicaría tocar muchas cosas a nivel C).

viernes, 1 de junio de 2012

ICARO en villa maria

El 30 de mayo en la localidad de Villa Maria (provincia de Córdoba) fuimos con Javier Castrillo (del programa nacional Conectar Igualdad) a dar unos talleres de Robótica pedagógica en el marco de los festivales conectar .
Ayudarlo a Javier con los cursos (uno con casi 150 chicos) me permito ver algunas cosas con respecto a la metodología que se puede utilizar para enseñanza de robotica (sobre todo trabajando con muchos chicos).
quiero tambien aprovechar para agradecer a Gsutavo Cierra de la Tecnoteca que nos dio una gra mano en todo y le puso toda las pilas al trabajo.
algunas fotos del evento:

Los chicos usaron Turtleart en sus netbooks y aprendieron conceptos básicos de la programación 

 una flor

 Segun Javier Castrillo, una cara



 Haciendo las primeras pruebas con el robot que llevamos

Mas pruebas

La experiencia fue muy linda (aunque estuve los dos días afónicos) y creo que permitirá armar un lindo grupo de trabajo para poder desarrollar el hardware con los colegios técnicos de la zona y poder usarlos en varias instancias pedagogicas.