Noticias

Lleva la discoteca a casa con estos tutoriales de Raspberry Pi HAT (Parte 1)

Foto de Dustin Trammell, sin salpicaduras

Esta semana, Ubuntu iluminará la Raspberry Pi con el primero de una colección de dos partes de tutoriales Unicorn HAT de nuestros desarrolladores residentes de Pi, Dave ‘waveform’ Jones y William ‘jan-smith’ Wilson.

En la Parte 1, comenzamos con algunos proyectos simples de Unicorn pHAT para aquellos que recién comienzan.Lo que sigue es un estudio de caso más avanzado de Dave sobre cómo su emocionante volante Proyectos utilizando el Unicorn HAT.

Esta es una publicación invitada de William Blog, amablemente nos permitió compartirlo aquí. Visite su sitio web para obtener más tutoriales geniales de Pi y algunos proyectos de impresión 3D igualmente coloridos.


A partir de Ubuntu 22.04, Pimoroni Gorro Unicornio Soporte de Ubuntu fuera de la caja. Esto incluye el Unicorn Hat estándar, Unicorn pHAT, Unicorn HAT Mini y Unicorn HAT HD.

Para instalar la biblioteca para cada HAT, ejecute el siguiente comando:

sudo apt install python3-unicornhat
sudo apt install python3-unicornhathd
sudo apt install python3-unicornhatmini

¡Aquí hay algunos ejemplos de cómo usarlos!

Tutorial: Aprendiendo los conceptos básicos con Unicorn pHAT

Sección escrita por William Wilson

notas: sudo Requerido para todos los scripts de pHAT

El pHAT tiene el tamaño perfecto para usar en Raspberry Pi Zero 2 y usa la misma biblioteca que Unicorn HAT.

El siguiente script mostrará la bandera de Ucrania:

import unicornhat as uh

uh.set_layout(uh.AUTO)
uh.brightness(0.5)

width,height=uh.get_shape()

for y in range(height):
    for x in range(width):
        if x < 2:
            uh.set_pixel(x, y, 0, 87, 183)
        else:
            uh.set_pixel(x, y, 255, 221, 0)

uh.show()
while True:
    pass

El siguiente ejemplo verifica su velocidad de Internet periódicamente y usa pHAT para indicar qué tan buena o mala es la velocidad, usando el color (verde, amarillo o rojo) como indicador.se necesita prueba de velocidad módulo python, que no está empaquetado de forma nativa en Ubuntu.

Para instalarlo, ejecuta: sudo pip3 instalar speedtest-cli

Luego use la siguiente secuencia de comandos para crear su mini tablero.

import unicornhat as uh
import speedtest
import time

st = speedtest.Speedtest()
uh.set_layout(uh.AUTO)
uh.rotation(0)
uh.brightness(0.5)
width,height=uh.get_shape()

while True:
    # run a speed test for download speed
    dl = st.download()

    # run a speed test for upload speed
    ul = st.upload()

    # Set the Unicorn pHAT LEDs accordingly
    if dl > 30000000: # 30 Mb/s
        # set the LEDs to green!
        dleds = (0, 255, 0)
    elif dl > 15000000: # 15 Mb/s
        # set the LEDs to yellow
        dleds = (255, 255, 0)
    else: # below 15 Mb/s
        # set the LEDs to red
        dleds = (255, 0, 0)

    if ul > 30000000: # 30 Mb/s
        # set the LEDs to green!
        uleds = (0, 255, 0)
    elif ul > 15000000: # 15 Mb/s
        # set the LEDs to yellow
        uleds = (255, 255, 0)
    else: # below 15 Mb/s
        # set the LEDs to red
        uleds = (255, 0, 0)

    for y in range(height):
        for x in range(width):
            if x < 2:
                uh.set_pixel(x,y,uleds)
            else:
                uh.set_pixel(x,y,dleds)

    uh.show()

    # sleep 10 minutes
    time.sleep(600)

Como puede ver en la imagen de arriba, mi velocidad de descarga es muy buena, pero la velocidad de carga no lo es.

Para más proyectos como este, Pimoroni tiene más ejemplo en su repositorio Unicorn HAT GitHub.

Estudio de caso: creación de un panel de control de piwheels con Unicorn HAT

Sección escrita por Dave Jones

notas: sudo Requerido para todos los scripts de Unicorn Hat

Cualquiera que esté en una videollamada conmigo suele notar algunas cosas nuevas de Pixel pulsando silenciosamente detrás de mí. Este es el monitor piwheels basado en Sense HAT que se encuentra en mi escritorio (y viaja conmigo de vez en cuando).

Para aquellos que no están familiarizados con piwheels, volante Este proyecto tiene como objetivo construir ruedas automáticamente a partir de paquetes en PyPI para un conjunto de ABI preconfigurados. En lenguaje sencillo, esto significa que los piwheels contienen paquetes preconstruidos en lugar de paquetes fuente que deben construirse localmente como parte de la instalación, lo que ahorra a los usuarios de Pi un tiempo valioso al instalar nuevos paquetes.

