Introduction: Pimoroni Inky Frame Comparison - 4 Inch Vs 5.7 Inch

The Pi Pico W microcontroller based Pimoroni Inky Frame (a programmable digital photograph frame) was originally launched in a 5.7 inch format with a 600x448 colour Advanced Color ePaper (ACeP) E-ink display. A new model has joined it with a 4 inch 640x400 display. This article compares the two and takes a close look at how the deep sleep mode operates.

The slide show software used on the Inky Frames in this article is from a previous article: Instructables: Battery-Powered Digital Picture Frame Using Pimoroni Inky Frame. Pimoroni's MicroPython version 1.19.14 was used for this article.

The images used for this article are:

The majority have been pillarboxed to convert them to 640x400. The exceptions are the colour chart, the Greta Thunberg portrait, Ukraine en Marche and Benetton advert which have been cropped from the original images and the testcards which are generated images. These are presented as photographs of the two Inky Frames. These were lit with tungsten halogen lamps which have a continuous spectrum.

A new 7.3 inch Inky Frame using the same display as the Inky Impressum 7.3" is under development (February 2023) and is likely to join the range soon. This joined the range on 8th March 2023.

Supplies

  • Pimoroni Inky Frame 4.0"
  • Pimoroni Inky Frame 5.7"
  • The Inky Frames come with small metal rods to make them stand up on a desk. For battery power they need either a 3xAA /3xAAA battery pack or a LiPo battery. The Inky Frames do not have on-board chargers.
  • 3D printer - if you want to make a frame for the Inky Frame (optional).

Step 1: Code Change for 4 Inch Inky Frame

The sdslideshow.py program currently needs a small change for the display on the 4" model. The line

from picographics import PicoGraphics, DISPLAY_INKY_FRAME as DISPLAY

becomes

from picographics import PicoGraphics, DISPLAY_INKY_FRAME_4 as DISPLAY

Determining the model programmatically is discussed later in this article.

Step 2: Visual Differences

Some 4" Inky Frame differences:

  • it's smaller and the aspect ratio is different;
  • if viewed at the same distance the dithering is less noticeable due to the smaller pixels;
  • the contrast and colour saturation appear slightly better, the difference looks greater in real life than the images above, this tends to vary with the image;
  • the border is different, the burgundy-coloured part is wider than the pale pink part and the outer grey line around the display area is more obvious;
  • price is 69.90 GBP vs 90 GBP, it's cheaper!

Step 3: Display Specification Comparison

The most significant difference apart from the size is the change in aspect ratio. The smaller 4" Inky Frame has a ratio of 16:10, in between 35mm film ("full frame" in digital terminology) 3:2 and modern widescreen television 16:9. This is significantly wider than the 4:3 ratio of the original 5.7" Inky Frame. These ratios are shown above together with the recommended 6:5 ratio for the cover image on an Instructables article.

  • Inky Frame 4: 4.01" (10.2cm) 640x400 (16:10 ratio, 1:6:1) 256000 pixels dot pitch 0.135mm (188 ppi)
  • Inky Frame 5.7: 5.65" (14.3cm) 600x448 (4:3 ratio, 1:33:1) 268800 pixels dot pitch 0.1915mm (133 ppi)
  • Inky Frame 7.3: 7.35" (18.7cm) 800x480 (10:6 ratio, 1:67:1) 384000 pixels, dot pitch 0.200mm (127 ppi)

The aspect ratio will be one factor in the choice of Inky Frame if it will be used for displaying photographs or stills from a video.

Step 4: Visual Differences - Primary/Secondary Colours

The four colours in the testcard above which map to a single pigment look very similar with the exception of the blue and maybe the red pigment particles. The blue appears slightly purple on the 5.7" model and the red also suffers from this to a lesser extent. The orange and taupe pigments don't appear on their own in this testcard, see the next page.

The current Pimoroni code uses the same RGB values to represent the pigments for both Inky Frames.

  • 0 black RGB(0,0,0)
  • 1 white RGB(255,255,255)
  • 2 green RGB(0,255,0)
  • 3 blue RGB(0,0,255)
  • 4 red RGB(255,0,0)
  • 5 yellow RGB(255,255,0)
  • 6 orange RGB(255,128,0)
  • 7 taupe (220,180,200) (E-ink cleaning particle)

These values appear to be chosen to represent commonly used RGB values for pixel colours on a computer rather than an attempt at matching the actual colours of the particles in the E-ink display.

Step 5: Visual Differences - Skin Tones

This colourful image is likely to have been taken on a medium format film camera. This version of it looks like a scan from a magazine. At the low resolutions of the Inky Frame the visual artefacts from scanning a halftoned print are lost. The image was cropped twice to fill the two displays. The smaller Inky Frame has ended up with the faces about 5% larger in terms of pixels making one aspect of the comparison imperfect.

Surprisingly for this particular pair of images, most of the faces look better on the 5.7" model despite having fewer pixels. This is probably a fluke of how the algorithm dithered them. The logo looks a bit better on the 4" model close-up but this is barely noticeable at normal viewing distances.

Step 6: Inky Frame Pigments by Daylight

The colour bar image above was drawn in Gimp with the same colours as the current Pimoroni dithering code for the eight pigment particles. The top quarter was blurred a few times in the horizontal direction. The lower half was filled with the gradient tool to black and to white.

This photograph is the only one lit by daylight on an overcast day. The Inky Frames are both angled slightly to reduce reflections. Some old Staedtler pencils and rainbow jumper wires provide reference colours.

The taupe colour (E-ink cleaning particle) was set to an incorrect value of (220,180,220) to create these images. The correct value is (220,180,200).

Step 7: Preparing and Selecting Images

Instructables: Battery-Powered Digital Picture Frame Using Pimoroni Inky Frame has a section on preparing images. The only difference for the 4" Inky Frame is the 640x400 resolution with its associated aspect ratio change.

The example above shows that a few images may not look quite right with the Inky Frame's palette and the Pimoroni dithering code. The dark yellow on the flag has become very orange when rendered on the Inky Frames.

Step 8: Selecting Images and Colours

This is a better choice of image for the Inky Frame's rendering of the colours on the flag.

The Inky Frame photographs above were taken after the main batch with a slightly different placement for the lights.

Step 9: Black and White Photographs

This is a black and white photograph. The low resolution images contain a range of greyscales. It seems to render better with less of a sepia look on the 4" model but this could just be luck on the dithering due to the change in resolution of the actual image, 404x400 vs 454x448.

Step 10: External Trigger - Edge or Level?

The Inky Frames have an external trigger which can wake-up the device from deep sleep mode. This raises the question of whether this is an edge or level-triggered input. This isn't quite the the right question as that applies more to the precise moment when logic circuits read input values.

The documentation states:

On the expansion header is an external trigger input. if this is transitioned from low to high then Inky Frame will wake up from deep sleep. This lets you add your own wake button or circuit or build Inky Frame into a more complicated system. The external trigger is 3.3V max.

The statement on the maximum voltage being 3.3V is useful as many sensors have a 5V output and caution is needed with 3.3V microprocessors. The use of the word "transitioned" suggests the device immediately wakes up on the rising edge of a potentially very brief pulse. Fortunately, Pimoroni supplies the schematic and a closer look reveals the requirements for the minimum duration of this pulse.

Step 11: Deep Sleep Awakening

The schematic shows all the inputs which can wake the Inky Frame from deep sleep mode go through an array of BAT54CL schottky diodes. These are acting like an OR gate, if one or more inputs goes high then VSYS_EN which is normally held at 0V by the 620k resistor will also go high. The forward voltage (Vf) will be around 0.3V so VSYS_EN will be 3.0V when EXTERNAL_TRIGGER is high.

VSYS_EN is switching the (N-Channel MOSFET) transistor which in turn switches a (P-Channel MOSFET) transistor connected to VBUS (USB power) and VBAT (battery via JST connector). As the name suggests the VSYS_EN is acting as an enable line to allow VBAT to power the Pi Pico W via VSYS.

