tech explorers, welcome!

Etiqueta: python

Configuración de ventilador con indicador de estado para Raspberry Pi 5 con Ubuntu

El calor ha llegado de nuevo y notaba mi Raspberry Pi demasiado caliente teniendo en cuenta que tiene el ventilador oficial incrustado, con temperaturas que fácilemnte superaban los 60ºC.

Desde que le instalé Ubuntu, el ventilador no parecía funcionar bien, pero parece que es algo que se ha resuelto con las versiones más recientes del kernel.

Así que aquí os traigo una configuración del ventilador para Ubuntu y una visualización de su estado.

Comprobación del ventilador

Primero comprobemos que el ventilador funciona correctamente accionándolo manualmente.

Actualiza tu sistema operativo para contar con los últimos parches que arreglan el funcionamiento del ventilador. Mi última versión es Ubuntu Linux 24.04.2.

Ahora deberías ser capaz de encender el ventilador manualmente introduciendo el siguiente comando en la terminal:

echo 4 | sudo tee /sys/class/thermal/cooling_device0/cur_state

Un valor de 4 encenderá el ventilador a sus máximas revoluciones. Puedes cambiar este valor entre 0 y 4.

Si lo anterior funcionó correctamente oirás bastante ruido del ventilador. Ahora puedes apagarlo cambiando el valor del comando anterior a 0:

echo 0 | sudo tee /sys/class/thermal/cooling_device0/cur_state

Verás que cambiando el valor del archivo cur_sate manualmente se cambia la velocidad del ventilador. Eso es exactamente lo que ahce el demonio automáticamente con el ventilador, una vez configurado. Así que monitorizaremos este valor más tarde para averiguar si el ventilador está funcionando (valor devuelto != 0):

cat /sys/class/thermal/cooling_device0/cur_state

Configuración del ventilador

El ventilador no viene preconfigurado en las versiones anteriores del kernel de Ubuntu para Raspberry Pi y no sé si lo hace ahora por defecto.

Comprobémoslo editando el archivo config.txt ubicado en /boot/firmware buscando unas líneas similares a las siguientes:

dtparam=fan_temp0=58000
dtparam=fan_temp0_hyst=10000
dtparam=fan_temp0_speed=200

Si no las encuentras, añádelas justo al final del archivo.

Si quieres puedes editar los valores libremente teniendo en cuenta que:

fan_temp0=58000 indica la temperatura de activación que enciende el ventilador

fan_temp0_hyst se refiere a la reducción de temperatura que apaga el ventilador respecto a la de activación (10000 por debajo de 58000 = 48000)

fan_temp0_speed indica la velocidad del ventilador de 0 a 255

Así que dejamos nuestro ventilador configurado para encenderse a 200rpm si la temperatura supera 58ºC y apagarse cuando baje 10ºC (~48ºC).

Ahora para aplicar estos cambios debemos reiniciar el sistema.

Monitorizar el ventilador

Ya monitorizaba ciertas variables de mi Raspberry Pi 5 usando una pantalla OLED, como explicaba en este post:

https://theroamingworkshop.cloud/b/2683/carcasa-pantalla-oled-con-panel-de-estado-para-raspberry-pi

Ahora vamos a añadir un indicador del estado del ventilador!

He añadido un par de líneas al script de python para obtener el estado del ventilador usando el comando que vimos anteriormente:

#Fan ON/OFF
cmd = "cat /sys/class/thermal/cooling_device0/cur_state"
Fan = subprocess.check_output(cmd, shell=True).decode("utf-8")

Un poco más abajo leo una imagen .png para dibujar el ventilador:

fan_img=Image.open("~/Documents/OLED/fan-icon.png")
fan_img = fan_img.resize((30, 30), Image.BICUBIC)
fan-icon.png

Y justo a la hora de mostrar todo en pantalla, añado el icono del ventilador si detectamos que está encendido (distinto de 0):

if int(Fan)!=0:
    bg.paste(fan_img,(90,55))

Todos estos cambios están actualizados en el repositorio de Github repository:

https://github.com/TheRoam/RaspberryPi-SSD1351-OLED

Y ese es un indicador bastante chulo para tu Raspberry!

Nos vemos! 👋

🐦 @RoamingWorkshop

Carcasa + pantalla OLED con panel de estado para Raspberry Pi

Estaba tentado de intercambiar la carcasa de mi Raspberry Pi 4 a la Pi 5, pero mírala…

  • 16×2 pantalla LCD de un Arduino Starter Kit
  • Programa en C++ con la librería WiringPi
  • Carcasa casera

Estaba realmente orgulloso de ella en su momento y fue un buen aprendizaje allá por 2020, pero seguro que lo podía hacer mejor. Seguro que me podía currar un pedazo panel de estado!!

Componentes

  • Raspberry Pi (probablemente sirva en cualquiera de ellas)
  • Pantalla OLED (RGB de 1.5 pulgadas es ideal)
  • PCB placa de prototipos
  • Cables
  • Material de soldadura
(cortesía del modelo epiCRealism en ComfyUI)
  • Carcasa (impresa en 3D o elaborada a mano)

Configuración de software

Configuraré la Raspberry para interactuar con la pantalla usando python, mediante la librería de Adafruit Circuitpython para el controlador SSD1351 de la pantalla:
https://learn.adafruit.com/adafruit-1-5-color-oled-breakout-board/python-wiring-and-setup#setup-3042417

Es tan simple como instalar Circuitpython con el siguiente comando:

sudo pip3 install --upgrade click setuptools adafruit-python-shell build adafruit-circuitpython-rgb-display

Si tienes problemas con tu versión de python para encontrar Circuitpython, incluye --break-system-packages al final. (No romperá nada hoy, pero no te acostumbres a ello...)

sudo pip3 install --upgrade click setuptools adafruit-python-shell build adafruit-circuitpython-rgb-display --break-system-packages

Cableado

Ahora conectaremos la pantalla según las indicaciones del fabricante. La mía es esta de BuyDisplay:

https://www.buydisplay.com/full-color-1-5-inch-arduino-raspberry-pi-oled-display-module-128x128

OLED DisplayRaspberry Pi (pin #)
GNDGND (20)
VCC3V3 (17)
SCLSPI0 SCLK (23)
SDASPI0 MOSI (19)
RESGPIO25 (22)
DCGPIO 24 (18)
CSSPI0 CE0 (24)

Usa un sitio como pinout.xyz para encontrar una configuración adecuada para tu cableado.

Estás listo para hacer algunos tests antes de mover tu diseño a la PCB.

Configuración de script

Puedes probar el script demo de Adafruit. Solo asegúrate de escoger la pantalla adecuada y actualiza los cambios en la asignación de pines (usa los números/nombres IO en lugar de los números físicos del pin):

# Configuration for CS and DC pins (adjust to your wiring):
cs_pin = digitalio.DigitalInOut(board.CE0)
dc_pin = digitalio.DigitalInOut(board.D24)
reset_pin = digitalio.DigitalInOut(board.D25)

# Setup SPI bus using hardware SPI:
spi = board.SPI()

disp = ssd1351.SSD1351(spi, rotation=270,                         # 1.5" SSD1351
    cs=cs_pin,
    dc=dc_pin,
    rst=reset_pin,
    baudrate=BAUDRATE
)

Ensamblaje

Aquí están los archivos STL en 3D para este diseño de carcasa:

Ahora pongámoslo todo junto:

  1. Atornilla el marco a la pantalla
  2. Suelda los 7 pines de la pantalla a los 7 cables a través de la PCB
  3. Cablea todas las conexiones a la Raspberry Pi
  4. Atornilla las partes superiores e inferiores de la carcasa entre sí
  5. Coloca la pantalla sobre el soporte

Resultado final

He compartido el script que se ve en las imágenes a través de github:

https://github.com/TheRoam/RaspberryPi-SSD1351-OLED

Actualmente muestra:

  • Fecha y hora
  • Estadísticas del sistema (SO, uso del disco y temperatura de CPU)
  • Tiempo local de la World Meteorological Organization (actualizado cada hora)

Y así es como acaba quedando. Mucho mejor verdad?

Como siempre, disfruta cacharreando, y hazme llegar tus comentarios o dudas a través de Twitter!

🐦 @RoamingWorkshop

UNIHIKER-PAL: asistente del hogar simplificado, de código abierto en python

PAL es una versión simplificada de mi asistente del hogar en python, que se ejecuta en una placa UNIHIKER de DFRobot, y que lanzo en código abierto gratuito.

Esta es solo una pequeña demostración de la simplicidad de la ejecución de comandos con reconocimiento de voz en python, y con suerte servirá de guía para tu propio asistente.

Version actual: v0.2.0 (actualizado septiembre 2024)

Características

La versión actual incluye lo siguiente:

  • Reconocimiento de voz: usando la librería de código abierto SpeechRecognition, se obtiene una lista con las cadenas de texto reconocidas.
  • Pronóstico del tiempo: usando la API de datos de World Meteorological Organization, devuelve el tiempo de hoy y el pronóstico de los próximos 3 días. Incluye los iconos de la WMO.
  • Temperatura local: reads local BMP-280 temperature sensor to provide a room temperature indicator.
  • Comandos HTTP para IoT: flujo de trabajo básico para controlar dispositivos inteligentes de IoT mediante comandos HTTP. Actualmente ENCIENDE y APAGA un interruptor inteligente Shelly2.5.
  • Modo ahorro de energía: controla el brillo para reducir el consumo de energía.
  • Gestor de conexión: periódicamente comprueba el wifi y llama a internet para restaurar la conexión cuando se pierda.
  • Muestra de voces de PAL: voz clonada de PAL de "Los Mitchells contra las Máquinas" usando el modelo de IA de voz CoquiAI-TTS v2.
  • Botones UNIHIKER: botón A despliega un simple menú (está pensado para desarrollar un menú más complejo en el futuro).
  • Controles táctiles: restaura el brillo (centro), cambia de programa (izquierda) y cierra el programa (derecha) pulsando en distintas zonas de la pantalla.

Instalación

  1. Instala dependencias:
    pip install SpeechRecognition pyyaml
  2. Descarga el repositorio de github:
    https://github.com/TheRoam/UNIHIKER-PAL
  3. Sube los archivos y carpetas a la UNIHIKER en /root/upload/PAL/
  4. Configura en PAL_config.yaml las credenciales WIFI, dispositivos IoT, etc.
  5. Lanza el script de python python /root/upload/PAL/PAL_020.py desde la terminal de Mind+ o desde la interfaz táctil de UNIHIKER.

Si habilitas Auto boot en el menú de Service Toggle, el script se ejecutará automáticamente cada vez que se reinicie la UNIHIKER

https://www.unihiker.com/wiki/faq#Error:%20python3:%20can't%20open%20file…

Configuración

Version 0.2.0 includes configuration using a yaml file that is read when the program starts.

CREDENTIALS:
ssid: "WIFI_SSID"
pwd: "WIFI_PASSWORD"

DEVICES:
light1:
brand: "Shelly25"
ip: "192.168.1.44"
channel: 0

light2:
brand: "Shelly25"
ip: "192.168.1.44"
channel: 1

light3:
brand: "Shelly1"
ip: "192.168.1.42"
channel: 0

PAL:
power_save_mode: 0
temperature_sensor: 0
wmo_city_id: "195"

Localización

La variable "CityID" se usa para proporcionar un pronóstico del tiempo de WMO más cercano a tu localización.

Elige una de las localizaciones disponibles en su listado oficial:

https://worldweather.wmo.int/en/json/full_city_list.txt

Dispositivos IoT

En este momento, PAL v0.2.0 solo incluye compatibilidad con Shelly2.5 para fines demostrativos.

Usa las variables lampBrand, lampChannel y lampIP para ajustar tu configuración de Shelly2.5.

Esto es solo un ejemplo para mostrar cómo se pueden configurar distintos dispositivos. Estas variables se deberían usar para cambiar las peculiaridades de los comandos HTTP que se envían a cada dispositivo IoT.

Se añadirán más dispositivos en futuras actualizaciones, como Shelly1, ShellyDimmer, Sonoff D1, etc.

Modo ahorro de energía

El ahorro de energía disminuye el brillo del dispositivo para reducir el consumo de energía de la UNIHIKER. Esto se hace usando el comando del sistema "brightness".

Cambia la variable "ps_mode" para habilitar ("1") o deshabilitar ("0") el modo ahorro de energía.

Temperatura de habitación

Cambia la variable "room_temp" para habilitar ("1") o deshabilitar ("0") el módulo de lectura de sensor de temperatura. Esto requiere un sensor BMP-280 instalado mediante el conector I2C.

Comprueba este otro post para los detalles de la instalación del sensor:

https://theroamingworkshop.cloud/b/en/2490/

Otras configuraciones desde el código fuente:

Tema

Se habilita la personalización de la imagen de fondo que representa los ojos de PAL.

Usa las variables "eyesA" y "eyesB" para especificar uno de los siguientes valores y cambia la expresión del PAL:

  • "happy"
  • "angry"
  • "surprised"
  • "sad"

"eyesA" se usa como fondo por defecto y "eyesB" se usa como transición cuando el reconocimiento de voz se activa y PAL habla.

El valor por defecto de "eyesA" es "surprised" y cambiará a "happy" cuando se reconoce un comando.

Comandos personalizados

Añadir tus propios comandos a PAL es simple usando la función "comandos".

Cada audio reconocido por SpeechRecognition se envía como una cadena a la función "comandos", que filtra y lanza uno u otro comando coincidente con la orden.

Solo define todas las posibles cadenas que pueden ser reconozidas para lanzar tu comando (a veces SpeechRecognition devuelve transcripciones erróneas o imprecisas).

Finalmente, define el comando que se lanza cuando la cadena coincide.

def comandos(msg):
    # LAMP ON
    if any(keyword in msg for keyword in ["turn on the lamp", "turn the lights on","turn the light on", "turn on the light", "turn on the lights"]):
        turnLAMP("on")
        os.system("aplay '/root/upload/PAL/mp3/Turn_ON_lights.wav'")

Palabra clave para la activación

Puedes personalizar las palabras clave o cadenas que activan las funciones de comandos. Si cualquiera de las palabras clave en la lista es reconocida, toda la frase se envía a la función "comandos" para buscar un comando coincidente y ejecutarlo.

En caso de PAL v0.2, estas son las palabras clave que lo activan (el 90% de las veces es Paypal...):

activate=[
    "hey pal",
    "hey PAL",
    "pal",
    "pall",
    "Pall",
    "hey Pall",
    "Paul",
    "hey Paul",
    "pol",
    "Pol",
    "hey Pol",
    "poll",
    "pause",
    "paypal",
    "PayPal",
    "hey paypal",
    "hey PayPal"
]

Puedes cambiar esto a cualquier otra frase o nombre para activar a PAL cuando la llames de esa manera.

Voz de PAL

Usa la muestra de audio "PAL_full" abajo (también en el repositorio de github en /mp3) como audio de referencia para la clonación de voz de CoquiAI-TTS v2 y genera tus propias voces:

https://huggingface.co/spaces/coqui/xtts

TIP!
Comprueba este otro post sobre clonación de voz con CoquiAI-XTTS:
https://theroamingworkshop.cloud/b/2429

Demo

A continuación hay algunos ejemplos de consultas y respuestas de PAL:

"Hey PAL, turn on the lights!"
"Hey PAL, turn the lights off"
"Hey PAL, what's the weather like?"

Futuros lanzamientos (To-Do list)

Iré desarrollando estas características en mi asistente personal, e iré actualizando la versión de código abierto de vez en cuando. Ponte en contacto via github si tienes especial interés en alguna de ellas:

  • Menú avanzado: añadir configuración y comandos manuales.
  • Dispositivos IoT: incluir todos los comandos HTTP de Shelly y Sonoff.
  • Consultar la hora: requiere clonar la voz de todas las combinaciones de números...
  • Consulta de Wikipedia/internet: requiere generar voz en tiempo real...
  • Mejoradas animaciones / temas.

Comentarios, problemas o mejoras, me encantará recibirlos en github o Twitter!

🐦 @RoamingWorkshop