0. Introduction
1. Basic Operation
2. The Conversion Overview
3. The Conversion Details
4. Main Components
5. Schematics
6. Arduino Code
0. Introduction
A project to convert an old record player into a controllable turntable for physical 3D animations.
What’s a zoetrope?
After typing “what is a zoetrope” into Google the first result is this:
zo·e·trope
a 19th-century optical toy consisting of a cylinder with a series of pictures on the inner surface that, when viewed through slits with the cylinder rotating, give an impression of continuous motion.
This essentially describes a looped version of a flip book. Unlike a movie filmstrip, which runs from beginning to end at a continuous speed and can show a long animation, the rotating cylinder in a zoetrope requires that the last image loops seamlessly back to the first image. That implies a rotation device of some sort.
In a traditional zoetrope the impression of a continuous animation comes about when the viewer only sees one image at a time without actually seeing the change to the next image. This is usually achieved with a mechanism that shuts the viewing slit while the change takes place. If this is done quickly enough – 12 to 16 images (or frames) per second – the viewer sees the individual images as a more or less seamless animation.
In a classic movie film projector a strip of plastic with small pictures scrolls in front of a strong light, which projects the picture on a canvas. The film strip was moved by a hand crank in early devices and later replaced by electric motors. Mechanically coupled to the rotating spools which contain the filmstrip is a small propeller-like piece which covers the light bulb while the next image is pulled in front of the light.
What makes a device like that 3D?
While the traditional zoetrope and film projectors use images that could be hand drawn or recorded with a film camera and therefore are 2D, taking this idea to 3D requires actual real objects. This real 3D version is not to be confused with modern 3D movies which use various optical gimmicks tricking the viewer to experience a more or less convincing 3D effect. The 3D zoetrope is a wonderful combination of down-to-earth basic technology with modern digital electronics.
The basic parts needed are:
– turntable capable of spinning at a constant speed
– collection of objects that display movement; for example the walk cycle of an animal (alternatively larger single objects that go in the center of the turntable and look like flowering blooms)
-light source that has an adjustable strobe frequency in sync with the turntable (emulating the little propeller from the film projector)
The old-meets-new charm here is that instead of drawing pictures by hand we use 3D printing to produce interesting objects for our 3D zoetrope.
1. Basic Operation
Connections
AC Power
- connect to regular 110V AC power
- this is the black cord coming out of the back of the unit
Strobe LED connector
- phone-style connector for external strobe pulse LED (modified to operate on 12V)
- located on the right side of the unit
USB cable
- optional connection of internal Arduino board to computer
- use Arduino software to modify and monitor code
Controls
Power ON/OFF
- main power switch; positive feedback through green status LED
- located on the right side of the unit
Control box
- located on the right side of the unit
Strobe Frequency
- when in manual mode this will allow to set the strobe frequency
Manual/Auto Mode
- in manual mode strobe frequency is not synced to turntable
- in auto mode the optical cartridge will try to synchronize the strobe signal with black markings on the bottom of the turntable
Rotation Speed
- controls the rotation speed of the turntable; about 10 – 100rpm(?)
Turntable ON/OFF
- starts/stops the turntable
Status LEDs
Status indicator LEDs
Power on (GREEN)
Auto Mode (RED)
Manual Mode (BLUE)
2. The Conversion Overview
Features of the record player:
- spins a weighted, round 12” platform at a constant speed of 33.5 or 45rpm
- motor is switched on by lifting a tone arm
- motor is switched off when tone arm has finished playing the record
The turn-o-trope
- spins a weighted, round 18” platform at constant speeds
- speeds can be set to 10-100rpm by manual control
- turntable can be switched on or off
- unit needs to trigger a strobing light source
- the frequency of the strobe can be set manually or optically synchronized with the turntable rotation
3. The Conversion Details
A turntable for a zoetrope can be built from scratch or by recycling various electronic devices that have a motor strong enough to spin discs of the required size. Smaller turntables have for example been recycled from computer hard drives. In this project I re-purposed a 30 year old record player.
After taking off the bottom cover we’re looking at these relatively simple mechanical and electronic innards.
On the left side is the mechanism that couples the tone arm with the turntable via thin metal rods. Back-right is the small power transformer which simply provides current to the motor. The audio circuitry is passive and requires no external power. Front-right is a sliding switch to select 33.5 or 45 rotations per minute. 33.5 is for LPs and 45 for singles.
For the project we will only keep the motor, everything else will have to be taken out.
The motor speed here is selected by adding or bypassing a resistor via the sliding switch.
Since the disc for the zoetrope scene should be larger than a LP, the top part of the turntable case has to be leveled so that the disc can rotate freely. This is done with various tools such as a simple handsaw, a Dremel oscillating tool and a heat gun with a cutting attachment.
Top of the turntable after some creative material removal.
Stripped of the tone arm assembly and everything else except for the motor and the metal spindle.
Unfortunately the raised plastic ledge had to be crudely cut to allow the larger disc to spin freely.
The original power transformer only had to drive the motor with 12V DC. We will use an Arduino UNO for testing and ultimately a smaller Arduino Pro Mini for permanent installation. For this we need a better option as a power supply. A small computer power supply from a recently disassembled DVD drive was available. Like most computer PSUs, this has multiple 12V and 5V feeds, a connector for an ON/OFF switch, and an LED to signal when it is powered on.
Even though this PSU is smaller than a regular PC PSU it was still a bit of a challenge to find a fitting location for in the relatively flat space inside the case.
Here, we have the new PSU on the right. The ON/OFF switch and power status LED are connected. You can also see the turntable speed control’s 10k potentiometer top-right. This replaces the fixed resistor.
The original 12V transformer is still supplying the motor at this stage.
While the speed adjustment is analog and requires no additional circuitry, the strobe light trigger and optical syncing needs a bit of computing power.
Here, an Arduino UNO is getting wired up to a photo resistor to test where and how the rotation of the disc can reliably trigger the strobe signal.
When experimenting with the Arduino, connections are usually made using short wires with wire plugs on either end. Additional external electronic components can be wired up using a breadboard.
The best spot for the optical components has been determined. This requires one white LED, which will illuminate the underside of the white, spinning scene disc. The disc is marked with thick black lines. While the disc is spinning, a photo-resistor will detect the light/dark pattern created by the consistent light source and the black lines. This will be processed in the Arduino and used to generate the automatic sync signal for the strobe.
Here, the experimental setup is slowly growing. In the black case you can spot the white LED and right next to it the small photo-resistor. Both are just stuck in there at the moment and freely movable to find the best distance from the spinning disc.
You can see how many components are connected to the Arduino or the breadboard by those gray connectors.
At this stage it is very important to use consistent wire colors to be able to trace signal and power flows.
Also, the Arduino here is connected to a laptop via a USB cable. This connection is needed to upload the program (called a “sketch”) and to monitor the sensor in the serial monitor of the Arduino software on the laptop.
To do practical testing of the illuminating LED and the photo-resistor a disc was needed. A thin plywood sheet seemed to be the most obvious material. How to cut a nice round disc? A little rig on the table saw does the trick.
But it turns out that the disc has too much mass for the motor to turn. A lighter material is needed.
Project foam board is a better choice. Easier to cut and stiff, yet very light. And since all the objects for the actual 3D scene will be 3D printed from ABS plastic, the disc won’t carry a lot of weight. The only shortcoming so far is that the material warps easily when it gets humid.
The two 3D printed circular plastic pieces in the picture go in the middle of the disc to hold it firmly on the turntable spindle and to prevent the hole in the foam board to wear out.
We are looking at the underside of the disc – which faces the illuminating LED and the photo-resistor. The ten black bars are the index stripes that are supposed to trigger the strobe. So this disc will support a ten frame animation in automatic strobe mode.
The Arduino is relatively easy to program. There is one segment of a “sketch” which sets up all the variables and initializes inputs and outputs. The main chunk is an endless loop. Everything that needs doing is done in there. At the moment all it needs to do is monitor the value returned by the photo-resistor and flash a control LED on the breadboard depending on whether that value is over/under a certain threshold. Later the code will become more challenging because several of the control buttons and the strobe trigger output will have to be served in the same program loop.
An open question from the beginning was what to use as a strobe light source. Full blown commercial strobe lights can be pretty pricey. Also it didn’t seem obvious how to trigger one from the Arduino. So for simple testing a 12V LED lamp was used. While not ideal, it could be directly connected to the Arduino trigger output. During the testing it turned out that, if anything, that light was too bright. Concerns that an LED wouldn’t be able to strobe fast enough were unfounded.
One of the things missing so far for a successful test were some 3D objects to put on the spinning disc. Thingiverse.com offers some freely download-able options. The most charming one is this set of ten walking elephants. This is how they came out of the printer.
After trimming off the “raft” (the excess plastic surface) the ten elephants perform a little break-dance before they are glued to the foam board disc.
After establishing that the basic setup actually works, all the components will have to be moved inside the case. This requires replacing the Arduino UNO by it’s much tinier cousin, an Arduino Mini Pro.
Fitting everything inside the case turned out to be much more of a challenge than expected. For one all wire connections had to be made permanent. Wire lengths had to be kept as short as possible. A location for all external control knobs and buttons had to be found. The first consideration was to have an external wired control box. This should have been removable and would have required a re-purposed SCSI cable and connectors (at least 16 wires). In the end it was more feasible to 3D print a small plastic box with a removable lid and glue/screw it to the side of the record player case. This control box now contains:
– on/off switch for the turntable motor
– potentiometer for turntable motor speed
– mode switch to set unit to run in auto strobe or manual strobe mode
– potentionmeter to set strobe light frequency when in manual mode
Three status LEDs are used for visual feedback:
– green LED to indicate that the main power is on
– red LED for automatic strobe mode
– blue LED for manual strobe mode
While the green LED is directly connected to the power supply, both the red and blue operation mode LEDs are powered through the Arduino.
At this point the photo-resistor and white disk-illumination LED where still loosely stuck in their intended location. Some scouting around in the workshop didn’t turn up anything that could be used as a mount, so a special part was designed and 3D printed. This now fits easily into the opening, is mounted securely with screws and has a lower cavity for the LED and a higher cavity for the photo-sensor. Eventually both electronic components will be glued at the ideal height.
Here the rewiring with the Arduino Pro Mini is in progress. On the far right you can also see the blue LED work light which will receive a slight rewire job. Also, next to it, the big black box with the four wires sticking out and the transparent plastic cover is a relay. While the testing setup had the strobe LED directly connected to the Arduino and thus drawing power from it, it made better sense to use the Arduino to drive the relay and then have the option later on to try strobe lights of all sorts of types and power requirements. Only the trigger impulse comes from the Arduino to the relay which then switches an independent current (if necessary from a different power supply up to 110V) on or off. While not a big component it was still a bit of a challenge to fit it in the case.
Other wiring changes included getting rid of the turntable’s original power transformer and connecting the drive motor to the turntable speed potentiometer, feeding it from the PSU. Then the PSU AC feed needed to be rerouted and safely connected to a properly tension-relieved AC cord.
Although only planned as a future extension, an FTDI breakout board was added in this version. It allows for a computer to be connected via a USB cable. This is usually only needed for software updates. But after some testing, the optical cartridge (photo-resistor/illuminating LED combo for strobe syncing) was not working consistently. So a software update was needed and the capability to send readings from the photo-resistor to the serial monitor in the Arduino software running on a connected computer.
Side view, looking at the main power switch and to the right of it the RJ12 output jack for the strobe LED. (This picture was taken before installing the USB connection)
View from top without the scene disc. The metal turntable is from the actual record player that was butchered for this project. It has a nice mass and is driven by a belt from the drive motor. On the right next to it is the optical cartridge. Here you can also see the AC power cable and the thinner USB cable.
One little detail was put off until the very end and it turned out not to be so trivial. For testing the strobe LED was always held up by hand, but for permanent operation some sort of adjustable stand was needed. The original idea was to re-purpose the stand from an old desk light but in the end this simple solution worked better. Since the strobe LED has a magnet in the back a metal rod offered itself. That way the height of the strobe LED could easily be changed. The metal rod is attached to a slot in a short PVC axis in the base. To adjust the angle the wooden slider is moved along the metal rod.
The strobe LED is connected to the turntable via a pluggable telephone wire. Since correct polarity is important when wiring an LED, a RJ12 connector was chosen.
This concluded the actual construction phase of the project on July 15th, 2017.
4. Main Components
A. Purchased Components
– Arduino Pro Mini ($12)
– VisiPort2 FTDI Breakout Board ($7)
– Auber 100A SSD relay ($20)
– Hilitchi 635 Pcs 40 Pin 2.54mm Pitch Single Row Pin Headers, Dupont Connector Housing ($16)
– Ribbon Cable – 10 wire (15ft) ($7.30)
– Gikfun Knurled Shaft Linear Rotary Taper Potentiometers ($7)
– PlatinumPower Turntable Belt ($7)
– Harbor Freight 27 LED Portable Worklight ($4)
B. 3D Printed Components (printed on Rostock Max V2)
from Thingiverse
custom designed objects
C. Repurposed Components
– JVC Record Player (audio broken)
– Power Supply from external DVD drive
– RJ12 socket from 2400kb modem
– two switches on control box
– plastic panels from Deskjet 500 printer
– several feet of 4 lead phone wire
– leftover screws and nuts from Makerbot Cupcake
D. Tools
– digital multimeter
– soldering iron
– Dremel heat gun
– Dremel oscillating tool
– small hand saw
– electric and manual screw drivers
– electric drill
– crimping tool
– wire cutter/stripper
– small vise
– “third hand” for holding electronics in place
– hot glue gun
– table saw
– scissors
– utility knife
– drill press
– various pliers
– forceps & tweezers
– various hex keys
– ruler
– manual & digital calipers
E. Software
– Autodesk Fusion 360 (CAD)
– Arduino (Arduino programming)
– Eagle (circuit schematics & board layout)
– Cinema 4D R15 (3D renderings)
– Blender (3D file format conversion)
– MatterControl (3D print file creation)
– Octoprint (3D printer control)
– Adobe Photoshop (image editing for documentation)
– Adobe InDesign (documentation)
– GraphicConverter 10 (image catalog)
5. Schematics
A. Turntable Main Electronics
B. Wire Header Connection Assignments
C. LED Work Light Rewire to run on 12V
6. Arduino Code
6. Arduino Code
/*
zoetrope controller
to do:
- implement auto calibration mode for optical cartridge
v3.0 2017-7-23 include diagnostics
V2.11 2017-5-25 clean up button code (test for max & min)
V2.1 2017-5-23 added workaround for malfunctioning A2 digital in
V2.0 2017-5-20 replaced mode button by toggle switch, simplified code
V0.2 2017-5-16 added red/blue mode indicators
V0.1 2017-5-16 initial
inputs:
(A0) strobeFrequencyPot
(A1) cartSensor - connect to A1 & +5V and 10k
resistor A1 & GND
(A2) modeButton
outputs:
(5) redLED = mode 0, syncStrobe (variable)
(6) blueLED = mode 1, variableStrobe (variable)
(8) strobeRelay (on/off)
(9) cartLED (variable)
*/
// user can play with these for fine tuning
// optical cartridge settings
int cartLedBrightness = 200; // cartridge LED brightness
int sensorThresholdLow = 450; // sensor at black spot
int sensorThresholdHigh = 500; // sensor at white spot
int modeLedBrightness = 160; // mode indicator LED brightness
int strobeHoldTime = 5; // how long the strobe signal is ON
//------------------------------------------
// set pin numbers inputs
const byte potPin = 0; // (A0) reads strobe frequency pot
const byte lightSensor = 1; // (A1) cartridge light sensor
const byte buttonPin = 2; // (2) number for modeSwitch
// outputs
const byte mode0LedPin = 5; // (5) syncStrobe mode LED, red
const byte mode1LedPin = 6; // (6) variableStrobe mode LED, blue
const byte strobePin = 8; // (8) to relay triggering the strobe
const byte ledPin = 9; // (9)) variable power to cartridge LED
int photocellReading;
int buttonReading = 0;
// other inits and defaults
byte buttonState = 0;
byte mode = 0; // modes: 0=syncStrobe, 1=variableStrobe
byte cycleFlag = 0; // used in syncStrobe
// for rpm calculation in mode 1
int frameRangeMin = 10;
int frameRangeMax = 24;
int frameRange = frameRangeMax - frameRangeMin;
int potRangeMin = 0;
int potRangeMax = 1023;
int timeSlice = potRangeMax/frameRange;
int frameFrequency;
int frequencyPot;
void setup()
{
pinMode(ledPin, OUTPUT);
pinMode(mode0LedPin, OUTPUT);
pinMode(mode1LedPin, OUTPUT);
pinMode(strobePin, OUTPUT);
pinMode(buttonPin, INPUT);
analogWrite(ledPin,cartLedBrightness);
Serial.begin(9600);
}
void loop()
{
/*
buttonState = digitalRead(buttonPin);
Serial.println(buttonState);
*/
// workaround for arduino not recognizing DIGITAL INPUT
buttonReading = analogRead(buttonPin);
//Serial.println(buttonRead);
if (buttonReading > 1000) {
buttonState = HIGH;
}
if (buttonReading < 10) {
buttonState = LOW;
}
if (buttonState == HIGH) {
mode = 1;
analogWrite(mode0LedPin,0);
analogWrite(mode1LedPin,modeLedBrightness);
analogWrite(ledPin,0);
} else {
mode = 0;
analogWrite(mode0LedPin,modeLedBrightness);
analogWrite(mode1LedPin,0);
analogWrite(ledPin,cartLedBrightness);
}
// decide which operations mode we’re in
if (mode == 0) {
// syncStrobe mode
photocellReading = analogRead(lightSensor);
//Serial.println(photocellReading);
if (photocellReading < sensorThresholdLow && cycleFlag == 0)
{
Serial.print(“photocellReading: “);
Serial.println(photocellReading);
Serial.println();
digitalWrite(strobePin, HIGH);
delay(strobeHoldTime);
digitalWrite(strobePin, LOW);
cycleFlag = 1;
}
if (photocellReading < sensorThresholdLow && cycleFlag == 1)
{
//DO NOTHING
}
if (photocellReading > sensorThresholdHigh && cycleFlag == 1)
{
cycleFlag = 0;
Serial.print(“photocellReading: “);
Serial.println(photocellReading);
Serial.println();
}
} else {
// variableStrobe mode
frequencyPot = analogRead(potPin);
frameFrequency = (frequencyPot/timeSlice)+frameRangeMin; // calculate frequency from spin time
Serial.println(frameFrequency); // diagnostics
// fire strobe
digitalWrite(strobePin, HIGH);
delay(strobeHoldTime);
digitalWrite(strobePin, LOW);
delay(1000/frameFrequency);
}
}