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: