Crear un kiosko digital con chromium o firefox en Raspberry Pi

Vamos a ver como crear un «kiosko» a partir de una web con Raspberry Pi, una pantalla táctil y una pagina web que es la que queremos mostrar en nuestro kiosko. Lo que deseamos es que la web aparezca a pantalla completa y sin que el usuario pueda «escapar» de ella. En mi caso lo que deseaba mostrar era una web con el tiempo, un calendario y alguna información del ayuntamiento de mi ciudad. Para ellos bastaba con mostrar una pagina web alojada en la propia Raspberry con iframes para mostrar parte de la información. El problema era que se viera en toda la pantalla y no se pudiera salir accidentalmente (o intencionadamente) de la web.

Para ello existe en chromium y firefox (tambien en chrome aunque para Raspberry no este) el modo kiosko que muestra una página web a pantalla completa, sin barra de herramienta, direcciones, menú o cabecera. La forma de lanzarlo es asi:

chromium-browser --kiosk direccionweb

firefox --kiosk direcionweb

google-chrome --kiosk direccionweb

La única forma de salir es con un teclado y pulsado alt+f4. En mi caso como no había teclado ya tenia mi kiosko seguro pero hay algunas cosas que hay que tener en cuenta según su uso para que el kiosko sea seguro:

  • Desactivar el recordar y autocompletar de campos
  • Nada de teclados
  • Si se tiene que poner un teclado mejor si es un teclado en pantalla, mejor aun si el teclado es parte de la web, por ejemplo este
  • El teclado ha de tener solo las teclas necesarias. No tiene que tener teclas «especiales» como control, alt, f1, f2,…
  • Asegurarse de que la web que se muestra no tiene enlaces que lleven fuera de la misma.
  • Bloquear los puertos USB para evitar que nadie los use. Si la conexión de red es por WiFi aquí se puede ver como hacerlo

Estas medidas hay que tenerlas en cuenta según el entorno del kiosko, no es lo mismo en una casa que en una tienda o en un lugar publico.

Aun así hay varios puntos de ataque:

  • Quitar la alimentación.
  • Quitar la conexión de red.

Quitar la alimentación eléctrica dejaría nuestra Raspberry apagada, el problema esta cuando vuelve, que por defecto se reinicia. Aquí tenemos que decidir porque opción optamos. Si mostrar una pantalla de login (mejor si es consola en lugar de interface gráfica) con usuario y password (ambos deben de ser seguros, nada de dejar los por defecto) y dejar el kiosko sin servicio. La otra opción es configurar el autologin y hacer que el kiosko se lance automáticamente cuando el desktop se inicie. Aquí se explica como hacerlo.

Al quitar la conexión de red (red de datos) el navegador mostrará una pagina de error. Al recuperar la conexión es posible que se quede esa página en lugar de volver a la que debería mostrar el kiosko. Hay una solución que es en lugar de cargar directamente la web remota poner un servidor web en la propia Raspberry Pi, que el navegador en modo kiosko cargue la pagina que sirva este servidor local y ella sea la que se muestren las distintas fuentes de datos. Al falla la conexión el servidor local sigue funcionando y permite tener cierto control sobre lo que ocurra.

Raspberry Pi, ejecutar una aplicación o script al inicio

Cuando queremos «ejecutar una aplicación al inicio» nos podemos referir a dos momentos distintos: al iniciar la Raspberry, al iniciar el escritorio. En el primer caso solo se pueden lanzar aplicaciones o script que no necesiten una «ventana» para funcionar mientras que el segundo se suele usar más para aplicaciones de escritorio.

Ejecutar una aplicación al iniciar la Raspberry Pi

Para esta tarea podemos recurrir a la herramienta crontab. Ya vimos su uso aqui. Siguiendo las indicaciones de ese posta bastaria con usar el comando:

crontab -e

Y luego añadir la entrada:

@reboot aplicacion

Donde «aplicacion» es la ruta y e lnombre de la aplicación, script o comando a lanzar.

Ejecutar una aplicación al iniciar el escritorio de Raspberry Pi

Hay que ir al directorio /etc/xdg/autostart y crear un fichero con el nombre que queramos pero terminado en .desktop el contenido del mismo ha de ser:

[Desktop Entry]
Name=Lanzo mi aplicacion
Exec=aplicacion
Terminal=false
Type=Application

El campo name puede ser una pequeña descripción de la aplicación y el campo exec contiene la ruta y el nombre de la aplicación a lanzar.

