My Final Project

The project I propose building for Fab Academy is an immersive interactive experience. The project responds to users' movements through varying patterns of light and sound. The project itself will have mounted to it addressable RGB LEDs and a speaker, as well as a sensor that will track data on users, such as movement and possibly color. The user is an individual curious about this device and who is interested in experiencing a sensory experience.

For my system integration documentation, see this link.

Final Project Flow Chart

Flow Chart for Final Project

Week 18 notes

I cut and painted the base and then laser cut the 32 slats. I fabricated the 102 slat holders. I assesmbled the t-slot exhibit- as facilities in my institution will not have the tslot installed on the wall until early august.

img of slats I created IDs for each slat to understand where it goes on the base I mounted the bholders. So many holders

I installed the neopixels on the base along with the holders. I had estimated 60 per board and then 58, but the number is acutally 56 per slat. The materials are to be reused, so i was requried to change my initial plan to cut the strips into meter long strips. Instead, I will loop the neopixels, count the "dead" addresses and then have the program avoid those addresses in the animations.

I used the fillowing prompt on codex to test the neopixels as set up

I would like to have you create a program that tests the addresses of the neopixels. I will video the animation and you/we can fine tune the addresses.

The pixel addresses are listed in this program.

Don't change any existing programs. Instead, create a new program using version number- as in this program is version 21.

link to test program

In testing the software, I used codex to work through a number of different changes I wanted to make to calibrate the experience. I am having trouble with differentiating between approaching/withdrawing (z axis movement) with rtl and ltr movement (movement tracked along the x axis). For the final project, I will focus on creating possibly six different animation states (four minimum) and look to add these x-axis movments when I can better calibrate/differentiate the z and x axis movements.

 

Week 17 notes

I have designed the enclosure, wire management, and have fabricated t-slot nuts using a water jet to hold the base onto 40mm t-slot that will be used as a structure. The sensor that will trigger the animations will be a pololu VL53L5CX TOF sensor, and the MCU will be a XIAO ESP 32 C3 board. I will like the project using 960 addressable neopixels, 16 meters of LEDs.

I began setting up and testing the VL53L5CX TOF sensor. I used the sparkfun sensor lirbary (link) and codex to code a series of programs to set up and then gradually spiral out to the functioing project. The first program was an I2C scanner. prompt link to I2C scanner program The VL53L5CX sensor can measure in a 4 x 4 or 8 x 8 zones. It communicates via I2C (adddress of 0x29). Elab. link to datasheet link to sparfun library link to dimensions the second program was a proof of cocnept- seeing the orientation of the sensor and whether it was functioing. IMG data IMG data visualized IMG hand IMG new data

