Simply put, the PhotoMetron is a device which brings back memories to the user by printing a photo once in a while. The name itself is a portmanteau of Photomaton and Memory.

The PhotoMetron is built on the idea that memories come and go randomly in one's mind. You don't choose what you spontaneously remember when you notice something on the street or when you hear a bit of a song. Sometimes your memory takes the form of a clear image but other times it's something grainy that takes a bit of effort to reveal.

The PhotoMetron emulates that human behavior and puts it in a box with a button, a thermal printer and an LED. Once in a while it will light up. Press the button and see what comes out.

Tech: Arduino/Electronics/C

Source: github.com



See it in action (GIFs might take a while to load)




prj-pmt-screen01.jpg prj-pmt-screen02.jpg prj-pmt-screen03.jpg prj-pmt-screen04.jpg



The physical components used are:

Once the functionality was designed, building the circuit and putting the pieces together was rather straightforward.



Briefly, this is how one interacts with the PhotoMetron:

  1. Wait for the LED to light up.
  2. Press the button.
  3. Receive photo memory, enjoy :)
  4. Go to 10

The software although simple by design was a bit more complicated to build as I ran into two major issues:

The first problem was not predictable as I managed to print an image quite easily after booting the printer. I ran a few tests with the included images as well my own and everything worked fine. Being new to embedded systems I didn't realize that my tests were printing images from the static EEPROM memory, skipping the RAM.

The only way to achieve what I was looking for was to stream directly from SD to the printer. The printer documentation was not that helpful but in the end I managed to find the correct way to do it. Pasting the code here, maybe someone else will find it handy.

File sdCardFile = SD.open (c, FILE_READ);

while (sdCardFile.available()) {
  printer.printBitmap(printWidth, printHeight, dynamic_cast<Stream*>(&sdCardFile));

The second issue took a while to work out and I ended up having to put images through this process for them to be printable:

  1. Export image from Lightroom
  2. Crop & edit image from a higher resolution to 384x500 px. Editing was for higher contrast (better prints) while the cropping was needed in most images to make sure the framing was aesthetic.
  3. Apply a dither to the image and export it as BMP with 1bit depth. The dither took a lot of trial and error but I eventually found that for my images a diffusion dither worked best. Each dot the printer passes through can only be black or white so 1bit depth is imperative.
  4. Run the image through a script to compile the BMP pixel data to a BIN file.

Now the BIN files can be copied to the SD card and directly streamed to the printer when called. Here are a couple of print-ready examples:



In the end I realize things would have been much easier had I chosen Raspberry PI instead of Arduino. However, my idea was to build something as dumb as possible, a device which doesn't boot up a full-fledged operating system for such a simple interaction functionality.