Skip to main content
Forrest O. Interactive

Tactile Labyrinth

Presentation

Inspiration

One definition of labyrinth is a winding path with no branches, so if you keep walking in one direction, you cover the whole path and end up back where you started.

I like this aesthetic, and think it would be nice as an object designed for touching.

Noomorph is a made-up word, consisting of noo (thought) and morph (shape). So noomorphology could be a design process that gives shape to thought.

Evaluation questions

Document a final project masterpiece that integrates the range of units covered, answering:

What does it do?

The tactile labyrinth is a 3D path around a ball that can be traced and followed with the hands. Lights along the path are programmed with animations that react to the motion of the ball.

Who’s done what beforehand?

Labyrinth mood board

Mood board – interactive version with video embeds and links.

What did you design?

  1. Parametric design app that simulates a tiny planet and rope loop with self-collisions and gravity.
  2. Once the path is solved, sockets for the LED wires are added, and holes are subtracted, using Boolean operations. The sockets are oriented towards the center of the ball.
  3. The app exports positive and negative space STLs that are combined in Blender or Prusa Slicer before 3D printing.
  4. The parts snap together securely, mostly without glue.
  5. The LEDs are inserted into each socket. The wire loops through the inside of the ball.
  6. A platform sits between the halves of the ball. It was designed to keep the accelerometer at the center of the ball, and the battery close to the center of gravity.
  7. Arduino code interfaces Adafruit accelerometer and FastLED libraries.

What sources did you use?

What materials and components were used?

Where did they come from?

How much did they cost?

maker and part part number source cost
Seeed Studio XIAO RP2040 102010428 Digikey $4.68
Adafruit LSM6DSOX 6 DoF Accelerometer and Gyroscope - STEMMA QT / Qwiic 4438 Digikey $11.95
Texas Instruments 3 V to 5 V Level Shifter TXB0104DR Digikey $0.92
Horizontal SMD 2.54mm pitch pin socket connector (01x04) ($0.67 * 3) BG300-04-A-L-A Digikey $2.01
Horizontal SMD 2.54mm pitch pin socket connector (01x03) BG300-03-A-L-A Digikey $0.51
7 Position vertical header ($1.08 * 2) NPTC071KFXC-RC Digikey $2.16
Omron push button switch B3SN-3012 Digikey $0.71
YAGEO 4.99 kOhms resistor 1206 ($0.10 * 2) RC1206FR-074K99L Digikey $0.20
TDK Corporation 0.1 µF Ceramic Capacitor 1206 ($0.23 * 2) C3216X7R2A104K160AA Digikey $0.46
Bantam Proto Board Copper Clad FR1, Single Sided ($67.53/25) MT1004 Digikey $2.70
BTF-Lighting WS2812B 10m / 100 LED String btf-5v-100l-t Amazon $16.99
Filalab transparent PCTG filament ($28.50/kg, 537g) 4779051441044 Filalab $15.30
Filalab Galaxy Blue PLA filament ($22.80/kg, 351g) 4779051440993 Filalab $8.00
Clas Ohlson 5000mah battery bank (generic versions of the product exist) 39-3976-1 Clas Ohlson $28.46
Baltic birch plywood, 3mm (128mm square, from offcut) Fablab $2.00

Total: $97.05 USD (€85.06 EUR)

What parts and systems were made?

  • 3D printed parts for the inner case (opaque) and LED path (transparent)
  • Laser cut mounting platform for circuit boards
  • Custom circuit board

What processes were used?

  • 3D printing
  • Laser cutting
  • CNC milling for the circuit board

What questions were answered?

Can I make a path from a physics simulation, embed addressable LEDs into the path, and program a microcontroller to make interactive color animations on the object? Yes, I can do those things now.

What worked? What didn't?

See LED strip drama in the build log for something that did not work. Also the first attempt at soldering the circuit board (Week 08) did not go well.

The fit between in the inner outer parts worked better than expected. I thought it would require more iteration, but the first version worked as the final.

Otherwise, things worked out pretty well.

How was it evaluated?

Local and global evaluators for my weekly documentation.

Friends and family birthday party, play-testing with folks young and old. Their hands are in my presentation video.

Helsinki Media Lab Demo Day, passing around the labyrinth and speaking with people involved in new media art. It was nice to run into former teachers and fellow students, and to just place the object into their hands to see their reaction. One described the gameplay as "homeopathic" which I appreciated.

At media lab demo day.

At demo day. Playful spontanious combination with a 360° audio installation.

Zoom comments from Fab Academy students and instructors.

Fab Academy final presentation comments. Thank you all. 😊

Neil suggested that I add more about the physics simulation to the video.

What are the implications?

My goal in joining Fab Academy was to expand the tools and processes in my digital fabrication toolbox. Coming in to the class, I was comfortable with 2D design and laser cutting. Taking an earlier project that was static and 2D, and making it interactive and 3D, is a good reflection of all that I have learned in this class.


Build Log

The rest of this page was updated through the course as I worked on the labyrinth.

Previous work

╔══════╗╔╗╔╗╔════╗
╚═╗╔══╗║║║║║║╔═══╝
╔╗║║╔╗║╚╝╚╝║║╚═╗╔╗
║║╚╝║║║╔═══╝║╔═╝║║
║╚══╝║║╚═╗╔═╝║╔╗║║
╚═╗╔╗║╚═╗║║╔═╝║║║║
╔═╝║║║╔╗║║║╚══╝╚╝║
╚══╝║║║║║║║╔════╗║
╔╗╔═╝╚╝╚╝╚╝╚═══╗║║
║║╚═══╗╔╗╔╗╔╗╔═╝╚╝
║╚════╝║║║║║║║╔══╗
║╔╗╔══╗║║║╚╝║║║╔═╝
║║║║╔═╝║║╚═╗║╚╝╚═╗
║║╚╝║╔═╝╚═╗║║╔══╗║
║║╔═╝║╔═══╝║║║╔╗║║
╚╝╚═╗║║╔╗╔╗║╚╝║║╚╝
╔═══╝║║║║║║╚══╝╚═╗
╚════╝╚╝╚╝╚══════╝

"Wave Form Collapse" seeded random labyrinth, 2018.

"Folding powers of 2" labyrinth, pen plotting, 2021.

Rainbow Sierpiński curve stickers.

Stickers made during fab Week 03.

More Sierpiński curve projects: snow walking, wall lamp, web animation, 3D print.

2D wooden labyrinth

2D wooden labyrinth, 2018.

3D wooden labyrinth around dodecahedron, composite photo sketch.

Sketch for a 3D wooden labyrinth.

Simulation

Both the Blender and web versions of the simulation include a center of gravity, a ground sphere, and a loop of beads. Each frame of animation can have many physics cycles, that advance the time a fraction of the animation frame time. I use Verlet integration to solve the positions of an velocities of the beads that make the rope.

Growing beads for smooth rope simulation.

One challenge was smoothly adding beads to the rope. If you just add a new bead between two existing ones, the new bead will be overlapping, and the collision constraint will "thrash" the rope as the beads jump away from their overlap. By adding a new bead with a small radius and then smoothly growing it, the rope can grow without this thrash.

Blender geometry nodes

Ropes simulated in Blender. I have a Blender journal that documents that simulation.

With this simulation, I can grow irregular paths around any shape, with various paramters like center of gravity.

3D embed, union of simulated ropes and base icosahedron.

Ropes only, and union of ropes and base polyhedron.

I've printed 3 versions of the same simulation result: ropes only, union with icosahedron, and difference (carving into the polyhedron). There is a pleasing contrast between the regular polyhedron and organic ropes.

Web

I ported the Blender geometry nodes rope simulation to the web, with help from Claude 3.7. I structured the prompt as a readme file, but it took a bunch of iteration to reach parity with the Blender version. I lost Blender's fancy rendering, but gained live parameter tweaking and more direct manpulation and interactive possibility.

Web simulation test print.

Interaction

Game sketch.

Idea for a game-like interaction, where a character, represented by one LED of the string, walks along the path, all around the sphere. You have to turn the ball to keep them on top.

Maybe the bottom hemisphere stays blue and sloshes around a bit, to represent water.

Large scale prototype

I bought an addressable LED "rope" with USB power, animation controller, and silicone and nylon diffuser.

By wrapping it around a ball, we could start to get a sense of how it would feel to hold an animating light orb. But I needed a better structure to attach the rope.

alt text

Everybody should have a stack of cardboard hexagons handy. This is actually the third life of these hexagons. They started as offcuts of a laser cutting jig, then became prototype game pieces, then became apriltag tokens for Folk Computer.

Cardboard soccer ball ready, a.k.a. truncated icosahedron.

With some zip ties to attach the LED rope. Getting a feel for the form, imagining a mag sensor driving the light motion.

Circuit design

fo_v3 to LED rope

Documented in week 10's post.

Future iterations ꩜

Mirror image prints, to trace with fingers in each hand.

3D modeling: learn how to split shape to be printed as triangles flat on the bed.

CNC carving: translate that design to be carvable.

Electronics: make it possible to insert LED rope, design animations that fit the form.

Open questions

  • What is the interaction?
  • If I end up with an unconventional display, what will it show?
  • Could it be the base of the "calm timer" idea?
  • Can I keep the tactile inspiration while adding electronic interactivity, or are those exclusive?

Midterm plan

Path of LED rope approximated in Desmos.

Desmos graph with approximate LED path. Time to "eat the frog" and do some integration. The step I've been a little stuck on is mapping the LED indexes to positions. By making an formulaic approximation, I can get something on the microcontroller to get unstuck, and finesse the strategy later.

2025-04-23: Week 13's post.

Prototype integration

It's important to get my hands on a working version, the integrated cardboard prototype, to better understand how to budget the rest of my time. What are the most important improvements to make in each area of the build?

Sensor and animation

I really want to get the sensor and battery in position now!

Battery and sensor position

Wireless and handheld at last.

(Re)calibration app

Screenshot of the calibration app with dots representing LEDs around a sphere.

2025-05-07: Once I had a version with the accelerometer in place, I reworked the calibration flow. Week 15's post.

Wood side quest

Wooden brain ball.

Four axis milling for wildcard week 17.

Final integration

Material choice

Small lamp with labyrinth design.

Material and LED socket tests in week 16.

Boolean workflow

Labyrinth inner structure, top half.

Internal structure design and printing the major parts.

Aesthetic

I'm committed to the "3D print of medium poly count geometry" aesthetic now. Other processes and sanding didn't enhance the tactile or translucent qualities that are important.

3D print snap-together

2D Diagram explaining the 3D Boolean (add, subtract) operation ordering of these shapes.

An accident, but my test parts became my production parts when they snapped together real nice. But why did it work out that way?

Hemisphere coupler

Blender screenshot.

Blender setup for the part that holds the two hemispheres together. Part created with several Boolean modifiers.

Circuit mounting platform

Cuttle screenshot.

The platform is designed to put the accelerometer at the center of the sphere, and the 18650 battery compartment near the center of gravity.

Week 18: documenting these final parts.

RIP LED index 0

LED drama sad

After feeling lots of momentum at the lab getting the parts produced and integrated, I took everything home to finish the integration. I was distrought when none of the LEDs worked. I tried various controllers and power supplies, and they worked with another LED strip, but not my wire. I couldn't find a local source of the LEDs, and it would take too long to get a replacement. I thought my schedule was shot. I wouldn't be able to finish the course on time.

Jumping the first LED with three sewing pins through the wires.

Kris mentioned that if something happens to the first LED, it might not forward the signals needed to the rest of the strip. Instead of cutting it out, I tried jumping the 3 wires with sewing pins. I was shocked and elated when it actually worked.

LED drama happy

What a roller coaster. 🎢

One LED can make the whole string not work, and the string not working made me think that the whole project wouldn't be done. In that way, it was a self-analogy of dependency failures.

Software integration

The gist of calibration:

  1. Light one LED at a time
  2. Turn the ball to put that at top
  3. Record the gravity vector for that LED

I also had to make an array mapping the outer path LED order to the internal index, because the order is different.

readme.md for the final software.

Source

forresto-tactile-labyrinth-v0.zip

.
├── dev_board
│   ├── dev_board.kicad_pcb
│   ├── dev_board.kicad_pro
│   └── dev_board.kicad_sch
├── print-and-cut
│   ├── internal-join-v2.stl
│   ├── internal.blend-bottom.stl
│   ├── internal.blend-top.stl
│   ├── labyrinth internal support - cuttle.xyz.svg
│   ├── rope-3d-print-complete-2025-05-27T10-48-23-285Z-negative.stl
│   └── rope-3d-print-complete-2025-05-27T10-48-23-306Z-positive.stl
├── TactileLabyrinthFinal
│   ├── PixelBallLedMap.h
│   ├── readme.md
│   └── TactileLabyrinthFinal.ino
└── web
    ├── lib
    ├── pixel-ball
    │   ├── index.html
    │   ├── pixel-ball-initial.js
    │   ├── pixel-ball-viz.js
    │   ├── pixel-ball.js
    │   └── readme.md
    └── rope-simulation
        ├── generated
        │   ├── main.js
        │   ├── Physics.js
        │   ├── Print3D-worker.js
        │   ├── Print3D.js
        │   ├── Rope.js
        │   ├── RopeVisualizer.js
        │   └── TubeSDF.js
        ├── index.html
        ├── lib
        ├── readme.md
        └── rope-148-16.json

fab license

© Forrest Oliphant 2025

This work may be reproduced, modified, distributed, performed, and displayed for any purpose, but must acknowledge "Tactile Labyrinth by Forrest Oliphant". Copyright is retained and must be preserved. The work is provided as is; no warranty is provided, and users accept all liability.


Example acknowledement link in markdown:

[Tactile Labyrinth by Forrest Oliphant](https://www.forresto.com/fab-academy/tactile-labyrinth.html)

Next steps...

Hardware upgrades:

  • Break out small panel for external access for power switch, charging, programming
  • Improve the joinery of the halves of the sphere
  • Fancy compound hinge?
  • Vibration motor with satisfying feedback for the gameplay

Software:

  • Gameplay improvements, make the motion more connected to physics
  • Persistence of vision, show images when spinning or throwing the ball