Actualmente, Piwheels solo crea ruedas para RaspiOS, pero también estamos explorando la compatibilidad con piwheels para Ubuntu.

¿Por qué?

Si bien una pantalla que consta de 64 puntos de colores puede parecer pequeña y casi inútil, descubrí que es exactamente lo contrario por varias razones:

  • Siempre está visible en mi escritorio; siempre se está ejecutando (aunque reinicié Windows para algunos juegos), nunca está en una ventana de fondo, no es una alerta de correo electrónico perdida en el correo no deseado, o No noto los mensajes de texto porque mi el teléfono está en silencio.
  • es si solo Visible en mi escritorio; piwheels es un proyecto voluntario, así que estoy feliz de mantener las cosas en marcha mientras estoy sentado en mi escritorio. Pero si los equipos de construcción salen del trabajo a las 4 a.m., eso no es gran cosa. Lidio con esto cuando estoy bebiendo café adecuadamente y detrás de la computadora.
  • Esta es una vista constante de todo el sistema; puedo activar alertas cuando algo falla o sucede, pero también es útil tener una vista "de un vistazo" de la "salud" de todo el sistema. De vez en cuando encuentro problemas con piwheels, pero no existen alertas específicas porque el monitor está "apagado".

¿cómo?

Si alguien quiere seguir los pasos de mi monitoreo pionero de baja fidelidad, aquí hay un pequeño script que hace algo similar con Unicorn HAT. Procederemos uno a uno:

#!/usr/bin/python3

import ssl
import math
import subprocess as sp
from pathlib import Path
from itertools import cycle
from time import sleep, time
from threading import Thread, Event
from urllib.request import urlopen, Request

import unicornhat

Comenzamos con todas las importaciones que necesitamos. Nada particularmente digno de mención aquí, aparte de notar que la única dependencia externa es la biblioteca Unicorn HAT.Ahora vamos a la línea principal. monitor Función:

def monitor(layout):
    unicornhat.set_layout(unicornhat.AUTO)
    unicornhat.rotation(0)
    unicornhat.brightness(1.0)

    width, height = unicornhat.get_shape()
    assert len(layout) <= height
    assert all(len(row) <= width for row in layout)

    pulse = cycle(math.sin(math.pi * i / 30) for i in range(30))
    updates = UpdateThread(layout)
    updates.start()
    try:
        for p in pulse:
            colors = {
                None: (0, 0, 0),
                True: (0, 127, 0),
                False: (int(255 * p), 0, 0),
            }
            for y, row in enumerate(layout):
                for x, check in enumerate(row):
                    value = check.value if isinstance(check, Check) else check
                    unicornhat.set_pixel(x, y, colors.get(value, value))
            unicornhat.show()
            sleep(1/30)
    finally:
        unicornhat.clear()
        updates.stop()
        updates.join()

Esto acepta un parámetro, diseño, Aquí hay una lista de listas de verificación. Cada marca corresponde a un píxel en el HAT, por lo que no se pueden definir más de 8 por fila, para un total de 64.

Configuración de funciones:

  • sombrero de unicornio – Unicorn HAT, incluida la rotación y el brillo, y afirma que el diseño se ajustará a la "forma" del HAT.
  • legumbres - un bucle infinito de números derivados de la primera mitad de la onda sinusoidal, que usaremos para legumbres El color "fallo" es agradable, por lo que llamará la atención.
  • renovar - alguno actualizar hilo Se utilizará para ejecutar comprobaciones en segundo plano, por lo que las comprobaciones de ejecución prolongada no se interpondrán en el camino de nuestro progreso sin problemas.

Luego entra en un bucle infinito (para p en el pulso - Atención - Recuerde legumbres es un generador infinito) actualizando constantemente el HAT con el valor de cada cheque.

notas: podrías notar comprobar valor Sólo cuando nuestra inspección es Realmente Una Controlary si en color Tabla de búsqueda, solo usamos el valor directamente.Esto nos permite especificar literales Incorrecto, realo no cualquiera valores en lugar de controles (en caso de que queramos separar un poco las cosas), o hacer que los controles devuelvan tuplas de color directamente en lugar de valores booleanos.

Ahora hay una pregunta importante: ¿qué es un cheque? Definamos algunos:

def page(url, *, timeout=10, status=200, method='HEAD', **kwargs):
    context = ssl.create_default_context()
    req = Request(url, method=method, **kwargs)
    try:
        print(f'Requesting {url}')
        with urlopen(req, timeout=timeout, context=context) as resp:
            return resp.status == status
    except OSError:
        return False

def cmd(cmdline, shell=True):
    try:
        print(f'Running {cmdline}')
        sp.check_call(
            cmdline, stdout=sp.DEVNULL, stderr=sp.DEVNULL, shell=shell)
    except sp.CalledProcessError:
        return False
    else:
        return True

