The name of the game in designing the mechanical components of this project was robustness; we designed and redesigned every piece to be as sturdy as possible. However, we also needed to keep all of our components as compact as possible because our stage isn't very big, and besides, the aesthetic appeal of our project would be diminished if even a single loose wire was visible. As a result, if you take a look at all of our CAD drawings, we hope you notice that each part is designed as space-efficiently as possible without sacrificing any of its intended functionality.
This picture shows a top view of the stage, where all significant mechanical components (the pulleys, gantry, etc.) are visible.
Click any of the CAD drawings below to get a better look, or click below to see our designs on OnShape.
Below are some of the beginning designs we made for various parts of our mechanical system. These worked, at least at first, but we knew we needed to redesign them for better functionality and to make them last. Above is a picture of what we originally envisioned for our stage.
Our original gantry design was created with the intention of making it able to support itself in order to test translational movement. In this initial design, we had a motor attached to the marionette with wheels attaching the trolley to the gantry.
At first, we tried a spooling mechanism to raise and lower the marionette, but this required the use of an unnecessarily complicated system of 3 DC motors. The press-fits we designed to attach the spools to the motors were unstable, and we learned that tolerancing 3D printed parts to be difficult but necessary.
This design proved to be much more adaptable than our previous. We switched from spools to a lever system and inserted more motors, including a motor for the head of the marionette and a motor for rotation, without making too many drastic changes. This design was also more compact than our previous.
The original trolley was designed to connect to our original motor mount. The idea was to have a DC motor drive a wheel that was attached to the gantry.
The original pulley system consisted of four mounts on the inside corners of the stage that housed small 3D printed pulleys with two 1/4” diameter threads and a mounted stepper motor attached to a driving pulley with two larger diameter threads. A tensioned loop of string looped around the entire system to be tied to the curtains mounted on thin acrylic rods that also attached to the motor mounts. It was double looped in such a way that it would drag the curtains open and closed depending on which way the stepper rotated. The PLA pulleys were weak and had a habit of snapping in half as well snagging because they weren’t smooth enough for the string to move easily. The string also crossed over itself a lot because of how it was looped which added even more friction. This meant the large stepper motor pulley couldn’t drive the curtains. We decided to machine new pulleys out of scrap aluminum instead because it’s smoother and stronger. We used a ½-13” die to add threads to the pulleys to keep the string from intersecting when it crossed over itself. The rest of the pulleys were turned down to smooth edges. The stepper motor pulley was made out of better material as well.
We used two Arduino Motor Shields to control all the components of our project. In the way of motors, we used four servomotors: one for the head of the marionette, one for the legs, and two for the arms. For drawing the curtains and moving the marionette translationally, we used two bipolar stepper motors. Finally, to rotate the marionette, we used a DC motor. We also used two infrared proximity sensors, and to enhance the appearance of our stage, we used a strip of LEDs, which take in their own power supply of 12V.
We produced this calibration curve for our infrared distance sensors to determine at what distance an audience can be detected. We decided to set the threshold at around 55 centimeters (the blue line on the graph), since this seemed to make sense in terms of how far away the audience would stand.
The source code that runs our project can be found in our Github repository. The source code is broken down into two different files. One file contains all the functions that the marionette can perform— walking, bowing, swordfighting, and so on. The other file contains execution capabilities; it allows the user to type in a serial input (a string of commands in the form [String command, int duration; String command, int duration; ...]). The execution file parses commands and calls methods from the functions file to move the marionette accordingly. The firmware is run on two Arduino UNOs with Adafruit MotorShields and is written in the Arduino programming language. We use the Adafruit MotorShield library.
There is also a software component that uses Python's pygame library to play audio files to accompany the marionette's performance. The Python code checks the serial port to see if the Arduino UNO is running, and plays audio files accordingly.
The code is structured to be as versatile as possible, in that a wide variety of movements and audio files can be used (as long as the audio file and movement commands are valid).
Dependencies: Adafruit MotorShield library, pygame library