Control inteligente de la refrigeración de mi Raspberry Pi 4.

La Raspberry Pi 4 es una bestia del rendimiento, si la dejas trabajar duro, su procesador puede alcanzar temperaturas que activan el thermal throttling, reduciendo su velocidad para no «derretirse». Es fundamental entender que el procesador empieza a reducir su velocidad automáticamente cuando llega a los 80°C – 85°C para protegerse.

Muchos optan por conectar un ventilador directamente a los pines de 5V, lo cual funciona, pero tiene dos grandes problemas: el ruido constante (¡parece un avión despegando!) y el desgaste innecesario del motor.

En esta entrada, vamos a hacer algo mucho más elegante y profesional. Vamos a configurar un sistema de control por PWM (Modulación por Ancho de Pulsos) utilizando el tercer cable de nuestro ventilador. ¿Qué conseguiremos con esto?

  • Silencio absoluto: El ventilador solo girará lo necesario.
  • Inteligencia térmica: Crearemos un script en Python que «lee» la mente (y la temperatura) de la CPU.
  • Automatización total: Configuraremos un servicio en Linux para que el control sea eterno y arranque solo.
  • Protección de hardware: Evitaremos forzar los pines de la placa con una configuración segura.

Si quieres que tu Pi 4 esté siempre fresca sin sacrificar tus oídos, ¡acompáñame en este tutorial!


Conexión del ventilador

Un ventilador PWM (Modulación por Ancho de Pulsos) se compone de 3 cables, esto significa que no solo puedes encenderlo o apagarlo, sino que puedes regular su velocidad (por ejemplo, que gire al 40% si está a 45°C y al 100% si llega a 60°C).

La función de cada cable es:

  1. Rojo a un pin de 5V positivo. (Pin 2 o 4). Aquí toma la fuerza.
  2. Negro a un pin GND negativo. (Pin 6).
  3. Azul (PWM) por ejemplo, pin 18 (GPIO 24).

Como se ve en la imagen anterior, No, se necesita resistencia, ya que el cable azul solo recibe una «señal» de control de muy baja intensidad (lógica), el procesador de la Raspberry no sufre. El transistor ya viene integrado dentro del propio ventilador para gestionar esa señal.

Nota: Algunos ventiladores baratos de 3 cables no soportan PWM por el tercer cable (a veces el tercer cable es solo un sensor de revoluciones, no de control).
Si el ventilador baja de velocidad: ¡Perfecto! Todo funciona.
– Si el ventilador solo está encendido o apagado: Significa que tu cable azul es un sensor «Tacho» y no admite control de velocidad. En ese caso, el script funcionará a todo o nada. (ON/OFF).

El script.

Con este script, tu Raspberry Pi 4 tendrá un comportamiento idéntico al ventilador de un ordenador portátil moderno. Este no solo enciende o apaga, sino que hace que el ventilador «susurre» cuando hay poca temperatura y «sople» fuerte solo cuando es necesario.

Script (Edición PWM)

Copia y pega el siguiente script en un archivo llamado fanGuard.py

nano fanGuard.py
#!/usr/bin/python3
import RPi.GPIO as GPIO
import time
import subprocess
import sys
from datetime import datetime

# ==========================================
# CONFIGURACIÓN PROPORCIONAL PRO
# ==========================================
PIN_FAN        = 18
FRECUENCIA     = 100
ESPERA         = 3

TEMP_ARRANQUE  = 50
TEMP_MAXIMA    = 65
TEMP_PARADA    = 39
POTENCIA_MIN   = 40
# ==========================================

def obtener_temp_maxima():
    try:
        with open("/sys/class/thermal/thermal_zone0/temp", "r") as f:
            temp_cpu = float(f.read()) / 1000

        salida_gpu = subprocess.check_output(["vcgencmd", "measure_temp"]).decode("utf-8")
        temp_gpu = float(salida_gpu.replace("temp=", "").replace("'C\n", ""))

        return max(temp_cpu, temp_gpu)
    except Exception:
        return 55.0

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(PIN_FAN, GPIO.OUT)
pwm = GPIO.PWM(PIN_FAN, FRECUENCIA)
pwm.start(0)

ventilador_activo = False

print("=============================================")
print("  FAN GUARD PRO: CPU + GPU MONITOR  ")
print(f"  Arranque: {TEMP_ARRANQUE}C | Parada: {TEMP_PARADA}C")
print("=============================================")

