¿Cómo detectar por software una mala alimentación de la Raspberry PI?

Si una Raspberry PI detecta que su voltaje es inadecuado, mostrará el icono de un rayo amarillo en la esquina superior derecha de la pantalla. Si no tienes la Raspberry PI conectada a una pantalla, pero puedes ver la propia Raspberry Pi, observarás que esta señala una mala alimentación apagando o haciendo parpadear el LED rojo.

¿Cómo puedes saber si la Raspberry PI tiene problemas de alimentación cuando no tenemos acceso físico a ella?

Hay varias opciones:

Advertencia

La Raspberry PI es una plataforma en evolución, por lo que a medida que aparezcan modelos nuevos o actualizaciones del sistema operativo pueden surgir otros mecanismos y algunos de los que muestro aquí podrían dejar de funcionar.

  • El pseudofichero /sys/class/leds/led1/brightness nos indica el estado del LED rojo. Un 255 indica que el LED está encendido (buen voltaje) y un 0 indica que el LED está apagado (mal voltaje).

  • Pin 35: El pin 35 nos indica el estado del LED rojo de alimentación. Podemos saber si está encendido o apagado y, de forma indirecta, saber si la Raspberry PI está señalizando problemas de alimentación.

    Para ello configuramos el pin 35 como entrada y leemos su valor. Un 1 significa que todo va bien y un 0 significa que se está detectando un voltaje inadecuado.

    # echo 35 >/sys/class/gpio/export
    # echo in >/sys/class/gpio/gpio35/direction
    # cat /sys/class/gpio/gpio35/value
    1
    

Advertencia

Estas medidas indican el estado en el instante actual. Si la calidad de la alimentación es marginal y solo falla, por ejemplo, en momentos de alta demanda, debemos tener la suerte de comprobar esas mediciones en el instante justo.

  • Comando vcgencmd get_throttled:

    En estos momentos la mejor forma de verificar problemas de alimentación o temperatura en la Raspberry PI, si tenemos un Sistema Operativo actualizado, es el comando vcgencmd get_throttled:

    # vcgencmd get_throttled
    throttled=0x0
    

    Este comando muestra eventos en curso en este momento y qué eventos han ocurrido alguna vez desde el último reinicio. Es decir, una ventaja importante de este comando es que nos indica si han ocurrido eventos durante el funcionamiento del equipo, además de si está ocurriendo algo ahora mismo. Esta ventaja es importantísima.

    La cifra devuelta está formada por bits con el siguiente significado:

    0 Bajo voltaje [1]
    1 Limitación de frecuencia en los ARM
    2 En limitación ahora mismo [2]
    3 En limitación de temperatura "suave" [3]
    16 Ha ocurrido un evento de bajo voltaje [1]
    17 Ha ocurrido un evento de limitación de frecuencia ARM
    18 Ha ocurrido limitación [2]
    19 Ha ocurrido un evento de temperatura "suave" [3]

    Los bits bajos nos indican los eventos en curso, y los bits altos nos indican qué eventos han ocurrido desde el reinicio de la Raspberry PI.

    Nota

    Podrían añadirse más bits en futuras revisiones del Sistema Operativo.

    El comando se puede invocar con un parámetro adicional. Dicho parámetro pone esos bits a cero tras devolver el resultado. De esta forma podemos ver si ha ocurrido un evento desde un momento anterior, no desde el arranque de la Raspberry PI. Por ejemplo:

      Desde el arranque de la máquina han ocurrido limitaciones y
      eventos de temperatura "suave":
    
    root@osmcpi:~# vcgencmd get_throttled
    throttled=0xd0000
    
      Pero desde que ejecuto estos comandos, solo están
      ocurriendo eventos de temperatura "suave", sin
      limitación:
    
    root@osmcpi:~# vcgencmd get_throttled 0xf
    throttled=0x80008
    root@osmcpi:~# vcgencmd get_throttled 0xf
    throttled=0x80000
    root@osmcpi:~# vcgencmd get_throttled 0xf
    throttled=0x80000
    
      Y sí, mi Raspberry está caliente:
    
    root@osmcpi:~# vcgencmd measure_temp
    temp=65.5'C
    

    Esto está explicado en:

    [1] (1, 2)

    La Raspberry PI debe tener un voltaje de alimentación de, al menos, 4.63 voltios.

    [2] (1, 2)

    Hay más motivos para que una Raspberry PI entre en limitación además de por temperatura o alimentación eléctrica inadecuada. Este bit refleja ese hecho.

    [3] (1, 2)

    La temperatura a la que una Raspberry PI entra en limitación "suave" varía según el modelo y no son valores que estén bien documentados.

    Algunos ejemplos mal documentados y recogidos de aquí y de allí (podrían no ser de fiar o depender de la versión del Sistema Operativo):

    • La Raspberry PI 3B+ limita la CPU a 1.2GHz (de un máximo de 1.4GHz) al llegar a 60°C.

      Esto se puede cambiar añadiendo temp_soft_limit=70 en el fichero /boot/config.txt, a riesgo de inestabilidad.

      Se pueden ver los valores en curso con:

      # vcgencmd get_config int | grep temp
      

    Para ver la temperatura actual del SoC de una Raspberry PI podemos ejecutar:

    # vcgencmd measure_temp
    temp=65.0'C
    
  • Pseudofichero /sys/devices/platform/soc/soc:firmware/get_throttled:

    Las versiones modernas del Sistema Operativo tienen un fichero /sys/devices/platform/soc/soc:firmware/get_throttled que, aparentemente, devuelve algo similar a vcgencmd get_throttled, pero a mí no me funciona.

    Más detalles.