Magic Wand

The Pitch

This wand allows you to manipulate the environment magically, you never know what you can do as your powers grow cumulatively over time. You wand glows radiently when something you can use your power on is near. Flick your wand to find out what your new powers are.

Practically Speaking

The wand is an IR sensor/reciever that interacts in a special setting– theme park, family entertainment center, mall– with special props that look innocuous but have hidden components that can be manipulated by the wand.

 

How it Works

Most of the intelligence is built into the devices that are interacted with, this makes the wands cheap, since there will be many more of them then interactions. The IR sensor on the wand “listens” for devices which can be interacted with. Different objects have different difficulty levels so some form of communication is nessecary beyond simple on/off sensing. The props sensors are networked, keeping an online total of your score.

 

Minimum

Working wand a interaction device.

 

Goals

A high form-factor wand that looks clean and polished, highly reliable sensing, and a really fun demo interaction.

 

Required materials

  • Mini-arduino
  • Force sensor
  • IR sensor/reciever
  • RFID Tags?

 

Draft Schedule

Week One: Schematic diagram device and interaction, industrial design wand, purchase components

Week Two: Build Wand electronics

Week Three: Build Interaction electronics

Week Four: Build prop

Egress Code Hat

The egress hat allows one to walk around a building to ensure that there is adequate light on the floor for emergency egress (5 footcandles in most municipalities). The LDR sensor is on the top of the hat to ensure nothing blocks it, and the red LED is under the brim, easiliy visible to the wearer, indicating that the area is not in complience

 

Code:

int int LDR = 2;    // select the input pin for the potentiometer
int ledPin = 13;   // select the pin for the LED
int val = 0;       // variable to store the value coming from the sensor

void setup() {
  pinMode(ledPin, OUTPUT);  // declare the ledPin as an OUTPUT
}

void loop() {
  val = analogRead(LDR);    // read the value from the sensor
 if (val >= 500) {         // check if the input is HIGH (button released)
  digitalWrite(ledPin, HIGH);   // sets the LED on
  delay(500);                  // waits for a second
  digitalWrite(ledPin, LOW);    // sets the LED off
  delay(500);                  // waits for a second

  } else {
    digitalWrite(ledPin, HIGH);  // turn LED ON
  }
           
}

Interactive Tigger

about the project: interactive-tigger

code:

// Tigger Hide and Seek
// by Jason Read
int play = 12;       // choose the pin for the play pause function
int skip = 8;        // chose the pin for the skip function
int back = 10;       // chose the pin for the back function
int repeat1 = 0;     // keeps track from repeating
int repeat2 = 0;     // keeps track from repeating
int repeat3 = 0;     // keeps track from repeating
int repeat4 = 0;     // keeps track from repeating
int interactions = 0;        // keeps track of interactions
void setup() {
Serial.begin(9600); // connect to the serial port
pinMode(play, OUTPUT);      // sets the digital pin as output
pinMode(skip, OUTPUT);      // sets the digital pin as output
pinMode(back, OUTPUT);     // sets the digital pin as output
pinMode(0, INPUT);      // sets the digital pin as output
}

void loop() {
 
char flag = 1; 
int  val = 0;
char code[10];
int bytesread = 0;
char target [][10] = {{0,0,’1′,’5′,’0′,’0′,’D’,’0′,’2′,’A’},
                      {0,0,’1′,’5′,’0′,’0′,’D’,’0′,’3′,’A’},
                      {0,0,’1′,’5′,’0′,’0′,’C’,’F’,’D’,’B’},
                      {0,0,’1′,’5′,’0′,’0′,’D’,’0′,’1′,’4′}};
                     
                          

if(interactions == 0) {
  Serial.print(“introduction”);
  interactions = 1;                       // inhibits repetition                         
  digitalWrite(play,HIGH);                // hits play
  delay(375);                              // waits for a second
  digitalWrite(play,LOW);                 // stops pushing play
  delay(375);
  digitalWrite(play,HIGH);                // hits play
  delay(375);                              // waits for a second
  digitalWrite(play,LOW);                 // stops pushing play
  delay(2000);                            // delays program until sounds program is finished
  digitalWrite(play,HIGH);                // hits pause
  delay(375);                              // waits for a second
  digitalWrite(play,LOW);                 // stops pushing pause
  delay(875);
  digitalWrite(skip,HIGH);                // hits skip
  delay(575);                              // waits for a second
  digitalWrite(skip,LOW);                 // stops pushing skip
  delay(575);
  digitalWrite(skip,HIGH);                // hits skip
  delay(575);                              // waits for a second
  digitalWrite(skip,LOW);                 // stops pushing skip
  delay(575);
  digitalWrite(skip,HIGH);                // hits skip
  delay(575);                              // waits for a second
  digitalWrite(skip,LOW);                 // stops pushing skip
  delay(575);
  digitalWrite(skip,HIGH);                // hits skip
  delay(575);                              // waits for a second
  digitalWrite(skip,LOW);                 // stops pushing skip
  delay(575);
  digitalWrite(skip,HIGH);                // hits skip
  delay(575);                              // waits for a second
  digitalWrite(skip,LOW);                 // stops pushing skip
  delay(575);
  digitalWrite(skip,HIGH);                // hits skip
  delay(575);                              // waits for a second
  digitalWrite(skip,LOW);                 // stops pushing skip
  delay(575);
}

if(interactions == 4) {
  Serial.print(“Finale”);
  delay(500);
  interactions = 1;                       // inhibits repetition
  repeat4 = 1;                            // inhibits repetition
    digitalWrite(skip,HIGH);                // skips a track
  delay(375);                              // waits for a second
  digitalWrite(skip,LOW);                 // stops pushing skip
  delay(375);                              // waits for a second
  digitalWrite(skip,HIGH);                // skips a track
  delay(375);                              // waits for a second
  digitalWrite(skip,LOW);                 // stops pushing skip
  delay(375);                              // waits for a second
  digitalWrite(skip,HIGH);                // skips a track
  delay(375);                              // waits for a second
  digitalWrite(skip,LOW);                 // stops pushing skip
  delay(375);                              // waits for a second
  digitalWrite(skip,HIGH);                // skips a track
  delay(375);                              // waits for a second
  digitalWrite(skip,LOW);                 // stops pushing skip
  delay(375);                              // waits for a second
  digitalWrite(play,HIGH);                // hits play
  delay(375);                              // waits for a second
  digitalWrite(play,LOW);                // stops pushing play
  delay(13900);                            // delays program until sounds program is finished
  digitalWrite(play,HIGH);                // hits play
  delay(275);                              // waits for a second
  digitalWrite(play,LOW);                // stops pushing pause
  delay(575);
  digitalWrite(skip,HIGH);                // hits back
  delay(575);                              // waits for a second
  digitalWrite(skip,LOW);                 // stops pushing back
  delay(575);
  digitalWrite(skip,HIGH);                // hits back
  delay(575);                              // waits for a second
  digitalWrite(skip,LOW);                 // stops pushing back
  delay(575);
  digitalWrite(skip,HIGH);                // hits back
  delay(575);                              // waits for a second
  digitalWrite(skip,LOW);                 // stops pushing back
  repeat1 = 0;
  repeat2 = 0;
  repeat3 = 0;
  repeat4 = 0;
  interactions = 1;
  delay(10000);
}
 
  if(Serial.available() > 0) {          // if data available from reader
    if((val = Serial.read()) == 10) {   // check for header
      bytesread = 0;
      while(bytesread<10) {              // read 10 digit code
        if( Serial.available() > 0) {
          val = Serial.read();
          if((val == 10)||(val == 13)) { // if header or stop bytes before the 10 digit reading
            break;                       // stop reading
          }
          code[bytesread] = val;         // add the digit          
          bytesread++;                   // ready to read next digit 
        }
      }
      if(bytesread == 10) {              // if 10 digit read is complete
//        Serial.print(“TAG code is: “);   // possibly a good TAG
//        Serial.println(code);            // print the TAG code //
      }
      bytesread = 0;
    }
  }
  for (int i=2;i<10 && flag==1;i++)
    if(code[i]!=target[0][i])
     flag = 0;
    
     if(flag==1 && repeat1==0) {
     Serial.print(“interaction 1 “);
  repeat1 = 1;                            // inhibits repetition
  digitalWrite(skip,HIGH);                // skips a track
  delay(375);                              // waits for a second
  digitalWrite(skip,LOW);                 // stops pushing skip
  delay(375);                              // waits for a second
  digitalWrite(play,HIGH);                // hits play
  delay(175);                              // waits for a second
  digitalWrite(play,LOW);                // stops pushing play
  delay(13750);                            // delays program until sounds program is finished
 digitalWrite(play,HIGH);                // hits play
  delay(175);                              // waits for a second
  digitalWrite(play,LOW);                // stops pushing play
  delay(875);                            // delays program until sounds program is finished
  digitalWrite(skip,HIGH);                // hits skip
  delay(475);                              // waits for a second
  digitalWrite(skip,LOW);                 // stops pushing skip
  delay(575);
  digitalWrite(skip,HIGH);                // hits skip
  delay(475);                              // waits for a second
  digitalWrite(skip,LOW);                 // stops pushing skip
  delay(575);
  digitalWrite(skip,HIGH);                // hits skip
  delay(475);                              // waits for a second
  digitalWrite(skip,LOW);                 // stops pushing skip
  delay(475);
  digitalWrite(skip,HIGH);                // hits skip
  delay(475);                              // waits for a second
  digitalWrite(skip,LOW);                 // stops pushing skip
  delay(475);
  digitalWrite(skip,HIGH);                // hits skip
  delay(475);                              // waits for a second
  digitalWrite(skip,LOW);                 // stops pushing skip
  delay(875);
  interactions = interactions + 1;
     }
    
flag = 1;
    
    for (int i=2;i<10 && flag==1;i++)
    if(code[i]!=target[1][i])
     flag = 0;

     if(flag==1 && repeat2==0) {
     Serial.print(“Interaction 2”);
  repeat2 = 1;                            // inhibits repetition
  digitalWrite(skip,HIGH);                // skips a track
  delay(575);                              // waits for a second
  digitalWrite(skip,LOW);                 // stops pushing skip
  delay(575);                              // waits for a second
  digitalWrite(skip,HIGH);                // skips a track
  delay(575);                              // waits for a second
  digitalWrite(skip,LOW);                 // stops pushing skip
  delay(375);                              // waits for a second
  digitalWrite(play,HIGH);                // hits play
  delay(175);                              // waits for a second
  digitalWrite(play,LOW);                // stops pushing play
  delay(6500);                            // delays program until sounds program is finished
  digitalWrite(play,HIGH);                // hits pause
  delay(175);                              // waits for a second
  digitalWrite(play,LOW);                // stops pushing pause
  delay(575);
  digitalWrite(skip,HIGH);                // hits skip
  delay(575);                              // waits for a second
  digitalWrite(skip,LOW);                 // stops pushing skip
  delay(575);
  digitalWrite(skip,HIGH);                // hits skip
  delay(575);                              // waits for a second
  digitalWrite(skip,LOW);                 // stops pushing skip
  delay(575);
  digitalWrite(skip,HIGH);                // hits skip
  delay(575);                              // waits for a second
  digitalWrite(skip,LOW);                 // stops pushing skip
  delay(575);
  digitalWrite(skip,HIGH);                // hits skip
  delay(575);                              // waits for a second
  digitalWrite(skip,LOW);                 // stops pushing skip
  delay(575);
  interactions = interactions + 1;
     }
    
flag = 1;
    
  for (int i=2;i<10 && flag==1;i++)
    if(code[i]!=target[2][i])
     flag = 0;
 
     if(flag==1 && repeat3==0) {
  Serial.print(“Interaction 3”); 
  repeat3 = 1;                            // inhibits repetition
  digitalWrite(skip,HIGH);                // skips a track
  delay(375);                              // waits for a second
  digitalWrite(skip,LOW);                 // stops pushing skip
  delay(575);                              // waits for a second
  digitalWrite(skip,HIGH);                // skips a track
  delay(375);                              // waits for a second
  digitalWrite(skip,LOW);                 // stops pushing skip
  delay(375);     
  digitalWrite(skip,HIGH);                // skips a track
  delay(375);                              // waits for a second
  digitalWrite(skip,LOW);                 // stops pushing skip
  delay(575);                              // waits for a second
  digitalWrite(skip,HIGH);                // skips a track
  delay(375);                              // waits for a second
  digitalWrite(skip,LOW);                 // stops pushing skip
  delay(375);     
  digitalWrite(play,HIGH);                // hits play
  delay(175);                              // waits for a second
  digitalWrite(play,LOW);                // stops pushing play
  delay(13000);                            // delays program until sounds program is finished
  digitalWrite(play,HIGH);                // hits pause
  delay(575);                              // waits for a second
  digitalWrite(play,LOW);                // stops pushing pause
  delay(675);
  digitalWrite(skip,HIGH);                // hits back
  delay(575);                              // waits for a second
  digitalWrite(skip,LOW);                 // stops pushing back
  delay(675);
  digitalWrite(skip,HIGH);                // hits back
  delay(575);                              // waits for a second
  digitalWrite(skip,LOW);                 // stops pushing back 
  delay(800);
  interactions = interactions + 1;
     }

flag = 1;

    for (int i=2;i<10 && flag==1;i++)
    if(code[i]!=target[3][i])
     flag = 0;

     if(flag==1 && repeat4==0) {
       repeat4 = 1;
  Serial.print(“introduction”);
  interactions = 1;                       // inhibits repetition
  digitalWrite(play,HIGH);                // hits play
  delay(375);                              // waits for a second
  digitalWrite(play,LOW);                 // stops pushing play
  delay(375);
  digitalWrite(play,HIGH);                // hits play
  delay(375);                              // waits for a second
  digitalWrite(play,LOW);                 // stops pushing play
  delay(2000);                            // delays program until sounds program is finished
  digitalWrite(play,HIGH);                // hits pause
  delay(375);                              // waits for a second
  digitalWrite(play,LOW);                 // stops pushing pause
  delay(875);
  digitalWrite(skip,HIGH);                // hits skip
  delay(575);                              // waits for a second
  digitalWrite(skip,LOW);                 // stops pushing skip
  delay(575);
  digitalWrite(skip,HIGH);                // hits skip
  delay(575);                              // waits for a second
  digitalWrite(skip,LOW);                 // stops pushing skip
  delay(575);
  digitalWrite(skip,HIGH);                // hits skip
  delay(575);                              // waits for a second
  digitalWrite(skip,LOW);                 // stops pushing skip
  delay(575);
  digitalWrite(skip,HIGH);                // hits skip
  delay(575);                              // waits for a second
  digitalWrite(skip,LOW);                 // stops pushing skip
  delay(575);
  digitalWrite(skip,HIGH);                // hits skip
  delay(575);                              // waits for a second
  digitalWrite(skip,LOW);                 // stops pushing skip
  delay(575);
  digitalWrite(skip,HIGH);                // hits skip
  delay(575);                              // waits for a second
  digitalWrite(skip,LOW);                 // stops pushing skip
  repeat1 = 0;
  repeat2 = 0;
  repeat3 = 0;
  repeat4 = 0;
  interactions = 0;
  delay(5000);
     }
 
  if (bytesread>0)
     Serial.print(“it wasn’t any”);
 
}

