brendanmatkin
Active member
OH! is a sculpture/controller for the lights on the geodesic dome at the Telus World of Science in Vancouver, Canada. It was built by me and several others at Tangible Interaction in Vancouver. I did the firmware, sensors/EDA, wiring, PureData (for external generated music), and local LED animations.
The controller has 240 embedded sensors that talk to a Teensy 3.5 via i2c (3 buses and a handful of PCA9617 repeaters/level translators). The Teensy communicates with a server inside science world over the internet via an LTE router, using a custom protocol (had to keep it light to keep our frame rates high enough). The Teensy also outputs an OSC signal on the LAN/WiFi for a laptop running puredata to use to generate real-time music. It is totally wireless and battery operated.
The very first prototype used a Teensy 3.2 with some multiplexed analog IR sensors:
The final prototype (I think I even just left it on the breadboard in the end
). A wiz820 for ethernet, Teensy 3.5 for the brains, and some custom sensor modules, each with an ATTiny841, an analog IR sensor, and an LED.
A janky pogo programming adapter for the sensor modules:
One of the last tests of everything connected before final assembly:
Here is an example of the i2c registers on the sensor modules that the Teensy interacted with. It could receive sensor data and trigger the LEDs to generate animations. If it wasn't animating, each LED responded to it's corresponding sensor input independently.
For more info:
The controller has 240 embedded sensors that talk to a Teensy 3.5 via i2c (3 buses and a handful of PCA9617 repeaters/level translators). The Teensy communicates with a server inside science world over the internet via an LTE router, using a custom protocol (had to keep it light to keep our frame rates high enough). The Teensy also outputs an OSC signal on the LAN/WiFi for a laptop running puredata to use to generate real-time music. It is totally wireless and battery operated.
The very first prototype used a Teensy 3.2 with some multiplexed analog IR sensors:
The final prototype (I think I even just left it on the breadboard in the end

A janky pogo programming adapter for the sensor modules:
One of the last tests of everything connected before final assembly:
Here is an example of the i2c registers on the sensor modules that the Teensy interacted with. It could receive sensor data and trigger the LEDs to generate animations. If it wasn't animating, each LED responded to it's corresponding sensor input independently.
C++:
volatile uint8_t i2c_regs[] = {
0x00, // 00 "sensorData" analog value (processed w/ R_DATA_AVG) ***READ ONLY***
0x00, // 01 "readAll" flag (return all registers or just sensor data)
0x06, // 02 DATA averaging coeffecient /255 (EWMA) (set to 255 to essentially disable)
0x06, // 03 LED averaging coeffecient /255 (EWMA)
0x00, // 04 LED pulse trigger (attract mode) (auto resets to 0x00 immediately)
0x01, // 05 LED pulse finished flag (attract mode) (0x00 while pulsing, 0x01 when not)
0x01, // 06 LED pulse up speed (attract mode)
0xFF, // 07 (x4) LED pulse hold time (attract mode)
0x01, // 08 LED pulse down speed (attract mode)
0xFF, // 09 LED pulse MAX BRIGHTNESS (attract mode)
0x01, // 10 LED Enable (0x01 = enable, 0x00 = disable)
0x80, // 11 (-128) LED_MIN (sensor to LED mapping MIN)
0x80, // 12 (x2) LED_MAX (sensor to LED mapping MAX)
0x01, // 13 LED_FADE_EN (0x01 = enable, 0x00 = disable)
0x06, // 14 LED_FADE_SPEED coeffecient /1024 (EWMA)
I2C_SLAVE_ADDRESS, // 15 address (changeable)
0x00 // 16 calibrate sensor (auto resets to 0x00 immediately)
};
For more info: