tim savas

broken link
broken link


Look what we have here. It's a table—that turns. It's a "turntable." [studio audience erupts in applause]. Radieye is a tripod-mounted, programmable turntable for repeatable still photography and rotary time lapse photography.

broken link

The fun doesn't stop there. I designed Radieye to be used as a "reverse 3D printer," whereby a set of photos are taken 360 degrees about an object, then patched together via 3D modeling software in post. I think of it as a kind of reverse 3D printer. A 3D printer translates a 3D illustrated object into a physical one. Radieye does the reverse, turning a physical object into a 3D model.

I started developing Radieye out of an interest in adding pan to Xy. More specifically, I wanted to use Xy to rotate a DSLR camera in a precise circle around an object, rendering this "spinning" effect during time lapse sequences. But there was a far simpler way to achieve this effect. When I explained the idea to a friend, he responded, "Why don't you make a turntable, so that the object turns in a circle, instead of moving the camera in a circle about the object?"

broken link

I was in good company, it turns out. This proved to be a far more elegant idea than my original thought. Radieye uses just one motor and axis of rotation, instead of the three required for moving the camera in a circle while trained at its center. I took to some CAD that week and knocked out Radieye's hardware pretty swiftly. There are some features I like about it.

broken link

Radieye's gearing components interface with a custom 1" bore hollow shaft I turned on a lathe. A fun piece to make. The piece itself and its clamps are nested into surface inlays on the two main polycarboate components, so the whole table sits super low on the tripod, and all the hardware stays hidden. Looking at clean design features like that, you'd almost never think I spend every other Friday night eating takeout Vietnamese while whiteboarding what exactly it is I think I should be doing with my life.

broken link

Manfrotto tripod legs come machined with three 10-32 tapped holes on their base, so Radieye attaches just like any standard tripod head. The camera can be positioned on the same set of legs with a Manfrotto magic arm, too. It all comes together as one nice and neat package.

broken link

Software is eating hardware, as it were. Radieye is controlled through a web browser. I developed a Javascript-based user interface that communicates to Arduino through node.js. The original client-side code I wrote is below. In the browser, the user enters a series of parameters to call out the desired number of rotations and photos per turn. Hitting go, the camera shutter and turntable actuate in sync according to their input parameters.

Shout out to everyone at the Harvard Extension DGMD15 course who coached me from the corner throughout this battle.

var five = require("johnny-five");
var board = new five.Board();
var motorSteps = 200 * 8;

board.on("ready", function() {

    var LEDpin = new five.Pin(13);
    var analogPin = new five.Pin('A0');
    var shutterPin = new five.Pin({
        pin: 12,
        type: "digital"

    var stepper = five.Stepper({
        type: five.Stepper.TYPE.DRIVER,
        stepsPerRev: 200,
        pins: {
            dir: 8,
            step: 9

    var express = require('express');
    var app = express();

    var run = function(passes, interval, shots) {
        console.log("Running run with passes:", passes, "interval:", interval / 1000, "shots:", shots);
        var i = 0;
        var setRun = setInterval(function() {
            console.log("Make another revolution or stop", i);
            //step(); You actually don't need this for your 
            if (i < passes) {
                revolution(interval, shots);

            } else {


        }, interval * shots);

    var step = function(shots) {
        stepper.step({ steps: 4 * motorSteps / shots, direction: 1 }, function() {

    var snap = function() {
        setTimeout(function() {
        }, 200);


    var photoStep = function(shots) {
        setTimeout(snap, 1 * 1000);

    var revolution = function(interval, shots) {

        var i = 0;
        var setStep = setInterval(function() {
            if (i < shots) {
            } else {
        }, interval);

    app.get('/form', function(req, res) {
        res.sendFile('form.html', { root: './node_modules' });

    app.get('/stylesheet.css', function(req, res) {
        res.sendFile('stylesheet.css', { root: './node_modules' });

    app.get('/run', function(req, res) {
        run(req.query.passes, req.query.interval * 1000, req.query.shots);


    app.listen(3000, function() {
        console.log("Server's up at http://localhost:3000!");

broken link broken link broken link broken link broken link broken link broken link broken link broken link


Xy is an open-source project. I know, I'm such a nice guy. Below is a complete bill of materials. All custom components can be milled from 1/2" thick material, or check out the STL folder to 3D print them. CAD models and drawings are to the right. The Github repo is the best place to start.

SW Name Code Description Q QP Cost/Unit Cost Serial Supplier
128T_gear MOT 128T, 32 pitch 1" bore gear 1 1 $16.99 $16.99 615238 Servocity
flanged_bearing MOT 1" bore flanged bearing 2 2 $6.48 $12.96 535051 Servocity
shaft MOT 1" bore shaft 1 1 $4.49 $4.49 635166 Servocity
nema14_motor MOT Nema 14 stepper motor 1 1 $9.77 $9.77 14HS17-0504S Stepper Online
pinion_5mm MOT 5mm bore 32 pitch, 16T pinion gear 1 1 $7.99 $7.99 615342 Servocity
hub_clamp MOT 1" clamping hub 1 1 $5.99 $5.99 545354 Servocity
S-010-050-NUT-SS HRD #10 1/2" screw 4 1 $4.04 $4.04 92185A242 McMaster Carr
M-030-160-SKT-H-SS HRD M3 16mm screw 4 1 $5.20 $5.20 91292A115 McMaster Carr
S-006-050-SKT-H-SS. HRD #6 1/2" screw 4 1 $2.56 $2.56 92185A148 Servocity
stage PLC turntable stage 1 1 custom custom custom timsavas
mount PLC motor and tripod mount 1 1 custom custom custom timsavas
broken link broken link
775 670 3447 / tsavas[@]media.mit.edu