After putting together my wave shield, hooking up my range finder and attaching a decent speaker (details here) I knew I needed to find a good way to tie everything together in one coherent object. I originally thought I might get crazy and bore out the center of some impressive and expensive marble stone and rig everything up like a million bucks – but I remembered that I’m kind of broke and ended up settling for one the few rocks from the park that hadn’t been peed on (in a while at least) and an oatmeal container. The idea being that I could just use the oatmeal container as a pedestal and housing for all the electronic bits and put the sad little rock on top. I cut three holes in the container: one for the Arduino port in the rear (which I would be using for power and another feature, which I describe below); one for the ranger finder to poke its head out the front; and another in the front to make sure that the speaker would be audible in the front. It took a little bit of cord to fasten the speaker in the right place and then I piled everything in.
Once I felt like the setup was going to work I just draped the whole thing in black cloth for a touch of class, leaving a hole to be sure that the range finder had unobstructed access out and voila! Well… it was still a bit lame, and I hadn’t really built in any feedback to let the observer know that they were in the correct position to get some action. The sound clip was originally pretty quiet for the first 10 seconds, so I had already edited that down so the observer would get more instant feedback, but it still seemed confusing and I really didn’t want to soldering more to my wave shield just for a little LED. What I ended up doing is writing a little processing script that reads data from the range finder via the Arduino serial monitor and then plays a pulse of orange light to compliment the audio.
It’s not really a pet trick, but it is stupid. Overall, I think it’s a bit too dramatic for the quality – making it hard to take it seriously. My original idea was inspired by my fascination with Aphex Twin’s ambient work, and this one song “Stone in Focus” is so relaxing I used it as my morning alarm – some would say counter-intuitively – but I wake up just fine and I will never go back to an alarm that is designed to scare the shit out of me. It’s no way to begin any day.
Anyways, I don’t think the project does the song any justice, and I’m a little upset I had to move all my oatmeal into tupperware. I’m also a little worried (based on some earlier testing) that people will think that the rock is there to pick up or drop or smash into the pedestal. We’ll see. On a positive note, I was able to get through a lot of soldering and grabbing sensor data and using it in Processing, which are two good skills to build upon from here.




#include
#include
#include
#include "WaveUtil.h"
#include "WaveHC.h"
SdReader card; // This object holds the information for the card
FatVolume vol; // This holds the information for the partition on the card
FatReader root; // This holds the information for the filesystem on the card
FatReader f; // This holds the information for the file we're play
WaveHC wave; // This is the only wave (audio) object, since we will only play one at a time
#define DEBOUNCE 100 // button debouncer
// this handy function will return the number of bytes currently free in RAM, great for debugging!
int freeRam(void)
{
extern int __bss_end;
extern int *__brkval;
int free_memory;
if((int)__brkval == 0) {
free_memory = ((int)&free_memory) - ((int)&__bss_end);
}
else {
free_memory = ((int)&free_memory) - ((int)__brkval);
}
return free_memory;
}
void sdErrorCheck(void)
{
if (!card.errorCode()) return;
putstring("\n\rSD I/O error: ");
Serial.print(card.errorCode(), HEX);
putstring(", ");
Serial.println(card.errorData(), HEX);
while(1);
}
int potPin = 0; // Analog input pin that the potentiometer is attached to
int potValue = 0; // value read from the pot
int led = 9; // PWM pin that the LED is on. n.b. PWM 0 is on digital pin 9
void setup() {
// set up serial port
Serial.begin(9600);
putstring_nl("WaveHC with 6 buttons");
putstring("Free RAM: "); // This can help with debugging, running out of RAM is bad
Serial.println(freeRam()); // if this is under 150 bytes it may spell trouble!
// Set the output pins for the DAC control. This pins are defined in the library
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
// if (!card.init(true)) { //play with 4 MHz spi if 8MHz isn't working for you
if (!card.init()) { //play with 8 MHz spi (default faster!)
putstring_nl("Card init. failed!"); // Something went wrong, lets print out why
sdErrorCheck();
while(1); // then 'halt' - do nothing!
}
// enable optimize read - some cards may timeout. Disable if you're having problems
card.partialBlockRead(true);
// Now we will look for a FAT partition!
uint8_t part;
for (part = 0; part < 5; part++) { // we have up to 5 slots to look in if (vol.init(card, part)) break; // we found one, lets bail } if (part == 5) { // if we ended up not finding one :( putstring_nl("No valid FAT partition!"); sdErrorCheck(); // Something went wrong, lets print out why while(1); // then 'halt' - do nothing! } // Lets tell the user about what we found putstring("Using partition "); Serial.print(part, DEC); putstring(", type is FAT"); Serial.println(vol.fatType(),DEC); // FAT16 or FAT32? // Try to open the root directory if (!root.openRoot(vol)) { putstring_nl("Can't open root dir!"); // Something went wrong, while(1); // then 'halt' - do nothing! } // Whew! We got past the tough parts. putstring_nl("Ready!"); } void loop() { potValue = analogRead(potPin); // read the pot value Serial.print(potValue, BYTE); // print the pot value back to the debugger pane //Serial.println(",", DEC); // print the pot value back to the debugger pane if (potValue > 60 || potValue < 40 ) {
playfile("stone-04.wav");
}
delay(10); // wait 10 milliseconds before the next loop
}
// Plays a full file from beginning to end with no pause.
void playcomplete(char *name) {
// call our helper to find and play this name
playfile(name);
while (wave.isplaying) {
// do nothing while its playing
}
// now its done playing
}
void playfile(char *name) {
// see if the wave object is currently doing something
if (wave.isplaying) {// already playing something, so stop it!
wave.stop(); // stop it
}
// look in the root directory and open the file
if (!f.open(root, name)) {
putstring("Couldn't open file ");
Serial.print(name);
return;
}
// OK read the file and turn it into a wave object
if (!wave.create(f)) {
putstring_nl("Not a valid WAV");
return;
}
// ok time to play! start playback
wave.play();
}
Hi there. I'm a design & code creative living, working and studying in sunny Brooklyn, NY. I'm currently finishing my thesis project at ITP and looking forward to what comes next.
Keywords: Design, User Experience, Interaction Design, Product Design, Visual Communication, Branding, Processing, Data Visualization, HTML, CSS, Javascript, Python
2010.09 — 2012.05 (expected)
Master of Professional Studies
Interactive Telecommunication Program (ITP)
Tisch School of the Arts, New York University
2010.09 — 2004.05
BA Visual Communications with minor in Art History
The George Washington University
Graduated Cum Laude
National Society of Collegiate Scholars
Spring 2003 semester at Sydney University, AU
2012.01 — present
Interaction Designer & Developer, SumAll, New York, NY
I'm currently working on an amazing data product with an incredible team here in SoHo. Check us out!
2011.06 — 2011.09
UX Designer, Microsoft Bing, Bellevue, WA
Worked with design, editorial, dev and program management teams to scope, design and develop prototypes for soon-to-be-released Bing.com feature during a summer internship. The internship culminated in two presentations of the feature prototypes to senior leadership at Microsoft as well as the Bing design team.
2007.02 — 2010.08
Graphic & Interaction Designer, Empax, Inc., New York, NY
Created a range of environmental, print and interactive materials to promote nonprofit clients and their causes. responsible for designing and presenting brand strategies, identities, print collateral, environmental signage, animation, user experience and interface, content management system setup and third party plug-in and data integration, search engine optimization, user analytics and testing.
2006.12 — 2011.08
Freelance Graphic & Interaction Design Consultant, New York, NY
Worked as a sole proprietor with various clients from retail, music, film, nonprofit, real estate and technology industries to create and improve existing brand and user experiences across many platforms and media.
2004.04 — 2006.01
Graphic Designer, The George Washington University Communication & Creative Services, Washington, DC
Worked with project management and external production vendors to deliver a range of print and interactive material related to university publications and communications initiatives. responsibilities included design and implementation of print collateral, posters, animation, environmental signage, web publication and press checks.
2011.07
Freakonomics (Web),
“What Would it Be Like to Climb 26 Years of Federal Spending?”
2011.04
Flowingdata (Web),
“Physically climb over budget data with Kinect”, by Nathan Yau
2011.02
Logo Lounge 6 (Book),
by Catharine Fishel and Bill Gardner, Rockport Publishers - Gedenk Logo
2010.12
“A Bartender That Pours The Perfect Shot, Every Shot”, by Matt Buchanan
2009.11
Basic Logos (Book),
by Index Book - The 2007 Gotham Awards Logo
2008.10
Print Magazine,
“Dialogue: Martin Kace”, by Steven Heller - The Alliance for Climate Protection Website
2010.12
ITP Winter show 2010, NYC
2011.04
Data Viz Challenge Party, hosted by Eyebeam and Google, NYC
2011.05
ITP Spring Show 2011, NYC
2006.01 — 2006.12
English Teacher, NOVA Japan, Kure-shi, Hiroshima-ken, Japan
Taught and mentored students of all ages and abilities in small to medium-sized classes to improve proficiency in english linguistics and conversation.