HQ camera and Canon lenses

This is a summary of my tests of the RPi HQ Camera and some Canon EF-S lenses.
(all photos made with the HQ camera are untouched and full size, click to view).

The results are not bad, the Canon lenses are usable, easy to change, focus is manually, they enhance the quality. The 6mm RPi is no match to any Canon, the 16mm is not bad at all.

Much has already been written about the new (spring  2020) HQ camera available for the Raspberry Pi.
Now one can argue if this is a HQ camera (12M pixels, no focus facilities), it certainly got the interest of the Pi community, the cameras and lenses seem to sell well.
Not to be positioned as a Pi Camera V2 replacement (much more expensive, larger in dimensions), it can be a quality camera  to do projects with.

Certainly not a photo/video camera replacement (even a phone camera is much easier to wok with, depth of view and focussing is too limited) , but will have its place in vision applications demanding higher quality images under computer control.

Since the camera comes without lens, but has a C or CS lens mount adapter, it is possible to choose a lens, like the two  available form the Pi Foundation.
I have bought both together with the camera, resulting in reasonable images but a pain to focus, let alone to change the focus often. The small one has a reasonable depth of view, and a wide view and lots of cushion distortion and color aberration. The bigger one is better, more a telelens.

The C mount allows more freedom in the choice of lenses, so I thought about checking out my (really high quality) Canon EF lenses.

This requires a C mount to Canon adapter. A metal one is on its way (May 10) from China, a metal one. In the meantime I set my 3D printer to work on 3D printed adapters.
I found two in Thingiverse:

and printed both.

Some remarks about the two designs:


The STL is missing the sizing information as required by the slicer program, as noted in the comments section. The trick to get a correct STL is to upload the STL in Autodesk Fusion and export as STL (with a new name of course!). It then prints fine in the right scale, once rotated and landed lying on its Canon side with supports and a brim. Reduce layer to 0.1.

It fits the Pi camera without adapter. I suppose I should have used a finer print, screwing on was hard, a gap was still present.
The tripod adapter needs to be removed from the camera, otherwise it will not fit.
The stand makes it a very stable setup on a table. I did not yet glue a tripod screw on it.

Prints fine, rotated and landed lying on the Canon side, with a brim. Reduce layer to 0.1.

It fits fine in the Pi camera (without c to cs adapter). The camera’s tripod support can be used, the result is quite unstable with a small table tripod and a real lens, a real tripod works fine, but the Raspberry Pi computer needs to be close and not dangling on the side. A longer camera cable of 50 cm helped a lot.

First impressions.

With each lens a photo of a test chart, printed on my laser printer, on the wall and a plant in the window.
Distance between camera and object for all lenses is 60 cm.

Focussing and capturing photo has to be done manually by looking at the monitor display running this command:

$ raspistill -fw -md 3 -q 90 -k -v -o filename

The – fw switch requires downloading and building Raspbian userland, it gives a numeric indication of the quality of the center part of the screen. Very helpful to get to the best focus.
The -k -v keep the camera image on screen with a prompt until Return key is pressed. Note that the -k in combinationwith other image formats like PNG do not work.

Canon EF-S 18-55 IS
Only way to focus is to adjust the zoom, making it a fixed length. Very high quality.

Canon EF-S 18-135
More a telelens. Same remarks as the EF-S 18-55.

Canon 40 mm (Pancake)
With a 13 mm ring added and about 25 cm distance between camera and object.

EF-S 60 mm Macro
Unable to focus

EF-S- 55-250
Unable to focus

6mm 3MP Lens for HQ Camera
Not easy to focus, extreme sensitive to small movements. Low quality, cushion distortion is high, wide view.

16mm 10MP Lens for HQ Camera
Not easy to focus, extreme sensitive to small movements. Quality is allright. Smaller view of point.


Tiny LCD Screens

Over the years I have collected several tiny touch LCD screens for the Raspberry Pi which are based on sending the framebuffer display data via SPI to the screen.
This has been made possible by the work of Noralf Trønnes aka notro as documented on his github page.. The resulting driver made its ways into upstream Linux. Some displays got now device tree support and can be used with the latest Raspbian versions.