Gaming Sweater

The gaming jacket recieves “IR” signals that are triggers in an interactive game. A potentiometer  controls the sensitivity of the sensor and, therefore, the difficulty level of the game. For the in class demo an LDR was used in place of IR.

 

/*
* Gaming Sweater
* by Jason Read
*
*/

int LDRPin = 3;                // pin for the LDR
int led1 = 9;                   // choose the pin for the LED
int led2 = 10;                  // choose the pin for the LED
int led3 = 11;                  // choose the pin for the LED
int led4 = 12;                  // choose the pin for the LED
int inputPin = 5;               // input pin for potentiometer
int intensity = 0;              // variable for reading LDR
int calibration = 0;            // variable for reading Pot
int counter = 0;                // store the number of button presses
int ending = 0;                 // resets the game
boolean buttonDown = false;     // a flag that stores if the button is beeing pressed down or not
boolean isLightOn = false;      // a flag that stores if the led is on or off

void setup() {
pinMode(led1, OUTPUT);      // declare LED as output
pinMode(led2, OUTPUT);      // declare LED as output
pinMode(led3, OUTPUT);      // declare LED as output
pinMode(led4, OUTPUT);      // declare LED as output
pinMode(inputPin, INPUT);   // declare pushbutton as input
pinMode(LDRPin, INPUT);   // declare pushbutton as input
digitalWrite(led1, LOW);    // turn LED OFF
digitalWrite(led2, LOW);    // turn LED OFF
digitalWrite(led3, LOW);    // turn LED OFF
digitalWrite(led4, LOW);    // turn LED OFF
Serial.begin(300);         // opens serial port, sets data rate to 9600 bps

}

