Dieses Blog durchsuchen

Sonntag, 17. März 2013

[Projekt] DIY PiPower Netzteil

Hallo.

Da ich mich seit einiger Zeit mit der kleinen Himbeere befasse ist es mir etliche Male passiert das ich vergessen habe das Kabel aus dem Pi zu ziehen. Jedesmal habe ich mich dann früh morgens geärgert wenn der kleine wieder die ganze Nacht unter Strom stand obwohl ich ihn am Abend heruntergefahren habe. Darum habe ich ihn an eine Schaltbare Steckdose gehängt. Das hatte aber wieder zur Folge das ich einige Male den Schalter betätigt habe obwohl der Pi noch arbeitete.
Na gut, selber Schuld, aber ich hatte einfach vergessen das der kleine ebenfalls an der Steckdose hängt.

Deshalb habe ich nach einer Möglichkeit gesucht den Pi automatisch auszuschalten und gegen Stromausfälle zu sichern. Meine Lösung möchte ich euch nun hier vorstellen.


Aufbau auf einer Lochstreifenplatine

 

Das Pipower Netzteil 


Die von mir entwickelte Schaltung ist im Grunde kein richtiges Netzteil, da man zum betreiben noch ein normales Steckernetzteil mit mindestens 9V bei 1,5A braucht.
Der Grund ist ganzeinfach:

Dieser Block hier richtet sich vorallem an Anfänger und ich möchte keinem Anfänger raten irgendetwas mit 230V zu bauen!!!

Jeder der das Wissen und die Fähigkeiten dazu hat, wird diese Schaltung selbständig zu einem Vollwertigem 230V Netzteil erweitern können.

Im Grunde bietet diese Schaltung folgende Möglichkeiten:
  • Ein und ausschalten des Pi's über einen Taster (mit vorherigem automatischen Herunterfahren)
  • Auto-off nach Herunterfahren
  • Sicherung vor Stromausfällen über ein Akkupack
  • Die Möglichkeit die Batteriespannung zu überwachen
  • Die Möglichkeit die Netzspannung zu überwachen

Durch die Überwachung der Batterie- und Netzspannung ist es möglich den Pi sicher herunterzufahren, sollte 1. Der Netzstrom ausfallen, oder 2. Die Batteriespannung beim Batteriebetrieb zu gering werden um einen sicheren Betrieb des Pi's zu gewährleisten.


Die Bauteile


Die Schaltung basiert auf einem Atmel Mega8, einem L4940V5 Low-Drop-Spannungsregler sowie einem IRZL34N Mosfet.

Folgende Bauteile werden benötigt:
  • 1x DC-Jack zum Anschluss des eigentlichen Netzteils
  • 1x USB-A-Buchse zum Anschluss des Pi's
  • 1x ELKO 20V 1000uF
  • 1x ELKO 10V 100uF
  • 4x 100nF Keramik- oder Folienkondensator
  • 1x 47nF Keramikkondenstor
  • 2x 22pF Keramikkondensator
  • 4x 1N4001 Gleichrichterdioden
  • 1x L4940V5 Spannungregler
  • 1x Atmel Mega8
  • 1x Pinleiste min. 1x10 Pins
  • 1x LTV847 Optokoppler
  • 1x Schwingquarz 4-16MHZ
  • 1x IRLZ34N N-Kanal-Mosfet (HEXFET)
  • 4x 10kOhm Widerstand
  • 4x 330Ohm Widerstand
  • 2x 1MOhm Widerstand
  • 2x 630kOhm Widerstand
  • 2x Taster
  • 2x Kühlkörper

 

Die Schaltung


Die Schaltung ist vom Prinzip her in 3 Blöcke geteilt. Zum ersten in die Spannungsversorgung mit schaltbarer USB-Buchse für den Pi, zum Zweiten in die Atmeg8 Steuerung und zum dritten in die Pegelwandlung mit galvanischer Trennung der seriellen Verbindung.

Schauen wir uns aber zuersteinmal die Gesamte Schaltung an. ACHTUNG!!! PIN 1 und PIN 4 der ISP sind vertauscht. Pin 1 muss natürlich an MISO und Pin 4 an MOSI!!!