Debo señalar que hay más formas de realizar estas dos tareas y estas solo son dos de las más habituales y sencillas.

Raspberry Pi, desactivar conexiones para ahorrar energía

Vamos a ver como poder modificar las distintas conexiones que posee una Raspberry Pi para ahorrar energía. Nos vamos a entrar en

Hay que pensarlo bien antes de usar una política de activar/deasctivar las conexiones. El restablecerlas tiene un coste enérgico por lo que estar todo el rato conectando y desconectando puede aumentar el consumo en lugar reducirlo.

Todos estos comandos se deben de ejecutar con permisos de administrador por lo que puede ser necesario usar sudo delante de ellos.

Desactivar y activar bluetooth

Desactivar bluetooth:

rfkill block bluetooth

Activar bluetooth:

rfkill unblock bluetooth

Desactivar y activar WiFi

Desactivar WiFi:

rfkill block wifi

Activar WiFi

rfkill unblock wifi

Al activarlo habrá que volver a conectarse a la red.

Conexión ethernet

En este apartado vamos a ver como de desactiva el software a nivel de sistema operativo y no como desactivar la alimentación que veremos en el apartado siguiente.

Desactivar conexión ethernet:

ifconfig eth0 down

Activar conexión ethernet:

ifconfig eth0 up

Desactivar puertos USB (y ethernet)

Los puertos USB y ehernet tienne alimentación compartida si desactivamos los USB el puerto ethernet «cae con ellos».

Desactivar puertos USB:

echo '1-1' |sudo tee /sys/bus/usb/drivers/usb/unbind

Activar puertos USB:

echo '1-1' |sudo tee /sys/bus/usb/drivers/usb/bind

Raspberry Pi programar el encendido, apagado y reinicio

Vamos a ver como podemos configurar la Raspberry Pi para que se encienda, se apague y se reinicie cuando nosotros queramos. El reinicio y el apagado son sencillos. Para el encendido necesitaremos soluciones más imaginativas.

Para programar el apagado y reinicio usaremos el servicio cron para programar tareas. Ya vimos como funcionaba en esta entrada. Ahora solo hace falta ver que comandos tenemos que programar.

Para reiniciar la Raspberry podemos usar:

reboot

Y para apagarla:

shutdown -h now

Ambos necesitan usarse con permisos de administrador por lo que es recomendable programarlos en el crontab del usuario root o de cualquiera que tenga permisos de administrador y precederlos del comando sudo.

Ahora vemos como resolvemos programar el encendido. No hay un comando que encienda al Raspberry Pi tras haberla apagado. Para ello necesitáramos un RTC con una batería que se quedase en espera para encender la Raspberry, por suerte debido a como funciona la Raspberry eso es muy sencillo. Si tienes la Raspberry sin alimentación y se la pones se enciende, no hay ningún interruptor que cambiar de on a off ni nada parecido. Aprovechando eso basta con usar un enchufe con temporizador, que se pueden comprar muy baratos. Esos enchufes llevan un reloj en el que ajustas que horas van a tener luz y que horas no.

Por ejemplo, supongamos que queremos tener una Raspberry de tal forma que se apague por la madrugada cuando no vas a hacer uso de ella, por ejemplo a la 1:00 y que se encienda a las 8:00. Lo primero es ajustar el enchufe, lo programamos para que corte la alimentación pasadas la 1:00 pero dejando un margen, la 1:15, la 1:30, sin apurar. Y para que a las 8:00 (o algo antes) vuelta a conectar la alimentación.

El último paso es configurar una tarea de cron para que lance el comando de apagar la Raspberry a la 1:00. Para evitar que cuando se corte la corriente se apague la Raspberry mal hay que dejar un margen de tiempo desde que está programado lanzar el comando hasta que el enchufe corte la corriente.

Raspberry Pi programar tareas con cron

Cron es un servicio que se usa para lanzar tareas programadas. Su configuración se realiza a través de un fichero de configuración donde se definen las tareas programadas.

Cada usuario tiene su propio fichero de configuración, este se edita con el comando:

crontab -e

Cada linea del fichero es una tarea programada. Una tarea progrmada tiene 6 parámetros (excepto si empieza por @ que solo tiene 2), los cinco primeros definen en momento cuando se lanza el comando y el sexto el comando que se lanza:

  1. Minuto en el que se ejecutará el comando, va de 0 a 59.
  2. Hora en la que se ejecutará el comando, va de 0 a 23.
  3. Día del mes en el que se ejecutará el comando, va del 1 al 31.
  4. Mes en el que se ejecutará el comando, va del 1 al 12.
  5. Día de la semana en el que se ejecutará el comando, va de 0 a 7.
  6. Comando que se ejecutará

