# PrintSnap Instant Camera

After three months of work, it’s finally done!

# Background

About a year and a half ago, I decided that I wanted to branch out from the fairly limited world of low-power 8-bit AVR microcontrollers into something better.  Very few consumer products are made with such antiquated technology, and I figured that moving up to something like a 32-bit ARM processor would open a lot of doors for my projects.

I quickly ran out and purchased development kits from three major ARM processor manufacturers.

Judging from the fact that the TI LaunchPad Evaluation kit is still wrapped in plastic, you might guess that I haven’t gotten a lot of use out of these.

All of my projects so far have been either entirely analog or “bare-metal” C compiled with AVRGCC and programmed using AVRDUDE.  AVRs are simple processors with a limited number of peripherals.  As such, my code usually speaks directly to the special function registers of the part by manually modifying specific bits to turn on the ADC or start a timer.

As processors get more complicated, doing all of this special programming by hand becomes overly cumbersome especially considering that some simple tasks require multiple operations that must be performed in a certain order and in some cases within certain timing constraints.  Each development kit came with a whole body of software that contains special functions to manage a lot of these operations for you.

Up to this point, I had been accustomed to keeping my entire project code inside a single main.c file.  This is a horrible strategy for software development as it makes code very difficult to maintain, but I’ve never considered myself a software developer and it’s always worked for me.  I started my life as a firmware developer by writing assembly code for the 8051; In fact, I didn’t even know what an AVR was until after I started working on my first pre-ch00ftech attempt at a persistence of vision display.  What a mess.

Though programming in C has made my life about 1000 times easier, I’ve always liked that with assembly, you have 100% control over of the processor and can predict and account for its every action.  As machine code gets covered up with more and more layers of abstraction, I tend to get a little anxious and have thus avoided using other people’s libraries for far longer than I should have.

This “bare-metal” coding strategy was no longer going to work for these more complex ARM processors, but when trying to incorporate their libraries into my little scripts, I got overwhelmed and eventually gave up.  Reading a software library is a lot like reading a schematic.  There is a general way things are supposed to be, and when you have zero familiarity with these standards, it makes it very easy to get lost.

For example, at one point I might have written:

return GPIO_ReadInputDataBit(GPIOB,4);

When I should have written:

return GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_4);

Which caused some odd behavior since this line is present in stm32f10x_gpio.h

#define GPIO_Pin_4      ((uint16_t)0x0010)  /*!< Pin 4 selected */

I generally learn best when a project is 90% stuff I know how to do and 10% new stuff, but this task had the percentages flipped the other way around and even with all of the documentation, I got lost pretty fast.  Besides, I’ve never found it easy to just pick up and learn a topic unless there’s a specific reason for learning it.  That reason didn’t come for another year.

# Thermal Printers and Instant Cameras

While waiting at Nordstrom for my newly hemmed jeans to get rung up, I noticed how fast their thermal receipt printers print.  Thermal printers don’t use ink but instead use a special paper that turns black when heated.  As the paper is rolled out, a row of tiny heaters “burns” tiny dots in the page that can be organized to make up text.  As a result, they have a very small number of moving parts.  Usually, it’s just the feed motor and sometimes a paper cutter.

A few years ago, I saw an ad for a internet-connected thermal printer called Little Printer which I still think is a brilliant product if only it had better content for US customers (and cost about $100 less). There’s something innately fun about having a paper copy of something trivial like the weather forecast or the “word of the day” when everything has been moved online. Despite the short shelf-life of thermal printed text, having a physical copy in front of you gives you a certain sense of permanence and with the digital world so well organized, it’s much easier to accidentally stumble across physical keepsakes that may be strewn about in the real world. Wanting to do something with a thermal printer, I immediately started thinking up ideas. My first idea was…some kind of scanner thing? I guess? It was supposed to be a little motorized car that would roll across a document while scanning it in, and then thermally print out a copy of that document over top. I have no idea why I thought this would be a good idea, but that didn’t stop me from spending$50 on this which I still haven’t even unwrapped:

I think my confidence was still a little inflated from reverse engineering a children’s toy, and I thought that it would be trivial to do the same for a high-speed, full-color, proprietary scan head. Regardless, something must have come up because I never did order a thermal printer.

Fast-forward three years. I’m waiting at Nordstrom and it hits me.  I should just make a camera!

