In memory of the "Point de vue du Gras".

In typical consumer cameras, each pixel of the photograph uses three such elements, each with a colour filter that restricts light detection to a narrow spectral band (red, green, blue).

But what if we use only one light‑sensitive element (a future single pixel) and obtain a photograph by moving this element along two axes while recording the brightness value at each point of the future image? Effectively, this would be a primitive scanner. We just need to project the future photograph onto a virtual plane (as in a conventional camera).

Photoresistor.

As the sensing element one can use a photoresistor. For movement, two stepper motors and leadscrew‑nut transmissions can be employed, similar to CNC coordinate machines.

The size of a photoresistor is about 5 mm, meaning the physical pixel size is 5 mm. For a 320×200 pixel photograph, the distance the photoresistor would have to travel is about 1.6 metres along the longer side.

If we aim for an exposure time (i.e., the time to produce one photograph) of at least 20 seconds, we would need a speed of 3200 pixels per second, i.e. 10 lines per second.

Clearly, implementing such a design in a DIY format is hardly achievable — moving a carriage with a photoresistor 20 times (including return travel) over 1.5 metres in one second is beyond reasonable capabilities.

Therefore we must keep in mind that shooting this way is a very slow process. Possibly even a bit romantic, harking back to the era of analogue photography when shooting also took quite a long time (though for different reasons).

To reduce the shooting time, one can apply a mask to the photoresistor — to reduce the physical size of the sensing element and thus decrease the step of the physical grid used for light registration.

Mechanics and electronics

To control the photoresistor carriage I used two stepper motors (28BYJ-48-5V) with included drivers, and off‑the‑shelf leadscrew‑nut actuators. These are easily found on AliExpress or in local shops selling Arduinos and various accessories.

Control is done with an Arduino Uno. The motor drivers are connected via a 74HC595N shift register to reduce the number of used outputs.

Data from limit switches (to know when to stop the motors) and a manual control button (for debugging) are read using a 74HC165N shift register — again to reduce the number of connections to the Arduino. As limit switches I used whatever was in stock: for one axis, IR sensors with digital (logic) output; for the other axis, ordinary push‑button switches with digital (logic) output.

To measure luminous flux, a simple circuit is assembled: connect the +5V from the Arduino to one pin of the photoresistor, and the other pin to the Arduino's analog input. A variable trimpot is connected in parallel with the photoresistor to adjust the input voltage so that the digital values at the analog input pin do not fluctuate between 1024 and 0 in bright or low light conditions. This effectively measures the voltage drop across the 5V pin.

The entire assembly is mounted on plywood in a wooden crate.

Render picture and some improvement

The data from the photoresistor, output to the monitor port, is then manually transferred to a Google spreadsheet. The cells are then colored using conditional formatting with a gradient. The minimum value in all cells is black, and the maximum value is white.

Because the integral sensitivity (i.e., the dependence of voltage on the drooping conversion) is close to linear, this approach allows small-range measurements to extend the entire grayscale range on the computer screen. In simple terms, the range of readings on the standard input, for example, from 46 to 81, is converted to a range from 0 to 255 (grayscale levels) or any other value; to achieve this, a contrast result must be obtained.

Tests

The initial tests on a small number of points demonstrate the correct operation of the circuit and the potential of the assembled...

Read more »