The project was developed for the III chicotropico festival, in Matadero de Madrid at Sep the 11th, 2011, before the end of the world...

Se celebraba el Fin del Mundo tal y como lo hemos concebido hasta ahora.

Además de un excelente cartel, acompañaron al festival la chamana Martha y una curiosa Virgen Chicotrópica a la que ya incluso se le atribuyen milagros…

Tal virgen robotizada surgió de una muñeca antigua, que se puede apreciar en la siguiente foto:

De esta muñeca, y tras varios pasos que se describen a continuación, se construyó una especie de sacrobot pagano, el cual se colocó en un altar propio para ser adorada en interacción con los asistentes. En la siguiente foto, también se puede ver a la chamana Martha en la habitación contigua a la de la virgencita.

En esta página, describimos cómo fue el proceso de construcción: mecánica, electrónica y control de la Virgencita Chicotrópica.

Mecánica

Brazos

Puesto que los brazos son relativamente ligeros se optó por utilizar servos. Una de las ventajas principales de estos servos es que ya encapsulan el control en posición y son fáciles de manejar desde Arduino.
Los servos utilizados fueron de tamaño medio: 28.8 x 13.8 x 30.2mm. En la siguiente figura puede observarse cómo se colocó el servo en el hueco del brazo de modo que el eje quedase centrado en dicho hueco. Para ello, hubo que fabricar una pequeña pieza moldeando plástico para poder atornillar el servo al hombro:
Detalle desde el interior:
En la parte del brazo, aprovechamos dos orificios por los que pasaba una antigua goma que ajustaba los brazos al cuerpo. Invirtiendo la convexidad de la articulación creamos un pequeño hueco donde fácilmente podemos incorporar la rueda que se ajusta al eje del servo:
En la siguiente figura, se muestra cómo se
acopla finalmente el brazo al eje del servo. Se realizó un orificio en el propio brazo, a la altura del hombro, para poder acceder al tornillo que lo
fija a dicho eje.

Párpados

Para el movimiento de los párpados se procedió del siguiente modo. Primero, se accedió a ellos por el gran agujero que hay debajo de la peluca.
Segundo, se desarmó el mecanismo de palanca que hace que cuando la muñeca está tumbada los ojos se cierren. Luego, se acoplaron los LEDs azules dentro de los globos oculares.
Finalmente se acopló un servo en un lateral del interior de la cabeza y se le acopló un eje realizado con alambre directamente al mecanismo de palanca de los párpados.

Piernas, ojos y corazón

En las piernas se acoplaron LEDs blancos de alta luminiscencia. Aprovechando la naturaleza traslúcida del material de la muñeca conseguimos un efecto de iluminación de toda la pierna.

El corazón se implementó colocando adecuadamente tres LEDs en triángulo. También se aprovecha la piel translúcida de la virgencita.

Corazón encendido.

Corazón apagado.
En los ojos, se acoplaron LEDs azules, como ya se ha comentado. En la siguiente figura, una foto con los tres tipos de LEDs encendidos a máxima potencia.

Electrónica

Los requisitos del sistema de alimentación eran varios. Por un lado, el sistema tenía que permitir tanto alimentación por red, como por baterías, para poder moverse en una procesión.

Por otro lado, había que hacer dos líneas de alimentación en paralelo: una de alta intensidad (hasta 2A) para los motores y otra de baja para el sistema de control y los LEDs, que son de bajo consumo.
Para ello se conectó un regulador de 5V para suministrar suficiente potencia a los servos, a partir de una batería de 12V, o de una alimentación por transformador de 9V.
El sistema de control, esto es, la placa Arduino, contiene regulador propio.

Control.

El sistema de control sigue tres fases en bucle: lectura de sensores, cálculo de señales, escritura en actuadores.

En la figura se observa el clásico bucle de control, dividido en tres bloques fundamentales: sensores, controlador y actuadores (planta).

Dominio de acciones.

Aunque generalmente se tiende a pensar y concebir el flujo de información y de diseño desde los sensores hasta los actuadores, no es un paradigma nada recomendable a la hora de realizar un proyecto de este tipo. Lo más importante de la obra es su dominio de actuaciones, esto es, qué es lo que es capaz de hacer la virgen, qué es lo que los asistentes van a ver, cuál es su dominio de acción.

Enumeramos los grados de libertad de la virgencita:

Por tanto, contamos con 6 GDL analógicos y 2 GDL digitales correspondientes a movimiento y expresión luminosa.

