Hallo,
ich bin neu auf dem Gebiet Pi und habe mir einen Raspberry Pi RBCA000 Mainboard gekauft.
Ist dies die richtige 'GPIO Bestückung?
Gruß
Hallo,
ich bin neu auf dem Gebiet Pi und habe mir einen Raspberry Pi RBCA000 Mainboard gekauft.
Ist dies die richtige 'GPIO Bestückung?
Gruß
Modell? Schau mal ob du hier fündig wirst!
Ja müsste stimmen
Hallo,
ich habe da ein Problem: ich habe an die GPIO eine 8 er Relaiskarte angeschlossen und an die Relais jeweils Lampen meines Aquariums angeschlossen. Gesteuert jeweils über Bash Dateien die von derCrontab gestartet werden.
Mein Problem: alles funktioniert nur wenn Relais 7 anzieht geht das Licht welches an Relais 1 hängt aus ...
Crontab einträge
00 12 * * * pi /home/pi/rotan.sh
10 12 * * * pi /home/pi/ww1an.sh
20 12 * * * pi /home/pi/ww2an.sh
30 12 * * * pi /home/pi/kw1an.sh
40 12 * * * pi /home/pi/kw2an.sh
00 23 * * * pi /home/pi/blauan.sh
Dann häng mal ein ULN2803A dazwischen.Die Relaiskarte schaltet erst mit 5V zuverlässig.
Moin,
bitte den Inhalt der bash-Dateien posten, wann was aufgerufen wird per cronjob ist nicht so hilfreich.
Und wie schaut es mit der Stromversorgung + Jumper der Relaiskarte aus.
Bye
Jürgen
Oha... Na dann viel Spass wenn bis zu 5A über die kleinen Leiterbahnen des PI's müssen - ich stell dir schon mal nen Eimer Wasser hier hin
Die Jumper sind im Auslieferungszustand, die anderen Relais schalten ja auch alle richtig und die Lampen leuchten.
#!/bin/sh
gpio export 22 out
sleep 120
gpio export 22 in
#
nein der Pi und die Last die über die Relais hängen sind nur am 5 A Netzgerät. Über den Pi werden nur die Relais geschaltet. Die Schaltkontakte der Relais bekommen natürlich ein seperates Kabel zur Versorgung
#!/bin/sh
gpio export 22 out
sleep 120
gpio export 22 in
Und welche Datei deines Crontabeintrags soll das nun sein?
Und wo wird der GPIO 22 auf 1 gestellt?
Alles anzeigen
Crontab einträge
00 12 * * * pi /home/pi/rotan.sh
10 12 * * * pi /home/pi/ww1an.sh
20 12 * * * pi /home/pi/ww2an.sh
30 12 * * * pi /home/pi/kw1an.sh
40 12 * * * pi /home/pi/kw2an.sh
00 23 * * * pi /home/pi/blauan.sh
Du hast doch anscheint 6 verschiedene Dateien - nicht nur diese eine?
Wenn dann poste das auch bitte in CODE
die sind alle gleich aufgebaut und schalten zu verschiedenen Zeiten und überscheniden sich auch
Crontab einträge Anfang Ende Dauer [min] Dauer [sec]
00 12 * * * pi /home/pi/rotan.sh 12:00 12:20 20 1200
10 12 * * * pi /home/pi/ww1an.sh 12:10 23:00 650 39000
20 12 * * * pi /home/pi/ww2an.sh 12:20 23:10 650 39000
30 12 * * * pi /home/pi/kw1an.sh 12:30 22:40 610 36600
40 12 * * * pi /home/pi/kw2an.sh 12:40 22:50 610 36600
00 23 * * * pi /home/pi/blauan.sh 23:00 01:00 120 7200
Rot an 12:00
WW1 an 12:10
WW2 an 12:20
KW1 an 12:30
KW2 an 12:40
KW1 aus 22:40
KW2 aus 22:50
WW1 aus; Blau an 23:00
WW2 aus 23:10
Blau aus 01:00
Moin,
nochmal Relaiskarte, wie ist die Jumperstellung??
VCC + JD-VCC oder abgezogen und Pi-GPIO-5 Volt an JD-VCC oder externe 5 Volt Stromquelle an JD-VCC....
VCC an ????, Volt ????
Offensichtlich nutzt Du wiringPi und schaltest über MODE out/in und nicht per write 0/1.
Die bash umstellen, zuerst per dem GPIO auf OUT setzten und dann per write 1 / 0 den Schaltzustand bestimmen.
gpio mode 22 out
gpio write 22 1
gpio write 22 0
Liegen 5 Volt an VCC an und GPIO ist im mode in wird das auf Dauer zu einem Grillfest...
Bye
Jürgen
PS.: Wann was per cronjob gesteuert wird ist unerheblich!!!
die sind alle gleich aufgebaut und schalten zu verschiedenen Zeiten und überscheniden sich auchCodeCrontab einträge Anfang Ende Dauer [min] Dauer [sec] 00 12 * * * pi /home/pi/rotan.sh 12:00 12:20 20 1200 10 12 * * * pi /home/pi/ww1an.sh 12:10 23:00 650 39000 20 12 * * * pi /home/pi/ww2an.sh 12:20 23:10 650 39000 30 12 * * * pi /home/pi/kw1an.sh 12:30 22:40 610 36600 40 12 * * * pi /home/pi/kw2an.sh 12:40 22:50 610 36600 00 23 * * * pi /home/pi/blauan.sh 23:00 01:00 120 7200
:-/...was son CODE ausmachen kann.... viel besser lesbar
Naja nur 2x eine export Zeile im Script zu haben ist denk ich nicht ganz richtig.. Mal davon abgesehen dass das Licht nie mehr aus geht wenn das Script crasht bzw der PI zwischenzeitlich wegen Stromausfall o.ä. mal neu gestartet wurde...
Ich würde also eher daher gehen und ein mal zum Einschalten und dann noch mal zum Ausschalten ein Script zu nehmen.
Und dann würde es auch schon reichen nur ein einziges Script zu nehmen. An dieses eine Script wird dann der Status (an/aus) sowie die Gerätschaft (kw1/kw2/rot/ww1/ww2 etc) übergeben und gut is... Dann kann der PI zwischendurch auch ruhig mal neu starten aber trotzdem geht nachts das Licht wieder aus
/home/pi/relais.sh
#!/bin/bash
#### CONFIG - START
## GPIO # = Name
GPIO[22]=WW1
GPIO[23]=WW2
GPIO[24]=KW1
GPIO[25]=KW2
GPIO[26]=ROT
GPIO[27]=BLAU
#### CONFIG - END
NAME=$1
STATUS=$2
if [ -z "$STATUS" ]; then
echo "Usage: $0 <Name> <Status>"
exit 1
fi
if [ $STATUS = "on" ]; then
STATE=1
else
STATE=0
fi
for PIN in ${!GPIO[*]}; do
if [ ${GPIO[$PIN]} = "$NAME" ]; then
if [ ! -f /sys/class/gpio/gpio${PIN}/value ]; then
echo $PIN > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio${PIN}/direction
fi
echo $STATE > /sys/class/gpio/gpio${PIN}/value
fi
done
exit 0
Alles anzeigen
Die Crontab Einträge (in deinem Fall wars ja in /etc/crontab) würden dann wie folgt aussehen:
00 12 * * * pi /home/pi/relais.sh ROT on
10 12 * * * pi /home/pi/relais.sh WW1 on
20 12 * * * pi /home/pi/relais.sh ROT off
20 12 * * * pi /home/pi/relais.sh WW2 on
30 12 * * * pi /home/pi/relais.sh KW1 on
40 12 * * * pi /home/pi/relais.sh KW2 on
40 22 * * * pi /home/pi/relais.sh KW1 off
50 22 * * * pi /home/pi/relais.sh KW2 off
00 23 * * * pi /home/pi/relais.sh WW1 off
10 23 * * * pi /home/pi/relais.sh WW2 off
00 23 * * * pi /home/pi/relais.sh BLAU on
00 01 * * * pi /home/pi/relais.sh BLAU off
Alles anzeigen
ups vielen dank erstmal ... könntest du mir die bash mal etwas erklären'?'
wie gesagt hatte es erst nach einer Anleitung so versucht, ging aber nicht mit Relais
Du hast drei unterschiedliche Baustellen:
1) Steuerung wann > cronjob
2) Steuerung wie > xxx.sh / bash
3) Schaltung > Relais
Zu 3)
das Relais hat 3 "Stufen"
A) VCC und GND steuert die "Vorstufe", den Optocoupler
B) JD-VCC und GND steuert die (5 Volt) Relaisspule
C) die Relaisspule schaltet einen UM-Schalter und ist nicht mit GND, VCC und JD-VCC verbunden und schaltet bis 220 Volt / 10 A
Wenn Du die Relais mit 5 Volt vom Pi versorgst (Jumper auf VCC + JD-VCC) kann es zu einem Dauerschaden beim Pi kommen, dieser ist nur für 3,3 Volt ausgelegt.
Daher auch meine Anfrage.
Geringe Last (Watt) kann unmittelbar über die GPIO´s geschaltet werden z. B. LED´s mit entsprechend dimensioniertem Widerstand, nein, keine "Power-LED´s".
Dieses sollte aber niemals mit dem GPIO-Status IN erfolgen.
Hier lauscht der Pi am GPIO (Eingang), bei mode OUT kann geringe Last geschaltet werden...salopp ausgedrückt.
Wenn viele Relais gleichzeitig anziehen entsteht zudem eine "grosse" Last (durch Stufe B), die den Pi in die Knie zwingen können und sollten möglichst durch eine eigene Stromversorgung abgedeckt werden (zumindest bei Typ A + B. (Typ B+ habe ich keine Ahnung))
Bye
Jürgen
PS.: vermutlich glimmen bei dir einige Relais-LED´s nach dem Hochfahren des Pi.
Hallo Jürgen.
Vielen Dank erst einmal für deine Unterstützung. Ja die meisten Relais LED glimmen nach dem Hochfahren. Ich habe den PI am GPIO PIN 2 mit + versorgt und vom PIN 4 nehme ich + für die Relaisplate. Dachte wäre ok weil beide als 5V bezeichnet sind ( siehe Anlage).
Ich werde am Wochenende die Versorgung der Relaisplatte ändern auf extern und den Jumper ziehen. Auch das mit der einzigen Bash aus deiner Anleitung werde ich ausprobieren .. bin gespannt wie das funktioniert. Dein Skript kann ich ja so kopieren nicht wahr?
Würden meine alten Bash mit dem write Befehl
#!/bin/sh
gpio export 22 out
sleep1
gpio write 1
sleep 120
gpio write 0
sleep1
gpio export in
#
fünktionieren wenn die Relaisplatine fremd gespeist wird?
#!/bin/sh
...
gpio export in
Grrrrr... verabschiede dich bitte vom Modus IN !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Der hat hier nix zu suchen.
Basic:
Was für eine Last (genaue Angabe bitte) möchtest Du schalten, nur LED ist zu dürfig, bitte den Typ und Anzahl je Relais angeben. Unter Umständen können diese, mit einem Vorwiderstand, direkt am GPIO betrieben werden.
Bitte mache einen reboot und stelle dann die Ausgabe von ... ein:
und
Nach dem reboot dürften alle mit Name: GPIO. x aufgeführten PIN´s den Mode: IN haben.
1) Um einen Mode OUT und Schaltzustand 1 beim Hochfahren/reboot zu erhalten muss dieser für jeden GPIO, der ein Relais steuert, gesetzt werden.
z. B. per cronjob ( x = GPIO Nr.)
oder per bash:
Crontab-Eintrag:
Inhalt von /usr/local/bin/gpiomode.sh:
#!/bin/bash
# GPIO-Status definieren
# GPIO x
/usr/local/bin/gpio mode x out && /usr/local/bin/gpio write x 1
# GPIO xx
/usr/local/bin/gpio mode xx out && /usr/local/bin/gpio write xx 1
# weitere GPIO´s .....
Relais schalten z. B. per cronjob:
00 12 * * * /usr/local/bin/gpio write x 0 # LEDx an
20 12 * * * /usr/local/bin/gpio write x 1 # LEDx aus
# weitere Schaltvorgänge ....
Du kannst hierfür auch meigrafds Beispiel verwenden, clever, die GPIO´s definieren und den Schaltzustand übergeben.
Die elekrische Komponente:
mode out und Zustand 0 = Masse liegt am GPIO an
mode out und Zustand 1 = 3,3 Volt liegen am GPIO an
Bei 0 "leuchte" der Optocoupler (intern) und schaltet die am JD-VCC anliegenden 5 Volt gegen Masse, das Relais zieht an.
Der Steuerteil A (VCC/Optocoupler) der Relaiskarten ist für den 5 Volt Betrieb ausgelegt.
Um den Pi, der für 3,3 Volt ausgelegt ist, zu schützen können Massnahmen wie Vorwiderstand oder/und ULN2803 greifen.
Meiner Ansicht nach ist dieses nicht zwingend notwendig und meine Pi´s bisher ohne Schaden, sofern unmittelbar beim Hochfahren mode out gesetzt wird!!!
Bye
Jürgen
könntest du mir die bash mal etwas erklären'?'
Shebang auf /bin/bash stellen. bash ist neuer als sh und kann mehr.
Erforderlich wenn die Datei direkt ausgeführt werden soll, ohne es selber an einen Interpreter zu übergeben.
## GPIO # = Name
GPIO[22]=WW1
GPIO[23]=WW2
GPIO[24]=KW1
GPIO[25]=KW2
GPIO[26]=ROT
GPIO[27]=BLAU
Array erstellen.
Format: GPIO[pin#]=Deine.Bezeichnung.die.zur.Übergabe.ans.Script.verwendet.wird
..Hierzu mehr weiter unten..
Zuweisung der Übergabeparameter.
Parameter werden generell durch Leerzeichen getrennt. Das erste Parameter was übergeben wird befindet sich in $1, das zweite in $2, das dritte in $3 usw. Das Script selbst ist in $0 hinterlegt. Alle übergebenen Parameter in $* bzw $@.
Hierdurch werden also das 1.Parameter nachfolgend im Script durch $NAME abrufbar und somit der Code besser lesbar.
Sicherstellen das dem Script zwei Parameter übergeben wurden, also auch das zweite. " -z " bedeutet soviel wie: wenn leer. Wenn also $STATUS (bzw $2) leer ist; then ... echo und exit 1 um eine Fehlerhafte Ausführung anzuzeigen (Googlesuche nach: Exitcode)
if [ $STATUS = "on" ]; then
#mode out und Zustand 0 = Masse liegt am GPIO an
#mode out und Zustand 1 = 3,3 Volt liegen am GPIO an
STATE=1
else
STATE=0
fi
Bequemlichkeit, damit besser verständlich "on" ans Script übergeben werden kann, was hier dann STATE auf 1 setzen würde, da die GPIO's nur 1 oder 0 verstehen, nicht aber on oder off...
eine for-Schleife, welche jeden Index des Arrays zurück gibt. Wir erinnern uns: GPIO[22]=WW1
GPIO ist der name des Arrays. [ ] legt das Index des Arrays fest, also eine Zahl. = ist die Zuweisung zu dieser Array-Variablen.
Arrays müssen in bash generell in Form von ${array[xxx]} aufgerufen werden
Das ! sagt aus das man den Index haben möchte. [*] wird hierfür ebenfalls benötigt..
Was das im Grund macht ist eine Liste mit allen Index's zurück zu geben: 22 23 24 25 26 27
Die for-Schleife weißt dann jedem Index die Variable PIN zu. Bei jedem Durchlauf ist also das aktuelle Element aus der Liste über $PIN abrufbar.
Er würde also bei for PIN in ${!GPIO[*]}; do zunächst folgendes formen: for PIN in 22 23 24 25 26 27; do
Nun startet er mit der ersten Zahl aus der Liste, also der erste Durchlauf der Schleife. Dann wäre PIN=22
Überprüfung ob der vom Array hinterlegte Wert, dem 1.Paramter von der Script-Übergabe entspricht.
Zuvor gelernt: $PIN beinhaltet beim ersten Durchlaufen 22. Es wird also die Variable $GPIO[22] abgerufen - da aber Eckklammern vorhanden sind müssen wir das umschließen: ${GPIO[22]}
Hier würde dann WW1 ausgegeben werden.
Wenn also dem Script WW1 übergeben wurde und somit diese Prüfung übereinstimmt; then ... nur dann macht er das innerhalb der if-Schleife:
Prüfen ob die Datei NICHT existiert. Das " ! " bedeutet NICHT. " -f " bedeutet FILE. ${PIN} wird durch 22 ersetzt. Wenn also /sys/class/gpio/gpio22/value NICHT existiert; then ...bedeutet dass, das der GPIO noch nicht initialisiert und exportet wurde, also holen wir das hier nach:
das " fi " schließt die if-Schleife.
Danach setzen wir den STATE - wir erinnern uns: Wenn wir an das Script "on" übergeben haben beinhaltet $STATE eine 1, ansonsten eine 0
Die erste if-Schleife schließen.
Die for-Schleife schließen
Falls das Script ohne Fehler durchgelaufen ist sollte man es immer mit " exit 0 " beenden, um dem übergeordneten Programm wie crontab zu signalisieren: Alles in Ordnung, keine Fehler aufgeteten
Und noch eine Frage:
Welche Pi-PIN´s (1 - 26 - nicht GPIO-Nr.) sind mit der Relaiskarte verbunden:
Pi-Pin........Relaiskarte
4 an VCC
6 - GND
18 - IN1
% - IN2
12 - IN3
16 - IN4
7 - IN5
11 - IN6
15 - IN7
% - IN8
Folgende Pi-PIN´s (1 - 26 - nicht GPIO-Nr.) sind mit der Relaiskarte verbunden:
Pi-Pin........Relaiskarte
4 an VCC
6 - GND
18 - IN1
% - IN2 nicht bbelegt
12 - IN3
16 - IN4
07 - IN5
11 - IN6
15 - IN7
% - IN8 nicht belegt
In der Übersicht ist gezeigt wie die Relaisplatte angeschlossenist, alles über den Pi.
Wie muss ich die Versorgung anschließen wenn ich den Jumper ziehe und die Relaisplatina fremd versorgen will um den Pi zu schonen?
Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!