Sternlab | Sequence Control
Sequence Control is an Arduino interface controlled animation system written in Processing. It gives the user the option to pause, frame forward, frame backward, and adjust the speed of the animation.
Sternlab is a collaboration between R. Stern and D. Rocamora, two artists living in New York City.
You may download the project .zip file, which includes the Arduino and Processing sketches as well as a circuit schematic diagram.
Processing code:
/*
* Sequence Control
* Copyright Sternlab 2006.
* licenced under the Creative Commons Attribution 2.5 license
* viewable at: http://creativecommons.org/licenses/by/2.5/
* contact[at]sternlab[dot]org
*
* This program animates images and uses an arduino-powered input device to control that animation.
* More information about this project can be found at sternlab.org.
*/
import processing.serial.*;
int numFrames = 20; // The number of frames in the animation
int frame = 0;
int speed = 15; //initial framerate
PImage[] images = new PImage[numFrames];
Serial port;
String portname = "/dev/cu.usbserial-A3000YYR";
int baudrate = 9600;
int value = 0; //for storing intial serial data
String buffer=""; //for buffering up serial data
float value1 = 0.0; //for converting buffered serial data to numbers
int stepper = 1; //for stepping frames
void setup()
{
size(720, 480);
key = 'a';
for(int i=0; i < numFrames; i++) {
String imageName = "470" + ((i < 10) ? "0" : "") + i + ".jpg";
images[i] = loadImage(imageName);
}
port = new Serial(this, portname, baudrate);
println(port);
frameRate(speed);
}
void draw()
{
while(port.available() > 0){
value = port.read();
serialEvent(value);
//println(value);
}
frame+=stepper;
if(frame >= numFrames){
frame = 0;
}
else if(frame < 0){
frame = numFrames-1;
}
image(images[frame], 0, 0);
//println(speed);
}
void serialEvent(int serial){
if(serial == 'P'){ //pause
stepper = 0;
}
else if(serial == 'R'){ //step frame reverse
stepper = 0;
frame--;
}
else if(serial == 'F'){ //step frame forward
stepper = 0;
frame++;
}else{
stepper = 1;
if(serial!=10) { //10 is a line break
// add event to buffer
buffer += char(serial);
}
else {
// if serial is line break set set the speed and clear the buffer
value1 = float(buffer);
speed = int(value1/9.0 + 1);
//println(speed);
frameRate(speed);
buffer="";
}
}
println(speed);
}
Arduino code:
/*
* Sequence Control
* Copyright Sternlab 2006.
* licenced under the Creative Commons Attribution 2.5 license
* viewable at: http://creativecommons.org/licenses/by/2.5/
* contact[at]sternlab[dot]org
*
* This program animates images and uses an arduino-powered input device to control that animation.
* More information about this project can be found at sternlab.org.
*/
int ledPin1 = 5; // LED connected to digital pin
int ledPin2 = 6;
int ledPin3 = 7;
int ledPin4 = 8;
int potPin = 5; // select the input pin for the potentiometer
int val = 0; // variable to store the value coming from the sensor
int value = 0;
int lastval = 0;
int pausePin = 2;
int ffPin = 3;
int revPin = 4;
int currentPin;
void setup()
{
pinMode(ledPin1, OUTPUT); // sets the digital pin as output
pinMode(ledPin2, OUTPUT);
pinMode(ledPin3, OUTPUT);
pinMode(ledPin4, OUTPUT);
pinMode(pausePin, INPUT);
pinMode(ffPin, INPUT);
pinMode(revPin, INPUT);
Serial.begin(9600); // use the serial port to send the values back to the computer
}
void flashLED(int whichPin, int duration){
digitalWrite(whichPin, HIGH); // sets the LED on
delay(duration*2); // waits for a second
digitalWrite(whichPin, LOW); // sets the LED off
delay(duration/2); // waits for a second
}
void updateSpeed(){
value = analogRead(potPin);
val = 1024 / value + 1; // read the value from the sensor
if (val != lastval){
//Serial.print(" ");
Serial.println(value); // print the value to the serial port
//Serial.print(" ");
lastval = val;
}
}
void loop() {
if ( digitalRead(pausePin) == 0) {
Serial.print("P");
if (!digitalRead(ffPin)){
Serial.print('F');
currentPin++;
if (currentPin > ledPin4){
currentPin = ledPin1;
}
flashLED(currentPin, val+20);
delay(10);
}
else if (!digitalRead(revPin)) {
Serial.print("R");
currentPin--;
if (currentPin < ledPin1){
currentPin = ledPin4;
}
flashLED(currentPin, val+20);
delay(10);
}
else {
delay(10);
}
}
else{
updateSpeed();
delay(val);
flashLED(ledPin1, val);
currentPin = ledPin1;
updateSpeed();
flashLED(ledPin2, val);
currentPin = ledPin2;
updateSpeed();
flashLED(ledPin3, val);
currentPin = ledPin3;
updateSpeed();
flashLED(ledPin4, val);
currentPin = ledPin4;
}
}

