Quiosque Raspberry Pi para GUI no Kivy

Olá, Habr!



Gostaria de compartilhar minha experiência de configuração do Raspberry Pi 3B + como um quiosque com uma GUI baseada na biblioteca Kivy para Python 3. Por que Kivy? É que já temos um produto desenvolvido em Python, gostaríamos de adicionar uma interface gráfica a ele. É importante notar que antes do Kivy, tentamos várias opções, incluindo wxWidgets e até um navegador Chromium com um aplicativo web. Todas essas alternativas se mostraram impotentes contra Kivy, leves e rápidas. Uma visão geral muito boa desta biblioteca já está no Habré .



Meio Ambiente



Estaremos usando Raspbian Lite com Python 3.7 e o processo Supervisor e sistema de gerenciamento de serviço. A propósito, o utilitário Raspberry Pi Imager é muito conveniente , com o qual você pode preparar um cartão SD. Após o primeiro download do nosso RPi baby, fazemos o login usando o login pi padrão e a senha raspberry . Então executamos:



$ sudo raspi-config


Selecionamos o quinto item Opções de Interface , no menu que aparece estamos interessados ​​no segundo item SSH , com o qual habilitaremos o acesso remoto por conveniência.

Assim, recostando-se confortavelmente em sua cadeira favorita, continuaremos configurando o RPi através de qualquer cliente ssh conveniente.



Do utilizador



Vamos criar um usuário com um nome conveniente para nós, permitir que ele use o sudo e reinicie:



$ sudo useradd -m kivygui -s /bin/bash
$ sudo passwd kivygui
$ sudo usermod -a -G sudo kivygui
$ sudo reboot


Após a reinicialização, faça o login via ssh com os novos dados para kivygui e remova a conta pi padrão :



$ sudo userdel pi
$ sudo rm -r /home/pi/


Não será supérfluo apontar que estamos usando o layout de teclado americano:



$ sudo sed -i 's/XKBLAYOUT="gb"/XKBLAYOUT="us"/' /etc/default/keyboard


Aplicação de teste



Nosso aplicativo de teste estará em uma pasta separada, vamos criá-lo:



$ mkdir /home/kivygui/helloworld


Agora, no editor de texto nano , vamos criar um script para executar o aplicativo Python /home/kivygui/helloworld/run.sh com o seguinte conteúdo:



export DISPLAY=:0.0
xset s off -dpms
exec matchbox-window-manager &
while true; do
  exec python3 start.py
done


Vamos fazer no nano um exemplo de uma interface simples no arquivo /home/kivygui/helloworld/start.py:



import kivy
kivy.require('1.11.0')
from kivy.app import App
from kivy.uix.label import Label
class MyApp(App):
    def build(self):
        return Label(text='Hello, world!')
if __name__ == '__main__':
    MyApp().run()


Interface gráfica do usuário



Precisamos do pip3 :



$ sudo apt-get update -y
$ sudo apt-get install -y python3-pip


Também descobri que, ao instalar o nodm, nem sempre foram baixados todos os pacotes necessários, então, por precaução, vamos instalá-los com antecedência:



$ sudo apt-get install -y desktop-base gtk2-engines-pixbuf libxklavier16 xserver-xorg xserver-xorg-input-all xserver-xorg-input-libinput xserver-xorg-input-wacom xserver-xorg-legacy xserver-xorg-video-all xserver-xorg-video-amdgpu xserver-xorg-video-ati xserver-xorg-video-fbdev xserver-xorg-video-nouveau xserver-xorg-video-radeon xserver-xorg-video-vesa


Agora vamos definir o nodm e a caixa de fósforos do gerenciador de janelas :



$ sudo DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true apt-get install -y x11-xserver-utils nodm matchbox-window-manager
$ echo "/usr/sbin/nodm" | sudo tee /etc/X11/default-display-manager
$ sudo sed -i -e "s/NODM_ENABLED=false/NODM_ENABLED=true/" -e "s/NODM_USER=root/NODM_USER=kivygui/" -e "s/NODM_X_OPTIONS='-nolisten tcp'/NODM_X_OPTIONS='-nolisten tcp -nocursor'/" /etc/default/nodm


Agora é a vez de Kivy :



$ sudo apt-get install -y libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev pkg-config libgl1-mesa-dev libgles2-mesa-dev python-setuptools libgstreamer1.0-dev git-core gstreamer1.0-plugins-{bad,base,good,ugly} gstreamer1.0-{omx,alsa} python-dev libmtdev-dev xclip xsel libjpeg-dev
$ sudo python3 -m pip install --user kivy


Agora vamos ensinar nosso sistema a nos mostrar uma interface gráfica em vez de um prompt de console, ocultar todas as mensagens de diagnóstico e mostrar uma tela gráfica de inicialização do sistema:



$ sudo rm /etc/systemd/system/default.target
$ sudo rm /etc/systemd/system/getty@tty1.service.d/autologin.conf
$ sudo ln -s /lib/systemd/system/graphical.target /etc/systemd/system/default.target
$ sudo sed -i '$ s/$/ quiet splash consoleblank=0 loglevel=0 logo.nologo plymouth.ignore-serial-consoles/' /boot/cmdline.txt
$ sudo sed -i 's/console=tty1/console=tty3/' /boot/cmdline.txt


Se desejado, o console tty1 pode ser totalmente desativado:



$ sudo systemctl disable getty@tty1


Supervisord



Agora vamos instalar o Supervisor :



$ sudo apt-get install -y supervisor


Vamos criar uma pasta para logs:



$ mkdir /home/kivygui/logs


Agora vamos interromper o serviço do Supervisor por um tempo para reconfigurar:



$ sudo systemctl stop supervisor


Adicione o seguinte ao arquivo de configuração /etc/supervisor/supervisord.conf usando o editor nano :



[program:rungui]
command=sh run.sh
directory=/home/kivygui/helloworld
user=root
autostart=true
autorestart=true
startsecs = 5
startretries=3
stderr_logfile=/home/kivygui/logs/rungui.err.log
stdout_logfile=/home/kivygui/logs/rungui.out.log
stderr_logfile_maxbytes=5MB
stdout_logfile_maxbytes=5MB
stopsignal=INT
stopwaitsecs=5


Além disso, vamos dar aos usuários kivygui e root algumas opções extras. Para fazer isso, use o comando:



$ sudo visudo


Vamos trazer o arquivo para o seguinte formato:



#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) ALL
kivygui  ALL=(ALL:ALL) ALL
 
# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL
 
# See sudoers(5) for more information on "#include" directives:
 
#includedir /etc/sudoers.d
 
kivygui ALL = NOPASSWD: /usr/bin/supervisorctl
kivygui ALL = NOPASSWD: /usr/bin/python3.7
kivygui ALL=(ALL) NOPASSWD: /bin/systemctl daemon-reload
kivygui ALL=(ALL) NOPASSWD: /usr/bin/supervisord
 
root ALL=(ALL) NOPASSWD: /bin/systemctl daemon-reload
root ALL = NOPASSWD: /usr/bin/supervisorctl
root ALL = NOPASSWD: /usr/bin/python3.7
root ALL=(ALL) NOPASSWD: /usr/bin/supervisord


Agora podemos iniciar o serviço:



$ sudo systemctl start supervisor


No monitor conectado ao RPi, veremos a querida saudação. Tudo o que resta é reiniciar para testar a tela gráfica de inicialização.



PS



Na verdade, nodm pode substituir lightdm por autologin . Será absolutamente semelhante à solução nodm . Além disso, o próprio desenvolvedor do nodm recomenda essa abordagem.



All Articles