Picture
I gotta give up some respect for what Miral, Alan and the iLuminate team have done since the rough prototype I gave them over a year ago. Their EL Wire and LED suits have now been seen on the Black Eyed Peas, Chris Brown during the BET Awards, Christina Aguilera, America's Got Talent, Death Cab for Cutie and more.


 
 
Picture
Thanks Popular Science! Can't wait to see it in print! If you are interested in building your own tank, feel free to check out my previous post with all the source code needed.
 
 
Picture
Thanks Engadget!



 
 
So I've been working on this little dodgeball demo to show off a little connectivity between the iphone / ipad / android and the kinect.

Just a couple days before we release our kinect based demos, this comes out.

Well, here is what we were working on. SHOCKINGLY SIMILAR.
So are they spying on me...I don't know. Maybe Microsoft is getting back at me for all my smart ass comments I made as a teenager at their software releases in Seattle. In reality Microsoft is probably just taking the same logical steps as me.

 
Augmented Tanks 12/21/2009
 
Picture
Projected Image
Augmented Tanks is a game I've been working on for a while now...and am still working on.

Building off of my solar powered iPhone controlled Arduino tank, I've added an infrared LED to my robot so that it can be tracked and also modified the tank's control system so that it now uses two XY grids and a fire button.

The first XY grid now controls the tanks direction and the second controls the tanks aim. There is also a large button spanning the entire top part of the interface which fires the weapon.
Picture
iPhone interface for tank control
doublexy.touchosc
File Size: 0 kb
File Type: touchosc
Download File

The goal of the game is simple, shoot tanks on the opposite team until your team has reached a total of 10 kills. Each time a member of your team is killed you get -1 point.

There are ammo pickups and each tank starts out with a shield that can take 10 hits before the tank is dead.

Right now every bullet fired is tracked with a firedfromID and teamID so that each bullet knows to go through team mates and only damage the opposite team. Also it help to keep track of kills so that at the end of the game statistics can be shown.
Picture
Currently in Progress:

Of course fun part of this is building the actual tanks/robots and controller. I'm still working out the details of what the tanks will be made out of, early tests were simply using Ardubots driven by SparkFun customers during our little meetup/class. How the controller communicated to the server running Processing is pretty important in order to be able to keep all the signals real-time and so that when a bot is killed it's IR led will be turned off for a few seconds and controls disabled.

The students were using xBee modules with unique channels to control each robot via serial commands send by their laptops, but that may be changing...or getting a bit more complicated since they all need to connect to the server via one xbee.
 
bologame10.zip
File Size: 149 kb
File Type: zip
Download File

 
 
Picture
iPhone Controlled Tank
Picture
iPhone Controlled Tank
Picture
Solar Panel Charger
Using the super awesome TouchOSC app for the iPhone connected to Processing for converting Open Sound Control signals into serial commands send out via USB to an Xbee...I am able to drive a small tank.

The tank is entirely made from SparkFun parts:
Arduino
Ardumoto
Dual Motor GearBox
Stackable Arduino Headers
Super Awesome Tank Treads
LiPoly Battery Charger
Batteries
Small Solar Panel
XBees
XBee USB board
XBee Explorer board
Also used a number of misc jumper wires, rubber bands, a block of wood and a few small pieces of aluminum (from the back of a PC).

Of course you will need an iPhone to get everything running exactly as I have setup, but you don't need to use an iPhone to control your tank, you could use a midi controller, a multi-touch screen, a random hardware controller, or really anything that can send serial, OSC or anything into Processing.

Here is the Source Code:
Source code for Arduino is from a Mechomaniac.com:

//-----------Start Arduino code ---------------

// Test program for SparkFun Ardumoto board
// Copyright (c) 2009 mechomaniac.com
 
// To use, connect the Arduino to a computer and send commands using a serial terminal.
// eg AR40#   motor A forwards with a speed of 40
 
