Monday, December 21, 2009

DOET Chapter 2

DOET Chapter 2

While reading this chapter there was one quote by Norman that really stuck out to me and summed up the chapter very well: “If an error is possible, someone will make it (Norman, 36).” Discussing how designers have to plan for errors and how people mentally react to problems with a device, Norman uses example to illustrate scenarios that have previously caused or showcased problems.

One of the most common occurrences when there is an error with a “simple” device is self-blame. Even if there is poor design, if the object is easy to use people feel that it is somehow their fault that the item was having problems. On the flipside, there are times in which a device is blamed for poor design and/or functionality when it is actually the fault of the user.

Mental models are theories that people use to explain something that they saw. While these may not always be correct or logical, they are still important in seeing how someone will respond to a new device that they are unfamiliar with. Continuing with this idea, naïve physics, is similar to the process in which people use naïve (often wrong) models to describe how something works.

Learned helplessness is a serious issue that is causing a resistance to the acceptance of new technologies. Essentially, some users who have a high fail rate with a particular device feels that they are not able to perform the said task and refuse to continue using it. Taught helplessness, however, if the idea that people who suffer from learned helplessness will apply this notion to all technologies.

In order to perform a task, Norman says that there are two major steps: execution and evaluation. However to execute an action, one must first have intent and a goal. Once the action is executed it is then evaluated by the user to ensure that the proper result was procured, or to see if there were any errors in the process.

Norman continues to say that there are seven subsections of actions: forming the goal, forming the intention, specifying an action, executing the action, perceiving the state of the world, interpreting the state of the world, and evaluating the outcome. These seven component allow us to create an approximate model of the action.

Gulfs, as described by Norman, are distinctions between mental states and physical states. This is also applied to distinguish between mental intentions and interpretations. While we may have an idea of what we want the device to do, we are not always accurate at judging the outcomes.

What I got out of this chapter was a sense for how important error finding is, as it can effect the reception of a device as well as effect the reception of an entire line of products. As we often place blame on ourselves, it is difficult for designers to find all of the flaws because people assume it was a human error, even if the design was poor.

DOET Chapter 1

DOET Chapter 1

In the first chapter, Norman introduces us to the idea of design, its practicality, and its place in a consumer-driven society. Using examples such as refrigerators, telephones, and other commonly used devices, he began to lay the framework down on the important functions that design plays in our everyday lives.

Visibility is a key aspect when it comes to designing an object. If a user can see how the object functions or there are visible cues, the user is more likely to succeed in properly using it. While visibility can aid in an objects ease of use, having too many visible features can be distracting.

Natural signs, a subsection of visibility, is the use of natural order or tendencies when creating an object that people should instinctually be able to use.

Mapping, the layout of a particular design, is crucial in not only the ease of use of an item, but also its aesthetics. While a design should be simple and well suited to the item, if the device is physically unappealing it will most likely not sell as well.

Affordance is the quality and type of item that is used for a particular object. The differences can be from materials to the type of metal or glass used.

Constraints are limiting features that are used by devices to filter out how or who can use a set device.

A conceptual model is a visual diagram showing how a device functions and how it will be constructed. Having a good conceptual model is crucial when creating an object.

Feedback, the ability to get responses on an object, is also an important component in design. With the proper feedback, the designers can find flaws that they would not normally notice in laboratory tests. This allows for the consumers to communicate directly to the designers and any problems can be dealt with.

The paradox of technology is basically the idea that while newer digital technologies may be a step up from previous analog construction, too much technology can be overwhelming and have a reverse effect.

What I got out of this chapter was a newfound appreciation for all of the items around me. As he mentioned in his writing, there are roughly 20,000 items that we are able to identify and most likely use. Each one of those devices had a creator, and most devices are evolutions from previous models. While it may be easy to get frustrated at poor designs, we should be grateful that we have so many great ones.

Mapping

I was going through all of my materials for the course and came across the mapping assignment that I had never posted. Originally I was going to be making a looping animation of the map but it ended up taking too long so I just used a map that I created of the space and I drew out the paths of all of the customers and the staff at Einstein's Bagels.

Simple Overview

This image is a quick overview of the major technological components and how they interact. For more detailed images as well as video, please check out my previous posts!

Attention Whore Concept

Attention Whore Concept

For this assignment I wanted to create a piece of wearable technology that reflects present youth culture and the obsession of drawing attention to one's self. While the tactics used to call attention have changed over many generations, using sex or visual sexual stimulation have remained a constant. While it has always been a part of our culture, it seems that flaunting one's sexuality, as well as one's body, has become a wide-spread fashion trend.

I recently visited a club and took the chance to watch people and look at what they were wearing. Most everyone in the club was at the least well groomed (or it seems that they at least started that way), and I would say that over half were wearing clothes that were revealing or sexually inspired.

Witnessing a growth of these trends throughout such a small period of time made me wonder what the next step in fashion would be for our sex-hungry generation. While our generation may be obsessed with sex and fame, our generation is also obsessed with new technologies.

Our generation, commonly referred to as the Me Generation, is filled with hungry consumers with a strong desire to have every aspect of their lives personalized to reflect their individual style. Whether our style is reflected through the clothes we wear or the songs that we have on our iPods, we are making a statement about who we are in relation to those around us.

Using the trends of our generation, I wanted to create a piece of wearable technology that not only was personalized to the wearer, but a garment that reflected our overwhelming desire for attention. In a time where each successive piece of clothing further stretches the boundaries of acceptability, I wanted to continue on with this trend and take it to the extreme.

Creating an evening dress that was covered in two layers of organza (a shiny semi-transparent material), I installed LED displays on the breasts that act as a music visualizer. Each display (which was made to reference a nipple) consisted of eight blue LEDs arranged in a circle with their lights shining towards a center point.

The two layers of organza were used as a diffuser for the light that gets emitted, creating a soft display that moves and flows with the garment. I chose the color blue because it is a color that I commonly associate with youth. I specifically stayed away from red as I felt that the lights on the chest would be more than sufficient attention grabbers and that using a color such as red would be more of a distraction than an enhancement.

Conductive threading was used to connect the LEDs to the Arduino, which were all able to be hooked up to the same PWM (Pulse Width Modulation) slot. The setup also includes a headphone splitter wherein one of the jacks is used for a wire that inputs the electrical signal from the music device into the Arduino.