Instant-photos managed to stay a part of popular culture from the 50s up until about the mid 2000s when the instant feedback and low-cost of digital cameras made them the new de-facto standard for sharing memories without a trip to the 1-Hour Photo.

The reality is that instant photos have always been terrible and it’s a miracle they lasted as long as they did.  Polaroid film was extremely expensive, the printed images were small, the picture quality was terrible, the cameras bulky, and you still had to wait a few minutes to see if your picture came out at all.

In its death-throes, Polaroid released the I-Zone camera which took even crappier, smaller pictures and had an annoying length of tape on either end of the picture that was larger than the image itself.

Image credit: http://ivanisapalindrome.blogspot.com/2010_12_01_archive.html

Regardless, Polaroid was fairly successful for a very long time.  I suppose the point is that people are willing to go a long way to get instant photos, and apparently image quality and size is not high on the requirements list.

This theme has persisted into the digital realm as well.  The quality of a photo is almost irrelevant to a majority of the point-and-shoot population. Many pictures aren’t meant to adorn the halls of an art museum; they’re just an aid to help unlock a specific memory.  The Facebook comments under the picture are almost as important as the image itself.  I’ve seen people post phone screenshots to Instagram because it was easier than actually downloading and saving the image they were looking at.  That 0.8MP version of that 8MP image is “good enough” so why bother use anything better?

Here’s a Polaroid picture of me on the first day I soloed when I was working on my private pilot’s license:

It’s blurry, the colors are washed out, and the image itself is pretty small.  But who cares?  A higher resolution picture won’t tell you that I was nervous as hell and sang “Bang on the Drum All Day” the entire time I was in the air while secretly fearing that I was somehow accidentally holding down the transmit button and doing impromptu karaoke to the entire airport.

The real issue with Polaroid has never been image quality, it’s been price.  I remember feeling very nervous when using a Polaroid camera as each press of the shutter was another \$2-3 spent.  It’s almost as if the apprehension associated with the price tag was directly at-odds with the spontaneity of instant images in general.

So while eating a club sandwich in the Nordstrom Grill, I thought it might be cool to take both of these issues to their extremes.  Make a camera the produces extremely low quality instant images for an extremely low price.  You still get the novelty and benefits of a physical keepsake, and as long as the pictures are somewhat recognizable, they still serve the purpose of helping you catalog and recall memories.

Conveniently, Christmas is coming up, and this is the perfect gift for my sister who has made a hobby of working with novelty toy cameras.  They don’t take super amazing pictures, but they have a bunch of really neat lenses that let you do things like extend the image frame to cover the sprocket holes or shoot 120 film.  Here’s a roll that we developed together:

It’s some buildings and clouds in Korea.

So the task was to produce a portable camera that can print images instantly using an optical module and a thermal printer.  Of course, processing a decent image quickly requires far more processing power than what’s available in an 8-bit AVR, so unless I wanted my instant-pictures to take weeks, this was the perfect project to get me started on ARM.

## 123 thoughts on “PrintSnap Instant Camera”

1. Separate the battery/charger from the camera/printer: Support attached and/or detached/cabled power, with standard LiPO standard and the option of a pack with replaceable/rechargeable NiMH cells (dirt cheap). Then, also offer the camera without a battery pack (DIY power is relatively easy if the interface is simple).

2. Personally, I’d want a clear case with all the internals visible, using standoffs and 3D-printed brackets where needed. Hopefully, this would also be the simplest/cheapest case.

3. Kit the custom parts and include a simple “no-solder” BOM for the rest. This permits a “partial gift” for the makers among us. And I certainly don’t mind giving Adafruit some business, especially if a small discount can be negotiated for this project’s BOM.

I think the above can provide a wider range of KS options and price levels with (hopefully) relatively little change to the core device.

• Yep, I’m well aware of that problem. I wash my hands compulsively anyway, and I’m sure someone will come around with a BPA-free option soon in response to public outcry. The same thing happened with Nalgene and leaded gasoline.

2. I want this! I want this soooo bad. Please sell me the first one!

3. Hi Ch00f,

Your PA15 pin isn’t busted; the problem is that it is by default mapped as a JTAG debug pin and not to the GPIO block. In the device datasheet (the 100-page thing, NOT the 1000-page reference manual), there will be a “pin definitions” table near the front containing pin numbers for all the different package options, pin names (“PA15”), pin-types (“I/O”) and 5V-tolerance (“FT”), a “Main Function” column (this is the important part) and “Alternate Function” columns.

Note that for most GPIOs, the Main Function is GPIO, i.e. at power-on, PC12 is PC12, etc. However at power-on, PA15 is JTDI (jtag data in). This is necessary so that JTAG can start talking to a device when it boots. If you’re using SWD (and it seems you are) and want to make use of the PA15 pin, you need to disable the JTAG peripheral and its pin remapping.

Note that if you don’t want to be able to debug or maybe ever load code into the device again, you could also free up PA13 and PA14 which are the SWD pins.

Email me if you get stuck and I can send you the specific line of code you need; I just don’t have it here right now.

(I found this one out the hard way while playing with an stm32; I wasted a good 4 hours figuring it out)

• THANK YOU

I figured it was something like that. I mentioned that part specifically hoping someone would figure it out for me.

Thanks for the tip!

4. Pingback: Prints for less than penny

5. You are a silly man with silly ideas. As soon as I started the video I thought, “Why is he recreating the GameBoy Camera/Printer?” Your presentation was mockingly beautiful. It’s good to see your personal projects continue to be so whimsical.

6. What’s nice about the Cortex series is that some of the “peripherals” are standardized by ARM, so no matter the manufacturer, they’ll all behave the same. SysTick, FPU, NVIC, etc.

To enable the FPU, google “cortex m4 enable fpu” and you’ll find the following asm to do so (basically setting a couple bits to turn on the coprocessors in the coprocessor access control register):

; CPACR is located at address 0xE000ED88
LDR.W R0, =0xE000ED88
LDR R1, [R0]
; Set bits 20-23 to enable CP10 and CP11 coprocessors
ORR R1, R1, #(0xF << 20)
; Write back the modified value to the CPACR
STR R1, [R0]

I'm actually working on a project right now using a thermal print head, but rather than an all-in-one module like you have, I am using discrete components: a solenoid to push a kyocera print head onto the paper and a stepper motor to drive the paper through. I can print a 1450×672 px image in 3-5 seconds. In my case, going faster actually improves the quality of the print because the print head stays warm.

7. I like this idea, the camera itself is sound for a version 1.0 project. To make it “sellable” you should consider a different housing altogether to make it look like an old school camera. Two ideas I thought are a TLR (like a Rollei) where the user looks down at a mirror to compose the image through a lens, while the camera is in a lens just below it, and the printer goes out the side. Another is a Brownie box camera style with an offset finder and the camera in a central front port. Either way something that looks like an old school film camera from a few feet away would be a winner.

8. Pingback: Una cámara DIY instantánea

9. Pingback: PrintSnap：用小票做相纸的黑白拍立得相机 | 趣火星

10. This is fantastic! You basically made a spiritual successor to the King Jim Da Vinci DV55. I really want to see this becoming a real product and hope you go with Kickstarter on this project!

12. I want this. If it’s become product please sell at JAPAN too.

13. PrintSnap is very good.
I like it !

14. I WANT CAMERA!

• 販売したら購入検討したい、

15. 興味があります、

17. Great!
I want it.

18. It is a great idea. This would be a great present for my 8 years old daughter who loves to take pictures. PLease make it at an acceptable price for normal people.
Thanks

19. Pingback: PrintSnap Instant Camera

20. This product concept is awesome!!

21. this would be a hit on kickstarter, its totally geared towards the 20-30 something year old, new and upcoming product loving, crowd that kickstarter brings in. where are you based out of?

22. Hi ch00f!

We really like your “PrintSnap Instant Camera” project and want to cover it on EEWeb.com for our readers.

EEWeb.com is an online resource community site for Electrical Engineers and I’m sure that your project will be a great addition as an entry on our webpage.

Would it be ok, if we write an article about your project and include some pictures and other relevant materials?

Hope to hear from you soon.

Regards,

Tin

23. I want this!

24. u got a great idea!
i want it!

25. That is great use of thermal paper roll.haha~

26. It could be really nice if you can use your code to create something like an app for smartphone who can automatically dither the photo you take and send it to a bluetooth thermal printer !

27. Pingback: Animated EVSE | ch00ftech Industries