Scott Fitzgerald / Art & Education

scott@droolcup.com


2011, May

Perpendicular Eye Stalk

Perpendicular Eye Stalk is an installation comprised of a four foot tall steel structure with 12 inch acrylic eyes that follow a visitor as they move in front of the piece. It is an attempt to create the archetypal example of what Tom Igoe refers to as the “Scooby-Doo painting”.

Special thanks to Hans-Christoph Steiner for teaching me how to weld. And the Madagascar Institute for the shop use.

The piece is an expanded excerpt from a portion of Trigger in Norway. In that work, a single motorized “eye” encased in a steel and glass cube moves back and forth like a sentry, changing its behavior and coloring depending on the presence of people. This version makes the “eyeball” analogy more explicit. Two hemispheres follow a person in front of the work. If someone comes too close, the eyes will “look away,” as if they were shy. Simple color changes in the iris of the eyes will indicate the various stages of the eye; an “attract” mode while waiting for someone, a “following” color, and a “shy” color.

Because of the ubiquitous nature of the interaction, and having seen many projects like this over the years as a teacher, I’m making all the code, wiring, etc. available for people to free replicate. If you want to make something that tracks your movement, this is now your one stop shop. I am updating this page as time permits, so be aware this is 1) a work in progress, and 2) things may not work exactly as shown.

Hardware

Arduino, LEDs, servos from ServoCity, video camera, mac mini, dfg-1394 usb cable, composite cable+adapter, firewire cable

Software

Max/MSP patch requires the cv.jit objects


----------begin_max5_patcher----------
2756.3oc0ct0bihiE.9YmeEr9woR6EciK6Cak82QWSkBaTbXFL3Fvt6cmZ9u
uBcv1Pr.Km.B4pSGG.a7QebtoiDh+5oEKWm+Kd4Rm+ky2cVr3udZwB4tp2wh
lsWrbWzu1jFUJeaK+ijpU6+YRVb9OW9Lb7jX4QxW+GeC6dZm4YkaJ37r5C41
rurC6RxR4UxyD5xNyOTcZu3l8tOpZy6IYaesfuoBjOO1J2mcH9xWBbq+sm32
N+9ouQ4Yo5+tmCu+kKeV7emeu9n+8SOU+qm0rQlw+on0bpoTw+kTDVt43p5l
eQzwsNuDkt+8HGg.fTvAzYN7VdVUVzNoLs7+TjDk19HkI+O4QP3UiCjvjvZv
fIn5WPDrbqAwjnI85tnphje84A1NdYYzV90DKMujqfOA2GdBUSGrR5ftIc7I
RMI7Jl.QrAUgFS0mXdpCy00UAO7FG0k6FHHu.IJjZKL+aqrrNJa6nCEjZnvl
InfwMdZlMnjlGEKOoWCE5T5XYPnPkdTvm76NcPoOmIGi4GS1vEgSbRx1enRH
tN46EgXT3+cd7uPXf+EoNCx0S9h4bvTGbB7j6fb17dTgvGmqClpx3BMNH5tC
Pg7k9ZHD.Nt.p7m5.T5Pr2DlcUD7.PifmKnIM3PfcGB4M6PqX6Zb5gcQNuTT
tIJUXTth37x1V+85y+sJPRlKPhg7hXPVRrYEjM4S1iOLBcBYD51VndRsLl6c
gnQ0geo3aQHakpfCalxfLTREnSHT1L3fOeuyKh++ucd4XTpv7BwTgmoLAaM7
tifjEbwytipFbEstLN4s2TkPk2rhJbfjQAAlgTU4a2lppGYzvkio2CVvISia
YfjjUMpWz+wNdUQtCQUXG1LkWXCT7kPggt8k5QuGE0lB+nZ01hn0mxuw4kCY
I+3.Wj4yKG2kGycvpPFdVyS7btNyaj5ejlrSsJE4dqzi6HoSQA9fk5TTYEMP
AFKRToSbRYUT1FU9RvnorSptCvDPMgfk8p.JXHzK0wrkKrMU5BEgmolMCpFJ
gAYkDNEM68Nk75FxqQE7HEM9vorXMCcIuI+T7kpB2otDxOBunoA2zhExRRJ+
HunLIOqExWrrUldttspjZHvVFy6x4VPxso4a9SdbKYbwxX9a22YoN++KeB46
uyu59NSx1WvK4YUQUMBe6u4nCoUupFzcO9aQa389gUd8awxsEIw4Yxtqz9SV
u6SeceWQL+l2QVzdEe3p77z0QEGSJSVmx6bsPnmFkkH7nyqR.4QPySGLY29B
YpCsNW7rHw438xME4oocNUvQNp3HPMk9YRb06xy0EZ0YnQZo6zwBpy9GxR5C
NQRSDwaIqD+z93pFAggMpFvv5ZiKR2CbcbldG5EDATektUuZLETGuQVNklfN
KN4GB9immJhhVI9oOhZQ.kBoBR7lchdX2Zg2wVeqhlWxtC6pOJkoljXh9nT7
sc5zgHrOAiQ8xX7MXbPSkFYWpiwsYbsOkm6j.9zq69O9lH0M2dTaISfi.7mV
uMP1wdhKj0IRelZJVtUDtvA6f5gl3PSRyaogBIuf8gJsQ0ils5byziyJGWQ+
CcO20vq3Yv3yy9s3oCySebCOAK9v5w2UaK9qewjLtlx8py5aQL1qYr+vgOXL
FIo759XrmMwX2lN070YrQiiUtOMoxA6EJR+uuvYXpISCCqkxLJTldqe3ckhf
IUeaHquqHzauj00lHaiJL05IKO0wi0WWFBrnrEf7XIHzkB9cahByhDClvvQm
3npn93oQijcibYwPATCuKdZIbzyh3HySxNJzWVqCj6i17mxP+h+0GNYiONoe
QbRnv.M6YY3LoOFRrnto5gkUTg0ZddZW8RsWJhsoN6CySVL0Zwnry9ndsqCr
HX1LiiZFcbpkYUWzYPs9HGmfn1teZkRHkcXPzo9VGG+vvh12bZ1FPYiWRX1N
6YawsqSL2s2ZhPMYBPjg4HhHUICoPZP2Wh4SSB5xVUeETd4nqI0P.OzE8ILS
u.EsdGax2siCCo2xkFBF3wGFvb0EFfGcYgY.w.Va8EBk4aQwPQrFELqMgj5Q
xoORxrHRhwdsJlfEmZWuzjZezDCdAmmj65LwNuhV86yG8UazWlyM1lJzfk1i
ZSk16DKYr4u1dcmL98e6b16j9yNhT.SHR3dX.tqOaO6HMgE4PfbedQkSuU2K
zlHYyLuEFp5lIcZfE0KgZh3D4D506.ifLZmEv5jcHJT9R.8tFWD0T8xzrKMI
quYrlTRpOtZbWlenXyousSCljSWoJlWVkjcdVG98KCb5GdiumDG2cV9Ayqn3
84hFRi.poBxcK2BaGQZC2VtItVkbWW3O8380MvYk2dZJ200X21jajtxM1tja
rtxMwdzuCzUOw+yYWRo08gg.UDDAytx1af7al4ZxE8g5MlnVp1Mz.6xAjutx
M0pjalthMwtDahlx8mTKAQAS.XMH.LNvDuISqWgVQ+sG6IL.U2n.gVk1itvt
tOYOfhMy2txo7wzyntdXrKoVgk13RaTfzYHxiT+he34MlJsGzT2f7fExp.uV
Mn5MlJqXcyvgYWgb0NDEi94hQAnGifAk1287VSUND51fnAOl49vX1kbytGEn
OgbWudzT2IFBTVHX.k6t04gZP9NkaMUsV+I1Lud0Lhc9te4TKxe5ZQZ2CGrc
k9g+CZIV7ePKwh+iYIVjxMQ2RHZQwk0tK7VXol0pWX1UdP02xdOh5IR49Qzt
L3A0OXviYbGh6Cpcoql5IX6pG6XsqFku8I2ZwaKqR82iYoEgac60mcUyRj1d
SrrATVabOlxcyNEM.X0WpL5HO9UwWCeS0qQUUEIqOTAyQgVM.cV6gF3P2ZYO
ZaZ95nzlEBpymiNm4qVMjtqkPomtPg6bw15zL88pUE8AVb0t2UYLzJVHCE3O
NqvZAMCsJbqoimhkZreqd0PYkpEXsfQroe2K3dLXk5jfcUu1mL750y3fl+oC
YEhhXgpVJBQgV.dvgWs16MA3oW6F91BNW0BFLkNmlMdPQ7HT5zY1b5FcUklg
+LsHUxfEJHLrZuCiIsAWkJ+Mmuo7oyh2bgCf.X2vVO.RBL4pi6256wA.adQR
yZcBQi0wzwGIHOkHgNaFMMyaIzbgjCYC4LgLNb4tWRfablffo0EKTOt773im
MQEU46ySU.mI0Q6sYC1q0Mg3vrAh997TjkR8hMcR04kUPU27gShtC415NtDc
4ibBWOQOwGVK5QR4pMhLXJxShUktBddswZdLYzrH9DLuOeLRiVyScdo9AZib
YJG47h7UWmWpdufW9ddZrClozWENXl.4omDBAvrAfD90Ho7S0cB9Cf8i0EnA
uCO2q5ajb67dtpJ.pq.vUWp0UhXZHQHiJQ5vHOiJQdZHQzPiJRHcTjvl85Vn
FxTm6ahIWjHXctxYVkIBQCYhX1KcHcTmHTiJS9ZHRXy5YBokyRypNIqvL5Vx
jYioniUGw7T5lW4LqBNRmvJHei5vDQ0UlLHmzwSfgEIcB008VKxH9Kuoe.yl
jR24.v.YDXvqbA5bkyrQeIrIHYNhqblbhbgmAbAtm25q1gAs7taV26A1W1vZ
EvwvAAc0MaXKKC8OH3SdWhmhNWc1BLri8X3W1dTqtcwP1GAIl8pJUmzsvlUl
HZEMBYebhX1baPXc.0myhjB2oPT3w+S2svvZoGEdjK0cKOXtWHd+LXiuptfV
odi+JfWrwe+z+Gb6ESmB
-----------end_max5_patcher-----------