def file(filename, min_size=1):
    try:
        print(f'Checking {filename}')
        return Path(filename).stat().st_size > min_size
    except OSError:
        return False

Definimos tres funciones de verificación:

  • Página - Comprobar acceso específico URL (El método "HEAD" se usa de manera predeterminada) Devuelve el código de estado 200 (OK en el lenguaje HTTP).
  • Ordenar – Verifique si la ejecución de un comando de shell específico fue exitosa (salir con el código 0).
  • documento - Comprueba si el archivo especificado existe y tiene un tamaño mínimo específico (1 de forma predeterminada, por lo que comprueba efectivamente si el archivo está vacío).

A continuación, definimos una clase que usaremos para definir cheques individuales. Envolverá una de las funciones anteriores, los argumentos que queremos pasarle y cuánto tiempo debemos almacenar en caché el resultado antes de permitir que la verificación se ejecute nuevamente:

class Check:
    def __init__(self, func, *args, every=60, **kwargs):
        self.func = func
        self.args = args
        self.kwargs = kwargs
        self.every = every
        self.last_run = None
        self.value = None

    def update(self):
        now = time()
        if self.last_run is None or self.last_run + self.every < now:
            self.last_run = now
            self.value = self.func(*self.args, **self.kwargs)

A continuación, necesitamos un subproceso de fondo que se ejecutará en un bucle. renovar Métodos para todas las comprobaciones en el diseño:

class UpdateThread(Thread):
    def __init__(self, layout):
        super().__init__(target=self.update, args=(layout,), daemon=True)
        self._done = Event()

    def stop(self):
        self._done.set()

    def update(self, layout):
        while not self._done.wait(1):
            for row in layout:
                for check in row:
                    if isinstance(check, Check):
                        check.update()

Finalmente, necesitamos ejecutar main monitor y definir todas las comprobaciones que queremos realizar. He incluido algunos ejemplos que verifican algunas páginas comunes/importantes en el sitio de piwheels, algunas páginas en mi servidor de blog, algunas comprobaciones de conectividad básicas (puede hacer ping a la puerta de enlace local, puede hacer ping a los nombres de DNS, puede hacer ping a Google DNS) y algunos archivos de muestra verificar.

if __name__ == '__main__':
    monitor([
        [ # some connectivity tests, centered
            None,
            None,
            None,
            Check(cmd, 'ping -c 1 -W 1 192.168.0.1', every=5),
            Check(cmd, 'ping -c 1 -W 1 8.8.8.8', every=30),
            Check(cmd, 'ping -c 1 -W 1 ubuntu.com', every=30),
        ],
        [ # a blank row
        ],
        [ # check some piwheels pages
            Check(page, '
            Check(page, '
            Check(page, '
            Check(page, '
        ],
        [ # make sure Dave's little pi blog is running
            Check(page, '
            Check(page, '
            Check(page, '
            Check(page, '
            Check(page, '
        ],
        [ # a coloured line
         (255, 127, 0)
        ] * 8,
        [ # are our backups working?
            Check(file, '/var/backups/dpkg.status.0'),
            Check(file, '/var/backups/apt.extended_states.0'),
            Check(file, '/tmp/foo', every=5),
        ],
    ])

Tu puedes correr guion completo como esto:

$ sudo ./monitor.py

Presione Ctrl+C para salir del script.

La verificación final del archivo es /tmp/fu, Esto puede no existir. Entonces, cuando ejecute este script, debería ver al menos un "fallo" rojo parpadeante.intenta correr echo foo > /tmp/foo Y observe cómo la falla se vuelve verde después de 5 segundos.Después rm /tmp/foo Míralo volver a parpadear en rojo.

Si desea que el script se ejecute automáticamente al inicio, agregue esta definición de servicio existir /etc/systemd/system/unicornio-monitor.servicio (Esto supone que ha guardado el script en /usr/local/bin/monitor.py):

[Unit]
Description=Unicorn HAT based monitor
After=local-fs.target network.target

[Service]
Type=simple
Restart=on-failure
ExecStart=/usr/bin/python3 /usr/local/bin/monitor.py

[Install]
WantedBy=multi-user.target

Luego ejecute el siguiente comando y debería encontrar que el monitor se iniciará automáticamente en el próximo reinicio:

$ sudo systemctl daemon-reload
$ sudo systemctl enable unicorn-monitor

¡disfrutar!


Eso es todo por esta semana con William y Dave, vuelva más tarde para la Parte 2 donde nos explican cómo construir un monitor de sistema con Unicorn HAT HD y un juego de ping pong en miniatura que se puede jugar en Unicorn HAT Mini.

Si estas ideas despiertan la imaginación, no olvides que puedes Categoría Raspberry Pi ¡Hablando de Ubuntu!

Para obtener consejos sobre cómo comenzar con una Raspberry Pi y más ideas de proyectos, consulte algunos de los enlaces a continuación.

tutorial

proyecto

LEER  Linus Torvalds descarta la industria de la inteligencia artificial como "90% marketing"

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba