Continuing from last post where a basic prototype testing was conducted. We designed a physical form of the prototype to test it out inside the park and observe how people react to eyes following them around when they pass. It was interesting to see that different persons had different reactions to the installation.
We thought of the installation as - two physical eyes shaped as googly eyes put up on the lamp post acting as pole’s own eyes. Following is a concept sketch for the installation we planned
We chose material to be 1/8” acrylic sheet with components mounted on it. The brains of this would be a linux based machine capable of running opencv and with a minimum of 2 USB ports. The eyes are controlled by an Arduino Uno which gets control commands from the linux machine.
The basic model of the installation was laser cut out of 1/8” opaque black acrylic.

Laser cut model
To make the base look like sclera we spray painted it with a white paint.

Spray Painting
For getting the eyes movement, we chose 28BYJ-48 (5V Stepper Motors) with ULN2003 as stepper driver. The motors are being controlled using an Arduino UNO which in turn is controlled by a linux machine.
This installation uses OpenCV for computer vision and detection for people passing by. Along with an arduino code that translates the motion coordinates generated by OpenCV and rotates stepper motors to show the follow movement. Below is the Arduino Code that translates camera co-ordinates to motor movements.
#include <AccelStepper.h>
#define HALFSTEP 8
// Motor pin definitions
#define motorPin11 4 // IN1 on the ULN2003 driver 1
#define motorPin12 5 // IN2 on the ULN2003 driver 1
#define motorPin13 6 // IN3 on the ULN2003 driver 1
#define motorPin14 7 // IN4 on the ULN2003 driver 1
#define motorPin21 8 // IN1 on the ULN2003 driver 2
#define motorPin22 9 // IN2 on the ULN2003 driver 2
#define motorPin23 10 // IN3 on the ULN2003 driver 2
#define motorPin24 11 // IN4 on the ULN2003 driver 2
// Stepper Motor 1 Initialization
AccelStepper stepper1(HALFSTEP, motorPin11, motorPin13, motorPin12, motorPin14);
// Stepper Motor 2 Initialization
AccelStepper stepper2(HALFSTEP, motorPin21, motorPin23, motorPin22, motorPin24);
int distance;
void setup() {
// Establishing Serial Communication at 115200 baud rate
Serial.begin(115200);
// Basic setup for stepper motors
stepper1.setMaxSpeed(500.0);
stepper1.setAcceleration(150.0);
stepper1.setSpeed(500);
stepper2.setMaxSpeed(500.0);
stepper2.setAcceleration(150.0);
stepper2.setSpeed(500);
}
void loop() {
// Data from openCV is received as *coordinate*
while (Serial.available()) {
if (Serial.read() == '*') {
distance = 0;
String steps = Serial.readStringUntil('*');
distance = steps.toInt();
distance = map(distance, 0, 640, 600, -600);
stepper1.moveTo(distance);
stepper2.moveTo(distance);
}
}
stepper1.run();
stepper2.run();
}