Darkroom geekery #1

If you have been following me on twitter, then you already know what I have been working on over the last couple of months: I have been making stuff for my darkroom with Arduino and Atmega micro controllers. The reason for this sudden surge of geekery was a problem that I was facing after buying a large format camera in November, namely that I simply couldn’t find the space for a 4×5 enlarger in my already cramped office. When I bought my Durst M670 enlarger, I already had to play quite a bit of real world tetris and ended up choosing my enlarger by size and not by functionality. I wanted an enlarger that could do at least 6×6 and it needed to fit into a wardrobe, which was the only space left in my office. In the end I found a nice Durst M670 with a vario contrast diffuser head that had the right diffuser box for printing medium format. The baseboard has a snug fit in the wardrobe and at the highest position the head just about fits. It’s as if it was made for this particular space.

Durst M670 with a VC head.

Durst M670 with a VC head.

Although I chose it by size, it turned out to be a great enlarger and I have been very happy with it. The only problem I have with it is that it can only print up to 6×7. By now I also shoot 6×9, 4×5 and a weird panoramic format that doesn’t quite fit into any of the Durst masks, which means that I can’t print an increasing number of pictures I take. One of the reasons why I haven’t shot that much 6×9 although I have a nice Zeiss 6×9 folder is that I prefer darkroom prints and when I bought my 4×5 camera I knew I would be facing the same problem. I thought about it for a while and then during one sleepless night I had a silly idea: I could build my own enlarger and attach it to my Durst column!

Well, what seemed a rather silly idea at first turned out to be not all that difficult. The next day I remembered that I had seen a Sally Mann documentary where she seemed to use an 8×10 camera as an enlarger. I already had my Speed Graphic so I basically just needed a negative holder and a light source instead of the ground glass. After a bit of searching I found that there even used to be an accessory for Graflex cameras called a Graflarger back which was exactly what I had in mind. The only problem was that these things are impossible to find in Europe and even if I found one it probably wouldn’t work with the electricity network over here without substantial modding.

My first design idea was dreamed up in my usual pi * thumb fashion: Some Cokin filter holders with multigrade filters in a snap frame, some bulb in some sort of box attached with bungee cord to a modified film holder. It didn’t take long until I realised that there was a fatal flaw in my plan though: Film holders are made of metal and sawing a chunk out of the middle isn’t as easy as it sounds without the right tools. Getting those tools wouldn’t have been too difficult, but I would have had to destroy several film holders for different formats and to make matters worse I’m actually quite clumsy, so working with “the right tools” could easily lead to serious injury. That made me realise that I was approaching this project in a way too analog fashion. It was time to throw some technology at it and make my life a little easier. If I used RGB LED strip there would be no need for filters or cooling and 3D printing could easily solve my negative holder conundrum. All it needed was some Arduino programming, a bit of soldering and some 3D printing which was something that fascinated me anyway.

Flickering lights

To make things clear, I’m actually a bit of an electronics n00b. Yes, I have played with servos and sensors before and I know how to code, but I’m very much a software person. In the past I usually left low level hardware things to the engineering guys. I do know how to pull apart a computer, but if it doesn’t come as a pre-made board, I’m definitely on all new territory. I may know the difference between a parallel and series circuit, but before this project I had never even used a transistor or gone beyond making a few single LEDs blink. Hooking up a single RGB LED that I found in my Arduino kit wasn’t difficult at all, but 12V strip lights? Oh dear! Well, I’m not scared of new adventures though and you can learn all sorts of things on the internet, including how to hook up strip lights to an Arduino. After watching a single video I ordered some TIP31C transistors and setting the circuit up took me just a few minutes. Hooking it up to a knob – or potentiometer in tech speak – wasn’t difficult either.


