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 passen 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 serieleln 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.

 


Besucherzaehler

Besucher seit
25.11.2000

>