Brazo robot dibujante V2. (Monstruosidad tecnológica)

Los resultados del brazo robot dibujante anterior no tuvieron una gran resolución. Mi idea inicial era hacer que pudiera escribir y eso resultaba imposible. Esto se debía principalmente a que cada paso de los motores paso a paso que uso es de 0.9° (400 pasos / rev). Cada tramo del brazo medía unos 16 cm, por lo que un solo paso del motor resultaba en un movimiento exagerado en la punta dibujante.
Una forma de mejorar la resolución podría haber sido cambiar los motores, pero decidí ir por otro lado.

Idea de mejora

Sin abandonar el diseño inicial (un brazo con 3 articulaciónes), se me ocurrió que la resolución en cada articulación se podía mejorar usando poleas y correas dentadas. Con dos poleas con suficiente diferencia de tamaño, podría multiplicar la resolución varias veces.

Manos a la obra

Conseguí un par de juegos de poleas y correas. 2 poleas de 72 dientes, y 2 poleas de 10 dientes. Usando ambos pares, la resolución para cada motor pasa a ser 400*7.2=2880 pasos / rev. Pero la construcción no fue sencilla.

Primero vino el caos:


Y (después de algunas decenas de pasos intermedios que no fotografié) emergió el orden:



Algunos detalles

  • La idea del funcionamiento y el software es idéntico al de la versión 1.
  • Mucha más resolución en ambas articulaciones.
  • El 'codo' ahora está suspendido. En la versión anterior estaba apoyado sobre un rodamiento
  • Meknex para la construcción. El peso del brazo es considerable, por lo que hicieron falta algunos tensores para mantener todo a nivel.
  • Arduino + Motor Shield para manejar los motores paso a paso.
  • Muuuuuuchas horas de construcción. El principal desafío fue lograr que ambas correas estén tirantes, para no perder movimientos de los motores en la transmisión.


Está vivo!

Aquí un videíto del monstruo en acción:



Sí, finalmente escribe!

(Me queda claro que este diseño de robot es más una demostración de obstinación que otra cosa, pero la verdad es que me divierte muchísimo hacer estas cosas.)

Brazo robot dibujante

Hace unos meses, construi mi versión del drawbot, que despues se convirtió en el lightbot.
Un proyecto muy usual para los que se van metiendo en la robótica es construir algun tipo de brazo robot. Me animé a intentar uno mío, con la idea inicial de que pudiera escribir, incluso con estilo.
Mi acercamiento era (demasiado) sencillo: con 2 motores paso a paso, construir un robot con 2 articulaciones, que se moviera sobre un plano y me permitiera dibujar. Nuevamente con meknex, y mi arduinomotor shield armé un primer prototipo:
(perdón por la calidad de la foto)
El marcador está fijo, y los perfiles están ajustados directamente a los motores. El motor de la articulación tiene unos rodamientos debajo para soportar el peso.

Software


Para el software, tuve que aprender la versión más básica de un cálculo de cinemática inversa (IK). Es así:

(Dibujado a mano, no por el robot)


Sabiendo donde queda el punto al que tengo que ir, es facil calcular la distancia d, usando el teorema de Pitágoras. Sabiendo las 3 longitudes de un triángulo, se puede encontrar el valor de cualquiera de sus ángulos por el teorema del coseno.  Primero, tengo que encontrar los valores para Gamma y Beta.  y ubicar a los motores en esa posición. Luego, tengo que aplicar una corrección Alfa para ubicar el marcador donde corresponde.
Programé los cálculos, y nuevamente utilizando la biblioteca AccelStepper,  implementé los movimientos de los motores paso a paso. Una vez implementado esa rutina, entendí con agrado que todas las rutinas para dibujar que había hecho para el drawbot eran usables, pues todas dependían de la implementación de una sola rutina: moveTo(x,y).

Algunas pruebas


No tardé mucho en darme cuenta que la precisión que hace falta para hacer algo parecido a la caligrafía está completamente fuera del alcance de un robot armado con estos elementos. Usar  microstepping no fue posible por el torque requerido (sobre todo por el motor de la base).Aun así decidí continuar a ver qué salía.
Las primeras pruebas no fueron muy alentadoras. El brazo tenía mucha vibración y dependía mucho de estar bien firme sobre la base. Solucioné el problema con una plancha de foamboard, a la que atornillé la base del brazo.
Hice algunos cambios de diseño para reducir el peso,  y agregué un servo en la punta del brazo, para poder subir y bajar el marcador:




Las pruebas de dibujo continuo dieron los resultados esperables, considerando la resolución de los motores. Los dibujos de precisión entonces quedaron descartados. Sin embargo, todavía quedaba la opción de hacer dibujos más 'impresionistas'. Un nuevo cambio de brazo y algunos resultados:






Un cambio por una punta más fina y otro algoritmo para dibujar:





Una vuelta de tuerca


Finalmente, decidí agregarle una cosita más. Había comprado hace tiempo una pantalla táctil para Nintendo DS que nunca había conectado a nada. Siguiendo los pasos de este tutorial, pude conectarlo al Arduino con facilidad. Usando una caja de un servo, construí una pequeña base. 




 Con la pantalla funcionando, solo hacía falta indicar al brazo a donde moverse, dependiendo de las coordenadas leidas por la pantalla tactil:



Espejo infinito interactivo

Hace un tiempo conocí los espejos infinitos. En un principio no me pareció un proyecto muy llamativo, pero luego se me ocurrió una vuelta de tuerca que podía hacerlos más interesantes.
A principios de este año, participé del free day de Sparkfun. Fui uno de los afortunados ganadores, y en mi pedido incluí dos muy lindas tiras de LEDs.  Cada LED está  manejado por un integrado WS2801 conectados en serie, con lo cual cada uno puede ser manejado independientemente con el protocolo SPI, utilizando solo 2 cables de control para toda la tira.

El proyecto inicial para el que los había pedido no prosperó, así que estaban esperando un nuevo objetivo.

Manos a la obra

Sin tener un plan claro, pero por lo menos con ganas de avanzar, empecé por comprar una plancha metálica y hacerle agujeros para que pasen los LEDs, lo más juntos posibles.  Despues de un par de pruebas destructivas, usando un taladro con una mecha de 12mm encontré una forma prolija de agujererearla:


Pruebas iniciales

Ya un poco más canchero.

Tiras finales
Con las tiras ya armadas, pasé los 40 LEDs de las tiras, hasta obtener una tira larga. 

Para este proyecto dejé descansar el Arduino y usé el Teensy++, que tiene características similares.



Tira de LEDs  + Teensy++ al comando

Uniendo las 2 puntas, ya tuve mi primer acercamiento:
Un "circulo", digamos


Una pequeña semejanza con el reactor de Iron Man, no?




 El papel metalizado no alcanzó para sostener la forma circular, pero un poco de alambre alrededor solucionó el problema.

El infinito

Con el circulo formado, ya es posible lograr el efecto de espejo infinito. Se requiere un espejo y un vidrio espejado. Al enfrentarlos, lo que queda en el medio se repite infinitamente (aunque cada vez con menos intensidad):

Vidrio espejado, leds y espejo

EL INFINITO


Un poco de interacción


Había que aprovechar la versatilidad de las tiras de LEDs, así que programé algunas visualizaciones. Y para agregarle un poco de gusto al proyecto, decidí que el espejo sea interactivo.  Para eso, conseguí un sensor ultrasonico de distancia HC-SR04 y un sensor infrarrojo VS1838B para recibir comandos de un control remoto:



La idea es programar el Teensy para que las tiras de LED reaccionen a los cambios de distancia y que las visualizaciones puedan cambiar manejadas con el control remoto.
Para manejar las tiras, usé la librería de Adafruit: https://github.com/adafruit/Adafruit-WS2801-Library y para leer el control remoto: http://www.pjrc.com/teensy/td_libs_IRremote.html . A ambas tuve que modificarlas ligeramente para hacerlas andar.

Emprolijando


Decidí agregar un terminado más prolijo al espejo. Para eso, hice cortar 2 piezas de acrilico para darle un marco:


Y luego los uní con 4 tornillos:




Alargué y emprolijé un poco el cable de las tiras de LEDs para alejar el Teensy. Así quedó el setup final:


Demo

Video del espejo en acción. Con el control remoto cambio de visualización y la mano cambio velocidad/intensidad del color:



Dibujar con luz

Apenas le comenté mi intención de construir un drawbot, mi hermano subió la apuesta y tiró una idea que creo que nadie implementó hasta ahora: reemplazar el marcador por una luz, y sacar fotos de larga exposición. Lo más parecido a esto serían las fotografías con varillas con leds.

Manos a la obra

Un led RGB sirve muy bien para emitir luz (de colores, ni más ni menos!), y abre mucho las posibilidades, así que conecté uno al Arduino. Con una modificación del software del drawbot (que incluyó una implementación "bestia" de PWM por soft), ya estaba listo para hacer una prueba. Me di cuenta que iba a necesitar un difusor para suavizar el destello de led. Construí uno con una pelota de ping pong:


Con la luz apagada, y mi Lumix LX5 en modo manual, hice las primeras pruebas:

(Solo  el cuadrado, John estaba ahi desde el experimento anterior)

Give peace a chance!

Despues de algunos prototipos fallidos, llegué a un diseño de difusor un poco más compacto:


El paso siguiente fue probar con una imagen más interesante. Programé el robot para recorrer linea por linea un bitmap :


El video muestra el funcionamiento con la luz encendida. Todo debe hacerse en oscuridad.
El resultado fue alentador:


Cada prueba llevó unos 8 minutos (4 de captura + 4 de procesamiento). La limitación de 240 segundos de apertura de mi LX5 me hizo ajustar la imagen a dibujar.

Afuera!

El paso siguiente fue sacar al robot de la habitación. La pizarra ya no cumple ninguna función, así que  decidimos hacer experimentos al aire libre. Con dos trípodes de fotografía, una cámara más pro y en un lugar más lindo, armamos el nuevo ambiente:


Nueva versión del difusor. (Una tapita de esmalte de uñas) 
Todo listo!
Al anochecer, y despues de algunos problemas de hardware, pudimos finalmente hacer unas tomas:


Nada de Photoshop, eh
El fondo sale iluminado por destellos de flash y por luz de luna. Cada toma llevó unos 15 minutos, así que fue un ejercicio de paciencia. Un camino de mejora será acelerar el robot y aprovechar un poco más el potencial para dibujar con precisión.

Para ver otros trabajos de mi hermano, click aquí y aquí.

Drawbot: robot dibujante


Desde hace un tiempo venía rumiando este proyecto: mi versión de un drawbot (robot dibujante). Hay varias implementaciones ya hechas, todas derivadas, por lo que entiendo, del original: el hektor.
La idea es la siguiente: Mover un marcador sobre una pizarra, usando dos hilos conectados cada uno a un motor paso a paso:

Vista general


Materiales:

2 motores paso a paso 200°/rev.
2 carreteles de tanza de pescar.
Cable de cuatro hilos.
Arduino + Motor stepper shield.
Marcador.

Armado
Primero aseguré los motores en las esquinas superiores del pizarrón: uno a cada lado. Con un poco de cinta de papel, engrosé el eje para que los carreteles encastren sin resbalar:


Alargué los cables de los motores para que alcancen al Arduino+Shield en la base.
Extendí ambos hilos hasta el centro y los até al sujetador del marcador

o

Con el hardware instalado, me puse a trabajar en el software.
Para dibujar con facilidad,  necesitaba poder transformar las longitudes de ambos lados en coordenadas cartesianas (x,y).  Esto se resuelve desempolvando un poco de trigonometría símple:


Con un pequeño programa de Arduino, implementé la función moverA(x,y)
Con eso funcionando, es sencillo implementar otras primitivas más complejas , como rectángulo, o circulo.

Para la primera implementación que escribí, usé la biblioteca AFMotor de Adafruit. Esta biblioteca solo permite manejar un motor stepper por vez. Eso implica que para hacer un movimiento conjunto, tengo que alternar pasos de los motores, lo cual genera mucha vibración en el marcador, ya que se alternan los tirones de un lado y otro. Afortunadamente, descubrí la librería AccelStepper, que me facilitó el uso de los dos steppers a la vez, con resultados mucho más suaves.

La velocidad a la que se mueven los motores también altera el resultado (y por supuesto, la velocidad a la que dibuja). Imprimí un pattern de prueba. Velocidades más altas dan resultados mas desprolijos :

30 steps/seg

100 steps/seg


Lo ultimo que probé fue convertir una foto para que pueda ser dibujada por el robot. Un  algoritmo sencillo convierte una imagen con pocos niveles de gris a una linea contínua:

25cm x 25 cm, 4 horas para dibujar.


Un video del robot en (leeeeenta) acción:



Lo que sigue


Es un proyecto todavía en progreso. Mi idea es poder leer archivos vectoriales e implementar otros algoritmos para mostrar archivos bitmap. Se aceptan sugerencias!