Hier könnt ihr die drei Blöcke erkennen.

Der erste Teil (Spannungsversorgung)

Spannungsteil
Dieser Teil dient nur der Spannungsversorgung des Pi's und des Atmels.

X1 ist dabei unsere Buchse für das Netzteil. Bat1 Ist der anschluss für die Batterien, welche Parallel zu X1 Geschalten werden. Für die Batterien solltet ihr min 9V und 2500mAh einplanen, damit euer Pi auch eine Weile mittels Batterie laufen kann. Als Netzanschluss nutze ich ein 12V/2A Universalnetzteil. Ihr solltet außerdem darauf achten das die Spannung vom Netzteil über der der Batterien liegt, da ihr sonst auch die Batterien entladet wenn das Netzteil angeschlossen ist.
Weiterhin könnt ihr eine 12V Zener Diode zwischen den positiven Anschluss des Netzteils und Masse schalten um eine Überspannung abzufangen.

Die Anschlüsse "NET_CHECK" und "BAT_CHECK" dienen zum Überprüfen der Netzteil- bzw. Batteriespannung.
Der Anschluss "PCTRL" dient zum Ansteuern des n-Kanal-Mosfets. Da Mosfets nicht über den Strom sondern über die angelegte Spannung gesteuert werden, müssen wir ihn so wählen das er bei 5V voll durchsteuert. Dies bietet uns der Gewählte IRLZ34N.
Der Kondensator C1 dient zum Abfangen von Spannungseinbrüchen sollte die Spannung vom Netzteil einbrechen (Stromausfall).
Die Rücklaufdiode D5 schützt unseren Spannungsregler sollte die Spannung im 5V Spannungsteil größer werden als im Eingangteil.
Ihr solltet dem L4940V5 und dem IRLZ34N jeweils einen passenden Kühlkörper spendieren. Der Mosfet wird zwar kaum Warm, sicherer ist es jedoch trotzdem, solltet ihr zum Beispiel vorhaben, nicht den Pi, sondern etwas anderes, z.B. über PWM, zu steuern.

Der zweite Teil (Controller Schaltung)

Controller Teil
ACHTUNG!!! PIN 1 und PIN 4 der ISP sind vertauscht. Pin 1 muss natürlich an MISO und Pin 4 an MOSI!!!

Dieser Teil der Schaltung beruht auf der Grundbeschaltung eines Atmel Mega8 wie ihr sie aus dem Tutorial "Raspberry Pi und der Atmel - Teil 1" kennen solltet.

Zusätzlich wurde an den ADC-Eingängen ein Spannungsteiler angebracht welcher uns die Eingangspannungen von Netzteil und Batterie im Verhältniss ~1:2,58 teilt. Aus einer 12V Spannung wird somit eine Spannung von ~4,65V, welche wir Problemlos über den Analog-Digital-Wandler des Atmels messen können. Aus 9V wird natürlich dann verhältnissmäßig weniger.

Über den Taster S2 wird unser Pi dann später geschaltet.
S1 ist wie immer Reset um die ganze Schaltung zu Resetten. Hierbei wird auch die Spannung für den Pi abgeschalten!!! Ihr könnt dies nutzen wenn euer Pi hängen sollte.

Der dritte Teil (Serielle Verbindung)

Serielle Verbindung
Diese Schaltung solltet ihr schon aus dem Tutorial "Raspberry Pi und der Atmel - Teil 2 - Serielle Verbindung" kennen. Deshalb werde ich hier nur Kurz darauf eingehen.

Ich habe die Methode über einen Optokoppler gewählt, da somit gewährleistet ist das der Strom nicht über die Masse an den den GPIO-Pins des Pi abfließt, sondern über den USB Anschluss des Spannungsteils.


Das Controller Programm

Auf jedes Detail einzugehen würde hier den Rahmen sprengen. Solltet ihr interesse daran haben, so könnt ihr gerne mit mir Kontakt aufnehmen.

Zum Wichtigsten sei gesagt das sämtliche Einstellungen die ihr vornehmt in dem im Code gekennzeichnetten Block vorgenommen werden. In den einzellnen Funktionen braucht ihr im Grunde nichts zu ändern.