While the current design only allows with audio from a computer, the goal is to get the system to work with a MP3 player or any other portable music device.

The dress is designed to allow the wearer to listen to their favorite music and have their breasts display their individual music style.

The organza as well the dress design allow for maximum fabric movability; because of this, the light display not only mimics the music that is being played, but it also moves in time with the wearer's movement.

The name "Attention Whore" was chosen as the title of the piece after its completion and while acting as a pun, I chose it because I felt that it summed up the essence of my work.

I plan on continuing working with wearable technology in the future, but other than attempting to make this piece work with a portable music device, I will not be making further changes to the piece. While an advantage of using technology is its ability to be easily updated, I feel that changing any other components would be changing the dress itself. Instead I plan on taking my other ideas and iterations of this dress to create new pieces.

Doet 5

The six different types of slips are

Capture errors (something more frequently done dominates) - typing a common word instead of a rarely typed one.
Description Errors (when your mind generalizes too much) - today
Data driven (when one type of data overwrites another)- Typing dialogue from a movie into something i am typing
Associative Activation Errors (doing something based on similar triggers) - In the morning when my alarm goes off, I normally snooze the first one. However, I believe I sometimes will snooze every alarm if I am not awake enough to realize the situation.
Loss of Activation Errors (forgetting mission)- I often end up wanting to google something on my computer and I end up forgetting to do it and then I am on youtube.
Mode Errors (too many fuctions) - today I put in a dvd that had two sides. I tried to put the correct side in, but I accidentally flipped it around when putting it on a tray.

Flowchart
observe the piece and cutout of hand > realize that ones hand is meant to be placed there > Place hand there and have sensor read skin > read result >get stamped by performer > think about result
There are potentials for error when a person has to touch their arm to the sensors, it doesn't look friendly to touch or heavy duty enough.

Memorize/retrieve info recently I have had to do a lot of studying for art history exams. These are unique tests in which you have to memorize both an image and information about it in order to do well. In order to remember this information, I have to do a flash card method without shuffling. I also will verbally announce the information in order to hear the info too. In order to remember one card, I have to relate it to other cards around it. A structure of 120 card existing in my head each with artist, title, and date has to be arranged in a nice grid.

The Connectionist approach is an interesting theory that memories are generalized over time and averaged, while unique events are separated out. Its like when I look back on high school classes there is a stereotypical classroom with desks, and sometimes individual ones with familiar faces, but I can rarely remember specific days unless something really unique happened.

stuctures - from my understanding, a wide structure has many decisions to be made before the next is reached. A narrow structure has few choices or may only have a single yes or no answer that needs to be given. A shallow structure has very few steps or following instructions to it. A restaurant menu has many different meals, but once one is chosen, the meal is served. A deep structure means that a menu might ask what meat you want, and what noodles you want with it, and other things you might want to add. Our group project has a narrow and somewhat deep approach. People have to decide if they want to approach the object and then if they want to put their arm up to it. Its all a linear arrangement of yes no questions.

A person must perform few actions when viewing our piece simultaneously. they have to comfortably hold their hand up to a sensor while waiting for feedback from a light saying when the reading is complete. They have to trust the piece will not harm them and that it is working.

Set 5


Inside Pocket of dress that houses the Arduino unit. If I can manage to figure out a way to use the device with a battery, there is enough room to enclose the power source as well.



This is a map that I made to show how my LED array works. Each breast contains 8 LEDs which are all oriented on a circle with their light shining towards the center. The Positive and Negative marks show how the conductive thread was run in order to prevent short-circuits.



This is a view of my computer hooked up to the Arduino. For this iteration the computer was playing the music as well as powering the microcontroller.




This is a top-down view of the Arduino, labeled to show how the project was wired to the board.




This image shows how the conductive threading is hooked up to the microcontroller.

Doet 4

Since my final project (adshades) is still being worked on, I will apply the questions of Doet 4 to it.

Constraints of project - The core piece of my project, the glasses with webcam, have a lot of constraints. A lot of people do not know what video glasses are and normally have to be told how to use them. The main cultural constraints of the object being designed like glasses normally gives people the hint that these are worn like glasses. Two screens spaced apart the same distance as eyes give physical clues at how to interact with the device. Currently having to use a computer in a backpack makes the piece much more compicated. If a user purchased my piece, they would have to be able to run the program and wear the computer. I don't know how to fix those issues at this time.

Experiments - I am not able to do the experiments but I could imagine that none of them would turn out well. I have had a few "how about this weather" conversations in elevators and it is just an awkward place to be in. I feel like people would just think i am crazy in an elevator. I also think people would be offended if I gave them money for no reason.

Doors - I can comment on some of the doors around FAC. I find that a lot of the visual clues are correct for the doors, but sometimes they don't function very well. For example the door to the west stairwell in FAC always sticks when you push it, and it always makes people run their bodies into the door accidentally. the strangest doors are in the library. I always have awkward moments when I leave the library and have to deal with a swinging aluminum arm and a door that pushes outward. Once I smacked a girl with the aluminum arm while trying to hold the outer door for her, and I just felt weird.

Visual Cues - I would love for my piece in the future to have a simple, one button interface. My piece could have a simple on/off button for people to interact with it. However the piece has a laptop and a pair of glasses that both have their own battery and interface issues. I am looking into smaller wearable computers that could run the piece in a smaller and easier to use package.

Circuits - so far my experience with circuit diagrams has made me think that they are pretty confusing. As a visual person, I tend to understand how the circuit works better from a picture than from a diagram. Normally the diagram ignores the use of a breadboard or any kind of 3d space. It gets confusing when no lines are allowed to cross or when a simple ground line is made to look way to complex. Normally I sketch out my circuits as how they would appear on a breadboard.

Sound - one situation that is helped from the sound of a device is when a computer is just starting up. With modern technologies, some people have been able to make silent computers. The only problem with this is that you don't if it is actually starting to run or if some cables are unplugged. Another device that is helped by sound is my gas stove. The only way to sense how much gas is coming out is by the sound of it. Otherwise it can't be seen or smelled. I would like to incorporate the recording of sound into my project so when I show the recordings of my piece, people will get a better experience of the environment i was in.

Surplus Walk

I never had a chance to report back on my surplus finding so here it goes.

The first object I looked at was the Life Sytems Corp. LifeSustainer 1000. I thought it would be interesting to look up medical device. The LifeSustainer™ 1000 is a fully automated dual organ perfusion workstation. It represents the next generation in isolated organ perfusion technology.
Basically the machine allows a researcher to deliver nutrients to an animal organ an to study it working. There is an entire computer built inside the unit and i can only imagine the cool sensors in it.

The second object I observed was a spectrofluorophotometer rf-5000. From what I could find this machine uses lights and very sensitive optical scanners to detect all of the different compounds in a sample substance so people can study pharmaceuticals and the environment.

The final machine i looked at was the Waters 484 tunable assorbance detector. It offers versatility in electrochemical detection and in chemical detection. I guess it uses a spinning centrifuge and specific substrates to detect chemicals that pass through materials. Its a little beyond what I know about chemicals.

I guess I ended up looking at a lot of medical devices. They all have interesting technology in them and it would be cool to see what they did in a lab.

Sunday, December 20, 2009

Critique of project 1

I was really happy with the results of our first project. It was a well finished piece for being so early in our learning about electronics. I feel what was really exiting was the creation of our own and possible better color sensor for reading skin then from some of the more commercial products. The sensor itself is only different color led's paired with photo sensors. It works really well, or as well as it is supposed to when trying to figure out the race of the viewer. I also thought the craft of the piece was great and found the Plexiglas to have a strange inviting yet very sterile feel to it. I like how the projects comments on technology that is used to discriminate. There are machines in airports and such that use random numbers and various scanning technologies to try to differentiate one person from others. This project tries to make people think about a machine that uses race to label people, as well as how useless of a fact that is. Trying to guess someones race by their skin color is a very inaccurate process.

I think the project could have been stronger if there was some different way that the machine could invite people in and give them their race results. I feel something interesting could be done with a screen to make it look more like a future security device. I also feel that the stamps could have been a little better crafted. There could also seems to be something that might be able to link together the scanning of the skin, and the performance of the stamping better.

Set 4

Here are the buttons on the collar. I had to reinforce the buttons because they end supperting the weight of the entire dress.


Here is another image of the collar with buttons .


This is a look at the LED display from the inside of the dress that shows off the circuitry.


Another inside shot of the nipple display. Some of the wires look like they are touching in the image, but this is because the dress is not being worn. When the area is stretched by someone wearing it, the wires are not nearly as close.


This image is also of the LED displays except that they are being viewed from the proper side.

Wednesday, December 16, 2009

Glove Code for anyone interested

#include // (no semicolon)
//// VARS
byte CLK_pin = 8;
byte EN_pin = 9;
byte DIO_pin = 10;
byte LED = 13;

int ZeroOffset = 0; // To calibrate the compass, run in uncalibrated mode [Section 1],
// point the sensor due North, and record the value sensed.
// Enter that value here and then run in calibrated mode [Section 2]
int X_Data = 0;
int Y_Data = 0;
int angle, status;
float Delta, xPrime, yPrime;

int ledN = 2;
int ledNE = 3;
int ledE = 4;
int ledSE = 5;
int ledS = 6;
int ledSW = 7;
int ledW = 11;
int ledNW = 12;
int buttonState = 0;
int buttonPin = 13;
int COValue = 0;
int MethaneValue = 0;
int buttonPushCounter = 0; // counter for the number of button presses

int lastButtonState = 0;


//// FUNCTIONS
void selectLineOne(){ //puts the cursor at line 0 char 0.
Serial.print(0xFE, BYTE); //command flag
Serial.print(128, BYTE); //position
}
void selectLineTwo(){ //puts the cursor at line 0 char 0.
Serial.print(0xFE, BYTE); //command flag
Serial.print(192, BYTE); //position
}
void goTo(int position) { //position = line 1: 0-15, line 2: 16-31, 31+ defaults back to 0
if (position<16){
Serial.print(0xFE, BYTE); //command flag
Serial.print((position+128), BYTE); //position
}
else if (position<32){
Serial.print(0xFE, BYTE); //command flag
Serial.print((position+48+128), BYTE); //position
}
else {
goTo(0);
}
}

void clearLCD(){
Serial.print(0xFE, BYTE); //command flag
Serial.print(0x01, BYTE); //clear command.
}
void backlightOn(){ //turns on the backlight
Serial.print(0x7C, BYTE); //command flag for backlight stuff
Serial.print(157, BYTE); //light level.
}
void backlightOff(){ //turns off the backlight
Serial.print(0x7C, BYTE); //command flag for backlight stuff
Serial.print(128, BYTE); //light level for off.
}
void serCommand(){ //a general function to call the command flag for issuing all other commands
Serial.print(0xFE, BYTE);
}

void ShiftOut(int Value, int BitsCount) {
for(int i = BitsCount; i >= 0; i--) {
digitalWrite(CLK_pin, LOW);
if ((Value & 1 << i) == ( 1 << i)) {
digitalWrite(DIO_pin, HIGH);
//Serial.print("1");
}
else {
digitalWrite(DIO_pin, LOW);
//Serial.print("0");
}
digitalWrite(CLK_pin, HIGH);
delayMicroseconds(1);
}
}

int ShiftIn(int BitsCount) {
int ShiftIn_result;
ShiftIn_result = 0;
pinMode(DIO_pin, INPUT);
for(int i = BitsCount; i >= 0; i--) {
digitalWrite(CLK_pin, HIGH);
delayMicroseconds(1);
if (digitalRead(DIO_pin) == HIGH) {
ShiftIn_result = (ShiftIn_result << 1) + 1;
//Serial.print("x");
}
else {
ShiftIn_result = (ShiftIn_result << 1) + 0;
//Serial.print("_");
}
digitalWrite(CLK_pin, LOW);
delayMicroseconds(1);
}
//Serial.print(":");

// below is difficult to understand:
// if bit 11 is Set the value is negative
// the representation of negative values you
// have to add B11111000 in the upper Byte of
// the integer.
// see: http://en.wikipedia.org/wiki/Two%27s_complement
if ((ShiftIn_result & 1 << 11) == 1 << 11) {
ShiftIn_result = (B11111000 << 8) | ShiftIn_result;
}


return ShiftIn_result;
}

void HM55B_Reset() {
pinMode(DIO_pin, OUTPUT);
digitalWrite(EN_pin, LOW);
ShiftOut(B0000, 3);
digitalWrite(EN_pin, HIGH);
}

