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!