Oh! - Science World Building Lights Controller

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.

oh-both.jpg


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:
oh_early_prototype.jpg


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.
oh_controller_01.jpg


A janky pogo programming adapter for the sensor modules:
oh_programmer.jpg


One of the last tests of everything connected before final assembly:
oh_controlled_prototype.jpg


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:
 
You're a brave man to leave the breadboarded electronics like that in the housing. Hopefully you used some hot-glue to keep the wires more-or-less attached to the breadboard...
But, nice project!

Paul
 
That has to be one of the most impressive implementations of interactive art I've ever seen. This world needs more minds like yours and projects like this.

Very inspiring!
 
You're a brave man to leave the breadboarded electronics like that in the housing. Hopefully you used some hot-glue to keep the wires more-or-less attached to the breadboard...
But, nice project!

Paul
Brave or stupid! We must've done something because somehow it kept working haha. Funny I went to the trouble of spooling up multiple iterations of the sensor PCB but never even made a protoboard version for the controller..

Thanks very much!
 
That has to be one of the most impressive implementations of interactive art I've ever seen. This world needs more minds like yours and projects like this.

Very inspiring!
Wow thanks Kris! I need to get back to it I guess - I have been snoozing on making stuff lately.
 
Back
Top