Now, I don’t know about you, but I’m not terribly fluent in Red-Green-Blue. In primary school we learned the Red-Yellow-Blue colour scheme commonly used when painting and I thought I would have less problems with that control scheme for colour correcting in C41 printing. Some clever person wrote a conversion function from RYB to RGB in javascript and I ported it to C to use in my Arduino code. Finally I added a multigrade mode, that went from yellow – made up of red + green – to magenta – red + blue. Of course using the red channel is just for my own benefit so that I can see what I’m doing when dodging and burning. The paper doesn’t actually see red, but green and blue can be rather dim on its own. All the correction modes look like this when hooked up to three rather handsome dials.


As you can see in the video, the project had already begun exploding, there is a keypad and a screen visible! The reason for this is simple: Once you get started, it’s not all that difficult to add more and more features, especially when you have a look online at what other people are doing with similar projects. After doing my research I had found out that my idea of using LEDs was actually common practice among high end darkroom manufacturers like Heiland electronics. The price of their LED light sources made my jaw drop and they actually charge extra for all their control units – black and white, RGB and a wifi one that can be controlled via an App. I could have all these functions in one controller and adjust it to fit exactly my needs. I pulled out the calculator and figured out that I’d easily end up paying more than 4000€ if I were to buy their products instead of building a system like that myself and in the end mine would be better! How is that for added incentive?

Keeping time

Since I was playing with an Arduino anyway, I decided that I would finally improve upon my rather inaccurate mechanical timer and program a proper digital timer for the light source. A quick search brought me to Brodie Tyrell’s website where he explains how to build an F-stop timer with a keypad and display. I had read about these timers before in the excellent book Way Beyond Monochrome and had tried to experiment with f-stop printing, but found it to be too much math to be practical. To program a timer that would do the math for me seemed like a great idea, so I immediately ordered similar parts. Brodie and I are on different sides of the planet though, so I couldn’t get the exact same parts though. I got myself a better screen – OLED full colour -, but had to settle for a 3×4 keypad in the end. That meant that since my parts were different I couldn’t simply use his code. First I thought I could possibly adapt his code to my parts, but trying to figure out other people’s code is awful business, especially when it is undocumented. In the end I gave up rather quickly and decided to write my own timer from scratch. This was good in a way, because it gave me the opportunity to properly understand f-stop printing in detail.

Let me guess, you have never heard of f-stop printing? Well, the idea is rather useful: Photographic materials react to light in a logarithmic fashion, so traditional linear ways of adjusting exposure times in the darkroom – 5s, 10s, 15s – aren’t very effective. With this method it’s practically impossible to get by without a gazillion test strips because things aren’t too predictable when adjusting exposure times like that. To be able to predict outcomes properly the exposure adjustments have to be calculated in stops. Just like the shutter of a camera which doubles the time with each stop difference, we can do the same thing when exposing photographic paper – 8s, 16s, 32s will give us predictable density increases. That’s not too hard to do in your head for full stops, but third stops get nasty quickly. There are exposure tables in which you can look these things up, but I always feel blind as a bat under red safelights so I found that impossible to do. With an f-stop timer things get a lot easier. An f-stop timer will let you input a base time and will calculate dodge and burn times on the basis of that time. Imagine you want to make a corner of the print a stop darker. Normally you’d have to make test strips and figure out how much time more it needs. With an f-stop timer you can do it without any test strips, simply add a burn exposure of +1 and it will calculate the time for you. If you want to make the same print on bigger or smaller paper, all you need to do is to change the base time and it will recalculate all dodge and burn times automatically. More control, less test strips and no math!

