Eine (elektrische) Odyssee
Vorsicht: sehr technisch!
Im Moment bin ich dabei, einen Ersatz für den etwas in die Jahre gekommenen Raspberry Pi 3 im Ferienhaus in Brail zu bauen:
Zum einen läuft dort HomeAssistant in einem docker container, zum andern laufen pi-hole (DNS, DHCP und Adblocking), weewx (Wetterstation), deCONZ (einige experimentelle ZigBee Geräte), eine WebCam und neuerdings auch noch ein Modbus Anschluss zur Ueberwachung der Heizung.
Mit all den USB Geräten sind alle Stecker des RPi belegt, die SD-Karte ist schon recht voll und bei Updates sehr langsam, die unterbrechungsfreie Stromversorgung (LiFePO4wered/Pi+) am Anschlag (weniger wegen des RPi - die vielen USB Geräte brauchen auch Strom...) und die 1GB Speicher sind auch knapp.
Daher der Wunsch, die Installation auf eine aktuellere, leistungsfähigere Basis zu heben - jetzt realisiert mit einem RPi 4 mit 4GB, den hatte ich schon früher mal zu Testzwecken gekauft - zwischenzeitlich war das Teil nicht zu vernünftigen Preisen zu bekommen und der aktellste RPi 5 ist noch zu neu (Kinderkrankheiten!) und auch ein Energiefresser.
Softwaremässig habe ich mich für die 64bit Version von Raspberry Pi OS als Basis entschieden und die unterbrechungsfreie Stromversorgung wird durch einen AmpRipper 4000 mit einem 1S4P Li-Ion Akku sichergestellt. Ueber USB ist eine SSD als Boot- und Speichermedium angebunden und der zweite USB3 Anschluss wird durch einen 7 Port USB Hub erweitert. Das Gehäuse stammt aus dem 3D Drucker und hat die Form einer Schublade mit grossen Oeffnungen für die Abwärme und einem Fetzen Fliegengitter zum Schutz der Innereien. Da die in Brail vorhandene Wetterstation sich gelegentlich immer wieder mal aufhängt und dann nur durch unterbrechen der Stromversorgung (aka Reboot des RPi) wieder gestartet werden kann, habe ich am dritten USB Port einen USB Stromschalter eingebaut, der das jetzt gezielt für dieses Gerät erlaubt (das ist der "Schwanz" auf den Bildern).
Leider ist die Integration zwischen dem ApmRipper, der als USB Stromversorgung arbeitet und dem Raspberry Pi nicht so perfekt, wie das mit der alten Hardware war, die genügend lokale Intelligenz zur Ueberwachung und Steuerung der Stromversorgung "on-board" mitbrachte: Neu wird so lange Strom geliefert, bis der Akku leer ist und dann abrupt abgeschaltet - mit der alten Lösung gab es ein entsprechende Signal auf einem GPIO Pin, mit genügend verbleibender Kapazität für einen ordnungsgemässen Shutdown. Ebenfalls wird neu direkt wieder gestartet, sobald Strom verfügbar ist - früher konnte der Neustart so lange verzögert werden, bis der Akku wieder genügend Reserven aufgebaut hatte.
Glücklicherweise hat der AmpRipper sowohl einen i2c Anschluss, über den das Monitoring der Batterie möglich ist, als auch einen "EN"able Anschluss, der es ermöglicht, den Strom zum neuen RPi elektrisch zu steuern. Der Zustand "on" wird durch einen Pullup Widerstand auch bei nicht-beschaltetem EN Anschluss gewährt. Zum Ausschalten ("off") muss EN auf GND gezogen werden.:
... und, wenn ich schon zusätzliche Logik und Hardware benötige, wäre es auch nett, wenn ich den Strom unabhängig vom RPi über's Internet schalten könnte - das wäre das eine oder andere Mal schon sehr nützlich gewesen.
Ein Raspberry Pico W der sowohl i2c, als auch GPIO und WLAN kann, kostet auch nicht die Welt. Damit sieht das jetzt so aus:
Damit das Stromversorgungstheater nicht wieder von neuem losgeht, wird die Elektronik des Pico über zwei Dioden sichergestellt - so kann der Pico loswerkeln, sobald entweder Netz-(primär) oder Batteriestrom (sekundär) verfügbar ist. Auf dem Pico läuft ein kleiner Webserver, der den Ladezustand als JSON verfügbar macht und es auch erlaubt, den EN Anschluss zu bedienen ("on"/"off". per Software).
Das hat auch funktioniert, solange der Pico für die Programmentwicklung an meinem Notebook angeschlossen war - aber ab dem Moment, als der Strom über die Dioden kam, wurde es kurios: Bei vorhandenem Primärstrom und gestartetem Pico funktionierte es wie am Notebook, aber wenn einmal der Strom für den Pico weggenommen wurde, sah es bei verfügbarem Primärstrom so aus: RPi startet, Pico startet, RPI crasht, RPi startet, danach alles normal. Bei nicht verfügbarem Primärstrom: RPi startet, Pico startet, RPi crasht, Pico crasht, RPi startet, Pico startet, RPi crasht, Pico crasht ... alle 2-3 Sekunden, ad infinitum (oder bis der Akku komplett leer ist).
Der Grund für dieses Verhalten: Ausgänge beim Pico sind im ausgeschalteten Zustand hochohmig (d.h. der EN Pin wird durch den Pullup hochgezogen - Sekundärstrom verfügbar); Sobald der Pin des Pico als Ausgang konfiguriert wird, geht er auf "LOW" (definierter Anfangszustand), was den EN Pin auf 0V zieht und der Strom damit abschaltet. Im Fall das Primärstrom verfügbar ist, läuft der Pico weiter und setzt dann den mit EN verbundenen Ausgang auf HIGH und der RPi bekommt wieder Strom und startet regulär. Wenn kein Primärstrom verfügbar ist, bekommt auch der Pico keinen Strom mehr und schaltet ab, wodurch der Ausgang wieder hochohmig wird und damit die Sekundärseite wieder Strom bekommt und das Spiel von vorne beginnt.
Was machen? Eigentlich einfach: Mittels eines Transistors die Logikpegel für EN und im Code "on" und "off" Pegel tauschen. Damit ist der hochohmige Zustand und der definierte LOW Pegel beim booten des Pico äquivalent zu "sekundär ein" und das hin und her "flippern" findet nicht mehr statt.
ABER: Das Ganze funktioniert nur, solange der Pico mit Strom versorgt bleibt, weil im stromlosen Zustand die Sekundärseite eingeschaltet bleibt. Und weil auch ein "ausgeschalteter" RPi noch ganz anständig Strom zieht und auch der Pico seine 100mA braucht, bringt es diese Lösung für den Grenzfall, dass der Akkustrom sich dem Ende zuneigt nicht - im reinen Akkubetrieb wird der Akku bis zum bitteren Ende leer gesaugt..
Schlussendlich braucht es zur endgültigen Lösung des Dilemmas (so man den AmpRipper nicht modifizieren will) ein bistabiles Relais, dass zum Ausschalten über einen Impuls den EN Pin mit GND verbindet und diesen Zustand auch stromlos weiter hält:
Ausserdem muss man einen digitalen Eingang auf dem Pico für die Ueberprüfung des aktuellen Zustandes verwenden, sofern man nicht mit einem Doppelspulenrelais arbeiten will.
Insgesamt war dieses "häppchenweise bottom-up" "Design" jetzt nicht wirklich befriedigend - hätte es einfachere Lösungen gegeben, die ich einfach nicht gesehen habe, habe ich die ursprüngliche Aufgabenstellung unterschätzt, oder ist es das Alter...