Software
Die Platine selbst enthält keinen Controller und damit keine Firmware. Hier jedoch einige nützliche Hinweise und Codeschnipsel zur Ansteuerung. Ich habe sie bisher nur über Bash-Scripts gesteuert.
config.txt
In /boot/config.txt (bzw. /boot/firmware/config.txt bei neueren Versionen) muss der Uart im Abschnitt [all] noch aktiviert werden. Hier ein Ausschnitt meiner config.txt mit den relevanten Einträgen:
#dtoverlay=vc4-fkms-v3d
dtoverlay=disable-wifi
dtparam=i2c_vc=on
enable_uart=1
dtoverlay=uart5,ctsrts
Bash-Skripts (bis PI4b)
Die Richtung der I/O-Pins wird zwar bereits vom EEPROM vorgegeben, um sie per Bash-Script nutzen zu können müssen wir sie jedoch exportieren:
Erst danach können wir die Pins direkt setzen, z.B. so:
Hier sehen wir auch gleich wie man Impulse erzeugt, die zum Ansteuern bipolarer Relais erforderlich sind. Der erste Sleep sorgt mit 2 Sekunden dafür, dass der Kondensator ausreichend geladen ist. Dann wird der Treiber eingeschaltet und mit einem 50 ms-Sleep die Impulszeit abgewartet. Danach schalten wir den Treiber wieder aus.
Das Timing mit Sleep ist selbst in Bash hinreichend genau. Zur Erzeugung von Messimpulsen (zum Ermitteln der aktuellen Relais-Stellung) und zur Auswertung von Tpulse reicht Bash jedoch nicht. Hier bräuchte man ein exaktes Timing und Auflösungen im µs-Bereich. Das habe ich bisher nicht versucht und ich weiß auch nicht, ob das mit dem Pi überhaupt möglich ist (zumindest mit Raspbian).
Wichtig ist, dass immer nur eine einzige Spule eines einzigen Relais angesteuert wird und davor zwei Sekunden gewartet wird um sicherzustellen, dass der Speicherkondensator geladen ist.
... ab PI5
Das IO-System hat sich mit dem PI5 erheblich geändert. Die bisherige Methode funktioniert nicht mehr
und ist deprecated
.
So musste ich mit dem Umstieg auf den PI5 einiges ändern.
In den aktuellen Skripten verwende ich den gpiod, den Sie evtl. erst mit apt install gpiod installieren müssen. Die Initialisierung der I/Os erübrigt sich dadurch, bei einem gpioset werden sie automatisch als Ausgang programmiert, bei einem gpioget als Eingang. Wer hat sich sowas ausgedacht? Das ist soweit entfernt von der Hardware! Manchmal muss man den Pin-Zustand lesen, ohne ihn als Eingang zu programmieren, manchmal will man einen Eingang als Ausgang schalten, ohne seinen Ausgangszustand zu ändern! Es gibt kein Data-Direction-Register, das in praktisch jedem Port vorhanden ist und das man unabhängig setzen könnte. Die Steuerung der Relais erfolgt also in etwa so:
Cron-Skript
Als Systemkonstante ist die NAS-Platte per UUID definiert. Damit wird vermieden, versehentlich die falsche Platte (/dev/sdx) als NAS zu mounten. Unter /proc/mounts erscheint sie jedoch als sdx. $(/bin/readlink -e $d) hilft hier bei der Zuordnung, wobei $d der UUID-Link (/dev/disk/by-uuid/<UUID>) ist. Hier beispielhaft mein powerOffNasDisk.