Only the TinyLCD 3.5 survices my current test as being fully supported, fast screen refresh and operational under Raspbian now and in the future.The  Adafruit 2.8 LCD also survices the test with a bit special installation.

The Kedei V2.0 and Itead V2.0 are frozen in time with OS support Jessie 2015 and slow refresh rates, and will not see much use by me, perhaps as a front end if a Zero runs Jessie.

All displays support touch, of the resistive type. So a pen is the preferred way to operate, anyway these screens are too small for finger touch.

Itead 2.8 TFT Add-on V2.0. I have 2. Installation post here.

– Nice screen quality.
– GPIO connector available via breakout
– OS support frozen in time, Jessie 2015
– slow screen updates
– Small screen, supporting PCB bulky

TinyLCD 3.5. Installation post here.

– Nice screen quality.
– GPIO connector available via breakout
– Current Raspbian support
– Fast refresh
– GPIO breakout is bulky (but can be removed)

Adafruit 2.8. Installation post here.

– Nice screen quality.
– GPIO connector available via breakout
– Current Raspbian support
– Fast refresh
– 4 buttons on 4 GPIO’s
– GPIO breakout is bulky

Kedei 2.0. I have 2. Installation post here.

– Nice screen quality.
– Connector blocks only part of GPIO connector, many I/O free.
– slow refresh
– OS frozen in time, Jessie 2015.


Experiments and boards

A Raspberry Pi  or Arduino is a perfect companion for experiments, but you need some hardware support during development and deployment.

Here I show you the breadboard development tools I have first, followed by deployment boards.

Breadboard experimenters boards

Traditional extenders into a breadboard. From Adafruit and China, 26 pin (yes, that old) and 40 pin with a flatcable to the Pi. I do not like these very much. Breadboard Pi Bridge – Pi Ports to Breadboard in Numerical Order. Nice setup, can be used with a Pi B or a Pi Zero. Easy to locate the pins with the descriptions on the PCB.
No Dupont wires required (except for +5V). .Blocks the power rows alas.

RasPiO Pro Hat Protect/Position Raspberry Pi Ports. Ideal if you fear damaging your Pi, has current limiting resistors on the GPIO pins.
Disadvantages are that these resistors may interfere e.g. I2C or SPI and the very small breadboard. Seldom used.

A simple and cheap Chinese breadboard solution. Requires Dupont wires and a printed pin layout required. Works fine, affordable Prototype comes close to deployment layout. Recommended.

