top of page

COLORCLOCK

What time is it?

Amber o'clock-ish (?)

ColorClock is an RGB LED art installation that challenges conventional time representation through color variation, shedding light on perceptual limitations. Housed in a practical lean-to structure with a bench, it offers daytime shade and evening contemplation. Concentric circles of colored light traverse the spectrum, emphasizing temporal fluidity. Participants can control the central light color changing cycle time, enhancing their engagement and understanding of the piece.



See the code repository here.

I would like to make the ColorClock code base more robust, so I decided to leverage some of the work I'm doing in my real job and applying it to ColorClock.


Google Test

During development of ColorClock Version 1, I did some rudimentary unit tests that took the form of print statements in simple C++ programs. I played around with writing makefiles but my unit tests were few and far between.


In my latest work, I'm implementing a "real" unit testing framework in using Google Test. Each module has its own test file and I'm using make to build the unit test executable.


Testing Limitations

Since ColorClock is designed to work with specific hardware, some of the code isn’t easily testable using Google Test. However, much (or at least some) of the hardware-dependent functionality is protected by preprocessor directives, providing alternate behavior for non-hardware builds. My goal is to write unit tests for as many functions as possible.


This Is Why We Test

So, I’ve started writing tests for the edge cases in the TimeCalcs module, and guess what? I found some errors in one of the functions 😅 I didn't run into these issues with ColorClock Version 1 because it was built for a specific use case, but as I expand the project, I need to address them 😬


Google Test Output for TimeCalcs

[==========] Running 5 tests from 1 test suite.
[----------] Global test environment set-up.
[----------] 5 tests from TimeCalcsGroup
[ RUN      ] TimeCalcsGroup.TimeAsFractionalOffset_Nominal
[       OK ] TimeCalcsGroup.TimeAsFractionalOffset_Nominal (0 ms)
[ RUN      ] TimeCalcsGroup.TimeAsFractionalOffset_Nominal_Swapped
[       OK ] TimeCalcsGroup.TimeAsFractionalOffset_Nominal_Swapped (0 ms)
[ RUN      ] TimeCalcsGroup.TimeAsFractionalOffset_Across_Midnight
/home/flux/git/color-clock/sw/test/build-test/../main/test-time-calcs.cpp:69: Failure
Value of: function_output == 0.75
  Actual: false
Expected: true

[  FAILED  ] TimeCalcsGroup.TimeAsFractionalOffset_Across_Midnight (0 ms)
[ RUN      ] TimeCalcsGroup.TimeAsFractionalOffset_Midnight_As_24_End
[       OK ] TimeCalcsGroup.TimeAsFractionalOffset_Midnight_As_24_End (0 ms)
[ RUN      ] TimeCalcsGroup.TimeAsFractionalOffset_Midnight_As_0_End
/home/flux/git/color-clock/sw/test/build-test/../main/test-time-calcs.cpp:95: Failure
Value of: function_output == 0.5
  Actual: false
Expected: true

[  FAILED  ] TimeCalcsGroup.TimeAsFractionalOffset_Midnight_As_0_End (0 ms)
[----------] 5 tests from TimeCalcsGroup (0 ms total)

[----------] Global test environment tear-down
[==========] 5 tests from 1 test suite ran. (0 ms total)
[  PASSED  ] 3 tests.
[  FAILED  ] 2 tests, listed below:
[  FAILED  ] TimeCalcsGroup.TimeAsFractionalOffset_Across_Midnight
[  FAILED  ] TimeCalcsGroup.TimeAsFractionalOffset_Midnight_As_0_End

 2 FAILED TESTS

Build Flags

I have a file called flux_macros.hpp that defines all the build flags, including preprocessor directives for enabling hardware-specific functionality. This file is included in every software module. One of its macros, DEBUG_CPP, is meant for non-hardware builds. Until now, I’ve had to manually set this flag in the macros file. To streamline the process, I wrote a simple Python script that automatically uncomments the line.

// #define DEBUG_CPP

and converts it to:

#define DEBUG_CPP

In the makefile for the unit tests, I create a phony target that runs the Python script first before building out the unit test executable 😎


File Headers

Another improvement I made to give the code a more professional look was adding a comment header to each file. To make this process more efficient, I wrote a Python script that automatically populates the header in each file.


