Scoots is an infrared motion tracking spotlight designed to follow users with an infrared wearable tech. Scoots adds a dynamic element to stage performances and presentations without needing a spotlight operator.
Scoot's spherical design allows for a seamless 360 range of motion, giving the illusion of the head gliding over the body. |
Infrared sensors on the head piece track the user's motion in each direction. |
The simple design keeps the complex inner workings from view to create a sleek aesthetic. |
#include <Servo.h>;
Servo servoVert;
Servo servoLat;
int latCount = 0;
int currentLat = 0;
String LatDir = "";
String VertDir = "";
String light = "";
int joy1 = 0;
int joy2 = 0;
int servoLatWrite = 0;
int servoVertWrite = 0;
int ledRight = A3;
int ledLeft = A2;
int ledUp = A0;
int ledDown = A1;
int ledRightRead = 0;
int ledLeftRead = 0;
int ledUpRead = 0;
int ledDownRead = 0;
void setup() {
Serial.begin(9600);
servoVert.attach(5);
servoLat.attach(3);
pinMode(10, HIGH); //light
pinMode(11, HIGH); //failsafe if lat rotates too far
}
//____________________________ ______________________________ ______________________
//____________________________ ______________________________ ______________________
//____________________________ ______________________________ ______________________
void loop() {
//____________________________ _________________
//CALIBRATE VALUES TO SENSOR LEVELS
ledRightRead = analogRead(ledRight);
ledLeftRead = analogRead(ledLeft);
ledUpRead = analogRead(ledUp);
ledDownRead = analogRead(ledDown);
//for joystick demo
//joy1 = analogRead(4);
//joy2 = analogRead(5);
//____________________________ _________________
//FIND MAX B/T EACH DIRECTION, ADJUST ANGLE, PRINT DIRECTIONS TO SERIAL MONITOR
//Lateral Motion
if (ledLeftRead - ledRightRead > 50) {
servoLatWrite = 93;
LatDir = "RIGHT";
latCount -= 1;
} else if (ledRightRead - ledLeftRead > 50) {
servoLatWrite = 64;
LatDir = "LEFT ";
latCount += 1;
}
else {
servoLatWrite = 83;
LatDir = "LAT CENT";
}
//Vertical Motion
if (ledUpRead - ledDownRead > 15) {
servoVertWrite -= 5;
VertDir = "DOWN";
} else if (ledDownRead - ledUpRead > 15) {
servoVertWrite += 5;
VertDir = "UP ";
} else {
servoVertWrite += 0;
VertDir = "VERT CENT";
}
//____________________________ _________________
// FLIP LATERAL DIRECTION IF VERT ON OTHER SIDE
if (servoVertWrite > 90) {
if (servoLatWrite == 67) {
servoLatWrite == 90;
}
if (servoLatWrite == 90) {
servoLatWrite = 67;
}
}
//____________________________ _________________
// LATERAL SERVO MOTOR GRADUAL ACCELERATION
//95 to either
if (servoLatWrite > 83) {
for (int i = 95; i >= servoLatWrite; i--) {
Serial.println(servoLatWrite);
servoLat.write(i);
delay(15);
}
//65 to either
} else if (servoLatWrite < 83) {
for (int i = 64; i <= servoLatWrite; i++) {
servoLat.write(i);
delay(15);
}
//83 down to 65
} else if (servoLatWrite == 65) {
for (int i = 83; i >= servoLatWrite; i--) {
servoLat.write(i);
}
//83 to 95
} else {
for (int i = 83; i <= servoLatWrite; i++) {
servoLat.write(i);
}
}
//____________________________ _________________
// WRITE ANGLES TO SERVER MOTORS
servoVert.write(map(joy1, 280, 1014, 90, 150));
//servoLat.write(map(joy2, 0, 640, 55, 105));
//____________________________ _________________
//TURN ON LIGHT ONLY WHEN INFRARED LIGHT DETECTED
if (LatDir == "CENT" || VertDir == "CENT") {
digitalWrite(4, LOW);
}
if (ledUpRead < 600 || ledLeftRead < 600) {
digitalWrite(4, LOW);
light = "LOW";
} else if (ledDownRead < 600 || ledRightRead < 600) {
digitalWrite(4, LOW);
light = "LOW";
} else {
digitalWrite(4, HIGH);
light = "HIGH";
}
//____________________________ _________________
//CAP ALL DEGREES
//shuts off if lat twists too far in either direction
if (latCount > 50) {
digitalWrite(11, HIGH);
}
if (latCount < -50) {
digitalWrite(11, LOW);
}
if (servoVertWrite > 155) {
servoVertWrite = 155;
}
if (servoVertWrite < 90) {
servoVertWrite = 90;
}
//____________________________ _________________
//SERIAL PRINTING
ledRightRead = dirOutput[0];
ledLeftRead = dirOutput[1];
ledUpRead = dirOutput[2];
ledDownRead = dirOutput[3];
Serial.print("ledLeft: ");
Serial.print(ledLeftRead);
Serial.print('\t');
Serial.print("ledRight: ");
Serial.print(ledRightRead);
Serial.print('\t');
Serial.print("ledDown: ");
Serial.print(ledDownRead);
Serial.print('\t');
Serial.print("ledUp: ");
Serial.print(ledUpRead);
Serial.print('\t');
Serial.print('\t');
Serial.print("VertDirection: ");
Serial.print(VertDir);
Serial.print('\t');
Serial.print("LarDirection: ");
Serial.print(LatDir);
Serial.print('\t');
Serial.print(light);
Serial.print('\t');
Serial.print("vert angle ");
Serial.print(servoVertWrite);
Serial.print('\t');
Serial.print(latCount);
Serial.print('\t');
Serial.print("lat angle ");
Serial.print(servoLatWrite);
Serial.print("Arm: ");
Serial.print(servo2Write);
Serial.print('\t');
Serial.print("Legs: ");
Serial.print(servo1Write);*/
Serial.println();
}
No comments:
Post a Comment