Cartografía Celeste

Prototyping and Fabrication Techniques Sound and Music Computing, Aalborg University Otoño 2020

El punto de partida

Cartografía Celeste nace como un proyecto para la asignatura "Prototyping and Fabrication Techniques", donde tenemos que diseñar y fabricar un objeto electrónico desde cero. Como punto de partida definí una lista de condiciones y caminos a explorar.

Inspiración

Por los misterios del algoritmo de recomendación de YouTube, llegué a un vídeo de The Warthog Project, un canal dedicado a la construcción de un simulador de un A-10C Warthog. En el vídeo, el autor explica cómo construye el panel de combustible desde cero.

La idea de usar un panel de acrílico negro, con textos y retroiluminado, me pareció muy interesante como punto de partida y empecé a explorar la posibilidad de generar paneles aleatorios.

Primeros bocetos

¿Y si los paneles no tuvieran sentido alguno? El panel sin sentido estaría formado por una serie de mandos con etiquetas absurdas. Desde lejos parecería algo importante, serio, pero al verlo con atención nos daríamos cuenta de que no tiene sentido alguno y nos trataríamos de imaginar qué controla un panel así.

Panel sin sentido
Sintetizador analógico

En esa misma línea, otra posibilidad sería que cada panel fuera un sintetizador analógico único: la herramienta genera el panel, la lista de materiales, el esquema electrónico...

Estos paneles presentan sendos problemas:

El panel sin sentido no "hace" nada, los controles no funcionan, son meros adornos, y manejar los controles no va a producir ninguna salida, porque no hay salida como tal.

El sintetizador analógico podría producir una salida, pero como contrapartida, la parte electrónica es mucho más complicada. Si queremos que el sinte sea un poco interesante, hay que dotarle de un mínimo de controles, lo que complica la programación, el cableado y por tanto, el tiempo necesario para construir un ejemplar.

Cartografía Celeste

Pensando en el acrílico negro, los LEDs y en mantener un interface reducido, se me ocurrió generar constelaciones. Los LEDs harían de estrellas, el negro del acrílico simularía el espacio, y presentaría suficiente contraste como para añadir las líneas que unen las estrellas y los textos sin necesidad de iluminarlos.

Al usar sólo LEDs (y un microcontrolador y una batería) el proyecto sería sencillo, pudiendo construir más de un ejemplar, pero el resultado sería interesante o serio, como para ponerlo en casa.

Cartografía Celeste cumple los puntos expuestos anteriormente:

Código abierto

Los ficheros principales son:

Desarrollo

El proyecto está dividido en cuatro bloques:

Herramienta de generación Herramienta que genera las constelaciones y los paneles, y graba los ficheros vectoriales que luego mandaremos a la cortadora láser.

Objeto físico Los materiales se deben cortar en una cortadora láser y contar con un acabado profesional. El objeto final debe tener un aspecto sólido y elegante. El tamaño final debe mostrar la información sin que quede apretujada, sin ser algo muy grande.

Hardware La combinación de microcontroladores, actuadores, etc. teniendo en cuenta el espacio disponible y el presupuesto.

Firmware El código debe ser sencillo, para que quepa en el microcontrolador, pero el resultado debe ser atractivo para que el usuario encienda el objeto.

Durante el desarrollo se han tomado una serie de decisiones de diseño que han venido motivadas por:

👉🏼
El desarrollo ha sido un proceso iterativo. Las decisiones que se han tomado en cada bloque han afectado al resto de bloques.

Herramienta de generación

Para manejar la cortadora láser, uno de los formatos recomendados es SVG (Scalable Vector Graphics) Decidí usar Processing porque permite generar ficheros SVG de manera casi automática.

La herramienta genera una serie infinita de constelaciones, distribuyendo doce estrellas al azar, uniéndolas y generando información adicional. El proceso es automático: pulsando la barra espaciadora se genera y graba una nueva constelación, incluyendo las piezas adicionales necesarias para el montaje. El fichero SVG incluye los grosores de línea necesarios para que la cortadora corte las piezas o marque las líneas y los textos. La única tarea manual es reescalar el diseño un 65.415% desde el programa donde se vaya a usar la cortadora, ya que el fichero SVG generado no incluye unidades.

Ejemplo de SVG generado

En detalle

Diseño paramétrico Una de las decisiones que tomé al principio fue parametrizar todas las medidas (márgenes, padding, tamaño de los LEDs...). Durante el proceso de desarrollo he tenido que cambiarlas muy frecuentemente y hacerlo de otra manera hubiera sido un horror.

translate(63, 0);
translate(traceW*2+panelMargin*2, 0);

Ayuda para soldar Para facilitar el proceso de soldar los LEDs, marqué la posición de la cinta de cobre (las columnas señaladas como A-D), así como a qué par de columnas hay que soldar el LED y en qué posición. Por ejemplo, -CD+ significa que en esa posición va un LED soldado a las columnas C (cátodo) y D (ánodo)

Disposición de los LEDs Los LEDs se colocan al azar en el espacio disponible, pero cumpliendo una serie de reglas que van a facilitar su soldadura:

Generación de la constelación Para generar las líneas que forman la constelación me estuve dando cabezazos contra la pared (unir algunas estrellas, unir todas con todas y refinar, eliminar algunas líneas) hasta que me di cuenta de que todo eso ya estaba inventado y que podía reutilizar algoritmos existentes. La constelación se crea siguiendo estos pasos:

  1. Calcular la triangulación de Delaunay, para obtener una red de triángulos que evita ángulos agudos y el cruce de segmentos. Este paso devuelve una lista de segmentos entre estrellas.
  1. Calcular la envolvente convexa , es decir, la lista de segmentos que engloban a las estrellas. Este paso devuelve otra lista de segmentos.
  1. Eliminar los segmentos de la envolvente de la lista de segmentos de la triangulación.
  1. Deshacer los triángulos que queden, eliminando uno de los segmentos al azar.
  1. Si una estrella está conectada a más de tres estrellas, eliminar las conexiones extra.
  1. Asignar un radio al azar a cada estrella.
Proceso de generación de constelaciones: Triangulación de Delaunay, eliminación de la envolvente, eliminación de triángulos, eliminación de conexiones

Tras este proceso pueden quedar estrellas desconectadas, pero eso ocurre hasta en las mejores constelaciones.

Textos El nombre de la constelación se elige al azar de una lista de sustantivos en latín. El apellido del descubridor de la constelación se elige de una lista de apellidos flamencos, franceses e ingleses. El año de catalogación se asigna entre 1600 y 1825 El resto de datos astronómicos están generados al azar, pero eligiendo valores plausibles. El número de estrellas de la constelación es el número de estrellas conectadas.

Piezas extra El diseño SVG incluye las piezas adicionales del anillo que necesitaremos para el montaje.

Posibles mejoras

Hardware

El hardware está formado por un microcontrolador ATtiny25, doce LEDs blancos de 3mm de diámetro y una batería de CR2032 de 3v. Los LEDs se sueldan entre las cuatro trazas de cobre, cada una de ellas unida a la correspondiente salida del microcontrolador.

Esquema del circuito
Conexión de los LEDs
Placa con el ATtiny
Montaje de LEDs y placa

En detalle

ATtiny25

Usamos el microcontrolador ATtiny25 como alternativa al ATmega328, el chip estándar en las placas Arduino. El ATtiny25 tiene seis pines que funcionan como entrada / salida, funciona entre 2.7 y 6 voltios y se puede programar desde el IDE de Arduino, por lo que no hacen falta herramientas adicionales. En caso de que el ATtiny25 se quede corto (sólo tiene 2kb de memoria para el programa y 128b para las variables) se podría sustituir por el ATtiny45, totalmente compatible y con el doble de memoria.

Charlieplexing Charlieplexing es una técnica utilizada para controlar varios LEDs con el mínimo número de pines de salida, sin necesidad de hardware adicional. Con esta técnica, los LEDs se encienden durante un breve período de tiempo, y la persistencia de la visión nos hace creer que siempre están encendidos

Mediante el uso del charlieplexing, con nn salidas se pueden controlar n(n1)n(n-1) LEDs, por lo que usando 4 pines de salida manejaremos 12 LEDs.

Las primeras pruebas se hicieron en una placa compatible con Arduino y se portaron al ATtiny25. La versión primitiva del código está disponible en el repositorio GitHub y usa el 35% de la memoria de programa disponible y un 86% de la memoria RAM.

Charlieplexing en un ATtiny25. El Arduino del fondo sólo le da corriente al microcontrolador.

Fuente de alimentación Una batería estándar CR2032 alimenta el sistema. La carga de una batería nueva dura aproximadamente 22 horas. Para mantener la batería en su lugar, uso dos pines de un cabezal, doblando uno de ellos. Es una solución provisional, pero suficientemente buena ya que soporta el peso de la batería y el objeto puede moverse sin que la batería se suelte.

Bent pins used to hold the battery.

Posibles mejoras

Firmware

El código es una combinación de charlieplexing y PWM para conseguir regular la intensidad de los LEDs y crear el efecto de parpadeo.

En detalle

Pasando el código al ATtiny Para poder pasar el código al ATtiny25, y considerando la posibilidad de construir más de un objeto, construí un shield para facilitarme la tarea, en vez de montarlo sobre una placa de desarrollo y tener que estar pendiente de los cables.

El shield se basa en los tutoriales de Viktor S en Hackster.io y NotoriousRapper2Chainz en instructables, con un LED extra en el pin 9 del Arduino, que indica que todo va bien y un segundo LED conectado al pin 4 del ATtiny para comprobar que todo funciona como se espera ejecutando un sketch de prueba.

Esquema del shield
El shield en persona
El shield colocado sobre el Arduino