void HM55B_StartMeasurementCommand() {
pinMode(DIO_pin, OUTPUT);
digitalWrite(EN_pin, LOW);
ShiftOut(B1000, 3);
digitalWrite(EN_pin, HIGH);
}

int HM55B_ReadCommand() {
int result = 0;
pinMode(DIO_pin, OUTPUT);
digitalWrite(EN_pin, LOW);
ShiftOut(B1100, 3);
result = ShiftIn(3);
return result;
}


void setup() {
Serial.begin(9600);
backlightOn();
pinMode(EN_pin, OUTPUT);
pinMode(CLK_pin, OUTPUT);
pinMode(DIO_pin, INPUT);
HM55B_Reset();
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(buttonPin, INPUT);
}

void loop() {
HM55B_StartMeasurementCommand(); // necessary!!
delay(40); // the data is 40ms later ready
status = HM55B_ReadCommand(); // read data
X_Data = ShiftIn(11); // Field strength in X
Y_Data = ShiftIn(11); // and Y direction
digitalWrite(EN_pin, HIGH); // Deselect chip

// [Section 1: Simple Angle calculation]
// To determine the angle using the raw sensor data, we can simply calculate
// the Inverse Tangent of Y_Data/X_Data. Uncomment the following line and comment
// all of [Section 2]

// angle = (180 * (atan2(-1 * Y_Data , X_Data) / M_PI)); // angle is atan( -y/x) !!!

// [End Section 1]


// [Section 2: Offset-Compensated Angle Calculation]
// To better match the compass readings with well known values of true north,
// you can use the following calculations to rotate the value of the tangent
// before determining the angle. To do this, we first need to run the program
// with the code in [Section 1] uncommented and note the angle value when we
// point the sensor to true north. Enter the value recorded at the top of
// this program in the variable "ZeroOffset", comment the code in [Section 1],
// and uncomment the code below.

Delta = (ZeroOffset/180.0)*M_PI; // Calculate radians from degrees
xPrime = X_Data*cos(Delta) - Y_Data*sin(Delta); // Translate the X_Data value based on
// rotating the original angle by "Delta" rads.
yPrime = Y_Data*cos(Delta) + X_Data*sin(Delta); // Translate the Y_Data value based on
// rotating the original angle by "Delta" rads.
angle = (180 * (atan2(-1 * yPrime , xPrime) / M_PI)); // angle is still atan(-y/x)

// [End Section 2]

if (abs(angle) < 10) {
digitalWrite (LED, HIGH);
}
else {
digitalWrite (LED, LOW);
}

if(angle > -22.5 && angle < 22.5){
digitalWrite(ledN, HIGH);
digitalWrite(ledNE, LOW);
digitalWrite(ledE, LOW);
digitalWrite(ledSE, LOW);
digitalWrite(ledS, LOW);
digitalWrite(ledSW, LOW);
digitalWrite(ledW, LOW);
digitalWrite(ledNW, LOW);

//selectLineTwo();
//Serial.println('angle');
}
else if(angle > 22.5 && angle < 67.5){
digitalWrite(ledNE, HIGH);
digitalWrite(ledN, LOW);
digitalWrite(ledE, LOW);
digitalWrite(ledSE, LOW);
digitalWrite(ledS, LOW);
digitalWrite(ledSW, LOW);
digitalWrite(ledW, LOW);
digitalWrite(ledNW, LOW);
//selectLineTwo();
//Serial.println('angle');
}
else if(angle > 67.5 && angle< 112.5){
digitalWrite(ledE, HIGH);
digitalWrite(ledNE, LOW);
digitalWrite(ledN, LOW);
digitalWrite(ledSE, LOW);
digitalWrite(ledS, LOW);
digitalWrite(ledSW, LOW);
digitalWrite(ledW, LOW);
digitalWrite(ledNW, LOW);
//selectLineTwo();
//Serial.println('angle');
}
else if(angle > 112.5 && angle < 157.5){
digitalWrite(ledSE, HIGH);
digitalWrite(ledNE, LOW);
digitalWrite(ledE, LOW);
digitalWrite(ledN, LOW);
digitalWrite(ledS, LOW);
digitalWrite(ledSW, LOW);
digitalWrite(ledW, LOW);
digitalWrite(ledNW, LOW);
//selectLineTwo();
//Serial.println('angle');
}
else if(angle > 157.5 || angle < -157.5){
digitalWrite(ledS, HIGH);
digitalWrite(ledNE, LOW);
digitalWrite(ledE, LOW);
digitalWrite(ledSE, LOW);
digitalWrite(ledN, LOW);
digitalWrite(ledSW, LOW);
digitalWrite(ledW, LOW);
digitalWrite(ledNW, LOW);
//selectLineTwo();
//Serial.println('angle');
}
else if(angle < -22.5 && angle > -67.5){
digitalWrite(ledNW, HIGH);
digitalWrite(ledNE, LOW);
digitalWrite(ledE, LOW);
digitalWrite(ledSE, LOW);
digitalWrite(ledS, LOW);
digitalWrite(ledSW, LOW);
digitalWrite(ledW, LOW);
digitalWrite(ledN, LOW);
//selectLineTwo();
//Serial.println('angle');
}
else if(angle < -67.5 && angle > -112.5){
digitalWrite(ledW, HIGH);
digitalWrite(ledNE, LOW);
digitalWrite(ledE, LOW);
digitalWrite(ledSE, LOW);
digitalWrite(ledS, LOW);
digitalWrite(ledSW, LOW);
digitalWrite(ledN, LOW);
digitalWrite(ledNW, LOW);
//selectLineTwo();
// Serial.println('angle');
}
else if(angle < -112.5 && angle > -157.5){
digitalWrite(ledSW, HIGH);
digitalWrite(ledNE, LOW);
digitalWrite(ledE, LOW);
digitalWrite(ledSE, LOW);
digitalWrite(ledS, LOW);
digitalWrite(ledN, LOW);
digitalWrite(ledW, LOW);
digitalWrite(ledNW, LOW);
//selectLineTwo();
//Serial.println('angle');
}

buttonState = digitalRead(buttonPin);
COValue = analogRead(0);
MethaneValue = analogRead(1);

if (buttonState != lastButtonState) {
if (buttonState == HIGH) {
// if the current state is HIGH then the button
// wend from off to on:
buttonPushCounter++;
clearLCD();
}
lastButtonState = buttonState;
}
if(buttonPushCounter == 0){

selectLineOne();
delay(100);
Serial.print("Welcome...");
selectLineTwo();
delay(100);
Serial.print("Fool.");
delay(100);
}

else if(buttonPushCounter == 1){

selectLineOne();
delay(100);
Serial.print("Methane = ");
delay(100);
Serial.print(MethaneValue);
delay(100);
}
else if(buttonPushCounter == 2){

selectLineOne();
delay(100);
Serial.print("CO = ");
delay(100);
Serial.print(COValue);
delay(100);
}
if(buttonPushCounter >= 3){
buttonPushCounter = 0;
}




}


