3dPrinted MoonPhase Lamp

Este proyecto realmente es un spinOff de uno que, echando la vista atrás, hace nada menos que seis años que terminé… Se trata de una lámpara que se ilumine con la actual fase lunar. Tenéis más info aquí: https://furgalladas.com/blog/?p=464

Aquel primer prototipo, pese a funcionar bien, tenía una interfaz de entrada y configuración demasiado complicada (basada en dos botones y potenciómetros). Esto limitaba demasiado la usabilidad de aquel prototipo.

Posteriormente llegó la impresora 3d, con lo que la revolución de la fabricación hizo que fuese viable diseñar un nuevo prototipo a medida. Además, usando la técnica de la litofanía, esperaba que el resultado fuese bastante más bonito y «profesional» que el anterior vinilo. Tenía ya el proyecto a medias semi desarrollado, pero aparcado en un cajón a la espera de ampliar el budget de tiempo. Pero, apareció el peque y le he dado prioridad para que pueda disfrutarla. Y de momento, está funcionando bien.

De la funcionalidad inicial realmente ha quedado poco. La he simplificado bastante, para que cumpliese su objetivo de luz nocturna. La idea es que se pueda configurar la duración del ciclo lunar para la longitud de la luna, de modo que, de un vistazo, puedas saber cuando te despiertas de noche, cuánto queda para levantarte: si la luna es creciente, sabes que aún queda más de la mitad de la noche por dormir…

Hardware

Realmente el hardware inicial ha cambiado poco. Tenemos los siguientes componentes:

  • Arduino nano. Da de sobra para este proyecto.
  • Módulo bluetooth HC-05: hará de interfaz con el usuario.
  • Rtc DS1307: Este módulo de reloj se encargará de mantener la hora de arduino para que pueda calcular la fase lunar almacenada aunque se vaya la alimentación.
  • Tiras de led: Como diferencia en la anterior versión, no me he complicado la vida, y he utilizado tiras de led comerciales, cortadas a medida:
    • Cinco tiras de leds pequeñas para hacer las fases de la luna
    • Una tira más larga para la luna nueva y que proyecta hacia el exterior (así el efecto de «luna nueva» se ve contra la pared).
  • Transistores 2n3904 y resistencias, que harán de driver para los leds.
  • Regulador 7805 para estabilizar la tensión de entrada. Dado que las tiras de led son de 12v, el 7805 viene de perlas para esto.
  • Sensor LDR para la función de apagado automático.

El esquemático sería el siguiente:

Aquí tenéis una imagen de la electrónica

Modelado 3d

El modelo en 3d puede descargarse de thingiverse o de mi página de tinkercad. Tened en cuenta que la litofanía va pegada en el soporte, por eso no he incluido fotos aquí, me olvidé de sacarlas antes de pegar la litofanía al soporte.

 

Detalles de implementación

La funcionalidad de la luna se puede resumir en la siguiente máquina de estados:

  • En el estado STARTUP, se lee de la EEPROM los datos guardados, como el modo de inicio preferido, activación del sensor de luminosidad o longitud personalizada del ciclo lunar.
  • FadeIn: Hacemos una transición smooth hacia el target configurado (si es custom lenght, iremos a la luna nueva, si es natural, iremos al ciclo configurado).
  • PrintMoon: En función del modo configurado, se comprueba si hay que actualizar la columna de leds y se actúa en consecuencia.
  • FadeOut: Si el sensor de luminosidad detecta más luz que el umbral configurado, o si apagamos la luna, la luna hará un apagado «smooth».
  • TurnOff: en este estado, la luna estará monitorizando la LDR para encenderse, si está habilitada.

Utilizo un scheduler propio y muy sencillo donde la gestión de los leds se realiza cada 100ms, y la atención del puerto serie, cada 1000ms.

Además, he incluido una librería desarrollada por Steven Cogswell para gestionar el puerto serie y la comunicación. He hecho unas pequeñas modificaciones para que matchearan con mi estándar de comunicaciones serie que vengo utilizando en los proyectos.

CIE1931

Otro tema interesante es el tema de iluminación de los leds. La respuesta del ojo humano a la iluminación no es lineal, esto es, un 50% de pwm, en vista del ojo humano no significa un 50% del led encendido. De modo que para hacer las transiciones en la lámpara, o simplemente hacer el ciclo de iluminación lunar lo más «smooth» posible, hay que buscar una fórmula que «linealize» el pwm. Podéis encontrar una explicación muy clara en este recurso: https://jared.geek.nz/2013/feb/linear-led-pwm. Básicamente, hay que acudir al modelo de color CIE1931 para generar una lookup table que nos relacione la intensidad de luz que queremos, con los pwm. En esa página tenéis un script de python que ya nos hace la magia y nos genera ese vector. Así que problema solucionado!

Programación arduino

El código lo podéis descargar de mi repo de gitlab: https://gitlab.com/mcarpacho/moonphase2023public. Recordad que está bajo la licencia MIT.

Programación Android

Para diseñar la aplicación, he utilizado el APPInventor (http://ai2.appinventor.mit.edu/). Te permite diseñar de forma muy rápida una aplicación en android, abstrayéndote de conocer en profundidad el lenguaje (Aunque realmente lo tengo pendiente, en seguida le ves las limitaciones). Para prototipos va muy bien la verdad.

Tenéis aquí un enlace al proyecto:

https://gallery.appinventor.mit.edu/?galleryid=81a3f55a-b927-4f13-ae73-3c47eb9a07ab

También podéis descargar directamente el apk de esta url.

La ventana principal ofrece estas opciones:

  • Botón connect => inicia la conexión con la luna. Utiliza la dirección MAC que se configura en el apartado settings. Si no la habéis configurado, obviamente no será capaz de conectar con la luna, y el icono no se va a iluminar (Fijaros que cambia el color cuando conecta).
  • Botón encender/apagar (moon on/moonOff) => Si queremos encender o apagar la luna, incluso en el medio del custom mode. Hace una transición suave hacia el target. Útil para no tener que apagar físicamente la luna.
  • Botón set mode: Aquí podremos configurar los dos modos de funcionamiento:
    • Natural: donde se setea la fase actual de la luna, y el RTC irá actualizándolo día a día (también se puede obtener la fase actual de Internet, de un script en mi servidor, que es el botoncito que pone fetch). Para enviar los datos a la luna, pulsar el botón del satélite que pone «send».
    • Custom: aquí podéis configurar la longitud de un ciclo lunar, desde una luna nueva a la siguiente luna nueva. Lo dicho, la utilidad: si la configuráis para la noche (8 horas, si dormís como nosotros), y os despertáis por la noche, viendo la luna podéis ver aproximadamente cuanta noche os queda por delante. Mola, eh?
  • Botón Settings: Aquí podéis configurar la MAC del HC-05, la configuración del sensor de luminosidad (activación y sensibilidad), y el modo de inicio preferido.

Resultado final

 Este es el resultado final. Junto a la lámpara de estrella, es la que usamos a diario. Y la verdad es que es un puntazo, al peque le gusta mucho.

 

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *