GoSlo, A 3DPrinted Remote Pinhole Camera.

In which our hero adds a servo-driven shutter to his 3D printed pinhole cameras, & remote and programmable control via Arduino and friends.

Similar projects worth following
Ever since I designed my first pinhole camera, I have been thinking about having some kind of servo-actuated shutter. This simple addition could allow for:
- remote operation,
- "fast" exposures, smoother than possible by hand (fast being relative for pinhole),
- the potential for precise timing and/or autoexposure.

One of the limiting factors for pinhole photography in bright light is operating the shutter without moving the camera. Even with a tripod, attempting to make an exposure of a half-second will probably induce enough camera motion to blur the resultant image. I have often found myself wishing I could open and close my camera's shutter without being obvious. There are situations where I don't wish to draw attention to myself as a photographer or provoke self-consciousness in people.

My "robo-shutter" could be implemented as a wired trigger, wireless/RC trigger, pre-set timer, or autonomous.

I designed my terraPin 3D printed pinhole camera with interchangeable "extensions" or pinhole/shutter assemblies.

Without 3D printing an entire dedicated camera, I can just change a sub-assembly that dictates the angle of view and magnification. Or the way the shutter is actuated.

The first step in the GoSlo (not GoPro) Robo-shutter project is to interface a shutter with the servo. From the very beginning, I've been thinking about how to stick a servo on the front of my cameras. My goal was for minimal modification of existing designs to accommodate the servo. The first "micro-servo" I tried turned out to be just a bit too large for my purposes. At a local hobby shop I found a smaller form-factor in the Common Sense CSRC-35 Ultra Nano Servo.

The modified files are now on Thingiverse, and the servo recesses into a cavity and is held in place by plates that clamp the servo mounting tabs. In the 6X9 extension, I have the luxury of room to use 3mm bolts to clamp the servo. In the case of the 6X6 extension, smaller plates utilize the tiny screws that come with the servo.

The Shutter blade has been slightly modified to give a large lever arm, but lacks a designed hole for a pushrod (connected to the servo). An easy technique is to heat a bit of #12 piano wire and quickly melt a hole, through which the pushrod (made from the same piano wire) will activate the shutter. After making a custom pushrod, every shutter will be a unique assembly with a specific numerical specification for the servo's positions at the extremes of "open" and "closed". I could leave the testing as an exercise for the reader, but I will be posting code for the shutter and set up. In order for YOUR shutter to work properly, you will have to ascertain the values to send to the servo.

Code pending.

  • 1 × trinket Arduino (mostly-) compatible
  • 1 × trinket pro Arduino - compatible
  • 1 × Common Sense CSRC-35 Ultra Nano Servo - 3 gram
  • 1 × any Arduino
  • 1 × #12 piano wire Electronic Components / Misc. Electronic Components

View all 7 components

  • Photos, or it didn't happen!

    theschlem01/31/2018 at 18:43 0 comments


    Here's a link to some pinhole photos I have made with the GoSlo 6x9:

  • Photos

    theschlem03/06/2015 at 08:15 0 comments

    At this writing, the first two rolls of film have been uploaded to Flickr.

    Also a blog post to the 52Rolls photo project has been uploaded.

  • GoSlo Code for Adafruit Trinket

    theschlem03/06/2015 at 07:52 1 comment

       Version 1
       For Arduino Trinket by Adafruit
    Code for controlling a servo-driven shutter on a pinhole camera via a cable
    from a distance.  Simplicity and reliability are paramount.  Such a remote /
    automatically controlled shutter-equiped camers, mounted on GoPro (or similar) 
    hardware shall be collectively termed a GoSlo camera system.
    Lacking proper PWM output, a clever hack is utilized to update the
    position of the servo arm via an interupt.  This should have minimal
    impact on functionality, but similar code could be easily written
    for other Arduino (semi-) ompatibles.
    Suitable camera applications are:
    Servo-ready parts for these cameras are pending on
        created  02/21/2015
       by Todd Schlemmer
       Adapted from TrinketKnob/SoftServo by Adafruit

    This sketch allows for remote control of a servo-driven pinhole camera shutter.
        Required library is the Adafruit_SoftServo library
        available at
        The standard Arduino IDE servo library will not work with 8 bit
        AVR microcontrollers like Trinket and Gemma due to differences
        in available timer hardware and programming. We simply refresh
        by piggy-backing on the timer0 millis() counter
        All circuitry is housed in a case with the 6-12V battery pack, and connected to the 
        shutter servo via a standard 3-wire servo cable(s).  Servos can be controlled by 
        connecting mutiple cables, many meters in length.  
        Handheld remote 
          power switch
          safety switch -momentary (unable to open shutter if not depressed)
          shutter switch -toggle
          status LED tied to PIN1, used for status, debugging, error purposes
    ******** diagrams and pinouts ***********************
                             Trinket Arduino Compatible
                                    By Adafruit
                                    MINI USB
                              _____|        |_____
                             |  _  | ||  || |  _  |
                             | (_) | ||  || | (_) |
                             |  _  | ====== |  _  |
                Green LED    | [G] |________| [R] |   red status LED
                (power)      |                    |
                      BAT +  | O  [] [] []  ||  O |   USB 5V+
                             |              ||    |
                      GND -  | O   =[]=  []     O |   #0               SERVOPIN
                             |     =[]=           |
                      #4     | O                O |   #1  (red LED)    LEDPIN
                             |     _u_u_u_        |
       SAFETYPIN      #3     | O  |       |     O |   #2               SHUTTAPIN
                             |    |       |       |
                      RESET  | O  |_______|     O |   5 V+ (regulated from BAT)
                             |  _   n n n      _  |
                             | (_)  |    |    (_) |
                             |_     |_[]_|   _____| 
                                 Reset switch
                   Servo Plug
                   |   __  _       |
        Ground     |  [__] _]      |==brown wire============
                   |   __  _       |
        5V +       |  [__] _]      |==orange wire===========
                   |   __  _       |            
        Signal     |  [__] _]      |==yellow wire===========
     ******** ARDUINO Wiring ***************************************
    BAT & GND wired to battery pack through power switch
    Pin #0 to servo signal
    Pin #1 to status LED
    Pin #2 from shutta switch (toggle 1=open 0=closed)
    Pin #3 from safety switch (momentary)
    // ***************** Declarations and Initializations ******************* 
       //int VariableName = 2;       //comment
       //#include <Library.h>        // some library module
    #include <Adafruit_SoftServo.h>  // SoftwareServo (works on non PWM pins)
    #define SERVO1PIN 0   // Servo control line (orange) on Trinket Pin #0
    #define LEDPIN 1      // Status LED wired to Pin #1
    #define SHUTTAPIN 2   // Toggle switch (shutter control) on Trinket Pin #2 (Analog 1)
    #define SAFETYPIN 3   // Momentary pushbutton on Trinket Pin #3
    Adafruit_SoftServo myServo1, myServo2;  //create TWO servo objects
    int OpenedValue = 102;      // Servo position for opened shutter, determined experimentally with ShuttaSetup
    int ClosedValue = 23;       // Servo position for closed shutter, determined experimentally with ShuttaSetup
    int servoPos;               // variable for servo position
    // ************************************************** 
    void setup() 
      // Set up the interrupt that will refresh the servo for us automagically...
    Read more »

View all 3 project logs

Enjoy this project?



Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates