Raspberry pi powered wall mounted tablet

For several years, I relied on a wall-mounted Android tablet running Fully Kiosk Browser as a control panel for my home automation system (OpenHAB). When my last tablet finally died, I decided to try a different approach: a Raspberry Pi paired with a touchscreen. I had looked into this option a few years ago, but back then the software side required far too many tweaks to match the smooth experience of an Android tablet (especially for touchscreen interactions and on-screen keyboard support).

Fortunately, things have evolved. It’s now surprisingly easy to build a web-based kiosk tablet using a Raspberry Pi and a reasonably large display. One of my main goals was to create a device that needs little to no maintenance while staying permanently available.

This is the story of my new Raspberry-Pi-powered wall-mounted tablet…

Used Materials

Here is the list of components I used to build the wall-mounted tablet:

  • Raspberry Pi CM4 (4 GB RAM, Wi-Fi, 16 GB eMMC)
  • 15.6″ Full HD HDMI IPS touchscreen (brand “Showscren”)
  • Waveshare Nano Board C (CM4 carrier board)
  • Waveshare aluminium heatsink for Raspberry Pi CM4
  • Uadme camera module (IMX219 sensor)
  • 30 cm ultra-thin HDMI cable (Thsucords)
  • 25 cm USB-A 90° to USB-C cable
  • 13 cm flat “FPC-style” USB-A to USB-C 90° cable

Hardware Assembling

The choice of the CM4 combined with the Nano Board C was intentional: I needed a compact setup that could fit inside a standard cavity wall box alongside a 5 V power supply and a heatsink.

First, the heatsink needs to be screwed onto the CM4:

Then the Nano Board C is connected to the CM4. The assembled unit has a total depth of just 20.3 mm:

Below you can see how the tablet is powered and mounted on the wall. The last photo highlights the position of the camera module:

Mounting eMMC to Flash an OS

I chose a CM4 with eMMC instead of a microSD card because it is faster and provides sufficient storage for this tablet. However, flashing the eMMC requires a small utility called rpiboot , which essentially exposes the eMMC as a standard block device on your PC (e.g., /dev/sdc ).

The Waveshare Nano C board features a small boot button that must be set to “ON.” Then, connect the CM4 to your PC via a USB-C cable. Running rpiboot produces the following output:

At this point, the Pi’s LEDs turn on, and the eMMC is accessible as a standard mass storage device, ready for flashing.

Install and configure

Base install

I initially experimented with LineageOS by following the installation guide, hoping to replicate the setup of my previous Android-based tablet running Fully Kiosk Browser. Unfortunately, a few limitations quickly made it unsuitable for this project:

  • The build lacks full camera and Bluetooth support, which makes videoconferencing apps unusable.
  • The browser became unstable and regularly crashed or froze after only a few hours displaying my HabPanel dashboard.

Given these constraints, I switched to Raspberry Pi OS with Desktop (the standard edition — not “full” and not “lite”), which offers better stability and broader hardware compatibility for a kiosk-style setup:

sudo dd if=2025-10-01-raspios-trixie-arm64.img of=/dev/sdc bs=2048 status=progress 

Configuring

Once the system was installed, I completed the initial setup by configuring Wi-Fi, setting Firefox as the default browser, and opening the Control Center for the first adjustments:

  • Disabled the background image and set a plain black wallpaper
  • Switched the system theme to Dark

Following the Waveshare CM4-Nano-C documentation, I applied the recommended settings in config.txt :

I verified camera support using rpicam-hello , as described in the official documentation

Using raspi-config , I enabled a few essential services:

  • SSH
  • VNC
  • The on-screen keyboad in automatic mode

Desktop adjustments:

  • Removed the trash icon from the desktop
  • Enabled multitouch gestures from the Control Center

Firefox configuration:

  • Disabled spell checking
  • Disabled recommended extensions and integrated features
  • Disabled data collection
  • In about:config , set dom.w3c_touch_events.enabled  to 1 to improve touchscreen handling

Finally, I paired my Bluetooth Plantronics Calisto 620 using the SBC-XQ audio codec. Now, whenever I power it on, it automatically connects to the Pi and becomes the default system microphone.

Automated upgrade

Keeping the OS up to date with automatic reboots is part of the “bare minimum” for a true no-toil device. Since Raspberry Pi OS is based on Debian, I relied on the standard unattended-upgrades service.

First, install the package:

apt-get install unattended-upgrades -y 

Then copy the default configuration and edit your local version:

In the edited file, I enabled the following:

  • Allow updates and proposed-updates in the Origins-Pattern  section
  • Unattended-Upgrade::Remove-Unused-Kernel-Packages 
  • Unattended-Upgrade::Remove-New-Unused-Dependencies 
  • Unattended-Upgrade::Remove-Unused-Dependencies 
  • Unattended-Upgrade::Automatic-Reboot 
  • Unattended-Upgrade::Automatic-Reboot-WithUsers 
  • Set Unattended-Upgrade::Automatic-Reboot-Time  to 04:00 

My logic was: download updates at 2:00, apply upgrades at 3:00, and reboot at 4:00 if required. Everything happens overnight, with no disruption during the day.

To tune the timers, I edited the systemd units apt-daily.timer 

Then apt-daily-upgrade.timer :

Photo frame while idle

On my previous Android setup, Fully Kiosk Browser provided a built-in photo slideshow when the tablet was idle. It’s a neat way to make a wall-mounted display useful even when nothing is actively shown. Raspberry Pi OS / Debian doesn’t offer such a feature out of the box, but implementing it turned out to be straightforward.

I also added a small improvement: automatic random photo selection at a configurable frequency. Photos are copied from a CIFS share hosted on my NAS to the Raspberry Pi, and a script handles the randomization logic before copying them locally.

The CIFS share is mounted via fstab  using a line similar to:

The script ( /usr/local/bin/sync_photos.sh ) accepts several parameters:
  • The source path (remote CIFS folder)
  • The local destination folder
  • The maximum number of photos to copy
  • How many recent photos to include
  • How many months define a recent photo
  • How many months define an old photo

This may look a bit over-engineered, but I like my photo frame to display a balanced mix of fresh memories and older ones. The script also handles folders to ignore.

Since the tablet is mounted horizontally, I added a simple check to only keep landscape-oriented photos.

To avoid putting unnecessary load on my NAS, the script generates a cached list of all eligible photos based on the selected parameters. This cache is reused until a new file is detected on the NAS, at which point it is rebuilt.


The script is triggered via cron ( crontab -e ), along with scheduled display power on/off during night hours to save energy. I also restart Firefox every day at 05:30, as HabPanel tends to freeze after several hours.

To display photos, I installed imv ( apt get install -y imv ).Together with swayidle, the slideshow starts automatically after 30 seconds of inactivity. Example:


Autostart everything at boot

To make the tablet fully autonomous, both Firefox (in kiosk mode) and the idle photo slideshow must start automatically at boot. This is handled through standard XDG autostart entries.

I created two .desktop  files in /etc/xdg/autostart/ :

firefox-kiosk.desktop:

idle-slideshow.desktop

 

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.