Tuesday, December 15, 2009

early installation site ideas

Early in the project developed I was considering a few installation sites that had a certain criteria, public thoroughfare without natural lighting and maintained a constant artificial lighting. These found images are a few areas I had in mind.




Websites that helped my Final Project's early development

My early ideas involved working video. Before I determined I wouldn't be able to solve my video problems and decided to instead use image stills these were the website that interested me the most:

http://webcamxtra.sourceforge.net/


http://www.danreetz.com/research/?p=66


http://mac.wareseeker.com/Multimedia-Design/video-trigger-2009-01-10.zip/e5de8cb86



Early-Mid Progress Code Comparison

My first naïve and failed processing Code compared to the final Processing Code



Old Code



new code
http://digitalmedia.arts.ufl.edu/~lemieux/wiki/F09_Animation/Students/code

Early-Mid Progress Documentation

Considering my final project had minimal physical set my early and mid progress work on the project exists as simply lines and lines of failed Processing and Arduino code, which is completely uninteresting. Conceptually the project predominately functions through unseen code. Very early, the set-up for the project was established as simply a video monitor and podium with a discreet project box used to house the sensor. Again, early development and trouble shooting for the project was simply manipulating found code without much success, a very boring and uninformative body of documentation. The best documentation for this portion of project development I can imagine would be the flow chart I made as an aid for writing the code. As I was trying to teach myself basic coding principles I came across a reading that suggested drawing the processes that one wanted to build. The flow chart below is the diagram I made for the project's earliest form, which used video and processes much more complex then my final work.


Warehouse Surplus Visit



gas chromatography-a type of chromatography used in analytic chemistry for separating and analyzing compounds that can be vaporized without decomposition.





HP 1050 Series Variable Wavelength Device-tapered-stripe semiconductor laser amplifier amplifies the returned portion of the light to emit the amplified light from a front-end surface of the tapered-stripe semiconductor laser amplifier???




Laser Diode/TEC Controller-designed for simultaneous control of both laser current and temperature in a single mainframe for R&D or production test of optical amplifiers.

Afterthoughts

Piezo Code:

int speakerPin = 9;

int length = 12; // the number of notes
char notes[] = "efgaaaabCagf "; // a space represents a rest
int beats[] = { 1, 1, 1, 4, 4, 4, 1, 1, 1, 4, 4, 4, 1, 1, 1, 4, 4,
4, 2, 4, 5, 1, 3};
int tempo = 150;

void playTone(int tone, int duration) {
for (long i = 0; i < duration * 1000L; i += tone * 2) {
digitalWrite(speakerPin, HIGH);
delayMicroseconds(tone);
digitalWrite(speakerPin, LOW);
delayMicroseconds(tone);
}
}

void playNote(char note, int duration) {
char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' };
int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956
};

// play the tone corresponding to the note name
for (int i = 0; i < 8; i++) {
if (names[i] == note) {
playTone(tones[i], duration);
}
}
}

void setup() {
pinMode(speakerPin, OUTPUT);
}

void loop() {
for (int i = 0; i < length; i++) {
if (notes[i] == ' ') {
delay(beats[i] * tempo); // rest
} else {
playNote(notes[i], beats[i] * tempo);
}

// pause between notes
delay(tempo / 2);
}
}

In case anyone wasn't certain, these tones represent the hymn "Lift Ev'ry Voice And Sing".

Basically, the thing is an Arduino Board with a miniature circuitboard on top. I soldered a piezo speaker (connected to pin 9) and a tilt sensor to the board. The way the tilt sensor works is like this: it's basically a little metal ball in a plastic(?) cube. Depending on which end of the cube the ball is in, it completes one of two circuits. I didn't connect anything to the other curcuit so when the ball isn't on the side that activates the speaker it's just 'off'. The arduino board is connected to a 9 volt battery so it doesn't need a cumbersome laptop setup to operate. I attached the whole thing to the inside of my hat and... well, voila. When I lean forward it plays music.




Uhm... sorry about my camera quality, but I think you get the idea.

Thanks to Mike for lending me the circuitboard, to Allyse for getting me/explaining how to use the battery connection device, Sarah S. for random code/building assistance, and Adam for recording video footage.

Monday, December 14, 2009

Final Project Final Documentation

I put a lot of love into constructing this piece, so I am glad that my hard work payed off in such a nice way. The final piece was built from a large wooden box that had been sitting in my studio space since the beginning of the year, and a construction of inner walls about an inch away from the wooden ones.








I knew I wanted there to be a soft feel, so I chose pale pinks and blue felt to dress up this otherwise hard looking structure. I was hoping for there to be a sort of juxtaposition between the harsh pulling of the motors and the soft structure it was in.
The strange protrusions at the sides of the box were my way of hiding the buttons/switches. At first I was desperately trying to figure out a way to make them invisible, so that the action of pressing them was unintentional, but since that was unavoidable (and the idea of intentionally pressing something was intriguing to me) I decided to play it up as much as possible. What would get someone's attention/what would make someone want to press these strange blue protrusions? I decided to draw from my audience and make them look like buttons that we normally press - circular buttons with a flashy colored interior. Like the "big red button" that we're never supposed to press in popular fiction, the pink dot in the center references that while keeping with my theme.

On the inside, it appears to be something like a child's playpen, or a strange child's asylum. There are sewn dolls scattered carefully along the walls, but hanging by four threads in the center is this strangely small voodoo-like baby doll. As the buttons are pressed, the strings tug on the doll in the direction of the button, like a puppet. All buttons can be pressed at the same time, precariously pulling the baby in all directions. Will it rip? Will it fall apart? I found it interesting that during critique, people would try to see what would happen, sad that it did not fall apart.