Das vollständige Programm  für den Atmel könnt ihr euch hier herunterladen:

PiPower.c

 

 

Konfiguration



//Festlegen der Controllerfrequenz und Baudrate

#define F_CPU   4000000UL
#define BAUD    19200UL


Sollte aus den Zwei vorhergehenden Tutorials klar sein.

//Ports festlegen
#define TASTER_1        PD2
#define POWER           PD3




Hier legt ihr den Anschluss des Tasters und des Mosfets fest. Solltet ihr die Beschaltung wie oben gewählt haben braucht ihr hier nichts zu ändern.

//Festlegen der Befehle
#define Pi_on_cmd "on"
#define Pi_off_cmd "off"
#define Bat_check_cmd "check_bat"
#define Net_check_cmd "check_net"
#define Shutdown_cmd "shutdown"

Hier legt ihr die Befehle fest welche ihr über die serielle Verbindung vom Pi zum Atmel senden wollt. Ihr könnt dabei die 5 Verschiedenen Befehle frei wählen, damit ihr sie in euer Programm auf dem Pi übernehmen könnt.
"Shutdown_cmd" ist das Commando welches der Controller an den Pi sendet wenn ihr den Taster S2 drückt.

//Festlegen der ADC Ports
#define Net_port 0
#define Bat_port 1

 Hier legt ihr Fest an welchen Port des Ananlog-Digital-Converters ihr die Spannungsteiler angeschlossen habt.

//Festlegen der Ausschaltverzögerung
#define sd_delay 120 

Hier legt ihr die Zeit in Sekunden fest die ihr dem Pi zum herunterfahren gebt, bevor der Atmel den Pi abschaltet.

 

Grundfunktion

Im Grunde ist das ganze noch rechts simpel aufgebaut.

1. Ihr schaltet den Pi mittels Taster S2 ein

Wärend des laufenden Betriebes könnt ihr die Netz- und die Batteriespannung mit einem Script oder Programm über die Serielle Verbindung abfragen. Ihr sendet dazu einfach die unter "Bat_check_cmd" und "Net_check_cmd" festgelegten Befehle und erhaltet ein "ACK".."\n".."xxxx" "\n" zurück.
Das "ACK" steht dafür das der Controller euren Befehl erkannt hat.
Das "\n" dient als Trennzeichen.
Das "xxxx" ist der Wert des ADC.
Sollte der Controller euren befehl nicht kennen erhaltet ihr ein "NAK" zurück.

 2. Ihr betätigt den Taster S2 wärend der Pi eingeschalten ist.

Der Atmel sendet nun den unter "Shutdown_cmd" festgelegten befehl an den Pi. Euer Script/Programm reagiert darauf indem es den Pi herunterfährt und den unter "Pi_off_cmd" festgelegten Befehl an den Controller sendet. Der Controller wartet daraufhin die unter "sd_delay" festgelegte Zeit ab und schaltet den Pi dann aus.

Das wars auch schon. mehr braucht ihr nicht.

Ein Beispielscript (Python) für den Pi findet ihr hier:

Shutdwonscript
Klasse für das shutdwonscript

Steckt einfach beides in einen Ordner und führt das Shutdownscript aus.

(Es wird Pyserial benötigt)


Erweiterte Funktionen (Anregung)


Ihr könnt euer Script/Programm auf dem Pi auch so schreiben das es alle x Sekunden die Spannung der Batterie und des Netzanschlusses liest. Wird das Netzteil nun abgeschalten, z.B. durch einen Stromausfall, könnt ihr den Pi automatisch herunterfahren lassen. Gleiches gilt auch wenn die Batteriespannung einen gewissen Wert unterschreitet.

Das war es für heute ersteinmal. Ich hoffe ihr konntet meinen Ausführungen folgen. Was noch folgt ist eine kurze Übersicht was ich mit dieser Schaltung noch vor habe.
  • Ausgabe der BatterieSpannung/Netzspannung via LCD
  • Ausgabe der IP-Adresse des Pi via LCD
  • Einige Scripte/Programme für die Schaltung