//_________________________________________________________________
//_________________________________________________________________
//      _   __   _   _ _   _   _   _         _
// |   |_| | _  | | | V | | | | / |_/ |_| | /
// |__ | | |__| |_| |   | |_| | \ |   | | | \_
//  _  _         _ ___  _       _ ___   _                   / /
// /  | | |\ |  \   |  | / | | /   |   \                   (^^)
// \_ |_| | \| _/   |  | \ |_| \_  |  _/                   (____)o
//________________________________________________________________
//________________________________________________________________
//
//----------------------------------------------------------------
// Copyright 2024, Rebecca Rashkin
// -------------------------------
// This code may be copied, redistributed, transformed, or built
// upon in any format for educational, non-commercial purposes.
//
// Please give me appropriate credit should you choose to use this
// resource. Thank you :)
//----------------------------------------------------------------
//
//_________________________________________________________________
// //\^.^/\\   //\^.^/\\   //\^.^/\\   //\^.^/\\   //\^.^/\\   //\^
//_________________________________________________________________

We named our artist collective (currently me, Bo, and our friend Cody) 'Lagomorphic Constructs.' Lagomorpha is the taxonomic order that includes rabbits—and I love rabbits. So, naturally, I went with 'Lagomorphic Constructs' 🐰


Home Display

On a different note, we are also working on installing the light display for ColorClock Version 1 in the house 🏠


I powered it up for the first time since its display at Burning Man 2024 and was thrilled to see that not only did it work, but the time was still accurate thanks to the real-time clock module 🎉


The first step to converting it to a home display is to sort out the wiring...


For ColorClock Version 1, the light display's wiring was terminated with a Molex connector, which connected to a wire harness. The harness then led to a 12-way terminal block mounted on the structure, which interfaced with the electronics box.
For ColorClock Version 1, the light display's wiring was terminated with a Molex connector, which connected to a wire harness. The harness then led to a 12-way terminal block mounted on the structure, which interfaced with the electronics box.

The diagram above was generated using DOT, a scripting language for creating vector images. It's another technology I use at work and have recently started incorporating into ColorClock.


For home display, we removed the wire harness from Version 1 and directly connected the LED strips to the terminal block, which we relocated to the back of the light display.
For home display, we removed the wire harness from Version 1 and directly connected the LED strips to the terminal block, which we relocated to the back of the light display.

TODO

Moving forward, I have a few tasks on my to-do list that I’ll continue chipping away at...


Unit Tests

  • Write unit tests for modules:

    • TimeCalcs

    • RgbColor

    • HsvColor

    • ColorClock

    • TimeController

    • TimeDisplay

    • TopLevel

  • Fix code for failures found during unit testing

  • Create a pipeline that runs all unit tests


Documentation

  • Make block diagrams of the software architecture of ColorClock using DOT

  • Add Doxygen comments and generate documentation


Cleanup

  • Organize ColorClock classes into folders

  • Clean up non-Arduino code


Hardware

  • Prototype a small hardware version of the light display for testing purposes

  • Research free PCB board layout programs


Ten years in the making and ColorClock was deployed at Burning Man 2024 🥳 It worked the whole week and I didn’t even need to break open the backup electronics box 😅


Contingency Planning

I packed up spares of all the electronic components in case one of the modules were to go kaput. Time didn’t allow to solder up an entire new circuit board so my contingency plan was to construct a new one with a solderless prototyping board if anything went really wrong.

The backup box had multiples of all the modules in addition to solderless breadboards and assorted components.


I also brought my little tool box with oodles of extra wire and tools. Thankfully I had no use for any of my extra wiring.


Artery Check In

During check-in, The Artery (the Burning Man art department) showed us our placement on the map.


Part of the check in ritual is to have the artist place a label near the green sticker corresponding with their project on the art map. I was ecstatic to see my little green dot 🤩


There we are!


🌈


After identifying our placement on the map, the Field Ops volunteer took us to our actual location on Playa.


Each project’s physical location is marked with a “floofy” connected to a CD-R bolted into the ground.


We were brought to our floofy!


Installation

The 2-day, 16 + 2 hour drive to Playa was a little nerve-racking. My poor Subie was at her towing capacity, and let us know with her engine whines. But we made it 😅


We were able to transport the project mostly assembled to make set up as easy as possible. Our good friend Cody was part of our art crew and helped with the construction.


Bo is getting the solar panels set up. The wooden box in front of the solar panels housed the battery and solar charge controllers.


It had been raining the day before and we were frantically trying to finish assembly before the looming rain. I felt some droplets while I was connecting the light harnesses to the terminal block but we got everything buttoned up without any damage. Due to the threat of rain, we decided to wait until all chances of precipitation had passed before powering up.


Many art installations at Burning Man are designed for climbing, but ColorClock was not, so we needed a sign to make that clear. Additionally, I wanted to ensure participants were aware of the trip hazard posed by the cross beams at the bottom. My campmate Heather had the chance to experiment with a Cricut and created some super cute signs for us 😍.


I added curtains to the sides of the structure in a futile attempt at making the lights visible during the day, but the Playa sun always wins ☀️So it turned out to be just a nighttime piece.


Nighttime Viewing

While the colored LEDs were not visible during the day, the colors shined through beautifully at night.

