Elektronik_Header_3Lüftersteuerung mit ESP-01

 

Raspberry Pi USV

In unserem Haushalt gibt es inzwischen ein paar Raspberry Pi (RasPi). Normalerweise verrichten die Zwerge unauffällig ihren Dienst, aber wenn die Versorgungsspannung unvorhergesehen ausfällt, ist die Wahrscheinlichkeit zumindest gegeben, dass die SD-Karte zerschossen wird und neu aufgesetzt werden muss. Hat man richtig Pech, geht die Karte auch schon mal über die Wupper und ist danach nicht mehr zu gebrauchen. Gut wenn man nach Einrichtung aller Erfordernisse z.B. mit imgUSB ein Backupimage erstellt hat.

Um diese Eventualitäten zu umschiffen, ist die Verwendung einer USV ein gangbarer Weg. Der deutsche Begriff USV für “Unterbrechungsfreie Stromversorgung” übersetzt sich ins Englische mit UPS, “Uninterruptable Power Supply”.

Auf der Suche nach einer einfachen und preiswerten Lösung bin ich auf die Veröffentlichungen von Joachim gestoßen, der die Ideen und Untersuchungen des niederländischen Kollegen Brousant zum Geekworm UPS HAT weitergeführt und auf seiner Github Seite veröffentlicht hat.

Joachims Beschreibung bezieht sich auf Geekworm UPS HAT V1.0 und V2. Alle Schritte von notwendigen Modifikationen des UPS HAT, der Installation des korrespondierenden Programms auf dem Raspberry und der Bau einer AtTiny85 befeuerten Zusatzplatine, die die Steuerung des Konstrukts übernimmt, sind haarklein und auch für einen nicht Linux affinen Nachbauer verständlich erklärt.

Allerdings kann es passieren, dass das eigene Linux-System verschiedene der von Joachim eingesetzten Erweiterungen nicht von Hause aus an Bord hat. Joachim setzt auf aktuellste Softwareumgebung, man muss also ggf. sein System entsprechend hochrüsten, damit die zur Verfügung gestellten Programme auf dem Raspberry Pi laufen.

So ist auf meinem betagten RasPi 1B unter Jessie Python V2.7 aktiv, vom AtTiny-Daemon genutzte Erweiterungen, z.B. die „typing-extension“, setzen aber mindestens Python V3.4 voraus.

Die Modifikationen am UPS HAT sind bei den von Joachim beschriebenen Versionen V1.0 und V2 notwendig, da der UPS HAT zwar bei Ausfall der Versorgungspannung sauber auf Akkubetrieb umschaltet, aber bei Wiederkehr der Versorgung den Akku nicht wieder lädt.

In der Version V1.1 des Geekworm UPS HAT ist dieses Manko inzwischen behoben, ein Teil der von Joachim beschriebenen  Modifikationen ist in diesem Fall also unnötig.

Da das automatische Laden des Akkus bei Wiederkehr der Netzspannung bei Version  V1.1 des Geekworm UPS HAT bereits hardwaremäßig implementiert ist, kann die Schaltung des UPS HAT unverändert bleiben. Es muss lediglich die Möglichkeit geschaffen werden, den Raspberry vom AtTiny gesteuert neu zu starten. Das erfolgt über ein Kabel, welches an Pin3 (PB4) des AtTiny und auf dem UPS HAT parallel zum dort vorhandenen Taster angeschlossen wird. Das Herunterfahren des RasPi bei Energiemangel erfolgt hingegen über ein via I²C abgewickeltes Protokoll zwischen AtTiny und RasPi.

Damit der AtTiny weiß, wann er dem Raspberry mitteilen soll, dass dieser sich herunterfahren soll, weil der Akku der USV leer ist, muss er die Akkuspannung messen. Diesen Wert erhält der AtTiny über ein weiteres Kabel, das auf dem UPS HAT an einer der beiden parallel geschalteten Dioden D2/D4 auf der dem Micro-USB-Stecker zugewandten Seite oder direkt am Stecker für den Akku angelötet wird. Das andere Ende ist direkt die Versorgungsspannung des AtTiny.