So much for the theory. Programming this thing was quite a bit more involved than my little blinking lights adventure. First I had to figure out the basic principle, then figure out the math and finally make it all fit on a microcontroller with only 2k RAM. And all of that I had to do in C++ which is a programming language that can literally drive people to tears because it’s so nightmarishly uncooperative. There was lots of swearing over C pointers which don’t show any warnings or segmentation faults on the Arduino, and I realised quite early that none of my typical approaches to coding would work here either. Most of the standard libraries and object oriented strategies I typically use to make C less of a nightmare were much too wasteful for 2K RAM. In the end I was reduced to C-strings for displaying information on the screen and storing everything in plain arrays rather than objects. If you’ve never done any coding you probably won’t have any clue what this means, but let’s just say that it induced several head->desk moments and long drawn out groans of frustration. So, if you want to make a timer like this yourself I suggest you go with Brodie Tyrell’s open source version and try to get the exact same parts he used. Coding this from scratch is definitely not something a beginner could pull off and with all the limitations of the Arduino it was challenging even for me as a somewhat more experienced coder. By the way, if you don’t have the patience for any of this DIY stuff and have the funds you can also buy a version from RH Designs which looks like an excellent piece of equipment. At more than £300 it isn’t cheap, but I’ve never heard a bad word about it!


My final version has two channels with 8 timers, i.e. 1 base time + 7 burn or dodge exposures, and I can set a different colour correction filter for the light source for each timer. The two separate channels are great for split grade printing and I don’t have to manually change the filters after each exposure. For the timer I can type the time in directly or increase and decrease in stop adjustments from 1/24 to full stops.

Building the prototype

For testing I decided to try out my new light source on my M670 enlarger since I could easily stick the LEDs behind the diffuser in a box lined with aluminium foil. I soldered a bunch of shorter strips into a grid, which is an exercise for very patient people – I’m not – and then went on to do some preliminary testing with the led strip behind the diffuser. All of it looked very promising indeed, but it seemed a little dim.


Although I had the brightest RGB strip lights available – 5050 LEDs – it seemed that the diffuser and the bellows of the enlarger would eat quite a lot of light on the way to the paper. I pulled out the light meter and compared the light output from the LEDs with the output from the regular enlarger light source and the difference was indeed significant. The LEDs turned out about 4 stops too dim! After a short calculation I figured that it would be bright enough for a test run anyway, at least with 35mm negatives. After so much coding and hard work I really wanted to see what it would be like to print with the setup once it was finished, so I light proofed the box and attached it to the Durst enlarger with bungee cord. (No prototype is complete without either electrical tape or bungee cord, preferably both, like in this case!) Quite handsome as prototypes go, and yes, that’s Santa on the box!

Since I didn’t have a proper enclosure for the controller yet I had the problem that my Arduino nano board was producing quite a bit of light with its on board LEDs. My quick fix was to put the whole contraption into my changing bag. Normally a changing bag is supposed to keep light out, but in this case it worked the other way round. Additionally I could also close the door of the wardrobe whenever I had to access the controller while paper was on the baseboard.

To start the timer I soldered a 6.3mm socket and attached a Midi foot switch I happened to have lying around. Having both hands free when dodging and burning is really useful and of course with the controller in the changing bag it would have been quite difficult to start the timer without such a switch.

Darkroom test run

For my first test I chose a negative that didn’t seem too horribly difficult. Not too contrasty, no sky, and a structure that made placing test strips rather easy since the light was too dim to see with the red filter under the lens. I made some test strips to confirm the 4 stops difference and arrived at a 00 filter (green LEDs on full) base exposure of 32s at f/4 for a small 13x18cm print. With medium format I would have been at more than a minute at f/5.6, which is doable, but rather annoying. 32s is borderline acceptable. Normally I wouldn’t print at f/4, but it was a negative from my Soviet Jupiter 12 lens, which isn’t that sharp anyway, so it didn’t really matter. With filter 5 or rather the blue LEDs on full power I determined an exposure of 16s to bring in the shadows, and made my first full sheet. Evaluating the sheet I decided that I could easily bring in a stop more in the shadows and that I needed to burn in the upper righthand corner by 2/3 of a stop. I made the final print without any additional test strips and it turned out so great that I made another one with the exact same settings. I could have made 10 more without getting annoyed since I didn’t have to pay attention while changing times or filters, it was so comfortable to use! The combination of a light source where I don’t have to change filters and a timer that I don’t need to reset is simply great! So, my first test run was a complete success and all the frustration and swearing while coding the timer was well worth it!

What’s next?

Light source improvements

Quite obviously I won’t get very far with my 4×5 enlarger if I have a light source that is barely bright enough for small prints from 35mm negatives. One flaw I already noticed in my setup is that I’m using transistors which are quite inefficient. After testing the LED strip with its original controller I concluded that using MOSFETs was probably the better choice and it’s also what I found in the casing of the original controller. However, considering the logarithmic nature of photographic exposures I doubt I even get one stop difference out of this little change! The only option for using LEDs that are common in 12V strip lights would be 5630 LEDs. The problem with those is that they are only available in single colours and I would have to solder a grid of SMD LEDs in 3 separate red green and blue circuits close enough together that there will be even light coming from them behind the diffuser. I tried around with strips, but getting them to overlap in the right way isn’t really possible. The only solution is to design a PCB board with this configuration and solder about 60 LEDs by hand, another job for very patient people. I will probably try it just to see whether I can pull it off and use the outcome as a safelight if the experiment fails. To be honest I don’t actually think it will be bright enough as an enlarger light source either. Between the MOSFETs and the 5630 LEDs I might gain 1-1.5 stops, which is enough for another proof of concept – printing medium or large format with the lens wide open – but not a real world solution.

In the end I will probably settle on high power LEDs that are usually found in LED flood lights. They introduce several new problems since they need to be powered with a constant current power source and they actually get hot when not adequately cooled. The drivers of these things can be bought readymade of course, but I need one for each channel and only the most expensive ones don’t get hot. I already found a resource that explains how to build one of these more efficient drivers, but I think I might actually need to read a book on electronics before I even understand what that circuit is doing. Usually when electronics beginners ask about these LEDs they are discouraged from attempting to work with them because they aren’t easy to handle, so this will definitely be a challenge. I will figure it out eventually though. Since I already tried it all out with strip lights it’s just a matter of time until I have a final version with enough brightness.

Once I have enough light I will also code another colour calibration mode that precisely matches my Durst colour head – Cyan Magenta Yellow – and I will match them by using a colour sensor that I will use for making a proper colour meter for night photography.

F-Stop Timer Improvements

Since my light source still needs more brightness and more fiddling with quite complicated electronics I decided that I will hook up the timer to my regular enlarger light source next. The least dangerous way (I’m clumsy, remember?) to do that will be to plug the light source into a wifi socket and interface the Arduino with that. I already found a wifi socket that has been reverse engineered and can be controlled via existing python code. It probably won’t be too difficult to rewrite this code to work on the Arduino. If I can’t get that to work there is always the option of interfacing the Arduino with my raspberry pi and running the python code on that. No matter how I exactly pull it off, in the end I can already use the timer while I’m still working on the brighter version of my enlarger light source.

Other improvements (/ feature creep) will be to add a real time clock chip for added timer accuracy and an SD card reader to save timer settings for later reuse. For this I will definitely need to use a bigger chip and I’ve already settled on the Atmega 2560. Once I got all the hardware hooked up – still a few switches missing since I had too few pins on the Nano – I will also move from the Arduino prototyping board to a bare breakout board of the chip so that I can get rid of the onboard status LEDs.

Another improvement will be that I will add a light sensor / darkroom analyser that will automatically determine the right exposure times for both split grade and regular printing. The idea is to get rid of the need for test strips altogether and make better prints in less time.


This concludes the first instalment of my explorations in darkroom geekery. I’m sure there will be more instalments as I progress further with these DIY projects. You can regard this as a little bit of a behind-the-scenes article that explains why I have been somewhat quiet these last couple of months. I basically spent most of my time on this project to improve upon my darkroom setup. Why now? Well, I have an awful lot to print for my Progress through Demolition project and I’m hoping that the new timer and darkroom analyser will save a lot of time with this project. Also, I’m working on a new project that involves a lot of the formats that I can’t print right now and I think the new enlarger will be very useful for the project once it is finished.

To be continued …


Leave a Reply