Auf Basis Raspberry Pi 3 mit 7"-Touch-Display und Analogmesskarte mit 24-Bit-A/D-Wandler ADS1256. Dazu PowerBank, Gehäuse. Ein Gehäuse und ein Raspberry Pi 2 war bereits da, weil jenes Projekt eingestellt wurde.
Nötig ist noch eine Vorsatzplatine mit folgenden Eigenschaften:
Es ist elend, dass für dieses Projekt der Raspberry Pi mit Standard-Hardware erweitert werden muss, die sich, wie sich zeigt, nur sehr schwer kollisionsfrei in Betrieb nehmen lässt. Für einen Anfänger ist das absolut ungeeignet!
Die beiden Logger sind (in der Domäne etit.tu-chemnitz.de) erreichbar unter:
Für die gegebenen Forderungen ist eine USB-basierte Lösung die bessere. Mittlerweile (2022) mit WebUSB und Smartphone. Auch das Kombinieren von Thermoelementen und Thermowiderständen an einer Buchsenleiste ist eher schwierig. Daher dort der Neuanfang.
Die Umschaltung der Eingangskonfiguration für die verschiedenen Messaufgaben erfolgt mit einem DIL-Schaltersatz. Bei 24-V-Speisung von Sensoren mit 4..20-mA-Ausgang muss die +24 V an X17-1 zugeführt werden. Die Platine ist prinzipiell für ±-Spannungseingänge ausgelegt; dann muss UEE an –5 V angeschlossen werden. Ansonsten wird UEE mit Masse GND verbunden, wie dies beim verwendeten A/D-Wandler auch gar nicht anders möglich ist.
Wie in China üblich sind sämtliche Durchsteck-Bauelemente oben und SMD-Bauelemente unten. Als Bestückungsvariante für die 4-poligen Sensoranschlüsse wurden die großen mit 5,08 mm Raster ausgewählt. Alternativ bietet die Platine Löcher für die kleinen mit 3,5 mm Raster. Die Platine wurde in Eagle mit metrischem Raster entwickelt.
Beim Betrieb des Raspberry Pi mit einer Powerbank (= Akkupack) muss dieser mit einem extra Schalter oder einer gesonderten Logik nach dem Herunterfahren vom Akku getrennt werden.
Da irrtümlicherweise eine Power-Bank mit Spannungsunterbrechung beim Umschalten zwischen Laden und Entladen ausgewählt wurde, wurde eine zusätzliche NiMH-Akkustütze mit 4,8 V Nennspannung vorgesehen. Dazu sind 2 Schalttransistoren oder ein Relais mit 2 Schaltkontakten erforderlich. Da der Raspberry Pi recht empfindlich auf Spannungseinbrüche reagiert, wurde ein 5-V-Relais mit 2 Arbeitskontakten verwendet, um sich Probleme mit RDSon von MOSFETs mit kleiner Gatespannung vom Hals zu halten.
Der Power-Knopf soll genauso wie beim PC arbeiten:
Dabei sind noch folgende Fallstricke zu beachten:
system()
, ohne fork()
,
Austausch des Prozess-Abbildes durch execlp()
.
Bei Low-Pegel wird systemctl poweroff abgesetzt. Komfortabler wäre ein grafisches Auswahlmenü, aber so funktioniert es auch ohne Display.
RPi.GPIO
-Bibliothek auf die Dateien
unter /sys/class/gpio
aufsetzt.
Benutzt man diese Dateien „zu Fuß“
(Beispiel)
gibt es das gleiche Phänomen;
echo 3 > unexport lässt I²C unbeeindruckt, es bleibt tot.
Das Datenblatt des BCM2835
verrät hingegen, dass das Portpin in jeder Konfigurationsart gelesen werden kann.
Daher ein Neuansatz als C++-Programm.
Die statische Linkbibliothek bcm2835
funktioniert via Shared Memory, benutzt /dev/mem
.
Dieses Programm funktioniert nun auch gemeinsam mit I²C.
Außerdem lässt es sich mit Strg+C beenden.
/boot/config.txt
und der Zeile
dtoverlay=gpio-shutdown
ist völlig wirkunslos.
Auf jeden Fall ist ein externer Knopf zum Herunterfahren erforderlich, damit der Anwender sich das Herunterfahren auch angewöhnt. Denn der Logger schreibt naturgemäß ständig Daten auf die SD-Karte, und Stecker ziehen beantwortet der Raspberry Pi irgendwann mal mit einem kaputten Bootvorgang. (Bei der Version ohne Akkustütze.)
Stützzeit | Power-Knopf? | Frühmeldung? | 5 V trennen? | Abschalt-Automatik? |
---|---|---|---|---|
Keine | Ja (GPIO3) | keine | Nein | Nein: Crash |
Sekunden | Ja (GPIO3) | schnell reagierend (GPIO6) | Je nach Akkutyp* | Ja: Zeit muss reichen |
Länger | Ja (GPIO3 + Schaltung) | GPIO3 oder GPIO6 | Ja | Bei niedrigem Akkustand |
Mit dem Vierfach-Schmitt-Trigger-NAND sollte das einfach zu realisieren sein. Die Schaltung ist im AUS-Zustand ruhestromfrei. TxD wird nicht verwendet.
Beschreibung:
Aufgebaut wurde das Ganze auf einer Lochrasterplatine. Die TxD-Signalisierung wird ignoriert.
Die Schaltung funktioniert gut, solange die Akkuspannung hinreichend konstant ist. Bei einbrechender Spannung machen die Zeitglieder allesamt Probleme. Daher ist der dauerhafte Betrieb nur an der Powerbank problematisch, denn diese schaltet bei fehlender Last den internen Hochsetzsteller ab und gibt nur noch die LiIon-Akkuspannung aus. Diese liegt zwischen 3 und 4,2 Volt.
Nach kurzer Zeit war der NiMH-Akku tot, und diese Schaltung wurde verworfen. Die Platine kam schließlich später bei der angezapften Powerbank zum Einsatz.
Es erscheint seltsam, um einen dicken Mikrocontroller namens Raspberry Pi einen Mikrocontroller herum zu bauen. Aber es ist richtig so, weil der Raspberry Pi im PowerDown-Modus immer noch viel zuviel Strom zieht und sich so ein direkter Akku-Anschluss verbietet. Auch kann er nicht ohne DC/DC-Wandler leben wie so ein weitbereichsfähiger 8-Bit-Mikrocontroller.
Diese Sechsbeiner liegen gerade herum und lösen alle oben genannten Probleme ohne weitere Hardware. Ein billigerer PIC10F200 tut's auch. Es ist beim Konzeptstadium geblieben.
Der Raspberry Pi unterhält sich mit dem Mikrocontroller über I²C, und dieser kann den Akku-Ladezustand zurückgeben (wenn an einer frisierten Powerbank herausgeführt). Dazu sollte ein Mikrocontroller mit A/D-Wandler eingesetzt werden.
Auch hier blieb es beim Konzeptstadium, da keine geeignete Powerbank mit befriedigender Funktion gefunden wurde. ATtiny13 ist unpraktisch da dieser keine I²C-Funktion in Hardware unterstützt. (Software-I²C ist zwar möglich aber bei 400 kHz Taktrate schon sehr anspruchsvoll.) Der ATtiny45 enthält ein Universelles Serielles Interface (USI) mit I²C-Unterstützung und Hardware-Clock-Stretch, was Taktraten von 400 kHz erlaubt und so andere Hardware nicht ausbremst.
Dieser kann sogleich die Funktion der Echtzeituhr inklusive Wakeup übernehmen, die am asynchronen Zeitgeber 2 mit einem 32-kHz-Uhrenquarz betrieben wird. Mit seinen vielen PWM-Anschlüssen kann dieser sämtliche MOSFETs und DC/DC-Konverter für eine Gesamtlösung betreiben:
Muss mal gebaut werden, spätestens nach dem Reinfall mit dem PiUPS+.
Für die Schalter gibt es inzwischen hinreichend gute p-Kanal-MOSFETs IRLML2244, für die kein extra High-Side-MOSFET-Treiber mehr erforderlich ist. Das ändert den Schaltplan erheblich. Den Akkustrom misst man am einfachsten mit einem Shunt auf der Minus-Seite. Für alle anderen Ströme nimmt man besser den INA138, auch wenn dieser mit 2 € schon recht teuer ist. Der Verzicht auf den Weitbereichs-Eingang (also nur 5 V) erspart einen Transistor mit seiner Ansteuerung sowie eine der beiden Spulen. Es ist auch keine soo schlechte Idee, den Raspberry Pi weiterhin mit einem Relais zu schalten.
Dieser 20-beinige Mikrocontroller erscheint noch maßgeschneiderter für diese Aufgabe, auch wenn man sein USB-Interface nicht (oder nur als Urlader) braucht. Siehe mittleres Bild. Er enthält die dazu nötige Hardware:
Wie oben, jedoch enthält dieser Mikrocontroller bereits die beiden OPV zur bidirektionalen Akkustrommessung und ist noch billiger.
Ebenfalls sehr preiswerte 16- und 32-Bit-Mikrocontroller und -Boards, etwa STM32F103, sind weniger gut geeignet wegen ihrer Beschränkung auf 3,3 V E/A-Spannung.
Es gibt für 35 € ein USV-Modul zu kaufen, an dem nur noch der Lithium-Akku anzuschließen ist. Dazu gibt es passende Software. Dieser sprengt leider das zur Verfügung gestellte Budget. Akkus aus defekten Notebooks finden sich. Als besonderes Feature bietet dieses Modul einen Weitbereichs-Eingang, sodass man ein nahezu beliebiges Steckernetzteil verwenden kann.
Schaltplan und Mikrocontroller-Firmware habe ich nicht gefunden, ist anscheinend nicht open-source.
Nun (September 2018) ist das Budget da, und auch Akkus haben sich angefunden. Das USV-Modul soll nun die alte Schaltung vollständig ersetzen. Schade, dass dieses Modul nicht gleich die Echtzeituhr enthält. Hätte man ja in den dort verbauten ATmega8 mit einbauen können. Wieder so eine halbgare Lösung.
Wichtige Infos zu diesem Teil gibt es in diesem Forum. Auch da kann niemand programmieren; das verbesserte Python-Skript zum Auslesen des ATmega8 ist hier. Dieses kann endlich (wenigstens) permanent Spannungen und Ströme anzeigen und ist zu Python3 kompatibel.
Schließlich wurde dieses Board wieder verworfen. Im Testfall während eines Hochlaufs zog es vom Akku 7 A (!). Irgendetwas muss dabei sehr heiß geworden sein. Wahrscheinlich kann man damit keinen Raspberry Pi 3 mit Display betreiben. Auch habe ich partout nicht herausgefunden, wie man das Teil so verwendet, dass es bei Erreichen von „Akku leer“ das Herunterfahren auslöst, nicht nach einer Zeitspanne. Auch ist der Akku-Ladestrom von 100 mA, durch Reduktion von R4 von 10 kΩ auf 2 kΩ dann 500 mA, eher mickrig. (Während der Erprobung war der Ladestrom dann wacklig und nur etwa 400 mA. Vermutlich kommen die eingesetzten MOSFETs an ihre Grenzen.)
Resümee: Das PiUPS+ erscheint nicht dafür gemacht, einen Raspberry Pi mit Akku zu betreiben. Es ist ausschließlich dafür gemacht,
Dafür funktioniert das Teil gut. Aber für mehr taugt es nicht.
Inzwischen (Herbst 2018) gibt es eine neue USV bei Reichelt zu kaufen, für 40 € teurer als der Raspberry Pi selbst. Die Echtzeituhr ist da mit eingebaut. Vielleicht ist dieses Board ja deutlich besser als das oben angegebene.
Am 20. September 2018 traf schließlich ein Powerbank-Bausatz aus China ein. Er beinhaltet alles außer die Akkus. Diese wurden bereits im Vorfeld aus einem alten Akkuschrauber- oder Notebook-Akku ausgeschlachtet. Die Zellen mit mehr als 3 V gelten als noch in Ordnung. Mit einem extra leistungsstarken Lötkolben wurden vier Zellen mit dickem Draht parallel geschaltet. Der dicke Lötkolben sorgt für möglichst geringe Erwärmung der Zelle, die eigentlich nur punktgeschweißt werden darf.
Im Innern ist nur ein einziger achtpoliger Schaltkreis und eine winzige Spule. Ohje! Vom Schaltkreis TP4395 gibt es keinerlei Dokumentation. Beim Testbetrieb zeigte sich, dass die Powerbank nur:
Damit ist auch diese Powerbank nicht zur Versorgung eines Raspberry Pi geeignet. Aber man kann das Ding jederzeit öffnen und so den Akku direkt nach außen führen. Ich habe dazu kurzerhand die beiden Datenkontakte der USB-A-Buchse genutzt. Daran einen Hochsetzsteller PTN04050C (mal als Muster bestellt) über das Relais der diskreten Schaltung angeschlossen funktionierte das Ensemble endlich ordentlich. Allerdings muss man bei der Verwendung des Ganzen beachten, dass das Laden der Akkus länger dauert als das Entladen. Das bedeutet, dass auch bei angestecktem Netzkabel die Akkus irgendwann leer werden. Dagegen hilft nur eine Doppel-Schottky-Diode in der Akkuleitung. Diese vermindert allerdings die Effizienz der 5-V-Versorgung ganz erheblich. Richtig wäre eine gesteuerte Diode, also ein weiterer MOSFET. Für geringen Bahnwiderstand bei geringer Gatespannung müsste es ein ganz besonderer Typ sein. Daher ist es schließlich besser, auf eine Mikrocontroller-Lösung auszuweichen, die zusätzlich eine höhere Gatespannung bereitstellt und viel mehr Komfort bietet. Vor allem bietet nur die Mikrocontroller-Lösung das geordnete Herunterfahren bei schwach werdendem Akku. Oder ein zusätzlicher Komparator: Mehr Aufwand.
Die Überwachung der Akkuspannung erfolgt über den A/D-Wandler, am Eingang ADC6. Damit ist diese nicht unabhängig von der Betriebssoftware, dem Logger, aber das ist hier verzeihlich. Die Akkuspannung kommt vom Ausgang 3 des '4093 und ist nicht direkt angeschlossen, da bei ausgeschaltetem Relais ein permanenter Entladestrom in den Eingang des A/D-Wandlers fließen würde. Der Eingang ADC7 wird verwendet, um über den Spannungsabfall über die Schottky-Diode eine Schätzung über die Stromaufnahme zu bekommen.
Diese Schaltung hat nur noch folgende Mankos:
Beides ließe sich mit einer noch komplexeren Schaltung lösen, aber das wird besser einem Mikrocontroller überlassen, der noch vieles mehr besser kann.
Die unterbrechungsfreie Stromversorgung X728 funktioniert halbwegs zuverlässig, mit folgenden Macken:
Richtig beschrieben/gemacht ist die Installation der Echtzeituhr mittels Kernel-Overlay.
Was noch fehlt:
Pin | GPIO | Richtung | Name | Nutzung |
---|---|---|---|---|
3 | 2 | SDA | - | I²C für Echtzeituhr DS1307 und Voltmeter |
5 | 3 | SCL | - | |
29 | 5 | Eingang | SHUTDOWN | ❌ Taste? Funktioniert nicht! Auch nicht als Ausgang
💡 Pin2 des PIC12F508 via 4,7 kΩ |
31 | 6 | Eingang | PLD_PIN | ✔️ USV-Speisestatus: H = Batteriebetrieb, L = Netzbetrieb
💡 Pin3 des PIC12F508 |
32 | 12 | Eingang | BOOT | ❌Akkuwarnung? Funktioniert nicht! Auch nicht als Ausgang
💡 4,7k an UCC eines '555, 10k an Masse |
38 | 20 | Ausgang | BUZZER_PIN | ✔️ Steuerung des (Gleichspannungs-)Piepsers
💡 H = ein via SOT23-Transistor A2L5M |
37 | 26 | Ausgang | BUTTON | ✔️ PowerOff-Meldung: Dauer-H = Ausschalten nach 7 s
(wenn sicherer Systemzustand erreicht)
💡 H schließt externen und blauen Taster via SOT23-Transistor W1A kurz, was zum Pin 7 des PIC12F508 führt |
Die nicht funktionierenden Leitungen wurden durch Überwachung aller GPIO nachgewiesen: sudo watch -n 0.1 busybox devmem 0xfe200034 läuft ohne irgendetwas installieren zu müssen. Der Timer '555 scheint voll für die Katz' zu sein. Und auch die „Warning“-LEDs (neben den Akkus) habe ich noch nie leuchten sehen.
Das All-in-one-Installationsskript offenbart die Funktion der Batteriefüllstandmessung: Auf I²C-Adresse 0x36 befindet sich der A/D-Wandler mit folgenden I²C-Daten:
Auf den Raspberry-Desktop gehört eine Ladezustandsanzeige
in den System-Tray (neben das WLAN- und Bluetooth-Icon).
Das wird vom Hersteller „Geekworm“ bzw. „SupTronics“ nicht angeboten.
Deshalb habe ich's hier (nach einer mehr oder weniger grauenvollen
Vorlage)
in Python3 nachgeschoben.
Mein erstes ernsthaftes
Python-Programm,
dazu mein erstes Qt-Programm.
PyQt5 ist auf dem Raspberry bereits vorinstalliert, nichts ist mit
pip3 zu installieren.
Kann schon:
TODO:
Gibt es zu kaufen. Aufgelötet ist der Chip DS3231. Dieser Chip enthält bereits den Quarz, und das Modul hat auf der Unterseite eine Lithium-Knopfzelle der Größe 1632 (?), nicht 2032 wie häufig angegeben.
Ist bei der Zeitschrift „Raspberry Pi Geek“ dokumentiert (und kostenlos zugänglich).
Man vermeide sudo apt-get upgrade, das installiert viele Megabyte WolframAlpha.
Falsch ist heutzutage (2018) das Hinzufügen von Zeilen zu /etc/rc.local
.
Stattdessen in die Datei /boot/config.txt
die Zeile
dtoverlay=i2c-rtc,ds3231,wakeup-source
.
Üblicherweise wird in der Uhr die Lokalzeit geführt, die zwischen Sommer- und Normalzeit springt. Aber ich denke mal, dass das beim Raspberry Pi anders ist. Da warte ich mal die nächste Zeitumstellung ab …
Dummerweise ist die 5-polige 1-reihige Pfostenbuchse des DS3231-Moduls nicht verpolungssicher. Glücklicherweise verträgt der Echtzeituhr-Chip die Falschpolung unbeschadet. Nur das I²C-Interface erscheint blockiert, merkbar daran dass i2cdetect -y 1 ewig braucht und nichts findet. Also: Richtig herum anstecken! Und am besten Pin 1 extra markieren: Mit Malerkrepp und rotem Filzstift.
Der Chip hat einen Alarm-Ausgang, der beim Erreichen der Weckzeit auf Low geht.
Das differenzierte Signal ist wiederum so kurz, dass es nicht zum Herunterfahren (mit dem Programm powerbutton) reicht; das ist so sinnvoll und gewollt. Der parallel über die Emitter-Kollektor-Strecke des pnp-Transistors angeschlossene Ein-/Ausschalter muss eben etwas länger gedrückt werden, um sicher vom I²C-Signalspiel unterschieden werden zu können. Die beiden 82-kΩ-Widerstände entladen den 100-nF-Koppelkondensator nach dem Startimpuls wieder. Die rote LED dient nur der Funktionsanzeige. Der Schaltplan des Differenziergliedes ist im Bild „Schaltplan“ oben links ersichtlich. Eigentlich gibt es das Programm rtcwake zum Steuern des Aufweckens. Dieses bezieht sich jedoch leider auf einen falschen Pfad: /sys/class/rtc/rtc0/device/power/wakealarm. Das (mein) Programm ./wake bezieht sich auf /sys/class/rtc/rtc0/wakealarm und funktioniert so erst einmal. Die Systemdatei bekommt die relativ unleserliche Epochen-Zeit zum Fraß bzw. liefert diese (= Sekunden seit 1.1.1970), ./wake macht daraus etwas menschenlesbares. Das Einschreiben einer Null oder vergangenen Zeit löscht die Alarmzeit. Jeglicher Schreibvorgang löscht den Alarmzustand (rote LED im Versuchsaufbau). Der Alarm wird unabhängig vom Betriebszustand des Raspberry Pi ausgelöst, nicht erst wenn dieser ausgeschaltet ist. Irgendwer entfernt den Alarmzustand automatisch nach rund 10 Minuten, vermutlich das Kernel-Overlay. Außerdem wird der Alarmzustand beim Hochfahren gelöscht. Der Echtzeituhr-Chip DS3231 erlaubt nur das Aufwecken innerhalb der folgenden 28..31 Tage.
Der DS3231 enthält einen eingebauten Temperatursensor, der ebenfalls in Logdaten einfließen kann. Die Software ist lächerlich einfach, denn im Kernel-Overlay ist das wichtigste eingebaut. Die Temperatur steht in Tausendstel °C in der Datei /sys/bus/i2c/devices/1-0068/hwmon/hwmon0/temp1_input als Integerzahl zur Verfügung. Es scheint dass die Temperatur einiges zu hoch ist. Bei mir zumindest, auf beiden Exemplaren. Die Auflösung des Chips beträgt 0,25 K. Die Aktualisierung erfolgt standardmäßig alle 64 Sekunden.
Ist in Zukunft die Knopfzelle leer,
Hier geht es um die Einbindung in das TU-eigene Netzwerk „lab“. Laut URZ so etwas ähnliches wie „eduroam“, aber mit statischer IP-Adresse, geeignet für den Fernzugriff.
Mit LAN geht es problemlos, wenn mich nicht gebrochene Kabel ins Bockshorn gejagt hätten.
Eine merkwürdige Eigenart beider Raspberrys (2 und 3) ist, dass bei angestecktem LAN-Kabel das WLAN tot, von außen nicht erreichbar ist!! Also muss man beim Herumfummeln Tastatur und Maus anstecken, da WLAN via SSH über LAN nicht zur Funktion zu bewegen ist: Die Anzeigen (bei ifconfig, iwconfig sowie in der GUI) sehen allesamt normal aus, aber weder ping noch ssh (Putty) geht von außen über WLAN. ping -I wlan0 www.google.de, also herauszu geht allerdings. Ich hatte zunächst das URZ im Verdacht …
Der Netzwerk-Manager wird nicht benötigt: sudo apt remove network-manager. Vom URZ kommen Login-Name und Passwort. Dazu eine Zertifikat-Datei. Aus der wpa_supplicant.conf, die vom Netzwerk-Manager mit den gefundenen freien WLAN-Netzen gefüllt wurde, kann man getrost alles löschen und nur den einen mit essid="lab" (siehe Zip-Datei oben) eintragen. Es muss vermutlich alles haarklein stimmen. Durch Starten von sudo wpa_supplicant -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf kann man die Funktion testen. (Notfalls vorher mit sudo killall wpa_supplicant einen laufenden Prozess beenden.) Das Programm spuckt im Normalfall permanent etwas aus und bricht nicht ab. Währenddessen zeigt die GUI die WLAN-Verbindung an, sowie die vom URZ zugewiesene IP-Adresse. Strg+C lässt das WLAN wieder zusammenbrechen. Ein Reboot startet dann wpa_supplicant wieder. Ohne Netzwerk-Manager.
Nunmehr läuft das WLAN schön zuverlässig, und es kann endlich weitergehen. Erst nach rund 2 Tagen kappt sich die WLAN-Verbindung; Ursache ungeklärt.