As computing becomes more ubiquitous in our objects, designers need to be more aware of how to design meaningful interactions into electronically enhanced objects. At the University of Washington, a class of junior Interaction Design majors is exploring this question. These pages chronicle their efforts.

Friday, June 13, 2014

Final Video - Daniel/Chip




Chip and I took a simple and mundane task, watering a house plant, and separated the basic steps and put them on extreme ends. Conceptually it is a wireless interaction, but this version is wired. So the concept is about watering a plant remotely and about the interactions it could create. 

On one end, the user (user A) can have the visuals and the presence benefits of owning a plant, but user A can’t water the plant, nor touch it, and it difficult to tell when it needs watering.

On the other end (User B), the user has the satisfaction of keeping this plant alive, but s/he can’t see it.

This broken communication structure can motivate the involved ones to seek communication between them. 

Other situations in which this concept could be used are : 

-Kids plant caring
-Traveling and away from plant

In the video, Chip realizes he could use a concept like his to have a new level of interact with his host dad.


Wednesday, June 11, 2014

Stellio (Color-Selecting Lamp) (Charlotte and Kendall)

Charlotte and Kendall's Color-Selecting Lamp We created a lamp that changes color based on the color of an object that the user holds up to it. It utilizes an RGB sensor to detect the color and displays this color in the RBG LED strip. We purchased an ikea ceiling lamp and modified it to fit our purposes. We laser-cut a sheet of acrylic (which we then sanded and spray-painted white) to create an inner-housing for the arduino, breadboard and LEDs. The code for our lamp is as follows: #include #include "Adafruit_TCS34725.h" // Pick analog outputs, for the UNO these three work well // use ~560 ohm resistor between Red & Blue, ~1K for green (its brighter) #define redpin 3 #define greenpin 6 #define bluepin 9 // for a common anode LED, connect the common pin to +5V // for common cathode, connect the common to ground // set to false if using a common cathode LED #define commonAnode false // our RGB -> eye-recognized gamma color byte gammatable[256]; Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_16X); void setup() { Serial.begin(9600); Serial.println("Color View Test!"); if (tcs.begin()) { Serial.println("Found sensor"); } else { Serial.println("No TCS34725 found ... check your connections"); while (1); // halt! } // use these three pins to drive an LED pinMode(redpin, OUTPUT); pinMode(greenpin, OUTPUT); pinMode(bluepin, OUTPUT); // thanks PhilB for this gamma table! // it helps convert RGB colors to what humans see for (int i=0; i<256; i++) { float x = i; x /= 255; x = pow(x, 2.5); x *= 255; if (commonAnode) { gammatable[i] = 255 - x; } else { gammatable[i] = x; } //Serial.println(gammatable[i]); } } void loop() { //this is the sensor read code uint16_t clear, red, green, blue; tcs.setInterrupt(false); // turn on LED delay(60); // takes 50ms to read tcs.getRawData(&red, &green, &blue, &clear); tcs.setInterrupt(true); // turn off LED if (clear >= 10000){ Serial.print("C:\t"); Serial.print(clear); Serial.print("\tR:\t"); Serial.print(red); Serial.print("\tG:\t"); Serial.print(green); Serial.print("\tB:\t"); Serial.print(blue); // Figure out some basic hex code for visualization uint32_t sum = clear; float r, g, b; r = red; r /= sum; g = green; g /= sum; b = blue; b /= sum; r *= 256; g *= 256; b *= 256; Serial.print("\t"); Serial.print((int)r, HEX); Serial.print((int)g, HEX); Serial.print((int)b, HEX); Serial.println(); //Serial.print((int)r ); Serial.print(" "); Serial.print((int)g);Serial.print(" "); Serial.println((int)b ); analogWrite(redpin, gammatable[(int)r]); analogWrite(greenpin, gammatable[(int)g]); analogWrite(bluepin, gammatable[(int)b]); } // close of if }

Final Video by Freistadt/Hart

Interaction overload!

Chip and I learned that in arduino projects it is very helpful if you simplify to the most essential elements that would still make most of the concept work. After getting advice from everywhere, we simplified our initial concept to only incorporate the most basic controls. A button, a light, and a valve. We then added a moisture meter to tell the LED's to blink.

Anjelica & Albert: Posh Plant Video

After initially not knowing the direction of our project, Albert and I decided to create a planter that would alert users of its water needs. When comparing our end product to our initial diagram, the concept changed very little, if at all. Essentially, the Posh Pot (named because our current version is British and snarky) detects the moisture levels in the potted plant's soil. Albert and I crafted our own moisture sensor by using spare copper wire,two nails, and some electrical tape. If the soil is acceptably damp, the planter turns on 3 blue LEDs. However, if the soil is too dry or too wet, the plant will comment on its state when someone walks by. This is detected through the motion sensor located in the front of the housing. The Arduino and wires are all housed in the base of the planter.















http://youtu.be/PK-YXzXmMmo


Jen + Emma | Prototype Life



After getting the rotation down and all of our code going, we had to figure out how to work out the screen that would cover the laptop. We were using a metal rod that was secured to the servo motor that was hard to configure in a way that would allow the entire screen to flip over. We tested out all sorts of materials, ranging from light paper towels to cardboard, but failed to make any of these work. The problem was that the rod itself would rotate inside of the loop it was fastened into, rather than rotating the material. We fixed this by bending the wire down to loop it in two holes, so it would be stable and rotate the (future) screen cover. 

Here are some photos of some very rough experiments. LOL.





Tuesday, June 10, 2014

Final Video and Documentation. Constance Wellman and Haley Knox

Coin Counter: "Bright Box"

Our final concept is a our coin counter that encourages children to set saving goals by rewarding them with a short light show each time they reach a goal of 1, 3, and 5 dollars. There are four rectangular slots at the top of the box. Each slot counts 1, 5, 10, and 25 cents to coordinate with a penny, nickel, dime and quarter. Once you reach your goal, the lights in the box will light up and the light show will get longer as the amount collected in the box increases. Once you have reached your final goal you can lift up the lid and collect your money. The video, hero shots, and code are posted below.

   
Video Link: https://vimeo.com/97896975
hero shot
insert coin
lighting up 

Code:

#include <Adafruit_NeoPixel.h>
#define PIN 6
int val1;
int val2;
int val3;
int val4;
int setPoint1 = 100;
int setPoint2 = 100;
int setPoint3 = 100;
int setPoint4 = 100;
//int A = 100;
//int B = 300;
boolean countcheck1 = false;
boolean countcheck2 = false;
boolean countcheck3 = false;
boolean countcheck4 = false;
int count = 0;
int changes = 0;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(8, 2, NEO_GRB + NEO_KHZ800);

void setup()
{
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(A3, INPUT);
  pinMode(A4, INPUT);
  pinMode(A5, INPUT);
  pinMode(A2, INPUT);
  Serial.begin(9600);
  digitalWrite(13, HIGH);
  digitalWrite(12, HIGH);
  digitalWrite(11, HIGH);
  digitalWrite(10, HIGH);
  
  strip.begin();
  strip.show();
//  stripone.begin();
//  stripone.show();
}

void loop() {
val1 = analogRead(A3);    // Read the analogue input value
//Serial.print("1ai");
//Serial.println(aiValue1);
//Serial.print("slot1count");
//Serial.println(slot1count);

if (val1 < setPoint1 && countcheck1 == false) 
{  count = count + 5;
    Serial.println("count1");
    countcheck1 = true;
  }
  
      
if (val1 > setPoint1)
{ countcheck1 = false;
}

val2 = analogRead(A4);    // Read the analogue input value
//Serial.print("2ai");
//Serial.println(aiValue2);
//Serial.print("slot2count");
//Serial.println(slot2count);

if (val2 < setPoint2 && countcheck2 == false) 
{  count = count + 10;
Serial.println("count2");
    countcheck2 = true; 
  }
  
  
if (val2 > setPoint2)
{ countcheck2 = false;
}   

val3 = analogRead(A5);    // Read the analogue input value
//Serial.print("1ai");
//Serial.println(aiValue1);
//Serial.print("slot1count");
//Serial.println(slot1count);

if (val3 < setPoint3 && countcheck3 == false) 
{  count = count + 25;
    Serial.println("count3");
    countcheck3 = true;
  }
  
if (val3 > setPoint3)
{ countcheck3 = false;
}   

val4 = analogRead(A2);    // Read the analogue input value  

if (val4 < setPoint4 && countcheck4 == false) 
{  count = count + 1;
    Serial.println("count4");
    countcheck4 = true;
  }
  
      
if (val4 > setPoint4)
{ countcheck4 = false;
}

if (count > 100)
{ strip.begin();
  strip.show();
  if (changes == 0) {
   colorWipe(strip.Color(255, 0, 0), 50); // Red
  colorWipe(strip.Color(0, 255, 0), 50); // Green
  colorWipe(strip.Color(0, 0, 255), 50); // Blue 
  colorWipe(strip.Color(0, 0, 0), 50); // Nothing  
  strip.show();  
  changes = 1;
  }
}


if (count > 300)
{ strip.begin();
  strip.show();
  if (changes == 1) {
  colorWipe(strip.Color(255, 0, 0), 50); // Red
  colorWipe(strip.Color(0, 255, 0), 50); // Green
  colorWipe(strip.Color(0, 0, 255), 50); // Blue 
  colorWipe(strip.Color(255, 0, 0), 50); // Red
  colorWipe(strip.Color(0, 255, 0), 50); // Green
  colorWipe(strip.Color(0, 0, 255), 50); // Blue 
  colorWipe(strip.Color(0, 0, 0), 0); // Nothing  

  strip.show();
  changes = 2;
  }
}

if (count > 500)
{ strip.begin();
  strip.show();
  if (changes == 2) {
  colorWipe(strip.Color(255, 0, 0), 50); // Red
  colorWipe(strip.Color(0, 255, 0), 50); // Green
  colorWipe(strip.Color(0, 0, 255), 50); // Blue 
  colorWipe(strip.Color(255, 0, 0), 50); // Red
  colorWipe(strip.Color(0, 255, 0), 50); // Green
  colorWipe(strip.Color(0, 0, 255), 50); // Blue 
  colorWipe(strip.Color(255, 0, 0), 50); // Red
  colorWipe(strip.Color(0, 255, 0), 50); // Green
  colorWipe(strip.Color(0, 0, 255), 50); // Blue 
  colorWipe(strip.Color(255, 0, 0), 50); // Red
  colorWipe(strip.Color(0, 255, 0), 50); // Green
  colorWipe(strip.Color(0, 0, 255), 50); // Blue 
  colorWipe(strip.Color(0, 0, 0), 0); // Nothing  
  strip.show();
  changes = 3;
  }
}

}

void colorWipe(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, c);
      strip.show();
      delay(wait);
  }

}