try:
    while True:
        temp = obtener_temp_maxima()
        ahora = datetime.now().strftime("%H:%M:%S")
        nivel = 0

        if temp >= TEMP_ARRANQUE:
            ventilador_activo = True
        elif temp <= TEMP_PARADA:
            ventilador_activo = False

        if ventilador_activo:
            if temp >= TEMP_MAXIMA:
                nivel = 100
            elif temp <= TEMP_ARRANQUE:
                nivel = POTENCIA_MIN
            else:
                dif_temp = temp - TEMP_ARRANQUE
                rango_temp = TEMP_MAXIMA - TEMP_ARRANQUE
                rango_potencia = 100 - POTENCIA_MIN
                nivel = int(POTENCIA_MIN + (dif_temp * rango_potencia / rango_temp))
        else:
            nivel = 0

        pwm.ChangeDutyCycle(min(max(nivel, 0), 100))

        # Usamos carácteres ASCII compatibles con todas las terminales
        estado = "[ON]" if ventilador_activo else "[OFF]"
        barra = "#" * (nivel // 10) + "-" * (10 - (nivel // 10))

        print(f"[{ahora}] {estado} Temp: {temp:.1f}C | Potencia: [{barra}] {nivel}%")

        time.sleep(ESPERA)

except KeyboardInterrupt:
    print("\nDeteniendo servicio...")
finally:
    pwm.stop()
    GPIO.cleanup()


Guarda el documento con Ctrl + o y sal con Ctrl + x

No olvides hacerlo ejecutable con:

chmod +x fanGuard.py

Exacto, al subir el umbral de activación de 45°C a 50°C, el comportamiento ha evolucionado para adaptarse a la gran eficiencia de tu disipador Ice Tower. Al ser un hardware tan potente, no necesitas que el ventilador «despierte» tan pronto.

Aquí tienes cómo ha quedado el nuevo ciclo de vida con los valores que tienes configurados actualmente en tu script:


El Nuevo Ciclo de Vida (Configuración 50°C – 65°C)

  1. Zona de Silencio Total (Hasta 50°C): El ventilador está en 0% (Apagado). Gracias a tu torre de refrigeración, la Raspberry se mantendrá aquí la mayor parte del tiempo (sobre los 45°C-47°C).
  2. El Despertar (A los 50°C): En cuanto el sensor (CPU o GPU) toca los 50.0°C, el ventilador arranca directamente al 40% de potencia. Esto asegura que el aire fluya con fuerza suficiente por las aletas del Ice Tower desde el primer segundo.
  3. Zona Dinámica Proporcional (De 50°C a 65°C): El script escala la velocidad de forma lineal:
    • 50°C —————> 40% (Arranque mínimo).
    • 57.5°C ————-> 70% aprox. (Punto medio).
    • 65°C —————> 100% (Potencia máxima).
  4. La Bajada con Histéresis (El camino de vuelta): * Si el ventilador está encendido y la temperatura baja de 50°C, no se apaga.
    • Se mantiene soplando al 40% de forma constante mientras baja por los 48°C, 45°C….
    • Solo cuando el sensor marca 39°C o menos, el ventilador se detiene por completo.

¿Por qué este cambio es mejor para tu caso?

Con estos margenes de temperaturas, tenemos un margén de maniobra para no castigar en exceso al ventilador, por lo que:

  • Evitas el desgaste: El ventilador gira lo necesario, reduciendo horas de funcionamiento y evitando desgaste del mismo.
  • Aprovechas el cobre: Dejas que el disipador trabaje de forma pasiva hasta su límite razonable.
  • Enfriamiento real: Cuando arranca a 50°C, lo hace con la misión de bajar hasta los 39°C, asegurando que la placa se quede realmente fresca antes de volver a apagarse.

Tabla resumen de revoluciones (ejemplo estimado):

TemperaturaEstadoPotencia PWMRuido Estimado
38°CBajando0% (Apagado)Silencio total
46°CSubiendo0% (Apagado)Silencio total
50°CArranca40%Susurro suave
52°CEstable68%Flujo de aire constante
60°CAlerta100%Máximo soplado

¿Cómo saber si los porcentajes son correctos para TU ventilador?

Cada ventilador es un mundo. Si notas que al 40% hace un ruido eléctrico pero no gira, puedes subir la variable POTENCIA_MIN a 50. Si por el contrario gira muy fuerte desde el principio, puedes bajarla a 30.

Para alargar la vida útil de los componentes y mantener el máximo rendimiento, lo ideal es mantenerla por debajo de los 60°C en carga de trabajo.

Crear el archivo del servicio

Para hacerlo «eterno» con systemd, tenemos que seguir unos pasos específicos. Es vital que el servicio se ejecute como root (para tener permisos sobre los GPIO) y que gestione bien el apagado, evitando que el ventilador no se quede «silbando» cuando detengas la Raspberry.

Abre el editor para crear el archivo de configuración del sistema:

sudo nano /etc/systemd/system/fanguard.service

3. Pegar la configuración del servicio

Copia y pega este bloque tal cual, sustituyendo tu_usuario, por el tuyo propio de la ruta en ExecStart):

[Unit]
Description=Control Inteligente de Ventilador PWM con Histeresis
After=multi-user.target

[Service]
Type=simple
User=root
ExecStart=/usr/bin/python3 -u /home/tu_usuario/fanguard.py
Restart=always
RestartSec=10
# Esto asegura que los prints del script se vean en el log del sistema
StandardOutput=inherit
StandardError=inherit

[Install]
WantedBy=multi-user.target

4. Activar el «Modo Eterno»

Ahora ejecuta estos comandos en orden para que el sistema reconozca el nuevo servicio y lo arranque:

  1. Recargar el sistema:
    sudo systemctl daemon-reload
  2. Activar el inicio automático al arrancar:
    sudo systemctl enable fanguard.service
  3. Iniciar el ventilador ahora mismo:
    sudo systemctl start fanguard.service

¿Cómo puedes vigilar tu ventilador ahora?

Como el script ahora corre de fondo («eterno»), ya no verás la barrita de carga directamente en la pantalla, pero puedes «espiarlo» con estos comandos:

  • Para ver si está vivo y la temperatura actual:
    sudo systemctl status fanguard.service
  • Para ver la «barra molona» en tiempo real (ver los logs):
    journalctl -u fanguard.service -f
  • Si quieres detenerlo para hacer cambios en el script:
    sudo systemctl stop fanguard.service
    (Al detenerlo, gracias al bloque finally de tu script, el ventilador se apagará completamente).

¡Listo! Ya tienes un sistema de refrigeración de grado industrial en tu Raspberry Pi 4.

1 comentario en “Control inteligente de la refrigeración de mi Raspberry Pi 4.”

Deja un comentario

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

Scroll al inicio