Sadly I do not have video at this time, but the sounds of the motors would have been something great to hear! Also, this piece is hopefully going to be reworked, with cleaner craft so that it is more seamless.
Here is the code to the motors - nothing complicated:
#include



SoftwareServo myservo1; // create servo object to control a servo
SoftwareServo myservo2;
SoftwareServo myservo3; // create servo object to control a servo
SoftwareServo myservo4;

int potpin1 = 0; // analog pin used to connect the potentiometer
int val1; // variable to read the value from the analog pin
int potpin2 = 1;
int val2;
int potpin3 = 2;
int val3;
int potpin4 = 3;
int val4;

void setup()
{
myservo1.attach(9); // attaches the servo on pin 2 to the servo object
myservo2.attach(10);
myservo3.attach(12);
myservo4.attach(13);
}

void loop()
{
val1 = analogRead(potpin1); // reads the value of the potentiometer (value between 0 and 1023)
val1 = map(val1, 0, 1023, 0, 179); // scale it to use it with the servo (value between 0 and 180)
myservo1.write(val1); // sets the servo position according to the scaled value
delay(15); // waits for the servo to get there

val2 = analogRead(potpin2);
val2 = map(val2, 0, 1023, 0, 179);
myservo2.write(val2);
delay(15);

val3 = analogRead(potpin3);
val3 = map(val3, 0, 1023, 0, 179);
myservo3.write(val3);
delay(15);

val4 = analogRead(potpin4);
val4 = map(val4, 0, 1023, 0, 179);
myservo4.write(val4);
delay(15);


SoftwareServo::refresh();

}

Final project documentation






The first picture is the working prototype where the waveshield detected the pressure against the force sensor. It still glitched in this form, because it would detect the sensor once and then stop reading the program entirely. I thought the problem was the SD card and the fact that the wires weren't soldered.

The second picture is the prototype right before I moved the wires to solder it to the circuit board. I was recording where the wires were in order to make sure I got everything in the right place. When I soldered it however, it refused to recognize the force sensor. I have no idea why.

The last picture is the final result of my revised project. It was in a cushion which was connected to my laptop so it could read the program. As I mentioned before, I couldn't make it work with the 9v batteries.

Here's the code I used:

#include
#include
#include "util.h"
#include "wave.h"

AF_Wave card;
File f;
Wavefile wave; // only one!

#define playcomplete(x) ROM_playcomplete(PSTR(x)) // save RAM by using program memory strings

#define servo 7
#define redled 9
#define eyeleds 18
#define mouthleds 17
#define midmouthleds 16
#define outermouthleds 19

void setup() {
Serial.begin(9600); // set up Serial library at 9600 bps
Serial.println("Wave test!");

pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(redled, OUTPUT);
pinMode(servo, OUTPUT);
pinMode(eyeleds, OUTPUT);
pinMode(outermouthleds, OUTPUT);
pinMode(midmouthleds, OUTPUT);
pinMode(mouthleds, OUTPUT);

randomSeed(analogRead(0));


if (!card.init_card()) {
putstring_nl("Card init. failed!"); return;
}
if (!card.open_partition()) {
putstring_nl("No partition!"); return;
}
if (!card.open_filesys()) {
putstring_nl("Couldn't open filesys"); return;
}

if (!card.open_rootdir()) {
putstring_nl("Couldn't open dir"); return;
}

putstring_nl("Files found:");
ls();
}

void ls() {
char name[13];
int ret;

card.reset_dir();
putstring_nl("Files found:");
while (1) {
ret = card.get_next_name_in_dir(name);

if (!ret) {
card.reset_dir();
return;
}
Serial.println(name);
}
}


void pulseServo(uint8_t servopin, uint16_t p) {

digitalWrite(servopin, HIGH);
delayMicroseconds(600);
while (p--) {
delayMicroseconds(4);
}
digitalWrite(servopin, LOW);
delay(18);
}

uint8_t pumpkinstate = 0;

void loop() {
int distsensor, i;
long time;
/*
for (i=0; i<50; i++) {
pulseServo(servo,0);
}
for (i=0; i<50; i++) {
pulseServo(servo,400);
}
return;
*/
distsensor = 0;
for (i=0; i<8; i++) {
distsensor += analogRead(0);
delay(50);
}
distsensor /= 4;

putstring("Sensor = "); Serial.println(distsensor);


if (distsensor > 30 && distsensor <=450) {
playcomplete("5.WAV");
// } else if(distsensor > 150 && distsensor <=250)
// {
// playcomplete("RUBBER1.WAV");
// }else if(distsensor > 250&& distsensor <= 400){
// playcomplete("POP.WAV");

}else {
Serial.println("no signal");
}}





void ROM_playcomplete(const char *romname) {
char name[13], i;
uint8_t volume;
int v2;

for (i=0; i<13; i++) {
name[i] = pgm_read_byte(&romname[i]);
}
name[12] = 0;
Serial.println(name);
playfile(name);
Serial.println("test");
while (wave.isplaying) {

delay(5);
}

card.close_file(f);
}

void playfile(char *name) {
f = card.open_file(name);
if (!f) {
putstring_nl(" Couldn't open file"); return;
}
if (!wave.create(f)) {
putstring_nl(" Not a valid WAV"); return;
}
// ok time to play!
wave.play();
}

Lilpad Piezo code

int PadPin1 = 1;
int PadPin2 = 2;
int PadPin3 = 3;
int PadPin4 = 4; // these are analog pins for input
int speakerPin = 6; // set the speaker pin on digital pin 6
int padLimit = 50; // the limit/ threshold at which to activate the logic
int howHard = 50; // variable to store how hard the sensor is hit, the lower the value the harder the hit
int Cnote = 1915; // set the pulse on/off time for each note.
int Dnote = 1700;
int Enote = 1519;
int Fnote = 1432;

void setup(){
pinMode(speakerPin, OUTPUT); // set the speaker as output
pinMode(PadPin1, INPUT); // set the piezo speakers as inputs
pinMode(PadPin2, INPUT);
pinMode(PadPin3, INPUT); // set the piezo speakers as inputs
pinMode(PadPin4, INPUT);
}

