User avatar
mline
Posts: 1422
Joined: Sun Jan 27, 2013 1:47 pm
Location: Austria, Vienna

RPiSU Abschalten der Stromversorgung

Sun Feb 24, 2013 12:29 pm

Kann hier mal jemand drüberschauen?
Funktionieren tut es aber gibts irgendwelche Fehler die ich eingebaut/übersehen habe?
Bekannt ist mir:
Wenn man aus der Konsole aus herunterfährt oder das System abstürzt weiß die Schaltung nix davon. Für meine Anwendung spielt das aber keine Rolle.

Verwendet habe ich einen ATtiny45 sowie das Relais FRS1B und als Transistor BC547B. Bekommt man alles beim blau/gelben C ;)
Als Taster verwende ich ein Teil mit integrierter LED. Das LED soll dem Benutzer anzeigen wann er das Netzteil nicht ausstecken darf.

Schaltplan:
siehe Anhang

Code auf dem attiny:

Code: Select all

#include <avr/io.h>
#ifndef F_CPU
#warning "F_CPU war noch nicht definiert, wird nun mit 1000000 definiert"
#define F_CPU 1000000UL
#endif
#include <util/delay.h>

void sleep(uint16_t ms)
{
    for(; ms > 0; ms--) _delay_ms(1);
}

int main(void)
{
    while(1) {
        DDRB |= (1 << DDB1) | (1 << DDB2); // Set pin 2 to output (1: LED, 2: Relais)
        DDRB &= ~((1 << DDB3) | (1 << DDB4)); // Set pin 3 and 4 to input (3: Button, 4: Raspberry Pi)
        while(!(PINB & (1<<PINB3))) { // Wait for button pressed
            ;
        }
        PORTB |= (1<<PB2); // Set Relais ON
        while(!(PINB & (1<<PINB4))) { // Wait for Raspberry Pi
            ;
        }
        PORTB |= (1<<PB1); // Set LED ON
        while(!(PINB & (1<<PINB3))) { // Wait for button pressed
            ;
        }
        uint16_t i = 0;
        while(PINB & (1<<PINB3)) { // Wait for button pressed
            i++;
            _delay_ms(1);
        }
        if(i > 4000) {
            PORTB &= ~(1<<PB1); // Set LED OFF
            PORTB &= ~(1<<PB2); // Set Relais OFF
            continue;
        }
        DDRB |= (1 << DDB4); // Set pin 4 to output (4: Raspberry Pi)
        PORTB |= (1<<PB4);
        sleep(1000); // Give RPi a 1 second HIGH pulse
        PORTB &= ~(1<<PB4);
        DDRB &= ~(1 << DDB4);
        sleep(2000); // Wait for RPi
        while(PINB & (1<<PINB4)) { // Wait for Raspberry Pi
            ;
        }
        sleep(5000); // Wait for safe shutdown
        PORTB &= ~(1<<PB1); // Set LED OFF
        PORTB &= ~(1<<PB2); // Set Relais OFF
    }
    return 0;
}
Code auf der RPi (wird mit /etc/rc.local gestartet)

Code: Select all

#!/bin/bash

echo "25" > /sys/class/gpio/unexport
echo "25" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio25/direction
echo "1" > /sys/class/gpio/gpio25/value

sleep 1

echo "in" > /sys/class/gpio/gpio25/direction
while [ true ]
do
  if [ "$(cat /sys/class/gpio/gpio25/value)" == '1' ]; then
		echo "out" > /sys/class/gpio/gpio25/direction
		echo "1" > /sys/class/gpio/gpio25/value
		shutdown -h now
		exit 1
	fi
	sleep 0.5
done
Weiterverwenden ist natürlich erwünscht.
LG

*edit*
Bild ist winzig...
http://imageshack.us/photo/my-images/221/v10s.png/
Attachments
v1.0.png
v1.0.png (12.56 KiB) Viewed 5884 times
<~~>

User avatar
Hiswif
Posts: 664
Joined: Sat Oct 13, 2012 11:54 am
Contact: Website

Re: RPiSU Abschalten der Stromversorgung

Sun Feb 24, 2013 5:28 pm

Huhu.

Also wo fange ich mal an.
Erstmal muss ich sagen das die Einfachheit deiner Schaltung mich positiv überrascht. Ich arbeite derzeit an einem ähnlichen Projekt. Allerdings mit Batteriebackup, autoshutdown LCD-Display und und und. Von daher bin ich davon positiv überrascht das ich nicht der einzigste bin der sich Gedanken über sowas macht.

Nun zu deiner Schaltung. Grundsätzlich erstmal nicht so schlecht. Wieso verbindest du aber Pin 2 und 3 des USB In und Out? Versorgst du den Pi über die USB eingänge und möchtest gleichzeitig Daten übertragen? Wenn du den Pi nur mit Strom versorgen willst, dann sind diese Verbindungen unnötig. Was mir auffält ist das Pin2 bei dir masse ist. Ist das bei USB nicht aber D- ?
Die Widerstände R3 und R4 sind unnötig. Der Tiny13 verfügt über interne Pullups, sodas du mit dem Schalter und dem Pi die Pins einfach nur auf masse ziehen musst. (active low)
Die 2 Dioden verstehe ich ebenfalls nicht ganz, hab ich in der Form aber auch noch nicht gesehen.
Ich werd deine Schaltung mal bearbeiten und dir ne mögliche neue Lösung vorschlagen.

Zu deinem Programm:

Du hast die Portdefinition mit in die While schleife gezogen. Das bedeutet das er die Ports ständig neu setzt. Er macht das zwar nicht wirklich, da sie schon gesetzt sind. Schreibt aber jedesmal die Register neu. Ich empfehle dir dies vor der While Schleife zu erledigen. Außerdem würde ich sowas in extra Funktionen packen.
Zu dem taster würde ich dir raten dir mal das Thema "Taster entprellung" anzuschauen.
Du nutzt eine extrafunktion sleep. Wenn du mit einer avrlib nach version 1.7 tust ist dies nichtmehr nötig, da ab 1.7 delayzeiten von bis zu 6sec unterstützt werden.
Weiterhin würde ich dir empfehlen dir einen programmierstil zuzulegen, welcher auf funktionen basiert. Einfach alles in die While schleife zu packen ist auch keine lösung ;) Es ist außerdem sehr schwer zu lesen.

Da ich ja aber nicht nur meckern will werde ich mir das ganze heute abend, wenn der kleine im Bett ist, anschauen und dir einen möglichen Lösungsweg zeigen. Es gibt ja 1000 und 1 weg das ganze zu realisieren. Deiner Funktioniert sicherlich, ist aber nicht der Eleganteste ;)

Ich hoffe du fühlst dich jetzt nicht angegriffen, denn so war das absolut nicht gemeint.

MFG

His
http://technikegge.blogspot.de

User avatar
mline
Posts: 1422
Joined: Sun Jan 27, 2013 1:47 pm
Location: Austria, Vienna

Re: RPiSU Abschalten der Stromversorgung

Sun Feb 24, 2013 6:02 pm

Erstmal danke für das Feedback.

Das mein Code nicht elegant ist war mir schon klar. Ich hätte natürlich einen vorbildlichen Code schreiben können. Das wäre aber den Aufwand nicht wert und hätte keine Verbesserung gebracht ;)
Abgesehen davon stammt der Quelltext eines Programmablaufplanes ab und sieht daher auch genau so aus.
Wieso verbindest du aber Pin 2 und 3 des USB In und Out?
Im Prototyp hab ich nur die VCC Strippe im Kabel getrennt. So gesehen ist die Schaltung korrekt. Für eine Platinenversion mit Steckern und Buchsen spielt D+ und D- keine Rolle.
Was mir auffält ist das Pin2 bei dir masse ist. Ist das bei USB nicht aber D- ?
Im Schema sind das nur Pinheaders. Hat also nichts mit der USB Spezifikation zu tun.
Die Widerstände R3 und R4 sind unnötig.
Das ist richtig. Bei meinen Prototypen verbaue ich die trotzdem immer. Wer diese Schaltung nachbauen will kann sie in die Software integrieren.
Die 2 Dioden verstehe ich ebenfalls nicht ganz, hab ich in der Form aber auch noch nicht gesehen.
Die RPi ist nicht 5V tolerant. Da Pin 4 am tiny als Ein und Ausgang benutz wird musste ich irgendwie den Pegel ändern. Einfachste Variante ist den ganzen tiny mit 3.3V zu versorgen. (Spannungsabfall an einer Diode: 0.7V, 5V-(2*0.7V)=3.6V).
Du hast die Portdefinition mit in die While schleife gezogen. Das bedeutet das er die Ports ständig neu setzt. Er macht das zwar nicht wirklich, da sie schon gesetzt sind. Schreibt aber jedesmal die Register neu.
Das stimmt nicht ganz.
Die äußerste Schleife wird nur nach einem shutdown ausgeführt.
Port 1, 2 und 3 des tiny hätte man natürlich auch außerhalb der Schleife setzen können. Spielt aber für die Funktion, Leistung des tiny oder sonstiges keine Rolle.
Du nutzt eine extrafunktion sleep. Wenn du mit einer avrlib nach version 1.7 tust ist dies nichtmehr nötig, da ab 1.7 delayzeiten von bis zu 6sec unterstützt werden.
Ist ein Relikt ja. Hatte aber schon Maschinen in der Hand wo noch alte Versionen drauf sind. Darum mach ich das immer so.
Sicher ist sicher ;)
Weiterhin würde ich dir empfehlen dir einen programmierstil zuzulegen, welcher auf funktionen basiert. Einfach alles in die While schleife zu packen ist auch keine lösung Es ist außerdem sehr schwer zu lesen.
Dieser Code hier ist an einen Programmablaufplan angelehnt. Die Komplexität dieses Codes rechtfertigt ein Aufteilen in Funktionen nicht im geringsten. Das ist fast so als würde man
echo "Hello "World!"
in eine Funktion packen.
Wer es schöner haben will kann es aber gerne schön machen. Falls der Quelltext mal so groß wird das man es auf einer Bildschirmseite nicht mehr anzeigen kann denke ich über ein Aufteilen auf Funktionen nach.