If the EXTERNAL_TRIGGER goes high for, say, 100 microseconds then the Pi Pico W will start to power up as VSYS is enabled but will then power off as the pulse goes low. The Inky Frame needs something to hold VSYS_EN high and this is achieved with the HOLD_VSYS_EN line connected to the Pi Pico W's GP2 pin. This means the duration of the pulse on EXTERNAL_TRIGGER or a button press needs to be long enough for the program on the Inky Frame to start and then set GP2 to a high output to stay powered on. This explains the long presses required to wake-up the Inky Frame for a MicroPython program. It's probably less for a C/Arduino program as that's likely to be quicker to set the pin high.

The regulator which supplies 3.3V via V+_A0 to the real-time clock also be seen in this part of the schematic. The V+_A0 is provided for convenience on the external connector.

UPDATE: Pimoroni's Inky Frame specific version of MicroPython now sets HOLD_VSYS_EN to high so the program no longer has to do this, discussed in Pimoroni forum.

Step 12: Alarms in Deep Sleep

The ultra-low powerPCF85063A (Real-Time Clock/calendar with alarm function) is left powered by the battery in deep sleep mode. It can be set to cause an interrupt when it's time for the Inky Frame to wakeup. The line over the INT label indicates this output value is inverted, hence the transistor on that output inverting that value to create RTC_ALARM.

Step 13: Inky Frame MicroPython Library

There is now an inky_frame module.

MicroPython 294098d-dirty on 2023-03-02; Raspberry Pi Pico W with RP2040

Type "help()" for more information.
>>> import inky_frame
>>> items = dir(inky_frame)
>>> _ = [print(items[idx:idx+5]) for idx in range(0, len(items), 5)]
['__class__', '__name__', '__dict__', '__file__', 'LED_B']
['Pin', 'get_shift_state', 'reset_shift_state', 'time', 'Button']
['ShiftRegister', 'sr', 'SR_CLOCK', 'SR_LATCH', 'SR_OUT']
['LED_A', 'LED_C', 'LED_D', 'LED_E', 'LED_BUSY']
['LED_WIFI', 'SHIFT_STATE', 'button_a', 'button_b', 'button_c']
['button_d', 'button_e', 'led_busy', 'led_wifi']

The recent Pimoroni example programs use an inky_helper module which uses inky_frame and may be useful for other applications. There's some documentation on these in Pimoroni: Getting Started with Inky Frame.

Step 14: Determination of the Inky Frame Model

A person can easily determine the model by the size of the Inky Frame or the name at the top but it's harder for the Pi Pico W attached to it. The E-ink display appears to be mostly unidirectional for communication meaning it cannot be queried - some displays are able to return the model number or resolution. This presents a quandary, but one that can be resolved by taking advantage of a small (intentional) difference in the hardware. There's a 10k pull-up resistor on the 4" Inky Frame's SWITCH_LATCH line which is absent on the 5.7" model. This is connected to the Pico's RP2040 GP9 pin and would normally be used as an output.

If SWITCH_LATCH is used as an input with the mode set to internal pull-down then:

  • the weaker (50-80k) pull-down on the 4" will lose the battle resulting in a high level;
  • faces no competition on the 5.7" resulting in the pull-down setting, a low level.

This test could be performed once early in the program and then SWITCH_LATCH could be returned to output mode for normal use to read the external shift register.

Step 15: New 3D Printed Picture Frames

Ingurum now has three 3D printed frames/case designs for the Inky Frames:

These are discussed in Pimoroni Forums: Inky Frame slide show.

Step 16: Going Further

Ideas for areas to explore:

  • Compare the required button press duration to wake-up the Inky Frame from deep sleep mode using a C/Arduino program and a MicroPython one.
  • Check if setting HOLD_VSYS_EN (GP2) high in boot.py has a significant benefit in reducing the button press duration. This is no longer relevant if you are using the Inky Frame specific verisons of Pimoroni MicroPython.
  • Explore the best ways to tweak colours in images to look good on the Inky Frames.

Further reading:

Step 17: Appendix: the Remaining Images Pt I

Step 18: Appendix: the Remaining Images Pt II