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: 159Wie 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