Arduino code

#include <Servo.h> 

Servo myServoR;
Servo myServoL;

//variables to hold incoming bytes 
int rByte = 0;
int gByte = 0;
int bByte = 0; 

//servo position
int servoPos = 0;

//pinSetup
const int rPin = 3;
const int gPin = 4;
const int bPin = 5;

const int rServoPin = 9;
const int lServoPin = 10;

int servoByte;
float filterVal= .15;
float smoothedVal;    

void setup()
{
  Serial.begin(9600);
  pinMode(rPin, OUTPUT);
  pinMode(gPin, OUTPUT);
  pinMode(bPin, OUTPUT);
  digitalWrite(bPin, LOW);
  digitalWrite(gPin, LOW);
  digitalWrite(rPin, LOW);

  myServoR.attach(rServoPin);
  myServoL.attach(lServoPin);     

  establishContact();  
}

void loop()
{
  checkForSerial();
  switchLights();
  moveServo();
  // Serial.flush();
  Serial.print('A', BYTE);
  delay(33);
}

void checkForSerial(){
  if (Serial.available() >= 3) {
    servoByte=Serial.read();
    rByte=Serial.read();
    gByte=Serial.read();
    bByte=Serial.read();
  }
}

void switchLights(){
  if(rByte==1){
    digitalWrite(rPin, HIGH);
  }
  else{
    digitalWrite(rPin, LOW);
  }
  if(gByte==1){
    digitalWrite(gPin, HIGH);
  }
  else{
    digitalWrite(gPin, LOW);
  }
  if(bByte==1){
    digitalWrite(bPin, HIGH);
  }
  else{
    digitalWrite(bPin, LOW);
  }
}

void moveServo(){
  servoPos=servoByte;
  smoothedVal =  smooth(servoPos, filterVal, smoothedVal);
  myServoR.write(smoothedVal);
  myServoL.write(smoothedVal);
}

void establishContact() {
  while (Serial.available() <= 0) {
    Serial.print('A', BYTE);
    delay(300);
  }
}

int smooth(int data, float filterVal, float smoothedVal){
  if (filterVal > 1){
    filterVal = .99;
  }
  else if (filterVal <= 0){
    filterVal = 0;
  }
  smoothedVal = (data * (1 - filterVal)) + (smoothedVal  *  filterVal);
  return (int)smoothedVal;
}

Structure Mig Welding, acrylic hemispheres, sandpaper, tap and die, aluminum tubing, 5/8″ shaft collars

Perpendicular Eye Stalk was created for the PluggedIN show at the Grounds for Sculpture in Harrison, NJ.


10/16

Next project: → Trigger

Previous project: ← Big <3 NYC

Perpendicular Eye Stalk
Perpendicular Eye Stalk
Perpendicular Eye Stalk
Perpendicular Eye Stalk