Para programar el ATtiny25, hay que seguir estos pasos:

  1. Instalar la extensión para los microcontroladores ATtiny Arduino > Preferences > Additional Boards Manager URLs pegando la URL https://raw.githubusercontent.com/sleemanj/optiboot/master/dists/package_gogo_diy_attiny_index.json Este paso solo es necesario una vez.
  1. Transferir el código de ArduinoISP a la placa Arduino. ArduinoISP está incluido en la versión estándar del IDE de Arduino en File > Examples > 11.ArduinoISP. Este paso solo es necesario una vez.
  1. Elegir el chip Tools > Board > DIY ATtiny > ATtiny 25, asegurarnos de que la opción Tools > Use Bootloader está a yes y pasar el bootloader al chip Tools > Burn bootloader. Este paso se necesita una vez por cada chip que queramos programar.
  1. Sube el código del ATtiny al microcontrolador, esta vez asegurándonos de que la opción Tools > Use Bootloader está a no. El sketch arduino/attiny_test disponible en el repositorio de GitHub repository es un sencillo 'blink' para comprobar que todo funciona.

El código El código está basado en el artículo Twelve PWM Outputs from an ATtiny85 de David Johnson-Davies e incluye la función para generar números pseudoaleatorios desarrollada por Rob Tillaart y publicada en los foros de Arduino.

El código de Johnson-Davies interpreta un array de 12 enteros como la intensidad de cada LED, empleando esos valores para ajustar el duty cycle del PWM mientras hace charlieplexing. En mi caso, actualizo el array cada 10 milisegundos para conseguir el efecto de parpadeo.

Inicialmente había probado variando los LEDs de manera aleatoria, pero el efecto era que se estaba produciendo un fallo eléctrico o una mala conexión. Una segunda versión convertía el panel en unas luces navideñas y también fue desechada.

En la versión actual, los LEDs están iluminados al 12.5% y hay una posibilidad entre 128 de que un LED se ilumine al 25% y una posibilidad entre 1024 de que se ilumine al máximo. Estos valores muestran un ligero movimiento en el panel, pero no llegan a distraer.

La versión final ocupa 910 bytes (44%) de la memoria de programa disponible y 29 bytes (22%) de memoria RAM.

Posibles mejoras

Objeto físico

El objeto resultante mide aproximadamente 142x87x14mm y está formado por tres capas de metacrilato negro brillante de 4mm de grosor y una capa de laminado negro mate / blanco de 1.6mm de grosor.

Render de las cuatro capas

En detalle

Configuración de la cortadora Para el corte se ha usado una cortadora láser Epilog Fusion M2 de 60w, con la siguiente configuración:

Raster laminado / acrílico Speed: 90% Power: 60% Freq: -

Corte laminado Speed: 10% Power: 100% Freq: 100

Corte acrílico Speed: 6% Power: 100% Freq: 100

Mal: Rasterizado con cinta
Mal: Corte sin cinta
Bien: Rasterizado sin cinta, corte con cinta.

Capa 1: panel frontal El panel frontal es una capa de laminado, de tal manera que al rasterizar los textos y líneas, la capa negra desaparece, dejando ver el blanco de debajo. Este panel se ha de fabricar en dos pasadas independientes. En la primera, se rasterizan los textos y las lineas. A continuación, se cubre la pieza con cinta de carrocero y se procede al corte de los agujeros de las estrellas y del panel. Si el corte se hace sin proteger la pieza, el láser deja demasiadas marcas. Si la pieza se protege desde el primer momento, el texto no queda bien.

Capa 2: componentes electrónicos Esta capa y las siguientes se fabrican en una única pasada y se pueden cortar en una misma operación. Esta capa incluye un corte adicional para encastrar el circuito impreso y unas tiras de metal para sujetar la tapa mediante imanes.

Capa 3: anillo separador El anillo separador se utiliza para dejar hueco para la electrónica, tanto a las soldaduras de los LEDs como al chip y a la batería. Para aprovechar el material, el anillo se corta despiezado, aunque eso dificulta ligeramente el montaje.

Capa 4: tapa trasera La tapa oculta la electrónica. Cuenta con unas abrazaderas para sujetar los imanes que mantendrán la tapa en su sitio. La tapa trasera no tiene plantilla SVG como tal, reutilizo la plantilla borrando el contenido del panel frontal y dejando sólo el corte de la pieza externa.

Montaje El montaje empieza pegando las tiras de cobre, soldando los componentes electrónicos y soldando la placa de inserción. El siguiente paso es pegar el anillo separador. Con el anillo en su sitio, podemos pegar las tiras de metal y las abrazaderas de los imanes. Para difuminar la luz y ocultar los LEDs, pegamos una pieza de papel vegetal al frontal a la capa 2 + 3. Finalmente, pegamos los imanes a las abrazaderas.

Material para cuatro constelaciones: anillo separador despiezado, componentes electrónicos, panel frontal (protegido con cinta) y tapa trasera.
Capa 2 con la pieza de papel pegada.

Posibles mejoras

Agradecimientos

👉🏼
Gracias a David Navarro por la supervisión de los datos astronómicos.
👉🏼
Gracias a Peter Williams por aguantar la turra que le he dado con los materiales.
👉🏼
Gracias a Dan Overholt por la idea para sujetar la pila.