FPP-3: DIY Film and Paper Processor

  • Published

Discover the FPP-3, a DIY film and paper processor using Arduino automation and 3D-printed parts. Explore features, setup, and benefits for film enthusiasts.

Processing was tedious and time-consuming with only a manual rotation device and a small JOBO 2520 drum. Determined to improve efficiency, I developed the Film and paper processor v3 (FPP-3), which streamlines the process, ensuring uniform and reproducible results with less effort and time, utilizing Arduino automation, and 3D printing. Here the story of the DIY project.

The Beginning

This adventure started after my last trip to the Dolomites in 2023. I ended up with more than 40 sheets of 4×5 film and several rolls of 35 mm film. At that time, I only had a self-made manual rotation device (which I called “Film Processor” v2, in short FP – 2) (see Fig. 1) and the smallest JOBO drum 2520. With this drum and the 2509 reel, a maximum of 6 sheets per batch can be processed. This means that  you needed minimum 8 loads with processing times of at least 30 min.

I love developing films, it’s like therapy for me, but the manual work is tedious and you get tired. It is also difficult to maintain the same pace in order to keep a constant angular speed with three revolutions on each direction. These parameters are essential for uniform and reproducible development.

Fig. 1: The FP-2, the previous manual version

While developing these sheets, my mind started to imagine how to mechanize this process to minimize development time, improve consistency, and better dedicate some time to printing some of my best photographs. After some reflection, I concluded that I have a few options: either I start saving a lot of money to buy a new JOBO CPP-3 (over 4K Euros); or I buy a used JOBO system (e.g.,  CPA-2, CPP-2, CPE2 or  CPP-3) which cannot be found for less than 2K Euros; or I must design and build an automatic system that suits my needs.

I like challenges, so I decided to try to build an automated successor to FP -2. I liked this option because it also allows me to expand and improve this primitive device so that I should be able to develop not only film but also photographic paper up to 40×50 cm.

The CPP-3 can of course do that too, but as I said above, you have to make a large initial investment, not only for the processor, but also for a set of large drums that allow you to develop multiple rolls of film or sheets and paper.  JOBO offers several options for 4×5 and large formats, for example the Multitank 5 or the large Multi-Drum 3000 series (left). Unfortunately, JOBO does not manufacture the 2800 series (print drums) anymore.

I started reading in various forums and found valuable information (LFP-Forum, Photrio). For example, that the 2500 (film) and 2800 (paper) drum series are compatible, that the 2870 print extension module and the 2560 film drum extension module are definitely the same. That a print drum can be converted into a film drum by exchanging the cup for a funnel, etc.  It is only necessary  to pay attention to the core extensions, as the print drum (2831) is slightly longer than the film tank (2551). This modularity makes the JOBO system unique.

With this information, I was able to buy several components on eBay at a reasonable price and condition. Currently I have several tanks (2550 or now multi-tank 5, 2520, 2560 and 2830), a beaker, and several core elements (available as a set only in CatLabs). With these modules I can make various combinations fitting various needs.

Having the drums, I proceeded to design the device, which I called “Film and Paper Processor v3, abbreviated FPP-3“. There is a certain resemblance to the names used for the famous JOBO products, which I do not deny, however, the choice of letters describes exactly what this device is supposed to do.

Basic functions of the FPP-3

The conceptualization of the FPP-3 was inspired by the “less but better” paradigm introduced by Dieter Rams (the mastermind behind the beautiful Braun 8 mm Nizo camera). According to Rams, good design: is innovative, makes the product useful, is aesthetic, is durable, is unobtrusive, is honest, is long-lasting, is environmentally friendly, and is meticulous down to the last detail, among others. The features I envisage for the FPP-3 are:

  • a simple control panel;
  • few buttons to control motor start and stop, cycle time and rotation speed;
  • possibility to develop film and paper up to 40×50 cm, and
  • temperature control.
Fig.2 : Mock-up of the control panel

The control panel menu should be as simple as possible (Figure 2). On the first attempt, no programmed development sequences will be programmed (e.g. for B&W, C41, or E6 films, or paper). 

I envisioned one button for on/off and four keys in the keyboard to control the start (C), stop (D), and two to enter development time in minutes (A) or seconds(B). Numerical values are entered with the key (#) and corrections with (*). The angular velocity of the tanks will be controlled with the potentiometer hand-turning button. That’s all.

Components: Motor, Controler, and Tray

The main criteria for the selection of components were: the electronic microcontroller should be cost-effective, open source, and easy to learn, program, and maintain.  The motor and brackets should be heavy-duty. The torque of the motor should be enough to maintain the angular speed of 75 RPM with the largest possible tank. the JOBO 2850 (2830+2870), with a full load of 4×5 or 120 film.  The tray should be black and made of high-density polyethylene due to its durability,  higher rigidity, 100% recycled, thermal characteristics, and drillable.

The decision for the controller was easy: the Arduino Uno controller with a keyboard, a potentiometer and a 4-line LCD (Fig. 3)

Fig. 3: FPP-3 circuit under development

The first question that needed to be answered was how big a JOBO 2850 print drum should be. The only way to answer this question was to buy a drum and measure it (Fig. 4). JOBO does not provide drum dimensions in any user manual. Once I knew the maximum dimensions, I started looking for HDPE containers. The best option I found was a heavy-duty 30 l tray with a drain from DENIOS. The dimensions of the tray were close to the ideal.

Fig. 4: Measuring the JOBO print drum 2850

The next question was, how powerful should the motor be to move a tank at 75 rpm (standard JOBO speed)? Using some knowledge of physics (moments of inertia of a cylinder, angular acceleration, torque, efficiencies, etc.), I concluded that the motor should have at least 1.5 Nm to avoid stalls, without safety factors. Searching the internet, I found the torque of the original engine used in the CCP2 JOBO processor.

This fact confirmed my estimation. With these parameters (i.e. maximum angular velocity and torque) I searched for a suitable motor and gears. The search for the motor took me weeks. By chance I ended up at an amazing company goBILDA that produces high-quality, heavy-duty motors, gears, and all kinds of components for building robots (Fig. 5). Two questions remain: how to build the motor mount and how to control a motor with an Arduino UNO?

Fig. 5: The motor and support now to be linked with the prototype circuit.

External design

Designing a clean and functional layout for the controls proved to be a real challenge. I aimed for a minimalist system, but the possible configurations seemed endless. The JOBO processors served as a source of inspiration, though I found their larger systems unnecessarily complex for my needs—a view shared by others as well. However, the color scheme was an easy decision: with JOBO’s signature black and red tanks, I adopted the same palette.

The next question was the placement of the control knobs—should they go on the left, like on the JOBO units, or on the right? I chose the right side (Fig. 6), as it felt more natural and comfortable to use. With that decision made, the next step was planning the internal layout and allocating space for each component.

Fig. 6: 1st sketch of the console for the FPP-3

Software (Firmware v3.0)

Writing the software to run the Arduino was a real challenge, as it was my first time programming a microcontroller in C. My previous experience with Fortran helped me structure the code, but the learning curve was steep. What truly helped were the excellent blogs by:

  1. DroneBotWorkshop: The master classes offered by Bill (thanks !)  helped me to understand and program the operation of a 12 V DC motor with an H-Bride, to set up a Keypad and a LCD display in Arduino. These tutorials were the best discovery I made in this project because I felt lost at the beginning.
  2.  The Arduino Forum: On this site, I had the chance to ask direct questions to real experts (“gurus”) which helped me to understand how to devise an Arduino code to perform various operations. One of them suggested introducing motor or development states (e.g. motor running, motor stopped, input data, stop). Without their support, it would have taken me months to get the device working as I expected. Kudos to these amazing people who invest their time in helping students and amateurs like me achieve a goal just for their love of programming!

With his help, I had a working prototype within a few weeks (Fig. 5). The initial code was able to move the motor back and forth, and to start and stop it on command. Once this basic functionality was in place, I began implementing refinements—such as a potentiometer to control the rotation speed, a countdown timer, and parameterized rotation cycles.

I read in the excellent book THE ROTARY PROCESSOR MANUAL by John Tinsley, that an effective development cycle should consist of three complete rotations for optimal results. Using this guideline, I developed equations to define acceleration and deceleration phases, along with a steady-state phase where the motor reaches its maximum angular velocity, as controlled by a potentiometer. This approach allowed me to estimate the device’s average angular speed. Based on JOBO literature and Tinsley’s recommendations, I concluded that an average speed between 45 and 75 RPM is ideal for developing both film and paper. Further technical details—including the implementation—can be found in the C code available on my github.

To streamline the design process, I built a cardboard mock-up (Fig. 7). I experimented with various sketches and shapes before settling on a straightforward solution: a minimalist accessory composed of two red plates and a black box mounted on top to house the main controls. This unit is securely screwed onto the tray. On the right side, I allocated space for an acrylic plate to support the circuitry (Fig. 8), with the electronics protected by a perforated aluminum sheet that adds both ventilation and a clean aesthetic. The structure supporting both the controls and the motor was assembled using aluminum profiles.

The potentiometer knob was 3D-printed in PLA by 3DDesign24, using a DXF file sourced from Thingiverse under a CC BY license.

Fig. 7. Final mockup of the console

The tray lid was designed to accommodate up to seven 1000 ml plastic bottles—such as those from Kaiser or JOBO (Fig. 9). One key consideration was the placement of these bottles. Essentially, there are two layout options: positioning the bottles at the front of the tray, as seen in JOBO processors, or placing them at the back. Based on my experience with version 2 of my manual processor and the workflow I developed around it, I found it more practical to position all the solution bottles at the back. This configuration reduces effort during the various stages of film and paper development, particularly since I do not plan to implement a lift mechanism like that of the CPE-2. This choice also contributes to a cleaner and more streamlined design.

Fig. 8: Acrylic plate for mounting the circuits. | This photography was taken with a Minolta X-700 | Cinestill 400 | Development: C41 (Jobo chemistry) and the FPP-3. This roll was the second developed in this processor.
Fig. 9: Tray lid and plates designed and cut.

For designing the various components, I used two open-source CAD programs: freeCAD and LibreCAD. While FreeCAD offers full 3D modeling capabilities, I found LibreCAD significantly easier to use for 2D drafting. Using LibreCAD, I created DXF files for fabricating the plates. For materials, I chose 3 mm transparent polycarbonate for the circuit boards, 3 mm black high-density polyethylene for the internal partitions and case covers, and 3 mm RAL 3020 PVC hard foam board for the tray lid and the device’s side panels. The final assembly is shown in Fig. 10.

Fig. 10: FPP-3 ensembled and last version of the code uploaded.

Materials and production price

Anyone interested can obtain the complete list of materials and unit costs, as well as detailed instructions for building the FPP-3. However, the total cost of the FPP-3 is much lower than that of a used CPE-2 on eBay. I have invested at least three months in planning and realization.

Building the FPP-3 was a great experience for me. I learned a lot!  The construction was done in a period of three to four weeks (not full-time). The search for suitable materials was, however, time-consuming.

First Test

The FPP-3 has now been tested with the following JOBO tanks: 2551, 2551 (new Multitank 5), 2830, and 2840. Ilford MGRC paper glossy (30×40 cm) was used for the 1st test (Fig. 11). The results were excellent.

The volume of chemicals caused me difficulties because the information from JOBO is sometimes contradictory. However, I found good information in these links (Classic-photo-supplies) and in John Tinsley’s book mentioned above.

The drums have to be accurately leveled (I leveled the inner side) and the coverage of the suggested minimum quantities. I provide at least 10% more than necessary to minimize errors.

As for the tested angular speeds (ω), good results have been obtained with 73 RPM average ω for the paper (reversing every 3 turns) and 60 RPM for the E6 chemistry. The water bath temperature is set to 39.8 C so that the solutions are at 38 C for color film. For paper and B&W, the water bath temperature is
set to 20 C.

Fig. 11: 1st test of the FPP-3 with Ilford MGRC paper (30x40 cm). Enlarger LPL 7451 | S-K Componon 150 mm lens | Negative: T-max 100.

Testing with the largest JOBO Drum (2850)

One of my original aims was to be able to make my own large prints, and if possible increase the efficiency of the process. To achieve this one needs a large JOBO drum like the 2850 (i.e. drums 2830+2870). The FPP3 was designed for this purpose since the largest drum that fits the CPE-2 (i.e. 2830+2820) is the drum 2840.

To test the device, I prepared two exposures on Ilford MGRC paper (glossy) 30×24 cm. I put them in the drum, added 200 ml developer, and let them run for 1 minute. Then 10 s with the stop solution and 1 min with the fixer. I set the average angular speed to 75 rpm. The results were very good as you can see in Fig. 12.

This experience was very pleasing. The ultimate goal was achieved. It was possible to develop large exposures in my improvised darkroom. This implies that the maximum size possible with my system is 40×50 cm. If I need larger (very exceptionally), I would have to send my scan to a professional lab like WhiteWall, as I have done a couple of times. For most of my prints, FPP-3 works!

The next challenge is to use FPP-3 to make color prints with 30×24 cm RA-4 paper. I will create a new blog entry to share my experiences.

Fig. 12: First dual print in the FPP-3

The Logo

I decided to finish this blog with a picture of the logo I created for my device. I think this effort deserves this final step. The design is simple. It includes the name of the device and the name of its inventor. I used free LaTeX fonts and printed it on a transparent sticker with a laser printer. The result is quite pretty (Fig. 13).

Fig. 13: FPP-3 logo

Firmware v4.0 Refactoring (Dec. 2025)

The FPP-3 is my third-generation rotary film and paper processor. With firmware v4.0 the controller and hardware finally work together as a compact, light-tight, temperature-stable system that makes rotary processing much more controlled and repeatable, without losing simplicity.

The aim remains the same: bring the advantages of rotary processing for film and paper into a controllable, repeatable and comfortable system.

Hardware Highlights

Several hardware changes were made to turn the FPP-3 into a practical darkroom tool:

  1. Thermostatic Control (±0.1 °C)

    The water bath is now controlled with a fine-resolution thermostat, capable of holding the target temperature within approximately ±0.1 °C. This is especially useful for tightly specified colour processes (C-41, E-6, RA-4), where even small temperature drifts can affect contrast, color balance and grain.

  2. Recirculation Pump

    A dedicated recirculation pump keeps the water bath well mixed. This avoids temperature stratification and helps ensure that all JOBO tanks™ on the bed see (almost) the same temperature throughout the entire process.

  3. Acrylic Flat Bed for Smooth Tank Motion

    The rotation bed is now a single, stiff acrylic plate that can be precisely leveled and barely deflects under load, giving a much more stable support than my first prototype with plastic beams. On top of the acrylic sit four JOBO rollers, so the tanks ride on a flat, well-defined plane and remain almost perfectly horizontal during rotation and reversals. Because the bed is laser-cut, its geometry and hole positions are very accurate, which improves alignment, repeatability and leveling tolerance compared to hand-cut or assembled constructions.

  4. Light-Tight Electronics Box

    The controller box is now light-tight: internal LEDs are painted or masked, and all seams and gaps are sealed. This allows the FPP-3 to be run in absolute darkness without fogging paper or film, and without having to power the unit off during sensitive steps. The new backlight control in the firmware complements this (see below).

Fig. 14: Contyroler State Machine (upgraded In yellow)

Software: What’s New in Version 4.0

The firmware for the FPP-3 controller builds on the existing state-machine design =, but Version 4.0 significantly cleans up the logic, improves the WAIT/menu handling (Fig. 14), and adds persistent settings plus new interaction modes. A key improvement is that the speed potentiometer now safely adjusts the tank RPM even while the motor is running, with proper anti-jitter filtering and updated cycle timing.

1. Dynamic, Stable Speed Control

The tank speed is set with a potentiometer and mapped to a narrow window around a rotary-processor-like nominal speed (from 50–75 rpm, with limits enforced by deltaMax and wTankHigh).

The controller now implements:

  • Anti-jitter filtering (minimum RPM change threshold and ~200 ms update interval), so the displayed RPM and actual motion do not twitch due to ADC noise.
  • On-the-fly updates while the motor is running, allowing you to fine-tune agitation during development without stopping the process.

Internally, the code computes:

  • theCycleTiming for one CW/CCW half-cycle (based on nFullRev and the current RPM),
  • breakCycleTime for the braking phase, and
  • wMean, the effective average RPM over the accelerate–run–brake cycle.

This yields a smooth, repeatable tank motion very close to commercial rotary processors.

2. Revised Controlled Bidirectional Rotation

To mimic classic rotary behaviour, Version 3.0 already include:

  • Runs the motor in cycles of a fixed number of full rotations (nFullRev) in one direction.
  • Applies three phases in each half-cycle:
    • Acceleration (0 → target PWM),
    • Constant speed,
    • Braking (target PWM → 0).
  • Inserts a short pause and then reverses direction (CW ↔ CCW) after each half-cycle.

In V4.0 I refined the motion parameters to soften direction changes, reduce stress on the drive train, and keep the chemistry moving smoothly and evenly along the tank.

3. Persistent Timings with EEPROM

The controller now stores its main timing configuration in EEPROM:

  • tMinutes and tSeconds (the main development time) are saved and reloaded on startup.
  • Settings survive power cycles, so the last used timing is immediately available when you switch the unit on again.

This is particularly helpful if you repeatedly run the same process (for example, a favourite C-41 kit or a standard RA-4 workflow).

4. Programmable Development Steps (Slots 1–9)

Version 4.0 introduces nine programmable slots for common process steps. Each slot stores a (minutes, seconds) pair in EEPROM.

In WAIT state:

  • # then a digit 1..9 → store the current time into that slot (e.g. developer, stop, fixer, bleach, etc.).
  • A digit 1..9 → recall the stored time from that slot and use it as the new main timing.

All step definitions are persistent across resets and power loss. This makes it easy to pre-program a complete process chain, for example, for E6 (Jobo):

  • 1: First developer (6′ 15″)
  • 2: Reversal bad (2′ o”)
  • 3: Color developer (6″ 0″)
  • 4: Pre-bleach (2″ 0″)
  • 5: Bleach (6′ 0″)
  • 6: Fixer (4′ 0″)
  • 7: Preheat (5′ 0″)
  • 8: …
  • 9: …

Actual assignments are up to you, they can be changed at any time. Just press # and then a digit from 1 to 9. In this way, the prerecorded times coincide with the reactive bottle number I have in the tray. Super easy.

5. Darkroom-Friendly Backlight Control

To allow operation in total darkness without cutting power, the LCD backlight is controlled by a simple keypad gesture in the WAIT state:

  • If the backlight is ON: press * and, within ~1 s, # → backlight OFF (controller keeps running, box stays light-tight).
  • If the backlight is OFF: press * → backlight ON.

These keys are handled specially in WAIT (no echo to the display), so you do not accidentally change menus when you only want to kill or wake the light.

6. Clean Menu Logic and Key Assignments

Main interaction is via the 4×4 keypad.

In WAIT state:

  • A – Edit minutes (ST_SETTIMING_M).
  • B – Edit seconds (ST_SETTIMING_S).
  • C – Start motor and timer (ST_STARTMOTOR).
  • D – Stop motor (ST_IDLE).
  • 1..9 – Recall stored step times (if defined).
  • # then 1..9 – Store current time into a step slot.
  • * / * then # – Backlight on / off (as above).

In SET_MIN / SET_SEC states:

  • Digits 0..9 build the new value.
  • # confirms and applies the new minutes/seconds.
  • * cancels and returns to the main menu.

The LCD displays:

  • Line 1: Title (“Film-Paper Processor”).
  • Line 2: Current time setting (minutes + seconds).
  • Line 3: Current maximum tank RPM (Rmax).
  • Line 4: Compact key help or, during a run, the average RPM (Ravg) plus countdown timer.

7. End-of-Run Acoustic Warning

A small buzzer gives a short beep in the last 5 seconds of the run:

  • It triggers once as the timer crosses the 5 s mark.
  • It does not stop or disturb the motor.
  • It automatically turns off after ~200 ms.

This gives just enough warning to get ready for the next step without constantly watching the display.
All changes described here are implemented in the FPP-3 controller firmware Version 4.0, and are documented in the updated README in the Git repository.

This Post Has 9 Comments

  1. Pedro Jose

    Que genialidad!
    Gran trabajo y excelente historia desde el concepto, pruebas, mejorías, y producto final! Me encantó.

    1
  2. Karl Dahlman

    Brilliant!
    I would like to get the information needed for making one for myself!

    0
  3. André

    Great project – thanks a lot for sharing!
    I am at the beginning of my journey to build a rotary processor just for b/w-negative development. Therefore, my target-construction shall be a much simpler and smaller one. However, I learned a lot from your experience and want to thank you very much for your time and effort to put this report together. Very much appreciated!!

    1
  4. André

    Oh, I forgot: Would you please provide me with the list of material and cost as mentioned in your article?
    Thanks in advance!

    0
  5. André

    Great project – thanks a lot for sharing!
    I am at the beginning of my journey to build a rotary processor just for b/w-negative development. Therefore, my target-construction shall be a much simpler and smaller one. However, I learned a lot from your experience and want to thank you very much for your time and effort to put this report together. Very much appreciated!!
    Would you please provide me with the list of material and cost as mentioned in your article?
    Thanks in advance!

    1
    1. Luis Samaniego

      Thanks, André. I sent an email to the address provided. I hope it helps. Good luck. Luis

      1
  6. ZIQIANG CAO

    Very nice item, I am making it from your article , could you tell me the motor model?

    0
    1. Luis Samaniego

      Hi. I do not have the serial number with me now but I guess it was this: https://www.gobilda.com/5203-series-yellow-jacket-planetary-gear-motor-71-2-1-ratio-24mm-length-8mm-rex-shaft-84-rpm-3-3-5v-encoder/
      I selected one motor with enough torque and able to produce 75 RPM. This one has 84 RPM and 93.6 kg cm. It is an overkill, but since I would like to use large tanks and reduce the stress the motor, this one fitted well. I have used over two yeards and works perfectly. I will create a full list of components after I finish the temperature control that I building now.
      L.

      0

Leave a Reply