Die zweite zu messende Spannung wird über einen Spannungsteiler 1:1 (z.B. 2x 100 kΩ) an den Eingang PB3 geführt, der als Analoginput parametriert ist.

Achtung!
Das Layout des UPS HAT V1.1 hat sich gegenüber V1.0 geändert. Die beiden oben als Anschlusspunkt erwähnten Dioden sitzen in der Version V1.1 um 180° gedreht auf der Platine.

Ich habe die Leitung direkt am Stecker des Akkus angelötet.

Geekworm UPS HAT V1.1Detail Leitung am TasterDetail Leitung am Akku-Anschluss              (Click auf Schalter und Akku-Anschluss für Details)


Joachim hat eine kleine Zusatzplatine entworfen, die mit TH (through hole, bedrahteten) Bauelementen bestückt wird und einfach auf den Erweiterungsstecker des UPS HAT aufgesteckt wird. Zwei zusätzliche Leitungen werden auf dem UPS HAT angelötet und ebenfalls an der Zusatzplatine angesteckt.

Will man den Kauf der Zusatzplatine vermeiden, kann die übersichtliche Schaltung auch auf einem Steckbrett aufgebaut werden, das funktioniert problemlos. Auf einer Platine aufgebaut ist es aber schöner :-)

Nun gibt es mit dem Digispark eine mögliche Alternative. Der Digispark ist ein über USB programmierbarer AtTiny85 mit Spannungsregler, LEDs, ein paar Kondensatoren und Widerständen und kann über die Arduino IDE programmiert werden, wenn die passenden Bibliotheken installiert sind.

Leider verhindert die Beschaltung für die USB-Kommunikation an PB3 und PB4 des AtTiny die Nutzung dieser Pins in der gegebenen Schaltung. Um die Pins nutzen zu können müssen die beiden Widerstände R1 und R2 (jeweils 68 Ω) entfernt werden, was aber wiederum die Programmierung des Digispark über USB unmöglich macht.

Das ist aber implizit kein Problem, da der AtTiny85 ohnehin mit 8 MHz betrieben werden muss, damit er auch bei der niedrigen Versorgungsspannung von 3,7 V direkt aus dem LiIon-Akku sicher funktioniert. Und 8 MHz ist zu langsam für die Abarbeitung des Software-USB-Stack. Die Programmierung des Digispark muss also fürderhin mit einem ICSP Programmierer erfolgen. Ich verwende dafür den mySmartUSB light. Damit ist natürlich der Hauptvorteil des Digispark gegenüber der reinen AtTiny basierten Lösung verschwunden.

Der Digispark muss sich noch eine weitere Modifikation gefallen lassen, um die Anforderungen des AtTiny-Daemon zu erfüllen. Die LED an Pin 6 (PB1) liegt beim Digispark zwischen PB1 und Masse, natürlich mit Vorwiderstand. In der Schaltung von Joachim wird die LED an einem gemeinsamen Pin des AtTiny mit dem Taster zum gezielten Herunterfahren des RasPi betrieben. Um den Pin so nutzen zu können, muss also diese LED umgepolt eingebaut und der Vorwiderstand von Masse nach P5V gelötet werden. Diese Operation ist aufgrund der beengten Platzverhältnisse und der winzigen Bauteile etwas knifflig, aber machbar.

Mit diesen beiden Änderungen sollte der Digispark für die Steuerung des UPS HAT geeignet sein.

Damit die AtTiny-Daemon Firmware auf dem so umgebauten Digispark läuft, muss in der Datei „ATTinyDaemon.h“ das Define LED_BUTTON von PB4 auf PB1 geändert werden, PIN_SWITCH wandert dafür von PB1 nach PB4, die beiden Anschlüsse werden also, geschuldet der vorliegenden Beschaltung des Digispark, vertauscht.

Man sieht schon, die einfachste Übung ist das nicht. Nimmt man noch den Fakt hinzu, dass Joachim einige Kniffe angewandt hat um den Stromverbrauch des AtTiny-Daemon zu reduzieren, der Digispark aber eine Power-LED hat, die immer leuchtet, drängt sich unweigerlich der Gedanke auf, doch lieber Abstand von der Digispark-Lösung zu nehmen.

