Canvas Clock is an object I designed to sit on a desk. Right now, it has two modes: an ambient light mode that gives off a soft colourful glow, and a clock mode that shows the time on an RGB NeoPixel matrix. In the future, I want to add a drawing mode, where you can use a joystick to draw directly on the matrix and choose your own colors.
I was inspired by simple, analog drawing toys like the Etch A Sketch and Magna Doodle. I used to spend hours with a Magna Doodle as a kid, so I asked myself: how could I bring that feeling back into something I’d actually use today? This project is my way of reimagining those toys, keeping the tactile, hands-on part I loved, while turning it into something new that still gives that same wow factor.
Etch-a-Sketch
Software:
Fusion 360: for sketching
GrabCad: to add electronics to the design
RD Works: preparing DXF for laser cutting
1) I started by measuring all my components and deciding on the dimensions of my design accordingly
2) Created a new component for the front and sketched it with the correct dimensions
3) Created a new component for the back and 'paste new' from the front. But I switched the directions of the x-slots
4) Created new component for the right and sketched it with the correct dimensions
5) Created a new component for the left and 'paste new' from the right. But I also switched the directions of the x-slots
6) Extruded all my faces to 3mm and added a 3mm fillet to the corners
7) Joined all the faces together
8) Browsed Grabcad to download files for my electronic components
9) Added them to my Assets on Fusion
10) Played around with their positioning
11) Placed them on the design
12) Created holes for the screws (3.2mm), and holes for the potentiometers, buttons and joystick
13) Created rectangular holes for each component
14) Projected the top and bottom faces
15) Final design (without components)
16) Final design (with components)
17) Created a blank sketch for each component to export as DXF
Machines:
Laser Cutter: El Malky ML149 CO2
Materials:
3mm plywood for laser cutting
M3 screws & nuts
Imported my 6 DXF files on RD Works and nested them as close as possible to each other on the workspace
Imported into RD Works:
Ensured the size and scale was correct
Adjusted the cut parameters: power and speed settings based on 3 mm plywood:
Power 50% - Speed 30 mm/s
Clicked CTRL + A select all and check the dimensions to make sure the total size will fit the plywood sheet
Ran a preview to ensure all lines were assigned correctly.
Clicked "download" to send file to laser cutter
Placing and fixing sheet
Adjusting focus
Placed and fixed 3mm plywood on bed.
Selected my file by pressing “File” button on machine and ensured my parameters are correct
Set the correct laser height to ensure it is in focus
Moved lens to top corner of plywood
Pressed “origin” to set start point
Pressed “frame” to check cut fits within sheet limits
Closed door and started machine
Removed parts after cut, confirmed proper size and clean cut
Setting the parameters for the cut
Finished cut
Jumper wires
Mini breadboard
5v adaptor
Female DC power adaptor
Crocodile wires
Push button
ON/OFF switch
Arduino Uno
SMPS 5Vdc (5A)
8x8 neopixel matrix (WS2812)
RTC module
For the circuit design
Input Components:
ON/OFF switch
Button to change between clock mode and ambient lighting mode
RTC module to measure time
Action Components: neopixel matrices to display the clock/colours
Circuit explanation:
The Arduino's 5v and GND are connected to two rails on a breadboard
The positive rail is connected to the RTC's VCC
The negative rail is connected to the RTC, switch and button's GND pins
The switch is connected to the Arduino's pin 4 and the button is connected to the Arduino's pin 3
The first neopixel is connected to the Arduino's pin 9 and connected to an external power source of 5Vdc (5A) through both GND and VCC
DOUT of the first neopixel > DIN of the second neopixel
I used an SMPS 5V DC, 5A power supply to power the two neopixel matrices. Each WS2812 LED can draw up to about 60mA at full brightness (white), so for 128 LEDs (2 8x8 matrices) the maximum current could be around 7.7A.
The Arduino and the button/switch are powered directly from the Arduino’s 5V regulator.
Including the required libraries for RTC and WS2812 neopixel matrix.
Matrices connected on pin 9
NUM_LEDS: total LEDs (2 8x8 matrices = 128 LEDs)
Button on pin 3,
on/off switch on pin 4
Brightness set to 120
Creating an array to hold the LED colors
timeMode decides if we’re showing the clock or rainbow.
The other variables are for debouncing (ignoring noisy button presses): https://docs.arduino.cc/built-in-examples/digital/Debounce/
Rainbow speed and brightness. Taken from rainbow code: https://codebender.cc/sketch:80438#Neopixel%20Rainbow.ino
Creating a font for the clock's numbers to be displayed
Translating x and y positions on the grid
ChatGPT helped me with this because when I tried displaying the time on both matrices, the numbers were scattered.
ChatGPT gave me a test sketch that printed values to the Serial Monitor and let me check the mapping of the pixels. From the values taken from the serial monitor, it created a font for my two matrices.
This was my prompt: "Digits look scattered when I am using this code and RTC library codes. I am connecting 2 WS2812 neopixel matrices. What is the problem?"
This was the test sketch it gave me:
This function talks to the RTC, reads the time registers, converts them from BCD to normal decimal numbers.
It returns 'true' if worked and 'false' if there was an error
clearAll: turns off all LEDs (sets them to black) so old digits don’t stay visible
drawDigitAt: draws one digit (0–9) at a chosen position using the 3x5 font ChatGPT gave me; it checks each bit and lights up the right LED in the chosen colour
drawTime: splits the hour and minute into tens and ones, clears the screen, draws the four digits in the correct positions, and adds the two blinking colon dots that switch on/off every second like a real digital clock
drawRainbowFrame: creates one frame of the rainbow by looping through LEDs, assigning each a hue colour, showing it, then moving the rainbow forward
setup: runs once: starts serial monitor for RTC, sets button/switch pins, initializes FastLED with brightness, clears LEDs, and updates the matrices
loop: main program that repeats:
Reads the on/off switch (SWITCH_PIN). If off, clears LEDs and stops everything.
Handles button press with debounce. Each press toggles between clock mode and rainbow mode.
In time mode: reads RTC every 600 ms, draws the current time with the custom font, and shows it.
In rainbow mode: updates rainbow colours every RAINBOW_SPEED_MS.
Rainbow effect: Adafruit NeoPixel Rainbow example, adapted for FastLED.
Clock + RTC reading: from Ping Pong Ball LED Clock
Debounce and button logic: Arduino button example
FastLED setup: from FastLED library docs
1) I began by testing parts of my project individually using libraries or code found on the internet:
Testing the rainbow effect using code I found on the internet
Testing the RTC displaying time on the matrices
2) After checking that both modes work properly, I integrated them using a button to change between modes and an ON/OFF switch:
Adding a button to change between both modes
Adding the switch...
this is the final version of the smart circuit before enclosing it
3) Assembling the enclosure:
Secured my components at the front face using screws & nuts
Wired them from the back. However, I did not wire all components that are for the drawing feature (nice-to have)
Secured the Arduino and sides using screws & nuts
Secured the top and bottom t-slots using screws & nuts on each side
Final functioning smart device with minimum and complete features.
minimum feature: ambient lighting
complete feature: displaying time
Noise in the matrices:
When I was testing the matrices using the rainbow code from the internet, the matrices were behaving strangely. The code was supposed to show smooth changing colours, but it was showing fast, random colours (more like party lights than ambient lights). After hours of researching, editing the code and trying to troubleshoot, my instructor was helping me and he noticed that if you press on the back of the matrix firmly, the noise starts to lessen. He told me that the matrix is probably faulty. To confirm that it is faulty, we tried different connections such as adding a resistor, and connecting them to a common ground with the Arduino but it still did not work.
By luck, he had a spare neopixel matrix which had only DIN connections and not DOUT, so we replaced one of the matrices and the code worked properly!
This was the code I had initially tested before the rainbow code. It seemed to function properly, so I did not think there was anything wrong with the matrices.
Fabrication of design with missing holes and x slots
X-slots and holes missing from my design after fabrication:
When laser cutting and importing to RD Works, I noticed that some of my x-slots on the entire design and holes on the front face of the enclosure had disappeared. I was tight on time and did not have another fabrication slot so I decided to fabricate anyway and see how it would fit with the missing parts.
Later, I got the chance to book another fabrication slot, so I booked it and fixed my design on Fusion. When trying to find the issue on Fusion, I noticed that some of the holes were done on different sketches in the main component, rather than the front face component. So when exporting the front face component, the holes were not visible. I fixed this by recreating the holes in the correct component. A similar issue was with the x-slots; they were not extruded in the first place. As a result, I only exported the extruded faces which did not include the x-slots.
Sides are virtually impossible to assemble:
After fixing my earlier issue and redoing the fabrication correctly, I ran into another problem: the enclosure was impossible to assemble. I had mistakenly designed the x-slots on the right and left sides in opposite directions, which prevented the front from fitting (see image on the right).
Remembering my previous failed laser-cutting attempt where some x-slots were missing, I decided to cut off the front slots with a cutter and this time, it fit perfectly.
Cutting off the x-slots
I was not able to slide the front face because the left and right x-slots were facing opposite directions.
Front face with the x-slots cut off
Some holes are not the proper size for the components:
I had to sand some parts, manually drill holes for the Arduino and figure out another temporary way to mount one of the matrices:
The new matrix my instructor gave me was smaller than M3 screws
Switch did not fit its designated spot
Drilling holes for the Arduino
I fixed it with a wire
Sanding to make it fit the switch
Holes are not the proper distance apart from each other
If I had more time, I would integrate my nice-to-have feature of being able to draw on the matrices and mix your own colours using the red, green and blue potentiometers and the joystick.
I also want my physical enclosure to be more sleek and rounded using living hinges rather than the current boxy design.
I actually started to re-design it with living hinges but I am still facing some problems with the measurements.