From 2ae2b33d087b8dc675f9450eb842ba5978e5eb72 Mon Sep 17 00:00:00 2001 From: Israel Figueroa Date: Wed, 29 Nov 2023 13:25:29 -0300 Subject: [PATCH 1/3] Subsistema de video --- ModuloLED/init.png | Bin 0 -> 26240 bytes ModuloLED/install-service.sh | 44 +++++++++++++++++++++++++++++ ModuloLED/led-driver.py | 52 +++++++++++++++++++++++++++++++++++ ModuloLED/led-driver.service | 14 ++++++++++ 4 files changed, 110 insertions(+) create mode 100644 ModuloLED/init.png create mode 100644 ModuloLED/install-service.sh create mode 100644 ModuloLED/led-driver.py create mode 100644 ModuloLED/led-driver.service diff --git a/ModuloLED/init.png b/ModuloLED/init.png new file mode 100644 index 0000000000000000000000000000000000000000..776fe6acc380c8466d3b3d508b17ebfd1edb4ec4 GIT binary patch literal 26240 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 P8`j>uX8Y=|Jo$eBd7y tstam: + image=Image.open(img_path) + matrix.SetImage(image.convert('RGB')) + tstam = ntstam diff --git a/ModuloLED/led-driver.service b/ModuloLED/led-driver.service new file mode 100644 index 0000000..f78b49e --- /dev/null +++ b/ModuloLED/led-driver.service @@ -0,0 +1,14 @@ +[Unit] +Description=LED Rendering Service +After=local-fs.target + +[Service] +User=root +CPUAffinity=3 +Nice=-20 +WorkingDirectory=/srv +ExecStart=/usr/bin/python3 /srv/subsystem/led-driver.py +Restart=always + +[Install] +WantedBy=multi-user.target From b136bd23f48702659a614d7978fadd5350d42bf0 Mon Sep 17 00:00:00 2001 From: Israel Figueroa Date: Wed, 29 Nov 2023 13:27:23 -0300 Subject: [PATCH 2/3] instrucciones --- ModuloLED/README.md | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/ModuloLED/README.md b/ModuloLED/README.md index 31965c0..c229eed 100644 --- a/ModuloLED/README.md +++ b/ModuloLED/README.md @@ -1,4 +1,4 @@ -# Guía de configuración para Modulo LED +# Guía de configuración para Modulo LED ## Materiales Necesarios @@ -13,7 +13,7 @@ ### Conexionado -Para las conexiones de datos, se utilizan cables hembra HUB75 de 16-pines, estos se conectan en un extremo al HAT HUB75 para Raspberry PI. En caso de tener un HAT con multiples conexiones de HUB75, siempre utilizar la salida TOP para la primera fila del conjunto de paneles, y usar el resto de las salidas para las filas inferiores. El extremo opuesto del cable de datos debe conectarse en el "input" del panel, estos modulos tienen etiquetada su entrada y salida en la parte posterior. Ver las imagenes mostradas como referencia visual. +Para las conexiones de datos, se utilizan cables hembra HUB75 de 16-pines, estos se conectan en un extremo al HAT HUB75 para Raspberry PI. En caso de tener un HAT con multiples conexiones de HUB75, siempre utilizar la salida TOP para la primera fila del conjunto de paneles, y usar el resto de las salidas para las filas inferiores. El extremo opuesto del cable de datos debe conectarse en el "input" del panel, estos modulos tienen etiquetada su entrada y salida en la parte posterior. Ver las imagenes mostradas como referencia visual. Para la conexión electrica, cada uno de los paneles LED tiene una entrada de cuatro pines para cables de alimentación. Es necesario tener una fuente de poder con salida de 5V y un minimo de 3A, para cumplir con los criterios de alimentación en los modulos LED. @@ -50,4 +50,28 @@ Luego de haber descargado los datos almancenados en este reposotorio. En el dire #### Despliegue de imagenes - Al seleccionar esta opción, se mostrarán todos los archivos de imagen guardados en el sistema de la Raspberry Pi. Se recomienda utilizar imagenes con la mimsa relacion de aspecto que la resolución de la pantalla montada para el despliegue. De lo contrario, la pantalla tendrá espacios en negro. + Al seleccionar esta opción, se mostrarán todos los archivos de imagen guardados en el sistema de la Raspberry Pi. Se recomienda utilizar imagenes con la mimsa relacion de aspecto que la resolución de la pantalla montada para el despliegue. De lo contrario, la pantalla tendrá espacios en negro. + + ### Variables del Sistema Operativo + + Se propone un Sub-sistema que se encargue de manera dedicada al renderizado en la Matriz LED en forma continua. Para eso se implementa un *demonio* de Linux que esta continuamente dibujando en el display. + + Para ello se reserva el procesador 3, entregandoselele la `CPUAffinity=3` al proceso, de manera de garantizar el recurso computacional. Adicionalmente se modifica el Sistema Operativo para que quite el procesador del itineradoe usando `isocpus=3` en la variable de inicio `/boot/cmdline.txt`. + + Además se monta un directorio de `/srv/ledram` que tiene un tamaño de 32MB para disponer una *memoria de video* en RAM que permita a otros procesos actualizar el contenido que se despliega en el display. Para ello se modifica el `/etc/fstab` para que se cree el recurso automaticamente al iniciarse la Raspberry. + + #### Sub-sistema de renderizado + + Se define el directorio `/srv` donde se aloja el sub-sistema de renderizado. Esta compuesto del script `/srv/subsystem/led-driver.py` que es iniciado en forma automática por `systemd`. + + El script ve la hora de modificación del archivo `/srv/ledram/current.png` para determinar si debe o no actualizar la imagen que se está desplegando actualmente en el display cada 100 ms. + + De esta manera, cualquier usuario o proceso (`chmod 666`) puede escribir ese archivo. Siendo este sub sistema el encargado de leer el contenido de la imagen y renderizarlo en el display led en forma permanente. + + #### Instalación como servicio + + Todos estos pasos están automatizados en el script `install-service.sh` que debe ser ejecutado como `root`. + + #### TODO + + Falta que el script detecte cuando se le solicita salir, para que elimine el archivo `/srv/ledram/current.png`, de tal manera de poder `systemctl stop led-driver.service` y `systemctl start led-driver.service` sin depender que la imagen se elimine en forma automatica al ser un directorio volatil From de0c1ffb90954927d6354e378a34ad3cc49978b5 Mon Sep 17 00:00:00 2001 From: Israel Date: Wed, 29 Nov 2023 13:57:21 -0300 Subject: [PATCH 3/3] Update README.md --- ModuloLED/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ModuloLED/README.md b/ModuloLED/README.md index c229eed..8da947c 100644 --- a/ModuloLED/README.md +++ b/ModuloLED/README.md @@ -48,7 +48,7 @@ Luego de haber descargado los datos almancenados en este reposotorio. En el dire **PANEL: Dado por el fabricante del panel comprado.** - #### Despliegue de imagenes + ## Despliegue de imagenes Al seleccionar esta opción, se mostrarán todos los archivos de imagen guardados en el sistema de la Raspberry Pi. Se recomienda utilizar imagenes con la mimsa relacion de aspecto que la resolución de la pantalla montada para el despliegue. De lo contrario, la pantalla tendrá espacios en negro.