raspi
This commit is contained in:
100
README.md
100
README.md
@ -71,6 +71,106 @@ that machine: put `HandleLidSwitch=ignore` in
|
|||||||
`/etc/systemd/logind.conf.d/photobooth.conf` (needs root, applies even
|
`/etc/systemd/logind.conf.d/photobooth.conf` (needs root, applies even
|
||||||
when the booth is not running) or use the desktop's own power settings.
|
when the booth is not running) or use the desktop's own power settings.
|
||||||
|
|
||||||
|
## Running on a Raspberry Pi (no desktop)
|
||||||
|
|
||||||
|
The booth needs no desktop environment. On a console-only machine (no X
|
||||||
|
or Wayland session) it automatically tells SDL to draw straight to the
|
||||||
|
screen via the KMS/DRM driver, so it runs fine on Raspberry Pi OS Lite.
|
||||||
|
|
||||||
|
1. **Install Raspberry Pi OS Lite (64-bit)** and boot with the screen,
|
||||||
|
camera, and mouse plugged in.
|
||||||
|
|
||||||
|
2. **Install the system packages:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo apt install python3-venv cups fonts-dejavu-core
|
||||||
|
```
|
||||||
|
|
||||||
|
(`fonts-dejavu-core` is for the contact-sheet footer text — Lite
|
||||||
|
doesn't ship it and the fallback font is tiny.)
|
||||||
|
|
||||||
|
3. **Create a virtual environment and install the dependencies:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python3 -m venv ~/photobooth-venv
|
||||||
|
~/photobooth-venv/bin/pip install pygame-ce opencv-python-headless pillow
|
||||||
|
```
|
||||||
|
|
||||||
|
Note the **headless** OpenCV build: the regular `opencv-python` wheel
|
||||||
|
needs X libraries that Lite doesn't have, and the booth uses no GUI
|
||||||
|
features. If the pygame-ce wheel's SDL lacks the KMS/DRM driver
|
||||||
|
(`pygame.error: kmsdrm not available`), use the distro build instead
|
||||||
|
(`sudo apt install python3-pygame`) — the booth uses nothing
|
||||||
|
pygame-ce-specific.
|
||||||
|
|
||||||
|
4. **Give your user access to the screen and input devices:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo usermod -aG video,render,input $USER # then log out and back in
|
||||||
|
```
|
||||||
|
|
||||||
|
5. **Check which screen modes are available.** The Pi can only use modes
|
||||||
|
the display (or HDMI adapter) advertises:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cat /sys/class/drm/card*-HDMI-A-*/modes
|
||||||
|
```
|
||||||
|
|
||||||
|
If 800x600 isn't listed, set `[display]` width/height in `config.toml`
|
||||||
|
to one of the listed modes. For a 4:3 CRT behind an HDMI-to-coax
|
||||||
|
adapter, 720x480 fills the screen correctly (same trick as DVDs).
|
||||||
|
Everything scales to `[display]` automatically — no code changes
|
||||||
|
needed.
|
||||||
|
|
||||||
|
6. **Set up the printer** with CUPS from the command line:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
lpinfo -v # find the printer's URI (USB printers: usb://...)
|
||||||
|
lpinfo -m # list available drivers
|
||||||
|
sudo lpadmin -p PRINTER -E -v <uri> -m <driver>
|
||||||
|
lpoptions -d PRINTER
|
||||||
|
lpstat -p -d # verify
|
||||||
|
```
|
||||||
|
|
||||||
|
Then set `printer = "PRINTER"` in `config.toml` to match.
|
||||||
|
|
||||||
|
7. **Run it** from the console:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
~/photobooth-venv/bin/python photobooth.py
|
||||||
|
```
|
||||||
|
|
||||||
|
### Starting automatically at boot
|
||||||
|
|
||||||
|
Create `/etc/systemd/system/photobooth.service` (adjust the user and
|
||||||
|
paths to match your setup):
|
||||||
|
|
||||||
|
```ini
|
||||||
|
[Unit]
|
||||||
|
Description=CRT Photobooth
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
User=pi
|
||||||
|
SupplementaryGroups=video render input
|
||||||
|
WorkingDirectory=/home/pi/nissaphotobooth
|
||||||
|
ExecStart=/home/pi/photobooth-venv/bin/python photobooth.py
|
||||||
|
Restart=on-failure
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
```
|
||||||
|
|
||||||
|
Then:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo systemctl enable --now photobooth
|
||||||
|
```
|
||||||
|
|
||||||
|
Quit with Esc/Q on a keyboard, or `sudo systemctl stop photobooth` over
|
||||||
|
SSH. The keep-awake locks work the same as on a laptop (a Pi rarely
|
||||||
|
sleeps anyway). The `auto-macally` camera lookup already waits ~15
|
||||||
|
seconds for USB devices to enumerate, so no boot-order tweaks are needed.
|
||||||
|
|
||||||
## Customizing
|
## Customizing
|
||||||
|
|
||||||
- **All settings** live in `config.toml` — camera choice, screen text,
|
- **All settings** live in `config.toml` — camera choice, screen text,
|
||||||
|
|||||||
@ -22,6 +22,11 @@ import time
|
|||||||
import tomllib
|
import tomllib
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
|
# On a console-only machine (no X or Wayland session), tell SDL to draw
|
||||||
|
# straight to the screen via KMS/DRM, so no desktop environment is needed.
|
||||||
|
if not os.environ.get("DISPLAY") and not os.environ.get("WAYLAND_DISPLAY"):
|
||||||
|
os.environ.setdefault("SDL_VIDEODRIVER", "kmsdrm")
|
||||||
|
|
||||||
import pygame
|
import pygame
|
||||||
|
|
||||||
import camera as cam
|
import camera as cam
|
||||||
|
|||||||
Reference in New Issue
Block a user