Tag Archives: cheap

IKEA Hack: MIDI Enabled Highscore Chair


The best thing about IKEA’s ANTILOP Highchair is that it’s cheap, and I mean dirt cheap. With a price tag of $19.99 you don’t have to worry about destroying it, or even not liking it. Coming in as a close second best thing is the fact that you can purchase extra trays which you can modify into activity centers you can swap in and out, such as this pro-gamer training rig.

For the Highscore Chair I added some Joysticks and Buttons I had lying around, loosely intended for expanding my arcade cabinet. These parts have the added advantage of actually being functional, down the road I can hook them up to a Raspberry Pi, an Arduino, MIDI out (Update: I’ve since added MIDI out), or just to some lights and buzzers — if you’ve got any ideas I’d love to hear them. The sky’s the limit as to what you can add to these trays, just keep safety in mind, for example, I placed the joysticks out of the arc of the baby’s head if he were to fall forward.

The trickiest part of this whole process is swapping out the trays. There are four rather stiff tabs that snap in place when attaching the tray. I may make a tool of some sort to make removal easier but in the mean time four butter knives do the trick. It’s probably best to swap the trays without the baby in the highchair, just slip a butter knife under each tab and once all four are in you can remove the tray easily (the butter knives will fall), really, any flat object would work, popsicle sticks perhaps? Now having thought about it, I’ll probably cut off the inner two tabs, the tabs are surprisingly strong I don’t see any risk of the baby removing the tray even if I remove two of them, however removing two would probably allow removal of the tray by an adult pressing one tab with each hand and pushing up on the tray with a knee or the like.

The plastic is very easy to drill, a stepped bit works wonders. Cutting would be a little more difficult but nothing a dremel wouldn’t be able to handle.

Update: I did end up snipping off the inner two tabs on both trays (with some sheet metal shears) and it worked like a charm. The trays can now be removed without the need for tools. Just push on the two remaining tabs with your thumbs keeping your fingers behind the lip for leverage, then use your chest, shoulder or chin (whatever works) to push up on the tray, once the tabs clear the lip you can let go and just lift the tray off. Be sure not to leave any sharp edges and swapping is still best done while the chair is unoccupied due to the number of places little fingers could get pinched while putting the tray on.

Update: I’ve since added MIDI out, which amounts to 10 MIDI triggers, 8 for each joystick and one for each button. The Highscore Chair now triggers samples loaded onto an Akai MPC1000, but with MIDI out it could be used as any sort of control surface now. The MIDI out is accomplished through an Arduino UNO, by following a couple of simple tutorials, found here and here, you can get buttons triggering MIDI notes in no time. I’ll shoot a new video when the little fellow is up for it. While the underside of the tray is already quite isolated from the baby due to the structure of the chair for added safety I’ll be putting the Arduino, battery and MIDI Jack in an enclosure and covering the entire tray undercarriage.


 

Here’s the Arduino sketch, very bare-bones. I cranked it out after a long day so I didn’t want to risk using the wrong array syntax so it’s just long hand, maybe that helps readability for beginners? Anyhow it would be much shorter if it used arrays. Basically there’re variables for each button pin and variables for the state of each button, it will only send one MIDI note per button push and wait until the button’s been released and pressed again before re-sending that note. This sketch is hard-coded to send MIDI notes 36 through 45 on channel 1 at 69 velocity.


const int buttonPin0 = 2;
const int buttonPin1 = 3;
const int buttonPin2 = 4;
const int buttonPin3 = 5;
const int buttonPin4 = 6;
const int buttonPin5 = 7;
const int buttonPin6 = 9;
const int buttonPin7 = 10;
const int buttonPin8 = 11;
const int buttonPin9 = 12;

int buttonStatus0 = 0;
int buttonStatus1 = 0;
int buttonStatus2 = 0;
int buttonStatus3 = 0;
int buttonStatus4 = 0;
int buttonStatus5 = 0;
int buttonStatus6 = 0;
int buttonStatus7 = 0;
int buttonStatus8 = 0;
int buttonStatus9 = 0;

void setup() {
  pinMode(buttonPin0, INPUT);
  pinMode(buttonPin1, INPUT);
  pinMode(buttonPin2, INPUT);
  pinMode(buttonPin3, INPUT);
  pinMode(buttonPin4, INPUT);
  pinMode(buttonPin5, INPUT);
  pinMode(buttonPin6, INPUT);
  pinMode(buttonPin7, INPUT);
  pinMode(buttonPin8, INPUT);
  pinMode(buttonPin9, INPUT);   

  Serial.begin(31250);
}