Ich hoffe eventuell offene Fragen wurden Beantwortet.

LG
<~~>

User avatar
mline
Posts: 1422
Joined: Sun Jan 27, 2013 1:47 pm
Location: Austria, Vienna

Re: RPiSU Abschalten der Stromversorgung

Sun Feb 24, 2013 6:23 pm

Ach ja...
Zu dem taster würde ich dir raten dir mal das Thema "Taster entprellung" anzuschauen.
Wo steht das mein Taster nicht bereits entprellt ist?!
Natürlich hast du recht. Taster sollte man entprellen. Ist das aber schon am Taster selbst passiert kann man sich das in der Schaltung oder Software sparen :)
<~~>

User avatar
Hiswif
Posts: 664
Joined: Sat Oct 13, 2012 11:54 am
Contact: Website

Re: RPiSU Abschalten der Stromversorgung

Sun Feb 24, 2013 6:33 pm

Huhu.

Ok. jetzt hab ich einiges verstanden. Stellt also erstmal einen Prototypen dar wo du die Programmierung ersteinmal schnell nach dem Ablaufdiagram hingezaubert hast. Das leuchtet mir ein. Ab und zu mach ich das auch so, vorallem bei Prototypen ;)
Du hattest ja aber nach Verbesserungen gefragt ;)

Ich sitze gerade über deinem Code und was mir noch nicht so ganz klar ist ist die stelle:

Code: Select all

 while(!(PINB & (1<<PINB3))) { // Wait for button pressed
            ;
        }
        uint16_t i = 0;
        while(PINB & (1<<PINB3)) { // Wait for button pressed
            i++;
            _delay_ms(1);
        }
        if(i > 4000) {
            PORTB &= ~(1<<PB1); // Set LED OFF
            PORTB &= ~(1<<PB2); // Set Relais OFF
            continue;
        }
Wartest du dort das der taster gedrückt wurde und nach 4sec nochmal gedrückt wurde um quasi den Pi ohne herunterfahren auszuschalten? Ich werd da grad nicht schlau draus.
Drückst du den aber 2mal kurz hintereinander innerhalb von 4 sec. soll er das komando zum herunterfahren senden?

Bzw. Könntest du den Programmablauf mal explizit aufschreiben? So richtig werde ich noch nicht schlau draus. Aber ich hatte schon immer probleme mich in anderen Code "einzulesen" ;)
Wo steht das mein Taster nicht bereits entprellt ist?!
Natürlich hast du recht. Taster sollte man entprellen. Ist das aber schon am Taster selbst passiert kann man sich das in der Schaltung oder Software sparen
Das steht in deinem Code ;)
Wenns sich um einen hardware entprellten Taster handelt ist alles supi. Du must ein geld haben ;) Ich nehm immer normale kurzhub und löse die Entprellung sofwareseitig ;)

Ok ich werd es mal weiterhin mit deinem Code versuchen. Vielleicht klau ich dir ja ne Lösung ;)

MFG

His
http://technikegge.blogspot.de

User avatar
mline
Posts: 1422
Joined: Sun Jan 27, 2013 1:47 pm
Location: Austria, Vienna

Re: RPiSU Abschalten der Stromversorgung

Sun Feb 24, 2013 6:48 pm