The Wombat, a great experimenters board. Much I/O on board (serial to USB, ADC MCP3008, 2 button,s 4 output LEDs, power regulator for +3.3V. All jumpered.Well documented single in line I/O connector.
Large breadboard! The best board in my collection! From Gooligum Australia.

Sunfounder China, experiments Raspberry Pi and Arduino Uno or Mega. Solid, large breadboard, recommended.

Arduino Uno experimenters boards, acryl, from China.

Deployment boards

These boards are where the permanent circuit will be soldered on. Essential are the GPIO connector and enough solder islands.

Richard Saville aka AverageMan made a great collection of boards, I have many in use.

A Chinese (40 pin) and Adafruits board (26 pin, yes that old). The Chinese ones are affordable and great for deployment. Recommended!

Mini Mega deployment board. From China.

Itead 2.8 TFT Add-on V2.0 Touch

A small display, again one of those LCD screens attached via SPI. slow refresh, OS support frozen in time.

Instructions that worked for me, April 2020.

Download Raspbian-2015-02-16.img into SD card, then launch Raspberry Pi B 
Its old Wheezy Debian, unsupported and outdated, so make sure you change to the legacy update, the official repository moved on. But there is a legacy repository!

Replace this line in /etc/apt/sources.list
deb wheezy main contrib non-free rpi

Now you can do the 

sudo apt-get update

Do the usual raspi_config, add SPI support

sudo nano  /etc/modprobe.d/raspi-blacklist.conf
Comment the mask of spi out
#blacklist spi-bcm2708

Connect Raspberry Pi B+ 2.8 TFT Add-on V2.0 to Raspberry Pi B+ correctly

sudo apt-get install xinput evtest tslib libts-bin

Download the fbtft driver, and you may need to run the following command three times:
sudo REPO_URI= rpi-update

Finally get the codes:
*** Running pre-install script
Work around rpi-update issue #106
*** Updating firmware
*** Updating kernel modules
*** depmod 3.12.21+
*** Updating VideoCore libraries
*** Using HardFP libraries
*** Updating SDK
*** Running ldconfig
*** Storing current firmware revision
*** Running post-install script
*** Deleting downloaded files
*** Syncing changes to disk
*** If no errors appeared, your firmware was successfully updated to b77683205688d3f6ae2b32a3c7
*** A reboot is needed to activate the new firmware

By now,you need to reboot your Raspberry Pi B+
sudo reboot

sudo touch /usr/share/X11/xorg.conf.d/99-fbdev.conf

Configure the file /usr/share/X11/xorg.conf.d/99-fbdev.conf

sudo nano /usr/share/X11/xorg.conf.d/99-fbdev.conf

Section "Device"
  Identifier "itdb28"
  Driver "fbdev"
  Option "fbdev" "/dev/fb1"

sudo modprobe fbtft_device name=itdb28 gpios=reset:5,dc:6,wr:12,cs:13,db00:20,db01:21,db02:22,d
b03:23,db04:24,db05:25,db06:26,db07:27 rotate=90 fps=50

Add the following contents to file /boot/config.txt
startx &
 (you may have to reboot)

Load the touch driver
1.Add the following contents to file /boot/config.txt

2.Reboot Raspberry Pi B+

sudo reboot
3.Load TFT display driver

sudo modprobe fbtft_device name=itdb28 gpios=reset:5,dc:6,wr:12,cs:13,db00:20,db01:21,db02:22,db03:23,db04:24,db05:25,db06:26,db07:27 rotate=90 fps=50
4.start up X Server

startx &
Adjust the X&Y directions of this touch screen
DISPLAY=:0 xinput --set-prop 'ADS7846 Touchscreen' 'Evdev Axis Inversion' 0 1
·Check the event’s number which is in accord with the touch screen.

	cat /proc/bus/input/devices

This event’s number here is event3, then you need to execute the following command to do the calibration and test touch screen according to the event’s number you’ve got. When do calibrating, you’d better use touch pen to click the cross’s center unless you want a rough calibration result.

·Touch screen calibration

sudo TSLIB_FBDEVICE=/dev/fb1 TSLIB_TSDEVICE=/dev/input/event3 ts_calibrate

Hyperpixel 3.5 Pimoroni

3.5 inch touch screen. Superseeded by Hyperpixel 4.0

Reasonable quality, touch is, though it i capacitive, not too easy to use. Resistive screens an be handled with pens, not this one.

With current Buster not a perfect pair.

Two experiments:

Raspberry Pi 2 B V1.2 success

1 imaged a SD with current Buster (feb 2020)
2 booted on a Pi 4 1 GB
3 did the usual raspi-config things and update/upgrade
4 checked out the system, works as expected
5 curl | bash
6. rebooted , installed Hyperpixel

Result is a working display, HDMI whosw rainbow screen, touch is wrong, cursor moves opposite directions, axes mixed up.
So not too bad, but touch not configured correctly.

Fixed with, in a console window, the command

$ hyperpixel-rotate normal

which changed the orientation of the screen to what is aleady was, and changed the touch matrix to a working touch.

So far so good.

Raspberry Pi 4 1 GB failure

To check out the Pi4, current Buster (feb 2020) and Hyperpixel 3.5 I did the following:

1 imaged a SD with current Buster (feb 2020)
2 booted on a Pi 4 1 GB
3 did the usual raspi-config things and update/upgrade
4 checked out the system, works as expected
5 curl | bash
6. rebooted , installed Hyperpixel

Result is not a working Hyperpixel display, but reverse image on HDMI, Hyperpixel dead.
Which is the same effect as booting from the working Raspberry Pi 2 SD.
Maybe the curl | bash gets the old hyperpixel install and not the Pi 4 version? Looks like it.

So back to

1 imaged a SD with current Buster (feb 2020)
2 booted on a Pi 4 1 GB
3 did the usual raspi-config things and update/upgrade
4 checked out the system, works as expected
5 downloaded the Hyperpixel Pi 4 git repository
6. rebooted , installed Hyperpixel with ./setup.h

Result is Hyperpixel noise banner, HDMI shows normal screen

So install fails with the curl or setup, and instructions clearly wrong.Issue opened at Pimoroni.

Adafruit PITFT 2.8 resistive

Image Raspbian full if you want a desktop, else lite is sufficient for CLI.

sudo apt-get update
sudo apt-get upgrade
sudo apt-get remove piwiz

sudo raspi-config
 - password
 - Boot to console autologon, no splash screen
 - localization time zone
 - Interfacing  - SSH SPI I2C Serial
chmod +x
sudo ./

Choose 1 tft 2.8 resistive
Choose 1 90 degrees
Console on tft Yes

reboot and console on tft visible

sudo sed -i "s+/dev/fb0+/dev/fb1+" /usr/share/X11/xorg.conf.d/99-fbturbo.conf
y       cat /usr/share/X11/xorg.conf.d/99-fbturbo.conf

sudo nano /usr/share/X11/xorg.conf.d/40-libinput.conf
At section touchscreen, add the following line
     Option "TransformationMatrix" "0 -1 1 1 0 0 0 0 1"

This matrix fits for the 90° turned display (see rotate=90 at /boot/config.txt). In case you have turned the display 270, the line must be
     Option "TransformationMatrix" "0 1 0 -1 0 1 0 0 1"

This design uses the hardware SPI pins (SCK, MOSI, MISO, CE0, CE1) as well as GPIO #25 and #24. All other GPIO are unused. Since we had a tiny bit of space, there's 4 spots for optional slim tactile switches wired to four GPIOs, that you can use if you want to make a basic user interface. For example, you can use one as a power on/off button.

We bring out GPIO #23, #22, #21, and #18 to the four switch locations!

The last known for-sure tested-and-working version is March 13, 2018 ( from

It works OK with recent Buster (Jan 2020), tested March 2020

Setting up the Touchscreen

Now that the screen is working nicely, we'll take care of the touchscreen. There's just a bit of calibration to do, but it isn't hard at all.

Before we start, we'll make a udev rule for the touchscreen. That's because the eventX name of the device will change a lot and its annoying to figure out what its called depending on whether you have a keyboard or other mouse installed.

Check if this already done

   sudo nano /etc/udev/rules.d/95-stmpe.rules

   to create a new udev file and copy & paste the following line in:
   SUBSYSTEM=="input", ATTRS{name}=="stmpe-ts", ENV{DEVNAME}=="*event*", SYMLINK+="input/touchscreen" 

   sudo rmmod stmpe_ts
   sudo modprobe stmpe_ts

Then type 
ls -l /dev/input/touchscreen

It should point to eventX where X is some number, that number will be different on different setups since other keyboards/mice/USB devices will take up an event slot

There are some tools we can use to calibrate & debug the touchscreen. Install the "event test" and "touchscreen library" packages with

sudo apt-get install evtest tslib libts-bin

Now you can use some tools such as

sudo evtest /dev/input/touchscreen

which will let you see touchscreen events in real time, press on the touchscreen to see the reports.

AutoMagic Calibration Script
If you rotate the display you need to recalibrate the touchscreen to work with the new screen orientation. You can manually run the calibration processes in the next section, or you can re-run the installer script and select a new rotation:

Try using this default calibration script to easily calibrate your touchscreen display. Note that the calibration values might not be exactly right for your display, but they should be close enough for most needs. If you need the most accurate touchscreen calibration, follow the steps in the next section to manually calibrate the touchscreen.
Manual Calibration
If the "automagic" calibration technique isn't working for you, or you have some other setup where you need to carefully calibrate you can do it 'manually'

You will want to calibrate the screen once but shouldn't have to do it more than that. We'll begin by calibrating on the command line by running

sudo TSLIB_FBDEVICE=/dev/fb1 TSLIB_TSDEVICE=/dev/input/touchscreen ts_calibrate

follow the directions on the screen, touching each point. Using a stylus is suggested so you get a precise touch. Don't use something metal, plastic only!

Next you can run

sudo TSLIB_FBDEVICE=/dev/fb1 TSLIB_TSDEVICE=/dev/input/touchscreen ts_test

which will let you draw-test the touch screen. Go back and re-calibrate if you feel the screen isn't precise enough!

X Calibration
You can also calibrate the X input system but you have to use a different program called xtcal (xinput_calibrator no longer works)

You can do this if the calibration on the screen isn't to your liking or any time you change the rotate=XX module settings for the screen. Since the screen and touch driver are completely separated, the touchscreen doesn't auto-rotate

Download and compile it with the following:

 Download: fileCopy Code
sudo apt-get install libxaw7-dev libxxf86vm-dev libxaw7-dev libxft-dev
git clone
cd xtcal
You must be running PIXEL (the GUI) while calibrating.

Before you start the calibrator you will need to 'reset' the old calibration data so run

DISPLAY=:0.0 xinput set-prop "stmpe-ts" 'Coordinate Transformation Matrix' 1 0 0 0 1 0 0 0 1
Now you'll have to run the calibrator while also running X. You can do this by opening up the terminal program and running the the xtcal command (which is challenging to do on such a small screen) OR you can do what we do which is create an SSH/Terminal shell and then run the calibrator from the same shell, which requires the following command:

DISPLAY=:0.0 xtcal/xtcal -geometry 640x480
Note that the geometry may vary!

If you are using a 2.4"/2.8"/3.2" 320x240 display with landscape orientation, use 640x480. If you're in portrait, use 480x640.

If you are using a 3.5" display with landscape, use 720x480, portrait is 480x720

Follow the directions on screen

Once complete you'll get something like:
Run sudo nano /usr/share/X11/xorg.conf.d/20-calibration.conf and copy the 9 numbers into the TransformationMatrix option so it looks like:

 Download: fileCopy Code
Section "InputClass"
        Identifier "STMPE Touchscreen Calibration"
        MatchProduct "stmpe"
        MatchDevicePath "/dev/input/event*"
        Driver "libinput"
        Option "TransformationMatrix" "-0.000087 1.094214 -0.028826 -1.091711 -0.004364 1.057821 0 0 1"
or whatever you got, into there.

You will want to reboot your Pi to verify you're do

Kedei 2 touch screen

Something I bought in 2015, 2 Kedei 2 lcd 3.5 inch touch screens. Worked, albeit slow.
With a Wheezy image, not to be updated due to the kernel doing its SPI thing to copy the framebuffer to the LCD screen via fbcopy.

March 2020, installed the Kedei screen on a Raspberry Pi V2 and inserted the archived SD card. It works!

Update? No, the official repository moved on. But there is a legacy repository!

Replace this line in /etc/apt/sources.list

deb wheezy main contrib non-free rpi

and teh apt-get update works (be it with some warnings).

To test I installed MC and that went allright (be it with some warnings).

Screen quality is not too bad, screen refreshes are slow. In console mode it reminds me of the 9600 baud serial terminals!

Now I want autologon, no option in old raspiconfig!


sudo nano /etc/inittab
Scroll down to:

1:2345:respawn:/sbin/getty 115200 tty1
and change to

#1:2345:respawn:/sbin/getty 115200 tty1
Under that line add:

1:2345:respawn:/bin/login -f pi tty1 /dev/tty1 2>&1

Auto StartX (Run LXDE)
In Terminal:

sudo nano /etc/rc.local
Scroll to the bottom and add the following above exit 0:

su -l pi -c startx