|
ERASURE MEMORY Michael Clemow Seanita Tolliver Jody Zellen | ||||||
|
THE SENSORS: FSR: FSR: ACCELEROMETER: THE PROCESSING CODE
import processing.serial.*;
import processing.video.*;
Serial port;
Capture vidCapture;
boolean pictureTaken = false;
int side;
int bottom;
int accelX;
int accelY;
int accelZ;
void setup() {
size(640,480);
smooth();
background(255);
vidCapture = new Capture(this,640,480,15);
// Print a list of serial ports so we can see what they are called
println(Serial.list());
port = new Serial(this, Serial.list()[0], 9600); // if this doesn't work, check the output of the line above
port.write(65); // send a byte to the microcontroller to start communication
println("Starting communication...");
}
void draw() {
//background(255);
//println("X: " + accelX + " Y: " + accelY + " Z: " + accelZ + " S: " + side + " B: " + bottom);
if(pictureTaken) {
// pick random point
int x = int(random(vidCapture.width));
int y = int(random(vidCapture.height));
int loc = x + y*vidCapture.width;
frameRate(4);
// look up color in video
loadPixels();
float r = red(vidCapture.pixels[loc]);
float g = green(vidCapture.pixels[loc]);
float b = blue(vidCapture.pixels[loc]);
// color enhancement
if(r > 100) { r = 255; }
if(r < 70) { r = 0; }
if(g > 100) { g = 255; }
if(g < 70) { g = 0; }
if(b > 100) { b = 255; }
if(b < 70) { b = 0; }
// draw an ellipse or something at that point with that color
fill(r,g,b);
if(accelY > 395) { // drawing with strokes
strokeWeight(side/100);
stroke(0);
} else { // drawing without strokes
noStroke();
}
rect(x,y,accelX/10,bottom/10);
}
}
void serialEvent(Serial port) {
String stringFromArduino = port.readStringUntil(9); // read until the end, e.g. "9" or a tab character
if (stringFromArduino != null) {
//println("String from Arduino: " + stringFromArduino); // DEBUG
String[] parts = stringFromArduino.split(","); // We know it's a comma because we sent "44" from Arduino.
//println(parts.length);
// assign our variables
accelX = int(parts[0]); // we know this is first because we sent it first.
accelY = int(parts[1]); // int() casts the string chunk into a integer type.
accelZ = int(parts[2]);
side = int(parts[3]);
bottom = int(parts[4].trim()); // use .trim() to get rid of the tab character.
// readStringUntil apparently includes what you're reading until (in this case, the tab character)
port.write(65); // tell Arduino we're ready for more.
}
}
void keyPressed() {
if(key == 'c') {
println("Taking a picture");
if(vidCapture.available()) {
vidCapture.read();
pictureTaken = true;
}
}
if(key == 'd') {
if(pictureTaken) {
image(vidCapture,0,0,640,480); // debug string to test framing
}
}
if(key == 'r') {
background(255);
}
if(key == 's') {
pictureTaken = !pictureTaken;
}
}
The ARDUINO CODE
/*
* Eraser Memory Device Code
*/
long FSRSide = 0;
long FSRBottom = 0;
long accelX = 0;
long accelY = 0;
long accelZ = 0;
int FSRPinSide = 0;
int FSRPinBottom = 1;
int accelPinX = 2;
int accelPinY = 3;
int accelPinZ = 4;
void setup() {
// open serial communications at 9600 bps
Serial.begin(9600);
// Let's you know when you the Arduino code is running by making blinky
pinMode(13, OUTPUT);
for(int i=0;i<4;i++) {
digitalWrite(13, HIGH);
delay(300);
digitalWrite(13, LOW);
delay(300);
}
}
void loop() {
if(Serial.available() > 0) {
// read x,y,z value pins
for(int i=0;i<10;i++) {
accelX = accelX + analogRead(accelPinX);
accelY = accelY + analogRead(accelPinY);
accelZ = accelZ + analogRead(accelPinZ);
FSRSide = FSRSide + analogRead(FSRPinSide);
FSRBottom = FSRBottom + analogRead(FSRPinBottom);
}
// prints "X,Y,Z,Side,Bottom" Dano's Text-Style
Serial.print(accelX/10, DEC);
Serial.print(44, BYTE);
Serial.print(accelY/10, DEC);
Serial.print(44, BYTE);
Serial.print(accelZ/10, DEC);
Serial.print(44, BYTE);
Serial.print(FSRSide/10, DEC);
Serial.print(44, BYTE);
Serial.print(FSRBottom/10, DEC);
// if you're not using Windows, use something other than 10 or 13 here to signal the end of the line
Serial.print(9, BYTE);
// reset variables back to zero
accelX = 0;
accelY = 0;
accelZ = 0;
FSRSide = 0;
FSRBottom = 0;
}
}
|