In 2015, I worked with Washington Ensemble Theatre on a play called Sprawl which featured characters who are infected with a zombie-like virus that turns them into giant insect creatures. My takes was to design and build an animatronic control system for the actors, which would allow them to move antennae on their masks via control input from a glove. Using flex sensors, Arduino UNOs, servo motors and reg-green-blue-white LEDs, we achieved a fun, low tech horror effect.
Early development consisted of getting control over the servos via the flex sensors, using a wig form as a stand in for the actor’s head. Two flex sensors were fitted to each glove, so that the actor had independent control over each antenna.



Arduino sketch:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
/* This program controls two HS225-MG servos with input values from a pair of 2.2" flex sensors to motorize antennae constume pieces. Each sensor controls a motor. This program also powers two RGB LEDs that fade through the color wheel and assumes common cathode LEDs. See comment below to change to common anode. Built for Washington Ensemble Theatre's production of "Sprawl" at 12th Avenue Arts, Seattle WA, January 2015. This sketch controls helmet #2 (Chris Hill) based on data values from Spectra Symbol flex sensors on that unit. */ #include <Servo.h> Servo servoLeft, servoRight; int flexpin = A0; int flexpin1 = A1; int redPin = 7; int greenPin = 6; int bluePin = 5; int redLevel = 0; int greenLevel = 0; int blueLevel = 0; float counter = 0; float pi = 3.14159; //uncomment the following line if using a Common Anode LED //#define COMMON_ANODE void setup() { servoLeft.attach(9); servoRight.attach(10); pinMode(redPin, OUTPUT); pinMode(greenPin, OUTPUT); pinMode(bluePin, OUTPUT); Serial.begin(9600); } void loop() { counter = counter + 1; redLevel = sin(counter/100)*1000; greenLevel = sin(counter/100 + pi*2/3)*1000; blueLevel = sin(counter/100 + pi*4/3)*1000; redLevel = map(redLevel,-1000,1000,0,100); greenLevel = map(greenLevel,-1000,1000,0,100); blueLevel = map(blueLevel,-1000,1000,0,100); analogWrite(redPin,redLevel); analogWrite(greenPin,greenLevel); analogWrite(bluePin,blueLevel); int flexposition; int servoposition; int flexposition1; int servoposition1; flexposition = analogRead(flexpin); flexposition1 = analogRead(flexpin1); servoposition = map(flexposition, 760, 860, 0, 180); servoposition = constrain(servoposition, 0, 180); servoposition1 = map(flexposition1, 760, 860, 0, 180); servoposition1 = constrain(servoposition1, 0, 180); servoLeft.write(servoposition); servoRight.write(servoposition1); Serial.print("sensor1: "); Serial.print(flexposition); Serial.print(" servo1: "); Serial.println(servoposition); Serial.print("sensor2: "); Serial.print(flexposition1); Serial.print(" servo2: "); Serial.println(servoposition1); delay(10); } void setColor(int red, int green, int blue) { #ifdef COMMON_ANODE // if using common anode, adjusts color values accordingly. red = 255 - red; green = 255 - green; blue = 255 - blue; #endif analogWrite(redPin, red); analogWrite(greenPin, green); analogWrite(bluePin, blue); } |
Next we crammed an UNO, solderless breadboard, servos, tubing, LEDs and a heap of wire onto bicycle helmets fitted with the mask, jaws adn hair. The solderless components were only intended for testing, but ended up staying in the final version due to time constraints. I ultimately made a modified version of the rig, with the sketch burned to an AT Tiny85 and soldered together onto a wafer in a small project box.


