Turns a Raspberry Pi into a simple browser kiosk. A Go program controls a full-screen Chromium browser.
-
Configure the OS image using the Raspberry Pi Imager:
- Set hostname
- Enable SSH
- Configure a non-default user
- Configure WLAN
- Set the locale
-
After first boot, use
raspi-config
to:- Auto-boot into the graphical environment without asking for login credentials
- Disable screen blanking
The official touch screen makes a great secondary display for the kiosk-controller
. Add or change the following lines in /boot/config.txt
:
-
Rotate the touchscreen by 180°:
lcd_rotate=2
-
Switch to FKMS mode:
dtoverlay=vc4-fkms-v3d
Make sure it's
fkms
, and notkms
.
The URL of the browser is described in a YAML file that is passed as argument or via STDIN
to the kiosk
binary. If multiple entries are present, they will be opened as browser tabs and switched between every --interval
; e.g. 10s
.
Example:
- name: org
script:
- go: https://example.org
- click: //p/a
- name: com
script:
- go: https://example.com
- name: net
script:
- go: https://example.net
-
Deal with default values of controller.StatusUpdate - we don't want to send
IsTabSwitching = false
just because we did not know the current value- pointers (and skip nil pointers)
- always query everything (maybe not ideal)
-
At page load, set initial status of display power
-
If displays are powered off, power-up the controller if touched (catching a click in any part of the page)
-
Update the status of the power checkbox if changed on the server side
-
stream image updates (no need to reload images)
-
keep updating screenshots while switching is paused (may be impossible)
-
make the current page the one shown when loading the controller
-
add another service to run the kiosk controller on the touch screen:
$ chromium-browser --kiosk http://localhost:8011
-
re-configure tab switching time in the controller
-
deploy using pipeline
-
test pages for presence of some element, otherwise close tab and restart (e.g. when authenticated session expires)
-
refresh pages that are not self-refreshing (e.g. reload)
- also useful as HTTP command
-
configure
lcd_rotate=2
anddtoverlay=vc4-fkms-v3d
via Ansible -
unclutter -idle 0.5 -root &
if needed -
Turn displays on and off via HTTP or cron:
# Touch Screen (primary monitor) $ vcgencmd display_power 0 0 $ vcgencmd display_power 1 0 # HDMI $ vcgencmd display_power 0 2 $ vcgencmd display_power 1 2
Alternatively:
-
Touchscreen
$ sudo zsh -c "echo 1 > /sys/class/backlight/rpi_backlight/bl_power" # off $ sudo zsh -c "echo 0 > /sys/class/backlight/rpi_backlight/bl_power" # on
-
HDMI (
2
is the HDMI port; usetvservice --list
to list)$ tvservice -o -v 2 $ tvservice -p -v 0
-
For the Raspberry Pi 4, this is
$ GOARM=7 GOARCH=arm GOOS=linux go build
-
Make sure you have a recent Ansible installation:
$ brew install ansible
Replace
brew
withyum
orapt-get
, depending on your OS. -
Install the required Ansible roles:
$ ansible-galaxy install -r roles.yml
-
Update
inventory.yml
with the host(s) to deploy to
Run the playbook:
$ ansible-playbook playbook.yml