void loop(){
  intensity = analogRead(LDRPin);    // read the value from the sensor range 0 – 1024
  calibration = analogRead(inputPin);  // read input value
  Serial.println(intensity);             // Send val to the pc, can be seen using Serial Monitor
  Serial.println(calibration);       // Send val to the pc, can be seen using Serial Monitor

if (ending <= 9) {                      // resets the game when finished
counter = counter;
}
else {
counter = 1;
ending = 0;
}

if (intensity <= calibration && buttonDown == false) {      // check if the input is HIGH and the button is not already been held down
buttonDown = true;           // set the button flag to down
counter = counter +1;        // add one to the counter
}

//if we are no longer pressing the button down set the buttonDown flag to up
if (intensity >= calibration){
buttonDown = false;  // set the buttonDown value to up
}

if (counter == 2)                       // one trigger activated
{
digitalWrite(led1,HIGH);
}
else if (counter == 3)               // second trigger activated
{
digitalWrite(led2,HIGH);
}
else if (counter == 4)                // third trigger activated
{
digitalWrite(led3,HIGH);
}
else if (counter >= 5)               // final trigger activated, game won
{
  digitalWrite(led1, HIGH);   // sets the LED on
  digitalWrite(led2, LOW);   // sets the LED off
  digitalWrite(led3, LOW);   // sets the LED off
  delay(100);                  // waits for a second
  digitalWrite(led1, LOW);   // sets the LED on
  digitalWrite(led2, HIGH);   // sets the LED off
  digitalWrite(led3, LOW);   // sets the LED off
  delay(100);                  // waits for a second
  digitalWrite(led1, LOW);   // sets the LED on
  digitalWrite(led2, LOW);   // sets the LED off
  digitalWrite(led3, HIGH);   // sets the LED off
  delay(100);
  digitalWrite(led1, LOW);   // sets the LED on
  digitalWrite(led2, LOW);   // sets the LED off
  digitalWrite(led3, LOW);   // sets the LED off
  ending = ending +1;        // add one to the finishing counter
  delay(80);
}
else
{
digitalWrite(led1,LOW);
digitalWrite(led2,LOW);
digitalWrite(led3,LOW);
}
}