The sensor tracks six motion states: NO_PERSON No foreground object/person is detected after subtracting the calibrated empty-room background. STANDING_STILL A person is present, but their horizontal position and distance from the sensor are not changing enough to count as motion. LEFT_TO_RIGHT The detected person/blob moves across the sensor field from the viewer’s left side toward the viewer’s right side. RIGHT_TO_LEFT `The detected person/blob moves across the sensor field from the viewer’s right side toward the viewer’s left side. APPROACHING The detected person/blob gets closer to the sensor over time. WALKING_AWAY The detected person/blob gets farther from the sensor over time. this is the sketch that was created link it is not registering my approach (standing still seems to be the default) and doesn't seem to register when I move my hand from left to right or right to left in front of it. I worked with codex we determined that the default is standing still- when it should be no person. the sensor is tuned so that it recognizes movement in the 8x8 grid- the process- raw 8x8 depth grid → subtract empty-room background → find foreground body/person zones → estimate X position and distance → classify motion state The code infers these motion states from two values: x = horizontal position across the 8x8 grid z = distance/depth from the sensor in millimeters So side-to-side motion comes from changes in x, and approach/retreat comes from changes in z. Just using z created problems- it has a lot of noise. I decided to use by changes in z and the number of zones as a means of tracking approaching and walking away/ As an object/person gets closer to the VL53L5CX, two things should happen- the z distance decreases (as the the measured distance in millimeters decreases) and the number of foreground zones should increase (the person takes up more cells in the 8x8 grid). . I gave codex the following prompt: Would it be more effective to revise the sketch to use both x and z values as well as zone count as a means to calculate the six motion states? link v 5 the code does a better job at identifyign approaching and walking away, but doesn't do a great job identifying left to right/right to left movement. if the user is walking at an angle- where they are passing the sensor but are coming closer to the sensor, the program confuses RTL or LTR with approaching. side-to-side should win whenever horizontal movement is clear. Approach/walk-away should mainly describe movement where the person’s x position is relatively stable. Sketch link The project works well at mapping movement. Now to connect sketches to the motion states. This is the prompt that I used with Codex. "now create a sketch that takes the six motion states and maps them to a neopixel pattern. I've attached four sketches of neopixel patterns as an example. When the person is standing still- I want the breathing sketch. Movement should be two new sketches- lighting up the 16 slats of 60 neopixels in the direction of movment. travelling tails can be moving from high #LED to low # led when viewer appraches (the leds are moving down) and when the view moves away, the leds move up (low to high). The excel spreadsheet will be the address of each Neopixel in the LED matrix. bottom left is the origin."" I included the following sketches and files: sixtenntraveling tals travelling tai adafruitneopixelexamplesketchrevision_breathing adafruitneopixelexamplesketchrevision_pulse LEDMatrixConcept excel file I worked through eighteen versions of this software. The Eightteenth version used the following prompt:
"Revise VL53L5CXTOFScanner8x8grid_distandzonecount_neopixelpatterns_V7.
  Keep the six VL53L5CX motion states and the 16 slats of 60 NeoPixels on D7.
  Improve the user experience and power behavior. NO_PERSON should invite
  interest and movement toward the exhibit by moving lights from the four
  corners of the LED matrix toward the center. The NeoPixel system is powered
  by a 10 amp supply, while 960 NeoPixels at full white could require about
  57 amps, so do not use white or full brightness. Keep all patterns low power,
  use mostly one or two color channels, and avoid lighting the full matrix at
  high intensity. Include this prompt in the header comments for Fab Academy
  documentation.

  Version 9 revision:
  Create a new version in which the program only lights every third NeoPixel in
  all animations. Apply this as a global power-saving rule so the attract mode,
  breathing pattern, left/right slat sweeps, approaching tails, and walking-away
  tails all obey the same every-third-pixel limit.

  Version 10 revision:
  Revise the APPROACHING animation so that the display gradually turns on more
  lights as the viewer gets nearer to the sensor. Keep the global every-third
  NeoPixel limit for power safety, avoid white, and scale the fill amount and
  brightness from the measured z distance.

  Version 11 revision:
  Add a global maximum brightness cap so no color helper can request more than
  half of the possible 8-bit brightness value. This keeps every animation at or
  below 127 out of 255 before the NeoPixel library's global brightness scaling
  is applied.

  Version 12 revision:
  Add a one-second delay before publishing STANDING_STILL. Brief pauses during
  approach, walking away, or side-to-side movement should not immediately switch
  the display into the standing-still breathing animation.

  Version 13 revision:
  Add explanatory comments throughout the program and create a companion HTML
  document that identifies each major part of the program and explains how it
  functions.

  Version 14 revision:
  Reduce false STANDING_STILL classifications when no person is present. Add a
  stronger foreground requirement for standing still, track how long a valid
  foreground person has been present, and force weak still detections back to
  NO_PERSON instead of allowing small background noise to become STANDING_STILL.

  Version 15 revision:
  Make the NO_PERSON attract animation more visible and inviting while keeping
  the every-third-pixel and half-brightness safety rules. Replace the subtle
  corner comets with broader corner-to-center fan waves plus a soft center pulse.

  Version 16 revision:
  Revise the NO_PERSON default animation so it starts from the full perimeter of
  the LED matrix: slat 1, slat 16, the top row of every slat, and the bottom row
  of every slat. The spreadsheet and Arduino code now use zero-based addresses,
  so the visible top row is 59, 119, 179 ... 959 and the bottom row is
  0, 60, 120 ... 900.

  Version 17 revision:
  Make the movement animations more seamless and directly controlled by sensor
  values. LEFT_TO_RIGHT and RIGHT_TO_LEFT now use smoothX to place the lit slat
  band, so reversing direction moves the band back instead of restarting a
  canned sweep. APPROACHING and WALKING_AWAY now both use the same smoothZ depth
  fill, so walking forward fills the display and backing up removes the fill.

  Version 18 revision:
  Make approach and walking-away easier to see by dividing the depth interaction
  into 20 visible steps, matching the 60-pixel slats with the every-third-pixel
  power rule. The depth fill amount is based mostly on distance from the sensor
  and partly on foreground zone count, so moving closer and taking up more of
  the VL53L5CX grid both increase the number of lit levels."

Mounting

I will be using four foot lengths of permanently mounted T-Slotted Framing Rail, Single Four Slot Rail, Silver, 40 mm Square as the base. This is meant to be a permanent installation that will afford displaying other interactive projects in the future.

Week 14 notes

I am working on the sensor that will trigger the animations. I am experimenting with either a time of flight sensor or the XIAO ESP 32 sense board and using tensorflow. In addition, the weight of the project is enough that it would need a solid foundation. I will work on creating a mounting system using T slot that can be mounted to a wall that would accommodate an 18 x 24 modular panel.

When I design and cut the pieces of the assignment, it will be hard to determine which boards are which. When fabricating the pieces, I will need to clearly yet unobtrusively identify each piece.

In addition, I will need to change the MCU that will control the Neopixels in the project. The XIAO RP2040 doesn't have wifi capabililty. I will instead use a XIAO ESP32C3 or ESP32S3-Sense. I can use the following resource to control the neopixels from the esp32:

Lily. “Control Your NeoPixel LEDs with WLED and XIAO ESP32 MCUs.” Latest News from Seeed Studio, May 6, 2024. https://www.seeedstudio.com/blog/2024/05/06/exciting-update-wled-now-supports-xiao-esp32-mcus/.

XIAO ESP32 Pinout

Weeks 11-12- Rethinking the Final Project

I thought the geodesic dome concept was interesting, however the problem is that to make the form factor of the geodesic dome large enough for someone to walk inside of it, the project would require a footprint too large for any space that I currently have at my institution. As a result, I needed to rethink what the form factor of this project would be.

Because horizontal space is such a constraint on my campus, the idea of using vertical space is appealing, as there are a number of spaces such as stairwells or hallways in which I could mount this project.

Hallway/vertical space Hallway/vertical space

As a result, I decided on focusing on a vertical form factor, as that would not take up any horizontal space. I brainstormed a number of different ideas, and for the first spiral, I think I’m going to do just one wall.

Brainstorming Brainstorming Brainstorming

The new form factor of my final project will look something like this:

Brainstorming Brainstorming Brainstorming Brainstorming

The leds will be mounted along the edges of the cut acrylic, with the microprocessor, sensors and audio/mp3 player mounted at the base of the installation.


To build out this project, there are a number of different components that I’ll need to consider. The first is the mount. I will need some means of mounting the project to a wall. I’ll need some means of creating a space to hold the LEDs and the mini MP3 player and speaker, as well as the microprocessor. I’ll need to be able to run wiring from all of the different power source and microcontroller and LEDs to one another. I am going to opt to use quarter inch, 12 by 24 inch acrylic sheets, and laser cut the form. I would like to use the idea of a concave surface with LEDs and a speaker mounted on it. I believe I will mount the speaker on the bottom to make it closer to the power source. I think I’m unsure of the material used to mount the pieces to the wall. Acrylic would be nice, but it does pose some problems in terms of seating the bolts that would hold the slats on. I could 3D print, using a stronger material such as PETG, the mounts that would hold the acrylic sheets to the back plate. The back plate would be a series of 12 by 24 inch sheets, essentially. I will continue to use the laser cutter. Obviously, I will create the microprocessor using the desktop mill. I will be using outputs in the mini MP3 player playing music and a set number of animations that the LEDs would perform as responses to user behavior. I will use some type of sensor to capture motion or movement--or color. If there is time, I am entertaining the idea of using some type of computer vision, which could provide some really interesting means of interaction.

I will likely use some of the patterns from the embedded programming week.

breathe

Final Project Task List (Weeks 12–20)


Week 10 progress and questions

I built out an LED PCB and a mini-mp3 player pcb for this project.

light

I used the neopixel addressable LED from week 10.

Neopixel Prototype

Each board requires a capacitor across voltage and ground and the tutorial on Adafruit recommends a resistor on the first digital in of a neopixel string. That being said, because the resistor only needs to be in series with the first neopixel- it would be pretty wasteful to add resistors to every board AND would add up (80 330ohm resistors would create a lot of problems for the circuit by adding that much unneeded resistance). I decided to redesign the jeffuino (now v3) to include a 330 ohm resistor on the d6 pin. This would keep the pcbs modular and allow me to add the resistor easily.

Going forward, I will need to think about how to run the data and the 5V power across all 80 some LED boards. The current setup doesn't really allow for running data in a "net" nor does it allow for adding multiple instances of five volt power to the neopixels throughout the net of LEDs.

Sound

Mini-MP3 player, using the DFROBOT DFR0299 DFPlayer Mini MP3 player.

Mini Mp3 player

I began to work through the project and build out a BOM. A 5/9th geodesic dome that would allow a person to stand inside it would have a diameter of 4 meters/13 feet. My campus has little space that would accommodate such a footprint. It would present ADA and safety concerns.

To build a 3v 5/9 geodesic dome that is 2.375 meters tall (7.79 feet), would require 83 total struts (requiring 131 meters or 430 feet of material for the struts) and 61 connectors. My campus has limited space indoors to place this and my goal had been to make something that would be a permanent installation.

The form of a geodesic dome is likely not a viable option for this project, given the space and material requirements that it wold pose. As a result, I will need to rethink the form. The goal is to immerse the user in the experience through providing both visual and auditory feedback stemming from user actions. The form factor that this could take coulud be slightly different, yet allow for the constraints listed above. I began to brainstorm alternate form factors for the assignment, listed below.

Brainstorming Brainstorming

Week 8- Questions I need to answer

Fabricating and assembling the electronics for my final project will pose a number of problems.

  1. Quantity. If the dome has an LED in each hub in the dome, I will need to fabricate, solder, attach to the dome, and then connect in a series approximately 80 LED PCBs. Each LED PCB would need an addressable LED, a capacitor across voltage/ground, and a means of daisy chaining (input and output). I need to determine the best means of creating 80 small boards. One solution I have is based on the tabs created when cutting using the CNC. Adding tabs that don't get cut all of the way would allow me to create an entire sheet of semi-attached PCBs that I can break out as I fabricate and use them.

  2. Ease of assembly / daisy chaining. I need a means of connecting and disconnecting the LED PCBs to one another for power and data. This would likely involve connectors on the boards themselves and easily attachable and detachable wires, or some other way to connect each board.

  3. Sequencing. I had not thought about how the PCBs and LEDs would be connected in the dome. Initially, I had just thought that the LEDs would be connected in a series, but that might not be the optimal way to do so. Is this a line running around and up the height of the dome, like an inclined plane wrapped around a screw, or is it some other pattern? How I connect the LEDs will likely affect the programming and the overall effect of the lights in the experience. Do I arrange them as a series of concentric circles going from the base to the top, or is there some other means of arranging the LEDs? I will likely need to explore this in the outputs week.

  4. Power. I am a little rusty in this area. I will need to figure out how to power 80 LEDs, plus the microcontroller or board I will make, plus the means of input for the whole experience. I assume I will need to figure out the forward voltage drop and current used by each LED. I also think that I will likely need to use multiple power sources at different points in the LED net rather than just one running through the length of the LED circuit.

  5. Input. My initial idea was some form of sensor that would collect input on user actions in the dome and, based on this input, change what the LEDs do. I need to begin to think about what sensor would make the most sense, how this sensor would shape the user experience so that it is desirable, and clearly map user inputs to the corresponding sensory outputs provided by the LEDs, and possibly sounds. I will work on this in inputs week.

  6. Struts. I do not think it practical to CNC struts for this project and think, right now, that PVC tubing might be a better solution. The biggest issue is that the CNC and the node are 7.5 hours away. If I make a mistake or need to fabricate new struts, I have a problem. In addition, I am unsure if cut plywood would be structurally able to support the weight of the dome. PVC tubing would be lighter and the circular cross section of a PVC tube might be stronger It seems that I need to explore the question of what would make for the most cost-effective means to create struts for this project. The strut design will in turn shape the redesign of the hubs.

  7. Hubs. I have a rough concept of the hubs now, but I need to determine a design that will hold the weight of individual struts and the dome itself. I can use PETG to make it a little tougher. I can lighten the weight of the struts. I know that a dome will have slightly different angles for each of the triangles in the geodesic dome: the internal angles of the triangle and the dihedral angle of the planes. The hubs will need to be slightly different, some with five intersecting struts, some with four, and account for the different angles.

  8. Form. I need to design the dome in such a way that the form allows people to enter and exit. Given the size of the project, I might need to rethink the dome being placed on the floor, such as placing it on a ceiling or in a corner. I have to figure out what this dome will look like in the context in which it will be set up. This will in turn affect the design of the struts and hubs and the placement of the input sensors. I need to determine the viability and feasibility of the existing design in terms of the context in which it will be located and work through how I can design the user experience of the project to best accommodate the space. This might require changing the scope or concept of the work.

  9. Research and work through the project in order to get a better understanding of how users would enter/move through it/engage with it and any ADA requriements that might need to be accommodated. Some of these questions will be answered during the input and output weeks, but how they use it will shape the design.

  10. Wire management. I need to determine how this project will manage the different wires required for it to work. I need to address power and data for LED PCBs, power for the main controller, and power and data for input sensors. The wires could be attached to struts or run through the struts if hollow. What makes the most sense for fabrication, setup and assembly, and the overall user experience?


Week 6 - electronics design

During week 6 I wanted to simulate a neopixel circuit similar to what my final project would use. Image of board forthcoming.

The Neopixels require a higher voltage and ampage than the RP2040 can provide. I will need to power the NEOPIXELs using an external power supply rather than through the Vout of the RP2040 as the RP2040 only provides 3.3 v through its GPIO pins.  In addition, the neopixels data line also requires a higher voltage than what is provided by the RP2040. For the final project I will likely need to add a logic converter. (I need to look at the data sheets of the neopixels and the XIAO/RP2040 to gather more details on forward voltage drop, current, etc). The neopixel in the simulation was not very bright, but did flash as expected. As an experiment, I had tried running the vdd and vss from the board to each neopixel and daisychaining the data through a series of neopixels. Both appeared to work in the simulation. Good to know. For my final project, I will research whether I can daisychain power, ground and data or whether I need to power sections of the LEDs separately.

The link to the sketch is: https://wokwi.com/projects/457408666709350401

Wokwi simulation of a circuit using neopixels

For week six our task was to design an embedded microcontroller system and check its design rules for fabrication. Based on the results of my simulation, I had intended to design a simple board that affords a "daisy-chainable" neopixel circuit that would easily connect with other neopixel circuit boards and provide the required capacitor between ground and power. The requirements of this week's assignment mean that instead I would need to build a microcontroller- not this LED board I had initially considered. I used an XIAO RP2040 and built it out to allow for inputs/outputs on the board. I will likely use this board (or one using an RP2040) for my final project.


Week 2- Preliminary Designs

In week two I began working through the design of a geodesic dome.

My initial design concepts for the hub include the following:



hub
hub

Early Concept work

The user would shape the colors, patterns and sounds through either movement (registered by a sensor in a hub at the top of the dome), RFID tags to choose the patterns, or possibly a mobile app.

Dome Sketch

The project would be composed of three parts- the hub which contains the sensors and the braces and connectors, which would be modular.

Modular Parts for project

Brainstorming

To come up with this idea, I worked through the posted earlier projects, listing those that I found interesting. I then used chatgpt 5.2 to categorize earlier fab academy projects. My initial prompt was:

“You are a student taking the fab academy class. You want to categorize the different projects that have been made in previous classes, with the aim of understanding what is possible in the class, given the technologies taught, areas in which successful projects seem to focus, and as a means to brainstorm your own project. The URL for the class is https://fabacademy.org/2026/prior.html”

The engine asked me a few quedstions for clarification- I've prompted the engine to always ask me questions to clarify the context and intent. The link to the chat is here. There are some serious problems with the links it provided, but the goal was to help me start considering what is possible given the technologies taught and brainstorm ideas.

I then used listing and free association for about an hour to brainstorm possible project ideas or problems that I would like to solve. I reviewed the list to see if any interested me and wrote them out separately for further elaboration. I had about ten possible ideas that I could pursue.

brainstorming

To refine the list, I thought about how I could evaluate this semi-final list of topics. I remembered an evaluation tool on choosing ideas in a book on brainstorming and creativity (p. 181) - Keith Sawyer, Zigzag. Jossey Bass, 2013.amazon link here- not a plugThis book explained how you could plot your ideas on a matrix:

Normal/Ordinary Ideas Breakthrough ideas
Highly feasible and useful Not so original ideas that are highly feasible- Ideas that might be worth pursuing but would require an effective and efficient implementation plan Ideal concepts- build it.
Difficult to make and unclear use Not so original ideas that are not feasible. Throw it out. Very original ideas that are not feasible- would need to be really high value/importance to proceed

I plotted out my ten ideas and the geodesic dome concept appeared to be the concept that would be best suited for this project.

choice matrix

Bill of Materials (BOM)

Component Quantity Supplier URL Price
Exhibit
Acrylic (Clear) 12” x 24” x 1/8” 16 MakerStock link $8.50
Backing/Mount Structure
Plywood ¼ in 24" x 36"2Lowesno link11.29
T-Slotted Framing Rail, Single Four Slot Rail, Silver, 40 mm Square, 4 Feet Long (mounted on wall) 3 McMaster Carr link 40.22
M3 screws/nuts/washers
T-slot nuts
PETG
NeoPixel addressable LEDs
Adafruit NeoPixel Digital RGB LED Strip - Black 60 LED 4m 4 Adafruit link 54.95
Female DC Power adapter - 2.1mm jack to screw terminal block 1 Adafruit link $2.00
2-pin JST SM Plug + Receptacle Cable Set 15 Adafruit link $0.75
User Input sensors
VL53L5CX Time-of-Flight 8×8-Zone Distance Sensor Carrier with Voltage Regulator, 400cm Max 1 Pololu link 19.95
MCU/Processing
XIAO ESP32C3 1 digikey link 4.99
Sound
DFPLAYER - A MINI MP3 PLAYER DFR0299 1 digikey link 5.9
36mm Speaker w/ Wires - 8 Ohm 2 Watt 1 Adafruit link $1.95
SD Card 1 Amazon link $31.99
Power
5V 10A switching power supply 1 Adafruit link $29.95