Hallo
Wartest du dort das der taster gedrückt wurde und nach 4sec nochmal gedrückt wurde um quasi den Pi ohne herunterfahren auszuschalten? Ich werd da grad nicht schlau draus.
Richtig.
Drückst du den aber 2mal kurz hintereinander innerhalb von 4 sec. soll er das komando zum herunterfahren senden?
Nein. Zumindest glaube ich... lässt man den Taster los wird die Zählschleife sofort beendet. Da man unter 4000ms ist wird die IF Anweisung übersprungen und es geht normal weiter.
Wenns sich um einen hardware entprellten Taster handelt ist alles supi. Du must ein geld haben
Ja und ja. Hat Vorteile wenn man in der EMSR Abteilung arbeitet ;)
Vielleicht klau ich dir ja ne Lösung
Vielleicht kennst du ja jemanden der eine kleine Platine fertigen und verkaufen kann. Konnte mich bisher nicht dazu bewegen das Platinen ätzen zu lernen gg
Schade das dieser Teil nicht direkt in die RPi eingebaut wurde. Dafür wäre der benötigte Platz sinnvoll gewesen.

LG
Attachments
RPiSU_PAP.jpg
RPiSU_PAP.jpg (51.64 KiB) Viewed 5812 times
<~~>

User avatar
Hiswif
Posts: 664
Joined: Sat Oct 13, 2012 11:54 am
Contact: Website

Re: RPiSU Abschalten der Stromversorgung

Sun Feb 24, 2013 7:06 pm

Vielleicht kennst du ja jemanden der eine kleine Platine fertigen und verkaufen kann. Konnte mich bisher nicht dazu bewegen das Platinen ätzen zu lernen gg
Wende dich mal an Christoph aus dem Post:
http://www.raspberrypi.org/phpBB3/viewt ... 75&t=32875
Nein. Zumindest glaube ich... lässt man den Taster los wird die Zählschleife sofort beendet. Da man unter 4000ms ist wird die IF Anweisung übersprungen und es geht normal weiter.
Asso stimmt du wartest ja auf die fallende flanke.
Ja und ja. Hat Vorteile wenn man in der EMSR Abteilung arbeitet
Du Glückspilz.

MFG

His
http://technikegge.blogspot.de

User avatar
mline
Posts: 1422
Joined: Sun Jan 27, 2013 1:47 pm
Location: Austria, Vienna

Re: RPiSU Abschalten der Stromversorgung

Sun Feb 24, 2013 7:17 pm

Ah ja das ist spitze.

Übrigens im PAP fehlt der Teil mit dem "Hard-Reset". Soll bei fertigen Projekten aber sowieso wieder raus. War nur für den Moment gedacht falls ein Freeze (hatte ein paar wegen nem WLAN-Stick der zuviel Strom gezogen hat) auftritt.
Hatte also in der Doku nix zu suchen ;)
<~~>

User avatar
mline
Posts: 1422
Joined: Sun Jan 27, 2013 1:47 pm
Location: Austria, Vienna

Re: RPiSU Abschalten der Stromversorgung

Sat Apr 13, 2013 1:35 pm

Hab mein Netzteil etwas geändert. Ich benutze nun einen Spannungsregler für 5V/2A und ein 7,5V Netzteil weil quasi jedes 5V-Steckernetzteil das ich gekauft habe bei etwas höheren Strömen zusammengebrochen ist. Falls das jemand auch so machen will: gut stabilisiertes Steckernetzteil verwenden.
Ich hatte auch schon ein Hub direkt am Ausgang hängen (via Y-Kabel) und habe so RPi und Hub gleichzeitig geschalten und versorgt.
Stromaufnahme im Ruhezustand: 17,5mA also nichtmal 0,1W ohne Stromsparfunktionen des µC.

Außerdem nutze ich nun ein FRT5 Relais. Es ist leiser, kleiner und besser auf Lochrasterplatinen zu verbauen.

Inzwischen konnte ich alles ausführlich testen. Habe bei der alten Schaltung festgestellt das das Teil immer wieder mal nicht sauber gestartet hat. Man drückt den Knopf, RPi liest von SD und zack war es wieder aus. Pi zieht wohl viel Strom beim Einschalten wodurch der µC einen Reset auslöste. Ein dicker Elko nach dem Spannungsregler schafft in der neuen Schaltung für Stabilität.

Übrigens hab ich gesehen das ich einen Fehler gemacht habe. Der Transistor muss natürlich _nach_ dem Relais geschalten werden. Werde demnächst mal alles aktualisieren, ne Preisliste erstellen und wenn ich dann wieder viel Zeit habe eine Aufbauanleitung mit Fotos machen.

Ein Bild vom geänderten Prototyp:
Image
<~~>