#define PwmPinMotorA 10
#define PwmPinMotorB 11
#define DirectionPinMotorA 12
#define DirectionPinMotorB 13
#define SerialSpeed 9600
#define BufferLength 16
#define LineEnd '#'
 
char inputBuffer[BufferLength];
 
void setup()
{
  // motor pins must be outputs
  pinMode(PwmPinMotorA, OUTPUT);
  pinMode(PwmPinMotorB, OUTPUT);
  pinMode(DirectionPinMotorA, OUTPUT);
  pinMode(DirectionPinMotorB, OUTPUT);
 
  Serial.begin(SerialSpeed);
}
 
// process a command string
void HandleCommand(char* input, int length)
{
  Serial.println(input);
  if (length < 2) { // not a valid command
    return;
  }
  int value = 0;
  // calculate number following command
  if (length > 2) {
    value = atoi(&input[2]);
  }
  int* command = (int*)input;
  // check commands
  // note that the two bytes are swapped, ie 'RA' means command AR
  switch(*command) {
    case 'FA':
      // motor A forwards
      analogWrite(PwmPinMotorA, value);
      digitalWrite(DirectionPinMotorA, HIGH);
      break;
    case 'RA':
      // motor A reverse
      analogWrite(PwmPinMotorA, value);
      digitalWrite(DirectionPinMotorA, LOW);
      break;
    case 'FB':
      // motor B forwards
      analogWrite(PwmPinMotorB, value);
      digitalWrite(DirectionPinMotorB, LOW);
      break;
    case 'RB':
      // motor B reverse
      analogWrite(PwmPinMotorB, value);
      digitalWrite(DirectionPinMotorB, HIGH);
      break;
    default:
      break;
  } 
}
 
void loop()
{
  // get a command string form the serial port
  int inputLength = 0;
  do {
    while (!Serial.available()); // wait for input
    inputBuffer[inputLength] = Serial.read(); // read it in
  } while (inputBuffer[inputLength] != LineEnd && ++inputLength < BufferLength);
  inputBuffer[inputLength] = 0; //  add null terminator
  HandleCommand(inputBuffer, inputLength);
}

//----------- End Arduino code ---------------

Processing code:

//----------- Start Processing code ----------------

import oscP5.*;
import netP5.*;
import processing.serial.*;
Serial arduinoPort;
OscP5 oscP5;

float [] fader = new float [3];

void setup() {
  oscP5 = new OscP5(this,8000);
  arduinoPort = new Serial(this, Serial.list()[0], 9600);
}

void oscEvent(OscMessage theOscMessage) {

    String addr = theOscMessage.addrPattern();
   
       if(addr.indexOf("/1/fader") !=-1){
       String list[] = split(addr,'/');
     int  xfader = int(list[2].charAt(5) - 0x30);
     if(theOscMessage.get(0).floatValue() !=0){
     fader[xfader]  = theOscMessage.get(0).floatValue();
     }  
    }
}

void draw() {
//---------------------------------Motor A
 if(fader[1] > 0.65){
    arduinoPort.write("AF100#");
  }
   if(fader[1] < 0.35){
    arduinoPort.write("AR100#");
  }
  //--------------------------------Motor B
   if(fader[2] > 0.65){
    arduinoPort.write("BF100#");
  }
   if(fader[2] < 0.35){
    arduinoPort.write("BR100#");
  }
  //----------------------------stop commands
     if(fader[1] < 0.65 && fader[1] > 0.35 ){
    arduinoPort.write("AF0#");
  }
       if(fader[2] < 0.65 && fader[2] > 0.35 ){
    arduinoPort.write("BF0#");
  }
 
}

//---------------------- End Processing Code ------------------
 
 
Using SparkFun's EL Sequencer, WiFly Module, some custom code and the iPhone app LightDance I prototyped the EL suits for LightDanceApp.com. Please try to excuse the ridiculously cheeseball video.