void loop(){

  int button0State = digitalRead(buttonPin0);
  int button1State = digitalRead(buttonPin1);
  int button2State = digitalRead(buttonPin2);
  int button3State = digitalRead(buttonPin3);
  int button4State = digitalRead(buttonPin4);
  int button5State = digitalRead(buttonPin5);
  int button6State = digitalRead(buttonPin6);
  int button7State = digitalRead(buttonPin7);
  int button8State = digitalRead(buttonPin8);
  int button9State = digitalRead(buttonPin9);  

  if(button0State == 1 && buttonStatus0 == 0)
  {
    buttonStatus0 = 1;
    noteOn(0x90, 0x24, 0x45);
  }
  else if(button0State == 0)
  {
    buttonStatus0 = 0;
  }

  if(button1State == 1 && buttonStatus1 == 0)
  {
    buttonStatus1 = 1;
    noteOn(0x90, 0x25, 0x45);
  }
  else if(button1State == 0)
  {
    buttonStatus1 = 0;
  }

  if(button2State == 1 && buttonStatus2 == 0)
  {
    buttonStatus2 = 1;
    noteOn(0x90, 0x26, 0x45);
  }
  else if(button2State == 0)
  {
    buttonStatus2 = 0;
  }

  if(button3State == 1 && buttonStatus3 == 0)
  {
    buttonStatus3 = 1;
    noteOn(0x90, 0x27, 0x45);
  }
  else if(button3State == 0)
  {
    buttonStatus3 = 0;
  }

  if(button4State == 1 && buttonStatus4 == 0)
  {
    buttonStatus4 = 1;
    noteOn(0x90, 0x28, 0x45);
  }
  else if(button4State == 0)
  {
    buttonStatus4 = 0;
  }

  if(button5State == 1 && buttonStatus5 == 0)
  {
    buttonStatus5 = 1;
    noteOn(0x90, 0x29, 0x45);
  }
  else if(button5State == 0)
  {
    buttonStatus5 = 0;
  }

  if(button6State == 1 && buttonStatus6 == 0)
  {
    buttonStatus6 = 1;
    noteOn(0x90, 0x2A, 0x45);
  }
  else if(button6State == 0)
  {
    buttonStatus6 = 0;
  }

  if(button7State == 1 && buttonStatus7 == 0)
  {
    buttonStatus7 = 1;
    noteOn(0x90, 0x2B, 0x45);
  }
  else if(button7State == 0)
  {
    buttonStatus7 = 0;
  }

  if(button8State == 1 && buttonStatus8 == 0)
  {
    buttonStatus8 = 1;
    noteOn(0x90, 0x2C, 0x45);
  }
  else if(button8State == 0)
  {
    buttonStatus8 = 0;
  }

  if(button9State == 1 && buttonStatus9 == 0)
  {
    buttonStatus9 = 1;
    noteOn(0x90, 0x2D, 0x45);
  }
  else if(button9State == 0)
  {
    buttonStatus9 = 0;
  }
}

void noteOn(int cmd, int pitch, int velocity) {
  Serial.write(cmd);
  Serial.write(pitch);
  Serial.write(velocity);
}

30 Second iPad Stand

What can’t coat hangers do? I came up with the idea for this stand and made this video to help advertise my ohDisco! iPad app, a quarter of a million views ain’t bad.

Macro Photography on the Cheap (ish)

Not long after I picked up my Canon Rebel XT 350D I realized the stock lense left a lot to be desired. After drooling over numerous macro photos on Flickr from this same camera I decided to look into a macro lense. Not being a pro photographer I couldn’t really justify spending $250+ on something like the Canon 50mm f/2.5 or better so, as I often do, I poked around for a comparable, less costly solution. That’s when I found out about Kenko Extension Tubes.

Kenko Tubes are lense extensions, they have no optics, they are connected between a lense and the camera, by changing the distance between the lense and the sensor it changes the focal length. This allows you to focus on objects which are much closer, hence, macro photography. These tubes come in sets allowing you a number of combinations.


So I purchased some Kenko Tubes ( http://www.the-digital-picture.com/Reviews/Kenko-Extension-Tube-Set-Review.aspx ) not knowing that they would not connect with Canon EF-S lenses, such as the EF-S 18-55 that came with my Rebel XT. Damnit!

Some searches revealed that you can modify the tubes to work, so here’s how it’s done. Basically, there are a number of plastic rings inside the Kenko Tubes whose diameter is not wide enough to allow the EF-S lense to insert the required depth to be able to lock the ridges.

You can simply take a dremel to the frist ring in order to widen it to accomadate the EF-S lense. All you have to do is be careful not to grind too close to the brass connector pins, only grind the first ring and remove all debris when you’re finished.

The red in the first pic is the opening which is too small, the green is what’s got to be removed. The finished pic shows the larger hole.

This,

Plus this,

Gets you this,

I did this on the 12mm tube figuring if I ruined it, I’d still have the others and if I wanted to use them I could simply attached the 12mm to them instead of grinding all three.

You can check out more of the resulting photos w/ the tubes on my Flickr.