Build instructions for the 'Baby Interface Device' (BID), an ultra-simple USB Human Interface Device for Tiny Humans.  Built to allow my kid to interact with the computer without destroying my keyboards. The BID is a DIY USB HID (Human Interface Device) that acts as a keyboard to trigger a single keypress (space bar in this case).  The concept is to create a very large button that is baby-friendly to allow an infant to interact with computer games and educational software.
The project can be assembled in less than an hour for around $35 or less and requires very little knowledge of electronics or coding.
The BID is ideal for use with certain online baby game sites such as:
Kneebouncers - an awesome ad-free site supported by annual membership
Fisher-Price Online - some of these games will work with this thing too.  They're free and not too bad.
Also this thing is very handy to play/pause media sites like Pandora and Youtube.
DISCLAIMER: Choking and Strangulation Hazard! This has a cable on it and small parts which could mark, maime or otherwise injure an unsupervised infant! Don't let your baby play with it unsupervised! I take no responsibility for injuries to your child!



There is a bug with the timeout function. I will provide updated code once I figure it out. Until then just disregard the commented section. This code froze the device after the device has been plugged in for a certain amount of time (a couple of weeks)
Download the file as a .PDE/*
  Baby Interface Device V1.0
  Build a simple Button-style USB interface for infant learning development.
Build instructions for the device are available at http://matthewroy.com/bid/
Developed by: Matthew C. Roy 2011
  Website: http://matthewroy.com/bid/
  License: Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0) 
  http://creativecommons.org/licenses/by-nc-sa/3.0/
You may share this code and modify for any non-commercial purposes.
  */
  const int RGB_R=9;
  const int RGB_G=14;
  const int RGB_B=15;
const int PBTN=11;
int rgb_rval=255; //initial r val
  int rgb_gval=255; //initial g val
int rgb_bval=255; //initial b val
int pbtn_state_cur=0; //cur value of push (for change)
  int pbtn_state_prev=0; //prev value of push (for change)
long interval_off=30000; //milliseconds to wait before turning off light
  long pbtn_last_press=0; //last time the btn was pressed.
  long pbtn_state_timer=0; //milliseconds since push button change
void setup(){ 
  pinMode(RGB_R,OUTPUT);
  pinMode(RGB_G,OUTPUT); 
  pinMode(RGB_B,OUTPUT);
  pinMode(PBTN,INPUT); 
  }
  void loop(){
  // set all 3 pins to the desired intensity
  pbtn_state_timer = millis();
  /*if((pbtn_state_timer-pbtn_last_press)>interval_off){
  rgb_rval=255;
  rgb_gval=255;
  rgb_bval=255; 
  }*/
  if(check_switch()){
  pbtn_last_press=millis();
  rgb_rval=random(0,255);
  rgb_gval=random(0,255);
  rgb_bval=random(0,255);
  Keyboard.set_key1(KEY_SPACE);
  Keyboard.send_now();
  Keyboard.set_key1(0);
  Keyboard.send_now();
  }
  
  analogWrite(RGB_R, rgb_gval);
  analogWrite(RGB_G, rgb_gval);
  analogWrite(RGB_B, rgb_bval);
  }
  boolean check_switch(){
  pbtn_state_prev=pbtn_state_cur;
  pbtn_state_cur=digitalRead(PBTN);
  if(pbtn_state_prev!=pbtn_state_cur){
  //switch happened
  return true;
  }
  else{
  return false;
  }
}




	
  
  
	Build this thing with 2 Pololu Wixels instead for wireless battery operated version.
	Add an IR receiver for remote control version.  This is good for the media playback/pause functionality
	Add an SD card/reader on this and have a custom application that lets parent's put image/media slides on it for the baby to flip through
	Wire in a reset button to reset teensy so you can upgrade the firmware without opening the tap light.
