Raspi-Notstromversorgung

Leider passiert es immer mal wieder, dass bei uns der Strom ausfällt und einer der Raspberry-Pis dabei seine Speicherkarte schrottet.
Hier der simple Entwurf einer Notstromversorgung, die bei Stromausfall den Raspi runterfährt und ihn per Batterie während dieser Phase noch weiter powert.

Notstrom-small

Die meisten käuflichen Notstromversorgungen für den Raspi verwenden LiPo-Akkus.
Ich habe Batterien verwendet, weil ich nicht wollte, dass da dauernd ein LiPo-Akku geladen wird, der explodiert, wenn was mit dem Laderegler schiefgeht.

Da ich kein passendes 5V Relais in meinen Beständen hatte, habe ich das komplett mit Transistoren gemacht.
Notstrom-Schematics-small

Die Schaltung funktioniert, könnte aber noch verbessert werden.
Ich muss mit Diode D1 verhindern, dass der Kondensator im Notstrombetrieb weiter geladen wird. Denn ich will ja, dass nach einer Minute oder so gar keine Spannung mehr anliegt. Obwohl ich eine Schottky Diode mit 0.3V Spannungsabfall verwende, ist die Versorgungsspannung im Normalbetrieb grenzwertig. Funktioniert nicht mit jedem Netzteil.

Vielleicht also doch mit Relais für die Serienfertigung…

Hier noch der Code zum Runterfahren:

/*********************************************************
usv.c  CC4.0 BY-SA.NC

This small tool shuts down the Raspberry when it detects a 
LOW signal on GPIO

**********************************************************/
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
#include <wiringPi.h>
#include <unistd.h>


// Helptext
void printUsage() {
    fprintf(stderr, "panelCtrl CC4.0 BY-NC-SA 2015          c-hack.de\n\n");
    fprintf(stderr, "Usage: ");
    fprintf(stderr, "usv <n>\n");
    fprintf(stderr, "<n>  Number of GPIO where the shutdown signal is connected to\n\n");
    fprintf(stderr, "Example: ");
    fprintf(stderr, "usv 3    Checks GPIO 3 for a LOW signal to trigger the shutdown\n");
    exit(1);
} 

/*--------------------- Main: Command Line Interface ---------------------------------*/
int main(int argc, char *argv[]) {
   int gpioNr;
   int gpioState;

   // Command line processing
   if (argc < 2) printUsage(); 
   else { 

     wiringPiSetup();     

     gpioNr = atoi(argv[1]);
     printf("USV shutdown armed on GPIO %d\n",gpioNr);
      
     pinMode(gpioNr, INPUT);              // Set input pin
     pullUpDnControl(gpioNr, PUD_UP);     // Set weak pull-up
     
     while (1==1) {
        gpioState = digitalRead(gpioNr);
        printf("State %d on GPIO %d detected\n",gpioState, gpioNr);
        if (gpioState == 0) system("/sbin/shutdown -h 0"); 
    sleep(1);
     }
  }
} 

Für den PanelController-Raspi habe ich GPIO 8 verwendet.
Also startet man das Tool mit: usv 8