Natürlich habe ich den so umgebauten Digispark nicht in den Müll geworfen, sondern einer sinnvollen Aufgabe zugeführt. Er verrichtet jetzt seinen Job als Ausschalter an einem Raspberry Pi 3, der sporadisch als Medienstreamer arbeitet.


Da ich keine Angst vor der Verarbeitung von SMD Bauteilen habe und Fan von einseitigen Platinen bin, solange sich das ohne Krämpfe erledigen lässt, habe ich eine kleine Platine für den AtTiny-Daemon entworfen und auf meiner CNC-Fräse hergestellt.

Der 8-polige Stecker stellt die Verbindung zwischen AtTiny-Daemon und USV Platine her, lediglich die vier Signale VCC, GND, SDA und SCL sind hierfür notwendig. Die beiden anderen Signale werden für die Programmierung des AtTiny in der Schaltung mittels ICSP Programmierer gebraucht.

Am zweipoligen Stecker rechts werden “Plus” des Akku und der Taster auf der USV Platine angeschlossen.

RasPi USV AtTinyDaemon                (Click auf das Bild für volle Auflösung)

Leider musste ich eine Leitung als Draht vorsehen, diese wird zwischen den beiden runden Testpunkten eingelötet und erlaubt die Programmierung des AtTiny85 auch im aufgelöteten Zustand. Für den Betrieb des AtTiny als Supervisor für die USV ist diese Verbindung nicht notwendig.

RasPi USV AtTinyDaemon

Fertig aufgebaut und in Betrieb:

AtTiny_Daemon

 

AtTiny_Daemon auf dem Geekworm UPS HAT V1.1

Soweit die Hardware Vorbereitungen.

Hinweis
Da das orangene Kabel direkt zum Pluspol des Akkus führt, ist es sinnvoller und sicherer, anders als hier gezeigt, die beiden Anschlüsse auf dem AtTiny-Board als Stecker auszuführen und die offenen Enden der Kabel dazu passend als Buchsen.


Weiter geht’s mit der zugehörigen Software. Man sollte immer die aktuellste Version der Software verwenden und die Firmware für den AtTiny und den Daemon auf dem RasPi gemeinsam austauschen.

Die Software ist zweigeteilt. Zum einen gibt es die Firmware für den AtTiny, zum anderen läuft auf dem Raspberry Pi ein Daemon als Service, der im Wesentlichen auf die Mitteilung des AtTiny wartet, sich wegen Akkumangel schlafen zu legen.

Betrachten wir zuerst die AtTiny Firmware.

Die Firmware von Joachim wird unverändert auf den AtTiny geflasht. Die meiste Zeit verbringt der Prozessor im SleepMode und verbraucht so kaum Energie. Alle paar Sekunden wird er über den Watchdog Timer aus dem SleepMode aufgeweckt. Die Sleep Zeitdauer hängt von der Akkuspannung ab.

Wacht der Prozessor auf, nimmt er verschiedene Messungen vor. Zuerst ermittelt er seine eigene Chiptemperatur, danach misst er über die Funktion “Eigene Versorgungsspannung messen” die Akkuspannung. Anschließend, falls das so parametriert ist, wird noch eine weitere Spannung gemessen, in unserem Fall die Versorgungsspannung des Raspberry Pi, wodurch der AtTiny feststellen kann, ob der RasPi läuft oder bereits abgeschaltet wurde.

Die Messung der Temperatur ist für den Betrieb als Supervisor für die USV Platine nicht notwendig und wird zur Zeit im Programm auch nicht berücksichtigt.

Die verschiedenen Spannungen finden natürlich Berücksichtigung.
Solange die Akkuspannung oberhalb einer in der Software festgelegten Schwelle - standardmäßig 3,4 V - liegt, wird der AtTiny einmal in der Sekunde geweckt. Sinkt die Spannung darunter, sendet der AtTiny dem RasPi die Aufforderung, sich geplant in den Shutdown zu begeben und jetzt wird der Prozessor nur noch alle zwei Sekunden geweckt. Bei jeder Messung blitzt die LED einmal kurz auf. Sinkt die Spannung weiter - standardmäßig unter 3,2 V - wird die Messfrequenz weiter abgesenkt, der Prozessor wacht nur noch alle 8 Sekunden auf, die LED wird nicht mehr eingeschaltet um Energie zu sparen. Zusätzlich schaltet der AtTiny die USV Platine ab indem er die Leitung am Taster für 4 Sekunden aktiviert.

Der AtTiny überwacht in diesem Zustand weiterhin die Akkuspannung. Da er direkt am Akku angeschlossen ist, wird er also den Akku über längere Zeit ohne Stromversorgung tiefentladen und schädigen. Aus diesem Grund muss der verwendete Akku eine integrierte Schutzschaltung besitzen, die eine Tiefentladung sicher unterbindet.

Ist die Stromversorgung über das an der USV Platine angesteckte Netzteil wieder aktiv, wird automatisch der Akku von der USV Elektronik geladen. Erreicht die Akkuspannung einen Schwellwert - standardmäßig 3,9 V - schaltet der AtTiny die USV über einen 4-sekündigen Impuls am Taster wieder aktiv und der RasPi wird dadurch neu gestartet.

Zusätzlich und optional kann der AtTiny überwachen, ob der RasPi läuft. Ist diese Funktion aktiviert, prüft der AtTiny zyklisch, ob der RasPi sich regelmäßig meldet (indem er bestimmte Register im AtTiny über I²C ausliest oder beschreibt). Fallen diese regelmäßigen Zugriffe aus, versucht der AtTiny den RasPi neu zu starten indem er die USV aus- und wieder einschaltet. Das erfolgt über zwei 4 Sekunden lange Impulse am Taster, getrennt durch eine kurze Pause.

Die oben beschriebenen Vorgänge finden genau so nur dann statt, wenn bestimmte Parameter in der Konfigurationsdatei “attiny_daemon.cfg” auf dem RasPi passend eingestellt sind. Darauf gehe ich später noch ein.


Wie bereits erwähnt gibt es auf dem Raspberry Pi ebenfalls einen Teil des Systems, den AtTiny_Daemon Service.

Joachim stellt die auf dem Raspberry Pi zu installierenden Softwareteile im Wiki auf seiner Github Seite ausführlich vor, ebenso den Weg, wie und wohin die einzelnen Dateien zu legen sind, damit das System anschließend problemlos funktioniert.

Zusätzlich erfolgen noch ausführliche Erklärungen über das Warum, so z.B. die Erstellung bzw. die notwendigen Inhalte einer Unit Datei, die dafür sorgt, dass der Service zur Kommunikation mit dem AtTiny auch beim Systemstart anläuft.

Beim Nachbau und der Inbetriebnahme sollte das umfangreiche und ausführliche Wiki zum Geekworm UPS HAT unbedingt durchgearbeitet werden. Um es einfach vorher zu überfliegen ist der Stoff zu kompliziert, aber man wird an die Hand genommen und stufenweise geführt. Sehr vorbildlich!

Ist die Hardware fertig bestückt und programmiert wird die Platine mit dem AtTiny auf den UPS HAT, der HAT auf den Raspberry Pi aufgesteckt. Die Stromversorgung vom USB Netzteil kommt an den HAT, nicht an den RasPi.

Die Software ist auf dem RasPi installiert, wir beginnen mit der Konfiguration des Systems.

Die Konfigurationseinstellungen für den auf dem RasPi laufenden AtTiny_Daemon stehen in der Datei “attiny_daemon.cfg”. Eine beispielhafte Konfiguration stelle ich hier vor.

[attinydaemon]
warn voltage = 3400
pulse length = 5000
battery voltage constant = 22
ups configuration = 3
temperature constant = -270
external voltage coefficient = 1818
battery voltage coefficient = 974
button function = nothing
restart voltage = 3900
i2c address = 0x37
vext off is shutdown = 0
pulse length off = 0
ups shutdown voltage = 3200
sleeptime = 20
led off mode = 0
temperature coefficient = 1000
timeout = 120
loglevel = INFO
force shutdown = 1
external voltage constant = 510
pulse length on = 0
i2c bus = 1
switch recovery delay = 2000
primed = 1