Bo and I were delighted to see how vibrant the colors glowed at night. Photo courtesy of my dear friend Victoria Hollis.


Here is a full 360 view of the project displayed on Playa.


I invited my camp to view the piece and gave a brief presentation explaining the meaning behind the colors of each LED strip in the light display.

This recording is the tail-end of my presentation where I encouraged my campmates to explore the control panel, figuring out how the buttons influenced the central light. Video courtesy of Victoria Hollis.


Over the course of the event, almost all of our solar lights to provide safe visibility were destroyed. My amazing camp member, Kerry Veenstra, who also had a piece on Playa, lent us some spare lights that added beautiful lighting to the ground. Photo courtesy of Victoria Hollis.


Participant Interaction

On a different note, event participants found my piece difficult to engage with. ColorClock was vandalized twice with mean stickers, and no one I spoke to at the project had the vaguest idea of what they were looking at or what the buttons actually did.


My camp mate Kerry found this sticker on my piece and promptly removed it. This was the second time someone had vandalized my art. I didn’t take it personally, but it saddens me that some people think it's acceptable or amusing to deface a project that someone has invested so much time and effort into. Photo courtesy of Kerry Veenstra.


Regardless of how ColorClock was consumed by the public, I’m still damn proud of what we accomplished. And this project wasn’t for anyone one else - it was for me. The magic of ColorClock was in the software which I did not have the time or mental capacity to translate into the visual aesthetic.


The End of ColorClock Version 1

Many of the art pieces at Burning Man are burned, which I believe symbolizes the impermanence of life. Though our choice to burn our piece was mostly because we simply didn't want to lug it home 😅 A ceremonial burn-in-place ritual is quite complex due to the need to protect the playa. Instead, we opted to disassemble the piece and burn it in the "Burn Garden."


Before disposing of the structure, we salvaged the electrical components and removed all fasteners.


Cody and Bo disassembled the project and removed all screws. Our friend and campmate Asher (not pictured) was helpful in removing staples from the battery box and played a significant role in conducting a MOOP sweep of the area. In Burning Man culture, MOOP stands for Matter Out Of Place. A MOOP sweep involves meticulously combing the area for any debris to uphold the principle of "Leave No Trace."



Only unpainted, untreated wood was permitted in the Burn Garden which is why we left the wood in the structure unfinished. Here, Bo is tossing our disassembled structure into the "Burn Garden".


ColorClock Version 2?

I have a lot of ideas of how to modify ColorClock to be more palatable for the viewer and how to improve the design. So there will definitely be a version 2. Here is a short list of ideas for improvement:


  • Use individually addressable LEDs.

  • Design and create a printed circuit board.

  • Modify lights in control panel to respond instantaneously to participant input.

  • Come up with a better user interface.

  • Make it smaller, reducing the need for a huge trailer.

  • Make it cuter. Burners like cute things.


But there’s another project I’ve been contemplating for a few years so maybe that will be the next endeavor. I’m going to let this year’s experience settle for a bit before I decide on my next project…


Thank You

I would like to extend my heartfelt thanks to several individuals who made significant contributions to ColorClock:


Bo, my partner in project creation and life, played a crucial role in designing and singlehandedly constructing the physical structure. His support gave me the confidence to see the project through to completion, even during challenging times. Bo assisted with troubleshooting both hardware and software issues, provided invaluable guidance on software design, including teaching me how to create a state machine, and helped me master Git rebase to keep the ColorClock repository organized.


Cody was incredibly helpful in numerous ways, from lifting heavy objects and loading to taking turns driving the large and unwieldy trailer. Beyond his practical support, Cody’s presence at Burning Man, his assistance with building and striking camp, and his joy and playfulness were heartwarming and made the experience even more special. His support was deeply appreciated.


Kerry mentored me during the early stages of software design and inspired me to bring art to the Playa. Kerry also generously loaned and installed new solar lights for my piece when the originals were damaged and has been a steadfast advocate for both my well-being and my art.


Heather created charming signs that truly brought the piece together, adding a special touch to the overall presentation.


Austin assisted with 3D printing my test models for the electronics box, providing a protective enclosure for the circuit board during its time on the Playa.


Asher assisted with our MOOP sweep and the disassembly process, ensuring that everything was handled efficiently and effectively.


Trevor, our Artery liaison, answered all our questions and provided exceptional support throughout the project.


To all my campmates with the Funguys, thank you for your warmth and unconditional support. You all are truly family to me 🥰


Finally, I’d like to extend my gratitude to the Burning Man organization for providing a platform to present ColorClock and for showcasing a diverse range of art and experiences. Their efforts create an environment where unique and extraordinary art forms can truly thrive.



©2022 by Rebecca Jennifer  Rashkin 🐰

bottom of page