Se pueden usar los siguientes modificadores:

  • * : cualquier valor de ese campo
  • , : define listas de valores. 1,3,5
  • – : define rangos de valores. 1-5 seria lo mismo que 1,2,3,4,5
  • / : en combinación con un rango o el asterisco define «cada cuanto». 1-5/2 seria lo mismo que 1,3,5
  • # : Se usa en el campo día de la semana, indica que semana del mes. 1#2 el segundo lunes del mes
  • W : Se usa en el campo día de la semana, indica el primero del mes. 1W el primer lunes del mes
  • L : Se usa en el campo día de la semana, indica el último del mes. 1L el último lunes del mes
  • @ : Es un atajo para indicar momentos concretos
    • @reboot una vez al inicio del sistema
    • @yearly una vez al año «0 0 1 1 *»
    • @annually una vez al año «0 0 1 1 *»
    • @monthly una vez al mes «0 0 1 * *»
    • @weekly una vez a la semana «0 0 * * 0″
    • @daily una vez cada dia «0 0 * * *»
    • @hourly una vez cada hora «0 * * * *»

Algunos ejemplos:

30 22 * * 1-5 reboot

Reiniciar de lunes a viernes a las 22:30 (las diez de la noche)

30 10-14/2 * * * reboot

Reiniciar a las 10:30, 12:30 y 14:30 cada día

15 */6 * * * reboot

Reiniciar cada 6 horas cuando sean las y cuarto de esa hora

@hourly reboot

Reiniciar cada hora

30 10 * * 0W reboot

Reiniciar el primer domingo de cada mes

30 10 * * 7W reboot

Reiniciar el primer domingo de cada mes (el 0 y el 7 indican domingo)

Jugando con los led de la Raspberry Pi

En la place de la Raspberry Pi hay dos leds (hay mas si contamos los del conector ethernet pero esos son otra historia). Uno verde conocido como ACT LED o led0 que se enciende cuando accede a la tarjeta SD y otro rojo conocido como PWR LED o led1 que se enciende cuando tiene alimentación. Usando comandos de Raspberry Pi OS tenemos cierto control sobre ellos.

Apagar y encender los leds

Hay varias maneras, en el siguiente apartado veremos otra, pero esta es recomendable puesto que los apaga si, afectar a su funcionamiento.

Apagar ACT LED

echo 0 | sudo tee /sys/class/leds/led0/brightness

Volver a encender ACT LED

echo 1 | sudo tee /sys/class/leds/led0/brightness

Apagar PWR LED

echo 0 | sudo tee /sys/class/leds/led1/brightness

Volver a encender PWD LED

echo 1 | sudo tee /sys/class/leds/led1/brightness

En la Raspberry Pi Zero los valores son al revés, 1 para apagar, 0 para encender

Cambiar función de los led

Podemos asignar distintas funciones a cada uno de los leds jugando con el trigger que controla su comportamiento.

El led ACT LED parpadea cada segundo:

echo timer | sudo tee /sys/class/leds/led0/trigger

El led PWR LED parpadea una sola vez

echo oneshot | sudo tee /sys/class/leds/led1/trigger

La diferencia esta en si en al ruta de /sys/class/leds/led0/trigger si se usa led0 o led1. Hay diferentes valores que se pueden usar:

none                Apagado
kbd-scrolllock      Keyboard bloq despl/scroll lock
kbd-numlock         Teclado bloq num/num lock
kbd-capslock        Keyboard bloq mayus/caps lock
kbd-kanalock        Keyboard kana lock
kbd-shiftlock       Tecla shift/mayus
kbd-altgrlock       Tecla altgr
kbd-ctrllock        Tecla ctrl
kbd-altlock         Tecla alt
kbd-shiftllock      Tecla shift/mayus izquierda
kbd-shiftrlock      Tecla shift/mayus derecha
kbd-ctrlllock       Tecla ctrl izquierda
kbd-ctrlrlock       Tecla ctrl derecha
timer               Parpadea cada segundo
oneshot             Parpadea una sola vez
heartbeat           Parpadea como un latido(1-0-1-00000)
backlight           Encendido
gpio                Permite controlarlo desde GPIO
cpu0                Parpadea cuando se usa la cpu0
cpu1                Parpadea cuando se usa la cpu0
cpu2                Parpadea cuando se usa la cpu0
cpu3                Parpadea cuando se usa la cpu0
default-on          Encendido
[input]             Encendido si el voltaje es suficiente
panic               Parpadea cuando hay un kernel panic
mmc0                Parpadea al acceder a la SD
mmc1                Parpadea al acceder a la SD secundaria
rfkill0             Parpadea con la actividad del WiFi
rfkill1             Parpadea con la actividad del bluetooth

Los eventos de teclado no funcionan con las conexiones en remoto, solo con los teclados directamente conectados a la Raspberry.

Los valores por defecto del led1 es [input] y el del led1 mmc0

Los valores none y default-on permiten apagar y encender el led, pero es más recomendable usar el método visto en el apartado anterior por no afecta a la funcionalidad del led, en cambio con none y default-on el led pierde su funcionalidad original para estar encendido siempre.

Como apagar la salida HDMI en la Raspberry Pi

Si tienes conectada una pantalla a tu Raspberry puede ser interesante apagarla cuando no sea necesaria, para ahorrar energía, para no molestar con su luz, para que dure más,….

Mi consejo es realizar las pruebas de todo los que vamos a ver en este post desde otro ordenador conectándonos a la Raspberry por SSH. No hay que olvidar que el primer paso es apagar la pantalla por lo que toda la parte de volver a encenderla tendrás que hacerla a ciegas.

El modo sencillo vcgencmd

Si esta forma te funciona enhorabuena, juegas en modo fácil. Eso no quiere decir que hayas ganado la partida. Ademas es la forma recomendada por la documentación de Raspberry Pi.

vcgencmd es una utilidad de Raspberry Pi OS para leer y fijar algunos valores de la controladores de vídeo de la Raspberry

Apagar la pantalla:

vcgencmd display_power 0

Volver a encender la pantalla:

vcgencmd display_power 1

Ahora bien a partir de la Raspberry Pi 4 llevan dos salidas HDMI puedes controlarlas por separado añadiendo un 2 para la salida HDMI 0 y un 7 para la salida HDMI 1.

Apagar y encender la salidad HDMI 0:

vcgencmd display_power 0 2
vcgencmd display_power 1 2

Apagar y encender la salidad HDMI 1:

vcgencmd display_power 0 7
vcgencmd display_power 1 7

El modo difícil tvservice

Si el modo fácil no funciona vamos al siguiente nivel.

tvservice permite controlar el servicio de video de Raspberry.

Apagar la pantalla:

tvservice -o

Ahora viene lo difícil, volver a encenderla. El problema suele ser que se vuelve a encender pero no con la configuración adecuada. Mi consejo es ir probando uno por uno los siguientes comandos:

tvservice -p
fbset -depth 8
fbset -depth 16
fbset -depth 32
xrefresh

Algunas pantallas volverán a funcionar correctamente con el primer comando, otras necesitaran solo hasta el tercero y otras necesitaran todos.

El caso más extremo reboot

Generalmente con alguno de los casos anteriores se logra apagar la pantalla y el problema suele ser volver a encenderla. Hay una solución que siempre funciona pero es tan radical que no siempre puede aplicarse. Reiniciar la Raspberry Pi con el comando:

reboot

Al reiniciarse la pantalla vuelve a funcionar con normalidad. Depende el uso que se le esté dando puede ser una solución que causa más problemas de los que soluciona.

Y aún así puede que no sirva de nada

Todo esto puede que no sirva para nada dependiendo de como se comporte la pantalla. Lo ideal es que al desconectar el puerto HDMI la pantalla se apague, pero el mundo no es un lugar perfecto y algunas pantallas en lugar de apagare muestran un mensaje estilo «No Signal», realmente es un mensaje útil cuando no sabes si lo que falla es la pantalla, el cable o el puerto HDMI, pero tras un rato en pantalla el monitor podría apagarse sin problemas. Al parecer no todos los fabricantes piensan así y la pantalla se queda encendida con lo que no logras nada.

Otro caso que da problemas son las pantalla que llevan iluminación trasera, esta puede seguir encendida aunque la pantalla se apague. Aunque en este caso si que reducimos el consumo energético.

También hay que tener ene cuanta las pantallas táctiles. Algunas siguen «leyendo» las pulsaciones en ellas aunque no vamos donde estamos pulsando.