Verschiedene Parameter sind weniger interessant, die werde ich hier nicht beschreiben, ich konzentriere mich auf die Wesentlichen.

“force shutdown” bestimmt, ob der AtTiny bei Erreichen der Abschaltspannung (ups shutdown voltage”) den UPS HAT komplett abschaltet. Das ist sinnvoll, da der HAT einen nicht zu vernachlässigen Stromverbrauch hat, auch wenn der RasPi ausgeschaltet ist.

“ups configuration” legt fest, wie sich der AtTiny verhält, um den RasPi zurückzusetzen bzw. einzuschalten.

“button function” bestimmt, was ein Druck auf den Taster auf dem AtTiny-Board bewirkt. Zur Auswahl steht “nothing”, “reboot” und “shutdown”. Bei “shutdown” wird der RasPi ordentlich heruntergefahren.

“primed” schaltet den Daemon auf dem RasPi scharf, so dass ab diesem Zeitpunkt alle konfigurierten Optionen umgesetzt werden.

Die komplette Liste der verfügbaren Optionen ist im Wiki auf Github beschrieben.


Mit den oben im Listing angegebenen Parametern überwacht der AtTiny die Akkuspannung und den Betriebszustand des RasPi.

Fällt die Akkuspannung unter die Warnschwelle - der klassische Grund dafür wäre z.B. der Ausfall der Netzspannung über einen längeren Zeitraum - fährt der AtTiny den RasPi herunter. Fehlt die Netzspannung weiterhin, wird die Elektronik der UPS den Akku weiter entleeren bis die “ups shutdown voltage” unterschritten wird. In diesem Fall schaltet der AtTiny den HAT komplett ab. Kommt die Netzspannung zurück, wird der Akku von der UPS automatisch wieder geladen. Ãœberschreitet die Akkuspannung die “restart voltage”, startet der AtTiny den RasPi wieder.

Hängt sich der RasPi aus irgend einem Grund auf, fallen die regelmäßigen Zugriffe auf den AtTiny aus, was dieser bemerkt. Ist das der Fall, schaltet der AtTiny die UPS aus und wieder ein, was zu einem Neustart des RasPi führt.

Hinweis
Bei einem Shutdown des RasPi, ausgelöst durch den AtTiny bei Erreichen der Warnschwelle oder auch manuell ausgelöst, beispielsweise durch sudo shutdown 0, wird der AtTiny rückgesetzt. Das ist unschön, denn so verliert er die Information, welchen Status das System vor dem Shutdown hatte. Der Algorithmus in der Firmware des AtTiny leitet im Falle von “Warnstate vor Shutdown” den vorhergehenden Zustand zwar wieder korrekt her, besser und richtig ist aber, den State gar nicht erst zu verlieren.

Es stellte sich heraus, dass der RasPi beim Herunterfahren auf der seriellen Schnittstelle noch ein paar Statusinformationen ausgibt, bevor er sich endgültig schlafen legt.

Wir erinnern uns, der Reset Pin des AtTiny, der für die SPI Programmierung notwendig ist, ist auf einen zusätzlichen Anschluss des Steckers geführt, der der Kontaktierung des AtTiny mit dem RasPi dient. Dieser zusätzliche Anschluss wird im gesteckten Zustand mit GPIO14 des RasPi verbunden, und dieser GPIO führt das Signal TxD der seriellen Schnittstelle des RasPi. Die Ausgaben auf der seriellen Schnittstelle erzeugen also mehrere Sekunden lang Reset Impulse für den AtTiny.

Um den unerwünschten Reset für den AtTiny abzustellen, wird in der Konfiguration des RasPi, Aufruf sudo raspi-config, die serielle Schnittstelle still gelegt.

 


Beim Aufruf dieser Funktion werden Daten an Google in USA übermittelt. Neben Ihrer IP-Adresse wird auch die URL der besuchten Seite übertragen.
Besucherzaehler

Besucher seit
25.11.2000