void soundwave(int note, int howHard ) { // function that takes 2 parameters, the note we want to play and how hard the sensor has been hit
unsigned long endSoundWave = micros() + (35000 * howHard); // start a count from the microseconds currently registered since the program first ran. And add on an arbitary value multiplied by howHard value
while(micros() < endSoundWave){ // while the count is not reached
analogWrite(speakerPin, 1023); // set the speaker to on/ high
delayMicroseconds(note); // wait the number of microseconds for the note
analogWrite(speakerPin, 0); // set the speaker to off/ low
delayMicroseconds(note); // wait for the same number again to complete our oscillation/ soundwave.
} // repeat for the length of time.
}

void loop(){

if (analogRead(PadPin1) < padLimit) { // if the sensor is hit and the reading is less than our threshold // turn an LED on.
while (analogRead(PadPin1) < padLimit) { // while the analog reading is less than the limit
if (analogRead(PadPin1) < howHard) { // if the reading valueis less than our howHard value (1024)
howHard = padLimit - analogRead(PadPin1); // then rewrite howHard with the new value
} // this allows us to capture the peak value.
soundwave(Cnote, howHard); // now generate the soundwave with our note and how had the sensor was hit
}
}

if (analogRead(PadPin2) < padLimit){
while (analogRead(PadPin2) < padLimit) {
if (analogRead(PadPin2) < howHard) {
howHard = padLimit - analogRead(PadPin2);
}
soundwave(Dnote, howHard);
}
}

if (analogRead(PadPin3) < padLimit) { // if the sensor is hit and the reading is less than our threshold // turn an LED on.
while (analogRead(PadPin3) < padLimit) { // while the analog reading is less than the limit
if (analogRead(PadPin3) < howHard) { // if the reading valueis less than our howHard value (1024)
howHard = padLimit - analogRead(PadPin3); // then rewrite howHard with the new value
} // this allows us to capture the peak value.
soundwave(Enote, howHard); // now generate the soundwave with our note and how had the sensor was hit
}
}
if (analogRead(PadPin4) < padLimit) { // if the sensor is hit and the reading is less than our threshold // turn an LED on.
while (analogRead(PadPin4) < padLimit) { // while the analog reading is less than the limit
if (analogRead(PadPin4) < howHard) { // if the reading valueis less than our howHard value (1024)
howHard = padLimit - analogRead(PadPin4); // then rewrite howHard with the new value
} // this allows us to capture the peak value.
soundwave(Fnote, howHard); // now generate the soundwave with our note and how had the sensor was hit
}
}
}

Motion-Detective Shirt



Progress work of AdShades (Visual Simplification System)

The project idea for AdShades had been floating around my head for a while. I have always wanted to do augmented reality projects that deal with the control of advertising. In order to do my project I had to do a lot of planning and some experimentation to finally get to the final product. The project started with the research for the correct programming language. I was looking at Jitter and Processing and after looking at libraries, I found that JMyron would be great for my project. I read in the reference that there was a function called getGloBoxes() as well as trackNotColor(), and there I had found the exact thing I needed.

The second phase of the project involved the coding and driver issues of the camera. Again after more research, I found that the ps3 eye camera is great for computer vision, but the drivers are created by some guy and are not official. After a lot of playing around(experimenting on 4pcs and a mac), I found my project would only run on windows xp 32bit(with the inclusion of exta .dll's from the internet). This is why I borrowed by friends laptop that I then broke. I was very active on online threads talking with a guy named liudr a lot. The main thread is at http://processing.org/discourse/yabb2/YaBB.pl?num=1259097615 He helped me get the video running at 640 x 480 at 30fps.

The programming is relatively simple based on the great yet old library JMyron.
import JMyron.*;

JMyron m;//a camera object
int[][] globArray;

void setup(){
size(640,480,P2D);//P2D allows the sketch to run at 30fps
m = new JMyron();//make a new instance of the object
m.start(width,height);//starts the capture
m.findGlobs(1);//glob finding on
m.minDensity(10); //the required density of ads
loadPixels();
}

void draw(){
color gal = m.average(0,0,width,height);//a function t
hat averages colors
m.trackNotColor(int(red(gal)),int(green(gal)),int(blue(gal)),150);//trackNotColor finds everyhting that is not the surrounding color
m.update();//update the camera view
m.imageCopy(pixels);//draw image to stage
int[][] b = m.globBoxes();//get the center points
updatePixels();

noStroke();
globArray=m.globBoxes();

for(int i=0;i< .75*width && (b[i][2] > 15)){
int[] boxArray=globArray[i];
int currColor = m.average(
boxArray[0],
boxArray[1],
boxArray[0] + boxArray[2],
boxArray[1] + boxArray[3]);
fill(red(currColor), green(currColor), blue(currColor));//All of this fills each shape with its average color.

rect( b[i][0] , b[i][1] , b[i][2] , b[i][3] );// the rectangle boxes
}
}
println(frameRate);
}

public void stop(){
m.stop();//stop the object
super.stop();
}


The next step of the project was to build the mount and aquire the video glasses. There was a lot of RMA issues as you know. The mount for the video camera was made with plexi and the laser cutter to make a pretty professional mount. I also bought multiple video adapters and ended up having to break a cable apart and create a proprietary s video to composite cable. I also had to program a mouse with hotkeys so I could start the animation, start a screen capture, and stop the capture. I however need to find a much better screen caputre program because I could only get 15 frames per second in an with an old codec.


The performance of the piece was amazing. I went to the oaks Mall and was very surprised by the results. It was almost perfect. The screen capture program does not show how great it looked and the feeling of having your vision actively changed. I wish the screen caps were better. Here are some of my favorite scenes.










































From left to right: Oaks Mall Entrance, Sale Poster
Sleep Number Store, Victoria's Secret.

I was really happy with the reading in the difficulty of blocking advertising, and that you are more aware of it if you have to think about blocking it. It was also fun to talk to some people about the project, which I would like to integrate into the future performances of the piece.

For the future of the piece, it has been accepted into the Creativity of the Arts and Sciences, so I will be working on it a lot more. I need to figure out an easy way to have a wearable computer with a processing sketch and screen capture running. I am currently trying to buy a laptop that can easily run the program and have good TV out.

Attention Whore