Por otro lado, en el diseño se va a tener en cuenta el futuro uso de una tarjeta de generación de sonidos y habla sintetizada. Esta tarjeta es la GinSing, que utiliza tres entradas/salidas digitales para ser controlada con Arduino.

La conexión con Arduino UNO se realiza del siguiente modo:

GDL PIN HW
LED_LEG_LEFT D13 white LED
LED_LEG_RIGHT D12 white LED
ARM_LEFT A11 Servo Mediano
ARM_RIGHT A10 Servo
EYES A9 Blue LEDs
GinSing D7 Sound Generation Card
LED_EYE_LEFT A6 Blue LED
LED_EYE_RIGHT A5 Blue LED
GinSing D4 Sound Generation Card
LED_HEART A3 Red LED
GinSing D2 Sound Generation Card

donde “D” corresponde a la salida Digital de Arduino, y “A” a una salida “Analógica”, esto es, la modulada mediante PWM.

Obsérvese que se tiene control de la iluminación de cada ojo por separado, y que esta iluminación es analógica. Sin embargo, la iluminación de cada pierna es digital (la pierna se enciendo o se apaga).

Sistema de ejecución de gestos

Un gesto es una matriz de pares de puntos, valor-tiempo, donde, valor corresponde al valor real que se quiere dar a un GDL en el tiempo tiempo. Cada fila de la matriz corresponde a un GDL.

Para la ejecución de gestos, se ha implementado la clase Curve que se encarga de cargar el gesto y calcular mediante interpolación, los valores de un GDL para cada tiempo de ciclo.Por ejemplo, imaginemos la parte de un gesto para el movimiento de un brazo. El vector de pares posición-tiempo implmentado por el programador sería algo así:

p = {0, 70, 20, 100, 0}
t = {0, 100, 400, 600, 800}
La representacióngráfica de estos puntos resultaría de la siguiente manera:

Donde los puntos negros representan las posiciones p a las que se quiere colocar el brazo en los tiempos indicados por el vector t. Estos puntos los denominamos puntos clave.

El algoritmo de interpolación lineal calcula los puntos intermedios entre los puntos clave. El bucle de control se realiza cada tiempo tau, con lo que los puntos interpolados se calculan y se envían al brazo cada tau. En la figura estos puntos se han representado con una cruz granate (solamente se han representado dos, pero se entiende que se calculan todos los puntos desde el comenzo hasta el final del gesto).

El algoritmo de interpolación expresado en pseudocódigo quedaría del siguiente modo:

cargar_puntos_clave;

for( i = 0 to i = num_puntos_gesto) :

A = ( p[i-1] – p[i] ) / ( t[i-1] – t[i] );

B = ( p[i] * t[i-1] – p[i-1] * t[i] ) / (t[i-1] – t[i] );

value = A * time + B;

dof( value);

delay( tau );

Los parámetros A y B corresponden a la recta en el intervalo marcado por el índice i. Este índice recorre los puntos clave previamente cargados.

Pseudo-concurrencia

Hoy por hoy, no existe una librería que permita programar hebras en arduino (o al menos yo no la conozco, si alguien si, que me lo haga saber!).
Por otro lado,la programación del PIC mediante interrupciones es compleja…
Sin embargo, la concurrencia resulta muy interesante e incluso necesaria para poder mover varios grados de libertad sincronizados y, asimismo, seguir atendiendo a la información de los sensores.
El método utilizado en este sentido se puede resumir en la siguiente figura.
La aportación hacia esta “pseudo-concurrencia” está en que cada función de lectura o escritura a un dispositivo de entrada/salida (sensor o actuador) tiene una duración del orden del milisegundo.
La toma de decisión sobre qué actuar se refiere a la elección de qué gesto ejecutar. Hay que tener en cuenta que todas las curvas que implementan cada gesto se cargan en memoria en la fase de inicialización, que es previa al control.

La escritura en cada actuador o grado de libertad está intercalada así por una lectura en los sensores y la toma de decisiones. El cambio de un gesto a otro es prácticamente instantáneo desde que se realiza la lectura de un sensor hasta que dicha lectura provoca el cambio.El tiempo total de cada iteración del bucle de control ronda los 10ms, lo cual está por debajo del umbral de tiempo real que podríamos establecer entre unos 30 ms y unos 110 ms.

La ejecución del gesto se realiza enviando a un GDL un
valor y chequeando un valor de un sensor. Esta alternancia tan rápida
provoca la sensación de concurrencia.