User avatar
Hiswif
Posts: 664
Joined: Sat Oct 13, 2012 11:54 am
Contact: Website

Re: RPiSU Abschalten der Stromversorgung

Sat Apr 13, 2013 2:43 pm

Huhu.

Na das schaut ja ganz gut aus.
Mal ne Frage: Wo hast du diese wunderschöne USB Buchse bekommen? Suche schon ne Weile eine die ich mal ohne Probleme aufs Breadboard bekomme. Hast dazu mal nen lieferanten und eventuell sogar ne Teilenummer?

Kleinen Tipp habe ich aber noch. Ich würde dem Tiny einen kleinen 100-300nF abblockkondensator spendieren. Dann haste wirkliche keine Probs mehr das der Ressetet wenn mal kurz die spannung einbricht. Keramik oder Folienkondensator nah am Tiny sollten da helfen.

Noch ne kleine Frage. Wieso bauen so viele das ganze mittels Relaise? Du könntest die Leistung schon noch runterbekommen wenn du das ganze mittels FET steuers. Hast dann auch nicht das Klacken und keine mechanische Fehlerquelle. Aber das ist Geschmackssache. Wollts nur mal fragen. Kann aber auch sein das ich gerade im "Optimierungswahn" bin ;) Habe meine Schaltung jetzt von 40mA im Standby auf unter 4 mA gebracht was bei Batteriebetrieb natürlich enorm viel ausmacht. Mit Powerdown beim Atmel müsstest du deine Schaltung auch noch unter 7mA bekommen schätze ich mal. Wenn du daran interesse haben solltest.

Aber alles in allem schon recht gelungen. Glückwunsch. Hoffe da kommt noch mehr ;)

MFG

His
http://technikegge.blogspot.de

User avatar
mline
Posts: 1422
Joined: Sun Jan 27, 2013 1:47 pm
Location: Austria, Vienna

Re: RPiSU Abschalten der Stromversorgung

Sat Apr 13, 2013 2:56 pm

Hiswif wrote:Huhu.

Na das schaut ja ganz gut aus.
Mal ne Frage: Wo hast du diese wunderschöne USB Buchse bekommen? Suche schon ne Weile eine die ich mal ohne Probleme aufs Breadboard bekomme. Hast dazu mal nen lieferanten und eventuell sogar ne Teilenummer?
Conrad 774932, 774854, 774866 und 774842
Hiswif wrote:Kleinen Tipp habe ich aber noch. Ich würde dem Tiny einen kleinen 100-300nF abblockkondensator spendieren. Dann haste wirkliche keine Probs mehr das der Ressetet wenn mal kurz die spannung einbricht. Keramik oder Folienkondensator nah am Tiny sollten da helfen.
Befindet sich links über dem Tiny. Im Schaltplan wäre das C1.
Hiswif wrote:Noch ne kleine Frage. Wieso bauen so viele das ganze mittels Relaise? Du könntest die Leistung schon noch runterbekommen wenn du das ganze mittels FET steuers.
Das ist richtig. Kann dir nicht sagen warum das so viele machen. Bei mir gibts auch keinen bestimmten Grund. Lagen halt rum...
Hiswif wrote:Aber alles in allem schon recht gelungen. Glückwunsch. Hoffe da kommt noch mehr ;)
Klar
<~~>

User avatar
Hiswif
Posts: 664
Joined: Sat Oct 13, 2012 11:54 am
Contact: Website

Re: RPiSU Abschalten der Stromversorgung

Sat Apr 13, 2013 3:14 pm

na Das ging aber schnell ;)

Danke dir, hab gleich mal ein paar Buchsen bestellt ;)

Sorry, C1 hatte ich ganz übersehen.

MFG

his
http://technikegge.blogspot.de

User avatar
mline
Posts: 1422
Joined: Sun Jan 27, 2013 1:47 pm
Location: Austria, Vienna

Re: RPiSU Abschalten der Stromversorgung

Sat Apr 13, 2013 3:48 pm

Hiswif wrote:na Das ging aber schnell ;)
Ich find das hier schnell:
Image

Entweder Zufall oder Google besucht raspberrypi.org schon stündlich :D
<~~>

User avatar
mline
Posts: 1422
Joined: Sun Jan 27, 2013 1:47 pm
Location: Austria, Vienna

Re: RPiSU Abschalten der Stromversorgung

Thu May 22, 2014 1:08 am

Hab inzwischen zwei dieser Netzteile mit dieser Platine aufgebaut:

http://openmicros.org/index.php/article ... structions
Image

Wie ich meine eines der nützlichsten Addons für die Pi ;)
<~~>

Return to “Deutsch”