A estas alturas estoy seguro de que la mayoría de vosotros ya ha podido comprobar la falta de correlación entre las pruebas realizadas en un laboratorio y las llevadas a cabo en el mundo real.
La Raspberry Pi no es ajena a esta afirmación, ya que su sistema de archivos, en teoría sólido como una roca al estar basado en Linux y ejecutarse en un medio sólido (sin dependencia mecánica), es en realidad extremadamente sensible a las fluctuaciones de alimentación, pudiendo llegar a corromperse por completo.
Pensemos en varios usos: una Raspberry Pi funcionando como webcam, repetidor de radio en una montaña, o leyendo información de un motor diesel.
En esos entornos, es fácilmente imaginar los habituales micro/cortes de corriente o cambios de intensidad/tensión por efecto de la arrancada/aceleración del motor diesel.
Mientras la Raspberry Foundation le da solución a este problema (han hecho importantes avances respecto a sus primeras versiones), os propongo una solución sencilla y barata, apta para principiantes, sin necesidad de tener conocimiento de electrónica ni programación.
Usar un Powerbank usb como SAI / UPS online de Raspberry Pi
Como os podéis imaginar por el título de este post, la solución está en el uso de un powerbank, aunque os adelanto que no os valdrá uno cualquiera, ya por algún motivo la mayoría de powerbanks del mercado no son capaces de alimentarse/cargarse y dar alimentación/cargar otro dispositivo al mismo tiempo, produciéndose un corte de corriente de apenas una décima de segundo en el cambio de modalidad, corte que es suficiente para dejar sin alimentación a nuestra Raspberry Pi, provocando un reinicio de la misma del peor modo posible.
He dicho la mayoría porque por suerte hay varios fabricantes que por suerte han ido un paso más allá, fabricando powerbanks capaces de cargarse y dar carga al mismo tiempo del mismo modo que lo haría un SAI / UPS de calidad.
Personalmente os recomiendo este:
Es el que he usado yo, un powerbank Tecknet, de calidad, muy bien acabado, con una capacidad de 9600mAh, y dos conectores USB capaces de dar 2.4A (3.4A en total), potencia más que suficiente para una Raspberry bien equipada, ya que en su configuración básica apenas llega a 1.8A.
Para su utilización bastará con conectarlo a la corriente a través de su cable de alimentación (incluido), haciéndose necesario un cable USB – miniUSB para que el powerbank alimente nuestra Raspberry.
El cable USB – Microusb conectado entre el powerbank y la Raspberry sustituye el cable de alimentación/fuente de la Raspberry, funcionando el powerbank literalmente como un SAI /UPS.
Monitorizar la alimentación
Para los que como me ha pasado a mí queráis ir un paso más lejos y siendo capaces de tomar decisiones en función de que haya corriente o nos estemos alimentando de la batería, a continuación os explico como hacerlo.
La clave está en monitorizar la conexión ethernet, por lo que para este proyecto se hace necesario conectar la Raspberry Pi a otro dispositivo (hub/switch/modem) que esté conectado a la corriente sin ningún tipo de SAI /UPS de respaldo. El dispositivo no necesita disponer de conexión a internet.
Una vez hecho esto lo siguiente es instalar el programa/demonio encargado de supervisar tanto la corriente como el estado de carga de nuestro powerbank.
El programa de software libre / licencia GPL se llama upsd (Servicio de control de Alimentación) y permite:
- Supervisar la alimentación (externa o con SAI), y el nivel de carga del powerbank.
- Ejecutar scripts automáticamente en función de si se ha cortado o reestablecido la alimentación.
- Apagar ordenadamente el sistema en caso de detectar un bajo nivel de carga en nuestro powerbank.
- Registrar los eventos más relevantes relacionados con la alimentación de nuestra Raspberry Pi.
Instalación del programa:
wget http://raspi-ups.appspot.com/upsd/upsd_1.2-1.deb
sudo dpkg -i upsd_1.2-1.deb
Si queremos desinstalarlo podemos hacerlo con:
sudo dpkg -r upsd
Para comprobar que el programa se ha instalado correctamente:
upsd -i
que nos mostrará algo parecido a lo siguiente:
IS_RUNNING=YES PID=3165 LAST_UPDATED=2017-05-26 17:31:34 POWER_OUTAGE=NO BATTERY_CHARGE_LEVEL=100 BATTERY_REMAIN_TIME=02:48:00 BATTERY_LOW=NO
Lo siguiente es configurar el programa para adaptarlo a las especificaciones de nuestro Powerbank.
Para editar el fichero de configuración:
sudo nano /etc/upsd/upsd.conf
Los parámetros más importantes son los siguientes:
INTERFACE : Interface utilizado para detectar el voltaje: por defecto eth0
BATTERY_RUN_TIME : Autonomía en segundos del Powerbank. (*1)
BATTERY_CHARGE_TIME : Tiempo en segundos que necesita el powerbank para cargarse totalmente. (*2)
BATTERY_LOW_LEVEL : Nivel de carga, en %, a partir del cual la batería se considerará vacía, por ejemplo 15
BATTERY_LOW_TIME : La cantidad de tiempo en segundos, tras el cual la batería se considerará vacía (se desactiva con 0).
Los scripts en caso de caida de corriente están en:
/usr/lib/upsd
Se llaman:
power_back (se ejecuta cuando vuelve la corriente)
power_outage (se ejecuta cuando se va la corriente
(*1) Para calcular la autonomía en segundos de nuestro Powerbank:
autonomia = 3600 * capacidad en WH de Powerbank / Watios que consume una RPI.
Como los powerbanks informan su capacidad en mAh lo primero que haremos será pasar su capacidad a Wh, en mi caso para no de 9600 mAh:
5V * 9600mAh / 1000 = 48Wh
Trasladado a mi ejemplo, teniendo en cuenta que una Raspberry 3 consume unos 2w a pleno rendimiento:
3600 * 48 / 2.5 = 86.400 segundos = 1.440 minutos = 24 horas
(*2) Para calcular el tiempo necesario para la carga del Powerbank:
(3600 * Wh) / (Amperaje de carga del powerbank * 5v)
que en el caso de mi powerbank con una potencia de entrada de 1.5A:
(3600 * 48) / (1.5 * 5) = 172.800 / 7.5 = 23.040 segundos = 384 minutos = 6,4 horas