These are videos of the dress working with a few songs (Including a Christmas Carol by Lady Gaga). I am still trying to convince a friend of mine to wear it so that I have someone wearing it for the videos. In the first clip I show the dress in multiple light settings as well as with movement. For the second video I just let the LED display work without interfering with it. I have titled the piece "Attention Whore," as I feel it sums up best the idea that I am working with for this project.

As a side note, in the first video around 35 seconds in you can hear a loud pop. That's my head breaking a light bulb (we have a hanging lamp). Luckily I didn't hurt myself, but that was one of the lights I was going to be using for the shot :/





Sunday, December 13, 2009

Set 3


Closer image of the final look.




This is the dress in its final form being worn. Unfortunately I didn't ruffle the bottom nearly as well as the top, but the bottom hemline is actually straight. (Thanks to Fiorella for this picture!)





This is the collar flipped all the way out in the right direction. The three areas that are not sewn together are for where the dress gets stitched into the collar.





Another picture of the collar inside out. The white material on top is the interfacing that I used in order to keep the collar stiff, maintaining its form when being worn.

Final blog post




Here's the final post, the last hoorah. My quick showing of the systems on the ZADD (Zombie Assembled Detection Device). I don't have any photos of the build process due to my hurried assembly of the system, which i regret. I hope the final pieces appearance will help the viewer to understand the workings due to the very visible components.

The idea behind this is that in the event of a world changing disaster, like a zombie apocalypse, any average person would be able to get this glove and attach different components that they would need throughout the day/period of time they're active. The LCD screen can display an infinite number of different readings. If one were to have this attached to a wireless network they could receive all types of data from the internet/network... assuming one is still active.

The methane and CO sensors are applicable with zombies, because as everyone knows, zombies put off massive amounts of methane gas due to their constant decomposition and defecation. The CO sensor is too keep me safe from toxic amounts of CO, makes sense right.

On a more serious note, I really need to work on a more solid concept for this because it's not gonna fly as it is I feel.

Enjoy!

oh, i have those items from surplus to display too.


Stratagene RoboCycler 40 PCR Machine

Stratagene RoboCycler 40 PCR Machine, Contains 4 heat blocks that you set to the desired temperature. A robotic arm moves the samples from block to block eliminating ramp time. 40 wells /Block, Well Volumen 0.6 ml, linea temp. range up to 14 or 22 across the well block, with temp. difference of up to 2 C between adjacent wells in each row. Can test up to 12 different anealing emp. in a single experiment. Single temperatures of up to 99C for pcr cycling.
Current Price: Condition: Age:
$2,500.00 Excellent Current






















The Roche LightCycler

utilizes a rapid air heating and cooling system to decrease run times to approximately 30-45 minutes. With a 32 sample capacity, this instrument is perfect for small projects or as a quick diagnostic tool. This instrument is located in (Building 7 room 7102)

















Remarks on the Spectra Diode Labs SDL-800 (LDI-800) Laser Diode/TEC Controller

Return to home page
modification for avoiding temperature oscillations: see at bottom


I got hold of one of these classic controllers. At some point I'll measure long-term stability and other factors that would be important for holography. Here are some remarks:
  • Here are links for manual and DIN-8 connector pinout. Thanks go to Spec and Marconi at photonlexicon.com.
  • The unit didn't at first seem to work - this was due to an open interlock, for which there is a little plug at the backside. Needless to say that first thing to do was to short this for good.
  • By changing the current sense resistor, one can modify the current range. I read somewhere that one can extend it to 1.6A max or so. The resistor in question is shown in the figure below. Normally (for 1A max) it is 1Ohm, 1%, 5W. I found my unit to be equipped by a 10Ohm resistor instead, limiting the max current to 100mA. After reinstating the 1Ohm resistor, I can go up to 1A, however the display doesn't show it right - it displays 100.0mA when the current really is1A. Obviously this had been modified by the previous owner, but I couldn't figure out what else was done - no further resistors anywhere of the board seem to have been changed, it seems an issue of programming the microprocessor; indeed, all what needs to be changed is the decimal point, and from tracing the circuit, that seems to be controlled directly by the processor.

  • What is very preculiar, is that there is no soft-start feature!. Insted the current is switched on (after a delay) by a relay, and so goes up in a microsecond or so. I was skeptical and checked the current carefully with a scope: indeed, there is a ca 30mA overshoot on the diode upon turn-on. This can destroy a low current diode instantaneously! Below a scope trace for a 30mA setting, there is overshoot to approx 90mA; the current limit was set to 40mA. For a 100mA setting, I found overshoot to ca 130mA, and for an1A setting, the overshoot is still in the order of 30mA. So don't use this driver if you have a diode that cannot take more than 30mA! It is a good idea to have a small series resistor (1-10Ohm) close to the diode and a cap of 100nF or so parallel to the laser diode. And a Schottky diode anti-parallel to the LD plus a 100Ohm resistor are a good investment too.
    Shown here is a current overshoot to over 90mA for a laser diode setting of 30mA.
    This was measured across a low-induction 1Ohm series resistor near a dummy diode.
  • The temperature stability is supposedly 0.1C, which corresponds to a wavelength shift of approx 0.03nm. This may not be good enough for holography applications. But it is not specified under what conditions, so some measurements are in order.
  • The TEC controller is uni-directional and not bi-directional - that is, it can cool only; the idea is, of course, that the cooling is balanced by the heating from the diode. This can be non-optimal for some applications, where fast response time is required.
    I have tried this controller with TEC's in various different laser heads, and in every single case the temperature oscillated - apparently the feedback loop is designed to work with specific SDL laser heads. Thus, the TEC controller as-is appears not be useful for stabilizing other laser heads, and in particular is not suitable for holography applications.
  • I now changed the feedback circuit so that it is now stable with all my laser diode mounts. The time constant for the integrator was too short, but the following simple operation remedies this. See this part of the circuit diagram:
    Simply replace R74 by 1Mohm und C33 by 4.7uF (or more; preferably MKS2 film capacitor or similar). They are easy to find as the PCB shows the component labels, they are at the center of the PCB somewhat to the front (see the blue circle in the picture above). The little modification has the following effect:

    To the left: temperature swing due to oscillation in original setup. To the right: Damped response after modificaton.

    Clearly now the nice gadget can be resurrected from the shelf and actually be used for something ;-)
  • The short-term stability seems sufficient for holography applications (x-axis is scaled by ten):


Lonngggg post.