Teil: 5 Wakeup ControllerHerzstück des Wakeup Controllers ist der IC4 PICAXE 08M2.
Wahrscheinlich für viele ein unbekannter Exot. Dahinter verbirgt sie ein PIC12F1840 von Microchip. In dem Chip ist ein einfacher Basic-Interpreter fest installiert.
Einen Picaxe-Editor zur Programmierung gibt es von Revolution Education Ltd.. Eine einfachere Methode um einen Microcontroller zu programmieren habe ich noch nicht gefunden.
Das Ganze gibt es kostenlos und in Deutsch. Die Chips gibt es z. B.
hier .
Die Tiny RTC ist über 2 bidirektionale und gepufferte I²C-Repeater, PCA9515, mit dem RPI 1 oder mit der PICAXE 08M2 verbunden.
Die Eingänge SDA, SCL und EN der PCA9115 sind 5V tolerant. Sie dienen dadurch als Pegelwandler mit 3.3V in Richtung RPI 1 und in Richtung DS1307.
Die 3.3V-Logikpegel der PCA9515 werden von der DS1307 als High interpretiert.
Aus diesem Grund müssen die PCA9515 mit 3.3V betrieben werden.
Die 3.3V für die PCA9515 werden vom Spannungregler IC1, LM3940IMP-3.3, aus der 5V-Betriebsspannung bereitgestellt.
Der Transistor T1 dient nur der Invertierung des Signals MasterMode von der PICAXE 08M2.
Somit kommt man mit einem Ausgang an der PICAXE 08M2 zur Steuerung beider PCA9515 aus.
Der Ausgang RaspiPower der PICAXE 08M2 schaltet über T2 das Relais K1. Die beiden Relaiskontakte schalten dann die Betriebsspannung zum RPI 1 und zum USB-Hub durch.
Ich habe mich bewußt für ein Relais entschieden, da der Spannungabfall über kleine Mosfets (RDS )kritisch werden könnte. Mosfets im TO220-Gehäuse verbrauchen zuviel Platz.
Mit D2 über St6 werden die +5V zum RPI 1 an die Kathode D1 geführt.
T3 dient zur Ansteuerung der rt/gn-LED, die den Betriebszustand nach Außen signalisiert.
Die grundsätzlichen Abläufe des Wakeup Controllers verlaufen folgendermaßen:
Nach dem Einschalten der Stromversorgung wird auf die Betätigung der Einschalttaste TaEin gewartet.
Wird das Signal /TaEin durch betätigen der Taste-Ein auf "0" gezogen, wird der Ausgang RaspiPower der Picaxe 08M2 auf "1" geschaltet. Das Relais K1 schaltet ein und der RPI 1 und der USB-Hub werden mit +5V Betriebsspannung versorgt.
Mit dem Signal MaMo="0" ist die Tiny RTC über IC2 mit dem RPI 1 verbunden.
Der Eingang RaspiOn wird nun auf (GPIO17 = "1") überwacht.
Nachdem der RPI 1 (GPIO17 ="1") hochgefahren ist, wird GPIO17 auf "0" überwacht.
Dieser Zustand trifft nur ein, wenn der VDR mit Poweroff ausgeschaltet wurde.
Eine Verzögerung von 10 Sek. reicht aus, um das korrekte Herunterfahren des RPI 1 abzuwarten.
Das Signal RaspiOn wird auf "0" gesetzt, das Relais fällt ab und die Stromversorgung zum RPI 1 und dem USB-Hub ist unterbrochen.
Jetzt befindet sich der Wakeup Controller im Aufwachmodus. Das Signal MaMo="1" verbindet die Tiny RTC über IC3 mit der PICAXE 08M2.
Permanent wird die aktuelle Zeit aus der RTC (Adr.: 1-6) mit der Aufwachzeit aus der RTC (Adr.: 9-14) verglichen. Die Adressen 0, 3 und 8, 11 für Sekunden den Wochentag, werden nicht berücksichtigt.
Sowie das Ergebnis zwischen aktueller Zeit und der Aufwachzeit übereinstimmt, wird der RPI 1 und der USB-Hub mit RaspiPower = "1" eingeschaltet.
Bei Betätigung der TaEin wird ebenfalls eingeschaltet.
Die beschiebenen Abläufe beginnen von vorne.
Die Festplatte kann normalerweise an den USB-Hub angeschlossen werden. Bei meinen Versuchsaufbauten hat sich jedoch gezeigt, die Festplatte lief nicht immer korrekt an.
Vorsorglich habe ich mit St5 einen direkten Stromversorgungsanschluß für die Festplatte vorgesehen. C1 auf dem Controller kann für diesen Zweck auf 470µ vergrößert werden.
Ist die Festplatte an St5 angeschlossen, sollte sie mit hdparm nach angemessener Zeit ausgeschaltet werden.
Zur Software:
Das Programm für die PICAXE 08M2 ist mit dem
Picaxe Editor in der Version 5.5.5 geschrieben worden.
Ich habe mich bemüht, möglicht viele Kommentare zum besseren Verständnis in das Programm zu schreiben.
Hier ist das Ergebnis.
' WakeUpRPI.bas
'
' Wake Up Controller für RPI 1
' Uhr mit Tiny RTC per I²C
'
' Der Rpi speichert die Aufwachzeit im DS1308 ab Adr. 8.
' Wenn die Aufwachzeit erreicht ist, wird der RPI eingeschaltet.
' Nach Ende der Aufnahme wird der RPI wieder ausgeschaltet.
' Der RPI kann auch über eine Taste im Aufwachmodus eingeschaltet werden.
'
' Normales ausschalten des RPI mit FB Ta-Poweroff !!!
'
'
'
'********* Definitionen *****************************************************
#Picaxe 08M2 ; Programm für Picaxe 08M2
#define com com6 ; DownloadPort = COM 6
#no_data
setfreq m4 ; Arbeitstakt = 4 MHz
'********* Variable und Konstanten ******************************************
Symbol Status = b2 ; Programmstatus
Symbol AwMode = b3 ; Aufwachmode
Symbol Sek = b4 ; Sekunde
Symbol AwSek = b5 ; Aufwach-Sekunde
Symbol Minu = b6 ; Minute
Symbol AwMinu = b7 ; Aufwach-Minute
Symbol Std = b8 ; Stunde
Symbol AwStd = b9 ; Aufwach-Stunde
Symbol WT = b10 ; Wochentag
Symbol AwWT = b12 ; Aufwach-Wochentag
Symbol Tag = b13 ; Tag
Symbol AwTag = b14 ; Aufwach-Tag
Symbol Monat = b15 ; Monat
Symbol AwMonat = b16 ; Aufwach-Monat
Symbol Jahr = b17 ; Jahr
Symbol AwJahr = b18 ; Aufwach-Jahr
Symbol RTC = %11010000 ; I²C-Adresse Tiny RTC (DS 1307 (RPI 0x68))
Symbol RaspiPower = C.0 ; Raspi und Hub - Power einschalten
Symbol RaspiOn = pinC.5 ; Raspi ist eingeschaltet: GPIO17=1
Symbol TaEin = pinC.3 ; Taste Einschalten
Symbol MaMo = C.4 ; 1 = Master Mode: RTC an 08M2
; 0 = Slave Mode: RTC an Raspi
'********* Voreinstellungen *************************************************
dirsC = %00010001 ; Ausgänge festlegen
; C 4 0
pullup %00001000 ; Pullup setzen
; C 3
hi2csetup i2cmaster,RTC,i2cslow,i2cbyte ; RTC DS1308 adressieren
disconnect ; Keine Verbindung zur PC-Programmierung
; C.0 = Ausgang
Status = 0 ; Status=0, Nach einschalten der Stv.
AwMode = 0 ; Aufwachmode
Low MaMo ; Slave Mode, Verbindung RTC an Raspi
'******************************************************************************
Start: select case Status
; ----------------- Einschalten StV für RPI und Hub ------------------
case 0
if TaEin = 0 then ; Taste Ein gedrückt ? Ja, RPI einschalten
High RaspiPower ; Power für RPI ist EIN
do
if RaspiON = 1 then exit ;exit, wenn RPI hochgefahren ist.GPIO17=1
loop
Status = 1 ; RPI wurde durch Taste eingeschaltet
endif
;------------------ RPI und Hub ausschalten wenn RPI = Poweroff ------
case 1
if RaspiON = 0 then ; RPI wurde von MLD runtergefahren GPIO17=0
wait 10 ; Warten 10 Sek. bis RPI in PowerOFF ist
Low RaspiPower ; Power für RPI, Hub, HDD AUS
High MaMo ; Master Mode, RTC Verbindung zur 08M2
hi2cin 8, (AwSek, AwMinu, AwStd, AwWT, AwTag, AwMonat, AwJahr)
; Aufwachzeit auslesen
pause 100
Status = 2 ; Slave Mode, RTC Verbindung zum RPI
endif
; ----------------- Aufwach-Mode -------------------------------------
case 2
AwMode = 1 ; Aufwachmode ein
Status = 2 ; Warten bis Aufwachen beendet
High MaMo ; Master Mode, RTC Verbindung zur 08M2
pause 100
hi2cin 0,(Sek,Minu,Std,WT,Tag,Monat,Jahr) ; Aktuelle Uhrzeit auslesen
Low MaMo ; Slave Mode, RTC Verbindung zum RPI
pause 100
if AwMinu=Minu and AwStd=Std and AwTag=Tag and AwMonat=Monat and AwJahr=Jahr then
High RaspiPower ; RPI und Hub einschalten
do
if RaspiON = 1 then exit ; Exit, wenn RPI hochgefahren ist
loop
AwMode = 0 ; Aufwachen beendet
Status = 1 ; Warten, bis RPI wieder runtergefahren
endif
endselect
' *-------------------- Im Aufwachmode einschalten mit Taste -------------
if TaEin = 0 and AwMode = 1 then ; Taste Ein gedrückt ? Ja, RPI einschalten
High RaspiPower ; Power für RPI und HUB ist EIN
do
if RaspiON = 1 then exit ; exit, wenn RPI hochgefahren ist
loop
Status = 1 ; Warten, bis RPI wieder runtergefahren
endif
GOTO Start
'******************************************************************************
end
' Stand: 11.1.16,
' Bytes: 159
Wie anfangs schon gesagt, dieses Ding braucht kein Mensch.
Mir hat der Aufbau und das Lösen der Probleme Spaß gemacht.
Die angehängten Bilder sind, besonders das WakeupController.jpg, schon veraltet. Es ist hier eine Version vom August 2015 zu sehen. Sie wurde mehrmals geändert.
Ich habe inzwischen eine neue Leiterplatte entworfen. Sie muß nur noch geätzt, aufgebaut und getestet werden.
Wenn sie fertig ist, werde ich die Bilder nachreichen.
Gruß Gerhard