Building affordable Self-service Kiosks with Raspberry Pi

Recently, I was tasked with designing and setting up a simple, cost-effective, touchscreen-based self-service Kiosk which users can intuitively use to navigate a predefined website (and nothing else).

After spending some time researching the options (and realising just how expensive commercial touchscreens are!), I settled on the Dell P2418HT 24” touchscreen monitor and a Raspberry Pi. At a total cost of under $600 per Kiosk, it was a bargain when compared to the other options I’d come across ($1,200+ for the display alone)!

Unfortunately, I wasn’t able to find much online about running the Dell P2418HT with a Raspberry Pi and was advised by Dell that it was not supported. Determined to save money, I purchased the monitor anyway with the view of being able to upgrade to an Intel Atom-based NUC at a later date, if the monitor wasn’t compatible. It helped that I had a spare Raspberry Pi lying around, too!

To my surprise, both Alpine Linux (ARMHF) and Raspbian detect the touchscreen as a generic Touch-input HID device, so the touchscreen functionality worked out of the box!

As with anything, security should be of paramount importance, so I needed a way to lock users down to only the one particular website, and prevent them from being able to change browser/OS configuration.
A combination of Getty, an unprivileged user, and Chromium-browser’s kiosk mode seemed to fit these requirements perfectly, without impacting on the user’s ability to use the desired self-service website. I’ve documented the steps required to do this, below.

Once you’ve saved this file, reboot the raspberry Pi and you should hopefully be greeted with a full-screen Chrome browser with http://myselfserviceurl.com/path loaded!

If the browser crashes, or if you restart the Raspberry Pi, Chrome will automatically start up again and load the desired URL, running as a user with minimal privileges.

If Chrome doesn’t launch in full-screen mode, you may need to disable Overscan in your display preferences, or force Chromium to start with a specific resolution. To simplify the latter, you can update your ~/.xinitrc file to retrieve the current display resolution automatically, as follows: