Raspberry Pi Relais Schalter

GPIO

Raspberry Pi: Relais-Schalter per GPIO steuern

Oftmals will man auch Module mit höheren Spannung mit dem Raspberry Pi steuern. Für diesen Zweck können am Raspberry Pi Relais verwendet werden: Mittels eines niederspannigen Impulses wird der Relais-„Schalter“ umgelegt. Da der Pi nur maximal 5V (die GPIOs sogar nur 3.3V) verträgt bleibt ohne Relais das Risiko vorhanden, den Pi durchbrennen zu lassen. Hat man jedoch zwei voneinander getrennte Stromkreise kann das nicht passieren.

Wie man ein Relais mit dem Raspberry Pi steuert und was dabei beachtet werden muss zeige ich in diesem Tutorial.



Zubehör

 

Die Relais gibt es als 2er, 4er, 8er und sogar als 16er Module, je nachdem was man braucht. Um nicht zu viele GPIOs auf dem Pi zu „verschwenden“ lohnt sich bei mehr als 4 Kanälen die Anschaffung eines GPIO Port Expander.

 

Aufbau

Der Aufbau ist sehr simpel, da alle Pins beschriftet sind. Links (GND) kommt an Pin 6 des Pi’s (GND), der rechte Pin (VCC) kommt an 3V3 (Pin 1) des Pis. Je nachdem wie viele der Relais du steuern willst, musst du entsprechend viele GPIOs mit den IN Pins verbinden. Es empfiehlt sich ein kleiner Widerstand zwischen Pi und Relais zu setzen, ist aber bei 3V3 nicht unbedingt nötig.
Solltest du 5V statt 3.3V an VCC setzen, solltest du auf jeden Fall jeweils einen Widerstand (~1kΩ) zwischen die GPIOs und die IN Pins setzen.

 

Auf der anderen Seite sind an jedem Relais 3 Verbindungen (siehe Bild unten):  Je nachdem ob am IN-Pin eine LOW (0V) oder HIGH (3.3V bzw. 5V) anliegt wird entweder der Schalter zwischen der Mitte und Rechts, bzw. Mitte und Links geöffnet. Falls du alle 3 Pins verbindest kannst du das Relais quasi als Switch verwenden, lässt du rechts oder links frei hat es einfach die Wirkung eines On/Off Schalters. Wo dabei VCC bzw. Ground angeschlossen werden (Mitte bzw. Rechts/Links) spielt keine Rolle.

 

Raspberry Pi Relais: Entweder Mitte-Links oder Mitte-Rechts wird verbunden/"geöffnet".

Entweder Mitte-Links oder Mitte-Rechts wird verbunden / „geöffnet“.

Solltest du Geräte mit hohen Spannungen anschließen wollen, solltest du entweder genaustens wissen was du tust oder einen Elektriker fragen! 230V sind lebensgefährlich. Achte zusätzlich auf die Spezifikationen des Relais und nimm möglichst keine zwielichtigen China-Teile (das ist im Niedrigstrom-Bereich zwar egal, bei höheren Spannungen sollte man aber der Sicherheit zu Liebe den Euro mehr ausgeben und geprüfte Ware nehmen). Ich übernehme keine Haftung für Schäden!

 

 

Raspberry Pi Relais Steuerung

Auch die Steuerung ist nicht sonderlich schwierig, da nur GPIOs geschaltet werden müssen. Du kannst dafür C++ (wiringPi) oder Python verwenden. Ich verwende Python und habe GPIO 17 (Pin 11) verwendet.

sudo python

Liegen 0V am Relais Pin an, leuchtet die entsprechende LED, bei einem HIGH Pegel erlischt die LED. Möchtest du, dass bei einem HIGH Pegel das Relais öffnet musst du also den mittleren und linken Pin mit dem Stromkreis verbinden. Dabei ist die LED aus. Soll das Relais öffnen, wenn die LED auch brennt werden mittlerer und rechter OUT Pin verbunden.

 

Das war es auch schon. Mich würde interessieren, in welchen Anwendungen die Raspberry Pi Relais bei euch Benutzung finden?



, , , , , , ,


78 Kommentare

  1. Sebastian sagt:

    Cool. Das habe ich für meine Weihnachtsbeleuchtung gesucht.
    Danke!!!

  2. Tim sagt:

    Ich würde gerne unsere LED-Leisten im Wohnzimmer damit steuern.
    Finde das Tutorial gut beschrieben, würde mich jedoch auch darüber freuen, wie in den anderen gewohnte Tutorials eine Beispielverkabelung oder Schaltpläne zu sehen, wie du das ganze wo angeschlossen hast.

    Gruß!

    • Felix sagt:

      Hi Tim,
      nunja so ein einzelnes Relais hat nur VCC, GND und einen Pin, der das Relais schaltet, wobei alle beschriftet sind. Daher habe ich hier auf einen Schaltplan verzichtet.

  3. Klaus Werner sagt:

    Hallo,

    Du hast nur eines wohl vergessen.
    Alle diese Relais die ich kenne werden mit Masse geschaltet und das kann der PI nicht!
    Also werden u. a. eine Transistor-Schaltung gebraucht.

    Klaus

    • Felix sagt:

      Hallo Klaus,
      bei welchen Relais hast du es denn getestet? Eizelne Relais oder verbaute Module?
      Bei den von mir verlinkten Relais Modulen ist eine Masse-Verbindung nicht nötig. Ich nehme an, dass in den Modulen die Verbindung zu Ground bereits eingebaut ist.
      LG Felix

  4. Hugolost sagt:

    Bei mir reagiert das Relais garnicht. Woran könnte das liegen?

    • Felix sagt:

      Was du testen kannst: Schließe ganz normal VCC (3.3V) und GND des Relais an den Pi an. Dann verbinde den Schalt-Pin des Relais erst an 3.3V und danach and GND. Die LED des Relais sollte einmal aufleuchten und einmal ausgeschaltet sein. Falls das nicht der Fall ist, ist entweder dein Relais kaputt oder es benötigt eine andere Spannung.

  5. Hugolost sagt:

    Mit 3,3V an VCC schaltet das Relais garnicht (ist ein 5V Relais) Aber auch mit 5V klappt es nicht. Ein Arduino an das Relais angeschlossen und es klappt.

    • Felix sagt:

      Möglich, dass du ein anderes Relais benutzt. Ich habe aber mit allen getesteten 5V Relais die Erfahrung gemacht, dass auch 3.3V zum schalten ausreichen. Wenn aber auch 5V des Pi’s das Relais nicht schalten, muss das Problem wo anders liegen.

  6. Hugolost sagt:

    Mit 3,3V schaltet das Relais garnicht. Aber selbst mit 5V klappt es nicht. An einem arduino klappt es aber einwandfrei.

  7. Hauschi sagt:

    Hi Felix,
    dich interessiert ja was wir mit dem Relais so anfangen.

    Ich hab mir aus einer Heizmatte, einem Relais, einem DHT22 und ner Styroporbox einen Joghurtbereiter gebastelt.
    Der PI muss für 7 stunden die Temperatur zw. 42 und 45 Grad Celsius halten, und das wars eigentlich schon. (wo ist eigentlich das Grad Symbol auf ner Tastatur)
    Das alles mit sehr begrenzten Elektonik und Python Kentnissen.
    Die meisten Zeilen sind bei Dir und Adafruit geklaut.

    http://pastebin.com/uFeBRZxJ

    Ich beschäftige mich jetzt seit knapp 2 Wochen mit Python, ein zwei Rätsel kommen immer wieder auf, aber meistens klappts.

    • Hauschi sagt:

      P.s. wie bau ich da denn nen abbruch durch benutzer ein…

      Also durch tastendruck oder ctrl irgendwas

    • Felix sagt:

      Hi Hauschi,
      dein Projekt klingt wirklich interessant, gut möglich, dass ich in Zkunft so etwas auch baue 🙂
      PS: Grad Zeichen (°) oben links neben der 1 auf der Tastatur.

    • Hauschi sagt:

      Oh man strg c….

      Ich hab mir hier allen möglichen mist mit keyinterrupt auf englisch durchgelutscht und mein englisch ist wirklich für fachbezogenes nicht ausgelegt, eher um ein bier zu bestellen

    • Hauschi sagt:

      Nochmal zum KeyboardInterrupt:

      Hab noch mit „try: / except KeyboardInterrupt“ gespielt

      Habs jetzt so hinbekommen, daß er bei strg+c noch das relais auf low stellt bzw den gpio cleanup ausführt
      Nicht daß man abbruch macht und die heizmatte grillt weiter oder ähnliches.

      soll ich die Zeilen noch Posten oder war das nur für mich Neuland?

      gruß hauschi

    • Hauschi sagt:

      Noch was wichtiges, auf jeden Fall muss man mit except bei fehlern zumindesten das relais wieder ausschalten…
      Mir erging es wie folgt: ich hab damit eine heizung für ein minigewächshaus gesteuert, lief wochenlang stabil. Eines morgen waren alle pflänzchen gar gekocht. Der dht22 hatte wohl nen fehler und round (temperature,1) ging schief weil diese auf einmal als string erkannt wurde… programm wurde beendet und relais blieb auf Heizen stehen… hab noch nen 16×2 display dran, das zeigt dann aber ja auch nur die letzte gemessene temperatur.

      Naja aus fehlern lernt man..

      Gruß Hauschi

      P.S. Felix, wenn ich hier nochmal das aktuelle script poste, würdest du mal drüber schauen ob da noch mehr überraschungen lauern?

    • Felix sagt:

      Hey Hauschi,
      klar, ich kann einen Blick drüber werfen.

  8. Patrick sagt:

    Hallo zusammen,
    ich steuere über 2 Buttons auf einer html Seite jeweils ein Relai für Auf- und zufahren eines Rollladens. Nun möchte ich auch über einen Stopp Button den Rollladen stoppen. Im moment kann ich nur ganz auf oder zufahren.
    Hier habe ich das sh skript für zufahren mal unten eingefügt. Das für auffahren sieht fast genau so aus.
    Weis jemand wie es möglich ist, durch betätigen des Stopp Buttons die beiden Pins für die Relais daraufhin auf Eingang zu legen?

    Vielen Dank

    LG
    Patrick

    #!/bin/sh
    
    gpio -g write 17 0              #Verriegelung
    gpio export 17 in                #Verriegelung
    
    gpio export 23 out              #Port 23 wird auf Ausgang gelegt
    sleep 10                                    #Rollladen fährt zu
    
    gpio -g write 23 0              #Port 23 wird eine 0 zugewiesen (Relai faellt ab)
    gpio export 23 in               #Port 23 wird auf Eingang gelegt (Grundzustand)
    • Felix sagt:

      Hi Patrick,
      das Problem liegt in dersleep 10 Zeile. Dadurch hast du keine Möglichkeit zu stoppen.
      Ich würde eine Schleife laufen lassen und innerhalb der Schleife lediglich eine halbe Sekunde oder noch weniger warten. Außerdem überprüfst du den Status des Stop-Tasters jedes mal und falls er gedrückt wurde bricht die Schleife ab und das Relais wird geschaltet. Mit Python könntest du auf die nützlichen GPIO Funktionen zugreifen ggf. sogar auf die Schleife verzichten.
      LG Felix

    • Patrick sagt:

      Hi Felix,
      das sleep 10 ist ja dazu da, dass das Relai für 10 sec anzieht und anschließend wieder abfällt. Der Rollladen braucht genau 10 sec zum auf bzw. zufahren 🙂

      könntest zu mir ein beispiel code schreiben, wie du das realisieren würdest?

    • Felix sagt:

      Das ist mir klar, aber durch sleep wird alles andere lahmgelegt. Das System pausiert und dadurch kannst du es auch nicht abrrechen.
      Beispielcode in Python (ungetestet):

      import RPi.GPIO as GPIO
      import time
      
      GPIO.setmode(GPIO.BCM) # GPIO Nummern statt Board Nummern
      TASTER_GPIO = 17 # anpassen
      RELAIS_GPIO = 21 # anpassen
      GPIO.setup(TASTER_GPIO, GPIO.IN) # GPIO Modus zuweisen
      GPIO.setup(RELAIS_GPIO, GPIO.OUT) # GPIO Modus zuweisen
      
      def wechsel():
        # abfragen ob wieder starten oder stoppen
        # ...
        GPIO.output(RELAIS_GPIO, GPIO.HIGH)
      
      GPIO.add_event_detect(TASTER_GPIO, GPIO.BOTH, callback=wechsel)
      
      start = time.time()
      dauer = 10 # Sekunden
      while time.time() - dauer < start:
        time.sleep(0.1)
      

      Schau dir ggf. dieses Tutorial auch mal an: Überwachung von Fenstern und Türen mit dem Raspberry Pi und Reed-Relais

  9. Patrick sagt:

    ja da hast du recht da wird alles lahmgelegt, dass habe ich noch nicht bedacht gehabt
    okey danke ich teste das mal 🙂

  10. Patrick sagt:

    Ne also ich habe eine html Seite mit 3 Buttons:
    Zufahren
    Auffahren
    Stopp

    und ich möchte über den Stopp button auf der Webseite den Rollladen stoppen.
    sorry vll hab ich das vorhin etwas schlecht beschrieben.

    • Felix sagt:

      Achso, ok. Dann musst du es natürlich etwas umschreiben: Überprüfe in der Schleife, ob Stopp gedrückt wurde und setze dann sofort den Relais GPIO auf LOW. Beispiel:

      if ... : # start button pressed
        GPIO.output(RELAIS_GPIO, GPIO.HIGH)
        while time.time() - dauer < start:
          if ... : # anpassen
            GPIO.output(RELAIS_GPIO, GPIO.LOW)
          time.sleep(0.1)
        GPIO.output(RELAIS_GPIO, GPIO.LOW)
  11. Patrick sagt:
    #!/bin/sh
    
    if zufahren button pressed : # start button pressed
      GPIO 23.output(RELAIS_GPIO, GPIO.HIGH)
      while time.time() - dauer < start:
        if stopp button pressed : # anpassen
          GPIO 23.output(RELAIS_GPIO, GPIO.LOW)
        time.sleep(0.1)
      GPIO 23.output(RELAIS_GPIO, GPIO.LOW)

    wenn ich den zufahren Button betätige ruft der über php das Shell Skript auf.
    Wenn ich die Schleife so mach funtkioniert gar nichts, und des Relai zieht nicht an. Ich glaube ich denke das is falsch wie ich es gemacht habe, vll denke ich da zu einfach 😀

    • Felix sagt:

      Du deklarierst ein shell Skript, benutzt aber Python Code? Hast du es gekürzt oder fehlen auch die imports der Libraries?
      Btw. was genau ist GPIO 23.output? eine Variable kann nicht durch Leerzeichen getrennt sein bzw. eine Zahl. Falls das alles an Code ist, macht dieser definitiv keinen Sinn (du solltest ihn testen und wirst bestimmt einige Fehlermeldungen bekommen).
      LG Felix

  12. M.Krause sagt:

    Hallo Felix,

    erstmal.. Du hast hier ne richtig geile Seite aufgebaut. Mach weiter so.
    Und nun zu meiner Frage.
    Ich habe wie hier in diesem Tutorial beschrieben eine 8er relaiskarge angeschlossen und daran wiederum aquariumpumpen.
    Aus einem deiner vorherigen tutorials hatte ich auch schon ein LCD-Display (4×20) in betrieb genommen.
    Nun spinnt mein display jedoch jedes mal rum wenn ich eine Pumpe ansteuere, ich habe schon gedacht das es vllt einen spannungeinbruch gibt, und habe die stromversorgungvom Raspberry und die der Pumpen getrennt.
    Das hat aber leider nicht geholfen. Hast du noch eine Idee an was es liegen könnte?

    Mit freundlichen Grüßen
    M.Krause

  13. Johannes sagt:

    Hi,

    vielen Dank für das Tutorial. Hab mich auch auf anderen Seiten eingelesen, aber leider funktioniert mein Skript nicht. Beide Relais schalten nach der Zeile GPIO.setup(….) und nach GPIO.cleanup(…). Das Umschlaten der Pins hat keinen Einfluss, weder auf die LEDs, noch auf das Relais. Wenn ich die Pins des Relais mit 3,3 V und GND direkt verbinde, schalten sie einwandfrei.

    Momentan bin ich noch am ausprobieren. Mein Ziel ist es eine Steuerung für einen Innenraumbelüftung zu bauen, die bei einer gewissen Temperatur meines Holzofens die Lüftung einschaltet, damit es unter dem Dach nicht so warm wird.

    Grüße Johannes

    import RPi.GPIO as GPIO
    import time
    #setup
    GPIO.setmode(GPIO.BOARD)
    pin1 = 7
    pin2 = 11
    GPIO.setup(pin1,GPIO.OUT)
    GPIO.setup(pin2,GPIO.OUT)
    
    #run
    GPIO.output(pin1,GPIO.HIGH)
    GPIO.output(pin2,GPIO.LOW)
    time.sleep(2)
    GPIO.output(pin1,GPIO.LOW)
    GPIO.output(pin2,GPIO.HIGH)
    
    #finish
    GPIO.cleanup([pin1, pin2])
    • Felix sagt:

      Hallo Johannes,
      hast du mal versucht einen Transistor dazwischen zu schalten? Diese brauchen nur eine geringe Stromstärke zum schalten und somit könntest du das Relais auch über 5V schalten. Ist zwar etwas umständlicher, aber vielleicht klappt es ja. Benutzt du irgendein spezielles Relais oder die verlinkten?
      LG Felix

    • Johannes sagt:

      Hallo Felix,

      Ich habe die gleichen Relais, auf dem Board sind bei mir aber andere Bausteine verbaut. Die zwei schwarzen rechteckigen fehlen. Könnte natürlich sein, dass das Transistoren sind… Auf dem Relais steht jedenfalls irgendwas von 5 VDC. Mir ist aber nicht ganz einleuchtend, wieso die Relais sauber schalten, wenn ich sie mit 3,3 V verbinde bzw. die Verbindung wieder unterbreche. Kann es sein, dass die Pins des Raspberry Pi nicht „sauber“ geerdet sind? Also dass eben nicht 0 V anliegen, sondern eine „zappelnde“ Spannung?

      Ich besorg mir mal einen Transistor und probiere es aus.

      Grüße
      Johannes

    • Felix sagt:

      Hallo Johannes,
      also eine „zappelnde“ Spannung habe ich bisher nie an den GPIOs gemessen. Ich habe bei vielen Bauteilen die Erfahrung gemacht, dass sie auch mit 3.3V funktionieren. Die Module sind meistens für den Arduino bestimmt und dessen IO Pins liefern 5V Spannung. Allerdings haben die verwendeten Komponenten eben oft einen Spannungsvereich von ca. 3-5.5V. Natürlich gibt es auch Module, die wirklich genau 5V brauchen, aber ich habe das mit solchen Standard Teilen wie Relais bisher nicht erlebt.

    • Johannes sagt:

      Hallo Felix,

      danke für den Hinweis mit dem Transistor. Hat geklappt. Ich habe die Verkabelung gemäß folgender Seite (Output Circuit, NPN-Transistor) vorgenommen: http://elinux.org/RPi_GPIO_Interface_Circuits Am GPIO-Pin liegen 3,14 V an, am Collector des Transistor, liegen 4,13 V an.

      Grüße
      Johannes

    • Felix sagt:

      Scheint wohl wirklich so zu sein, dass dein Relais mehr als 3V braucht. Nunja, hauptsache ist, dass es nun klappt 🙂

  14. Frank sagt:

    Hallo,

    super Tutorial……
    Ich möchte meine 12V LED Aquarium Beleuchtung damit Steuern.

    Frage: Was bräuchte ich, damit ich zusätzlich dimmen kann?

    Ich habe 4LED 12 V Leisten über dem Becken und habe jetzt einen DrehDimmer dran. So kann ich Stufenlos die Helligkeit einstellen, d.h. die LEDs sind einfach Dimmbar.

    Weisst du ob es vielleicht so etwas gibt? Dein Relais macht sicher nur ein/aus.

    Viele Grüße

    Frank

  15. Maurice sagt:

    Moin moin, danke für das super Tutorial!

    Ich habe ein bisschen grundsätzliche Ahnung von Elektrotechnik, aber trotzdem eine Frage dazu…

    Du hast geschrieben, dass du, wenn man die Relais mit 5V beschaltet, einen ~1k Widerstand zwischen GPIO und IN einbauen würdest – zur Sicherheit. Wie kommst du genau auf die ~1k?
    Ich habe nämlich ein entsprechendes Board zur Verfügung, das aber mit 12V versorgt wird. Wie müsste ich die Widerstände da dimensionieren?

    Wäre super, wenn du mir da aushelfen könntest.
    Danke!

    • Felix sagt:

      Hey Maurice,
      Im Grunde ist das bei 3.3V nicht wichtig, da der GPIO nur einen Strom sendet, aber keinen bekommt. Das war nur gedacht, falls man etwas falsch angeschlossen hat etc. Aber da sollte es auch eine Diode tun (solange der GPIO nur Output ist).
      Ansonten kannst du dir mal das Prinzip eines Spannungsteiler ansehen: https://de.wikipedia.org/wiki/Spannungsteiler

  16. 4711engel sagt:

    Hi,
    ich habe nun auch wiringPi installiert und das Relais an den Pi angeschlossen (VCC GND IN) und auf der anderen Seite einen Motor mit eigener Stromversorgung .
    Nun habe ich aber das Problem, dass wenn ich
    GPIO.setuup(RELAIS_1_GPIO, GPIO.OUT) eingebe, das Relais schließt (Motor läuft) und wenn ich
    GPIO.setup(RELAIS_1_GPIO, GPIO.IN) eingebe, das Relais öffnet (Motor aus).
    Also ohne dann GPIO.output ….. auf LOW oder HIGH zu setzen.
    Was mache ich falsch?

    • 4711engel sagt:

      Ist dieser Blog nicht mehr aktiv?
      Oder warum erhalte ich keine Antwort? Schade eigentlich. Ich würde gerne meinen Fehler finden. Da sollte es doch jemand geben, der einem Anfänger vielleicht helfen kann.

    • Felix sagt:

      Ist noch aktiv 😉 Nur bei so vielen Kommentaren überließt man mal ein, kümnmere mich ja nur in meiner Freizeit darum 🙂
      Zu deiner Frage: Ich vermute folgendes: Durch GPIO.IN agiert der Pin wie GND (oder auch GPIO.LOW). Der andere Zustand ist dann ggf. nicht HIGH sondern „nicht LOW“.
      Dennoch würde ich den Pin als Output deklarieren.
      LG Felix

  17. Daniel sagt:

    Habe jetzt dein „AN“ statement und dein „AUS“ statement getauscht, damit die LED am Relais nur brennt wenn das Relais meine Pumpe ansteuert. Spricht etwas dagegen das so zu tun. Wenn ich die Schaltung richtig verstehe liegt damit auf dem GPIO immer eine Spannung an wenn das Relais aus sein soll. Oder hat das negative Auswirkungen wenn der Raspberry vielleicht mal abstürzt und damit das Relais angeht weil die Spannung fehlt?

    • Felix sagt:

      Nein, das kannst du handhaben wie du möchtest. Es gibt auch unterschiedliche Arten von Relais (manche leuchten, wenn Spannung anliegt, manche wenn keine Spannung anliegt). Je nachdem welches du hast wird der Stromkreis unterbrochen, wenn z.B. der Pi keine Spannung mehr liefert (also gar keine – nicht nur LOW am Schalt-Pin).

  18. Winne sagt:

    Hallo Felix,
    ich weiß nun nicht mehr was nun richtig ist, bin leider totaler leihe. Dein Bericht ist nun das gegen teil was ich nun schon mehrfach über dieses Relay Modul gelesen habe. ( Hersteller ArtikelNr.: CP0408A )
    Hier mal eine Beschreibung was man machen soll wen man es mit ein Raspberry pi betreiben möchte. Ich einen Raspberry pi 3
    Was ist Deine Meinung dazu, für eine Antwort wäre ich dankbar.
    ————————————————————————————————–
    Problem: Das Relaismodul besteht aus zwei Stromkreisen, dem Steuerkreis und dem Relaiskreis. Beide sind auf 5V ausgelegt. Betreibt man beide Stromkreise mit 3,3V, so besteht die Gefahr, dass das Relais „hängt“ oder nicht zuverlässig schaltet, denn die Relais brauchen zwingend 5V; außerdem fressen dann die LEDs im Steuerkreis so viel Spannung, dass die dort befindlichen Transistoren (aus irgendwelchen elektrotechnischen Gründen, die ich ehrlich gesagt nicht vollständig verstanden habe…irgendwas mit Sättigung) ironischerweise durch ihre eigene Verlustwärme schleichend geröstet werden und irgendwann ausfallen können. Gibt man stattdessen beiden Stromkreisen 5V, so röstet man den GPIO des Raspberry Pi, da dieser nur 3,3V verkraften kann. Was tun, um aus diesem Dilemma herauszukommen?

    Lösung: Wir arbeiten mit unterschiedlichen Spannungen. Wir betreiben den Relaiskreis mit den erforderlichen 5V, während wir den Steuerkreis mit 3,3V betreiben. Auf diese Weise können auch die GPIOs nur 3,3V abbekommen.

    Howto:
    1.) Die vier LEDs mit einem Lötkolben auslöten. Die Stellen, an denen die LEDs waren, mit ausreichend Lötzinn überbrücken.
    2.) Den Jumper, der JD-VCC und VCC auf dem Board verbindet, abziehen. Wichtig! Solange dieser Jumper gesteckt ist, sind Relaiskreis und Steuerkreis miteinander verbunden. Diese Verbindung muss logischerweise getrennt werden, und das geschieht durch Abziehen des Jumpers.
    3.) 3,3V vom Raspberry Pi an VCC des Boards stecken (Pinleiste mit sechs Pins).
    4.) 5V vom Raspberry Pi an JD-VCC des Boards stecken (einer der Pins, wo der Jumper draufgesteckt hat – den richtigen wählen! Beschriftung JD-VCC!)
    5.) Masse vom Raspberry Pi an GND des Boards stecken (Pinleiste mit sechs Pins)

    Nun fehlt noch die Verbindung von den GPIOs zum Board. Da der Raspberry Pi pro GPIO-Port nur max. 8mA an Strom zur Verfügung stellen kann, der Steuerstrom aber lt. Produktbeschreibung mit 15-20mA angegeben ist, müssen wir verhindern, dass das Relaisboard zu irgendeinem Zeitpunkt mehr ziehen kann als diesen Wert. Nach dem Ohm’schen Gesetz (U=R*I) ergibt sich bei einer Spannung von U = 3,3V und einem Maximalstrom von I = 8mA = 0,008A ein Widerstand von R = 412,5 Ohm. In der Praxis eignet sich ein 470 Ohm-Widerstand, den man in das Kabel vom GPIO zum Board einlötet. Dieser begrenzt dann den Stromfluss auf 7mA. In der Praxis funktioniert das auch nach vielen Tests hervorragend.

    In einem letzten Schritt schließt man nun also ein derart präpariertes Kabel zwischen den GPIO-Pin des Raspberry Pi und dem gewünschten Eingang des Relais (z.B. IN1 für das erste Relais). Fertig!

    • Felix sagt:

      Hallo Winne,
      also vorweg gesagt, ein Relais hat keine eingebaute Transistoren sondern arbeitet mit einem Elektromagnet, der durch die Spannung (3.3V bzw. 5V) geschaltet wird und einen anderen (getrennten!) Stromkreis öffnet (siehe Wikipedia: https://de.wikipedia.org/wiki/Relais ).
      Zu der zweiten Aussage bzgl des Dauerbetriebs: Ich nutze Relais kaum im Dauerbetrieb, kann also dazu keine Aussage treffen. Allerdings haben sich alle bisher von mir getesten Relais auch mit 3.3V schalten lassen. Falls sich dein Relais nicht mit 3.3V schalten lässt oder du 5V anliegen haben möchtest, so kannst du einen Transistor (NPN) benutzen. Dabei schließt du den GPIO an die Basis an (bitte mit Vorwiderstand ~10k), an den Collector kommen die 5V des Pi’s und der Emitter geht zum Schalt Pin des Relais. Damit kannst du mittels eines GPIOs auch 5V schalten. Ein Beispiel zum Transistoren schalten findest du hier, ist aber nichts großes dabei (bzgl Vorwiderstand stimmt alles, was du kopiert hast) 🙂

  19. Winne sagt:

    Hallo Felix,
    erst mal danke für die schnelle Antwort.
    also ich möchte mir dieses Relay Modul kaufen ( http://www.avc-shop.de/epages/64272905.sf/de_DE/?ObjectID=55119743 ).
    Ich habe da nachgefragt, Sie haben gesagt das ich von Rasberry vom PIN 2 die 5v Stromversorgung an DC+ an Relay Modul und Masse vom Rasberry PIN 6 an DC- an Relay Modul ohne was dazwischen anzuschließen und an den IN 1-4 den GPIO anschließen muss ( Beispiel an PIN 7,11,13,15 am Raspberry .
    Nun meine Frage, ist die Aussage richtig, oder muss ich, wie Du geschrieben hast, auch noch ~10k Vorwiderstand dazwischen machen?
    Wie schon geschrieben bin leider totaler leihe.
    Danke im voraus.
    Winne

    • Felix sagt:

      Hallo Winne,
      ich habe gesagt, dass der Vorwiderstand vor die Basis des Transistor (falls du einen verwendest) kommt. Wenn du darauf verzichtest kannst du die GPIOs auch direkt anstecken. Ich würde aber ggf. eine Diode dazwischen schalten, damit du sicher gehen kannst, dass keine 5V an die GPIOs gelangen (falls du ausversehen einen Pin vertauschst oder sonstige Komplikationen auftreten), aber auch das ist kein Muss, aber damit bist du auf der sicheren Seite.

  20. Kevin Hans-Horst-Jaqueline sagt:

    Danke dir. Das Tutorial hat mir sehr geholfen.

  21. Andreas sagt:

    Hallo!
    Ich muss mit einem Raspberry Pi eine Pumpe für eine Fußbodenheizung ein- und ausschalten, je nach Temperatur. Kann ich mit Relias die 230V für die Pumpe ein- und ausschalten oder muss da was anderes her?

    • Felix sagt:

      Am einfachsten und sichersten wäre eine Funksteckdose – sofern die Pumpe per Steckdose angeschaltet werden kann.

  22. MatthiasB. sagt:

    Hallo miteinander,
    was ich hier so gelesen habe, finde ich einfach nur toll!
    Ich möchte ein Bastelprojekt starten, obwohl ich keinerlei Ahnung vom Raspberry und Steuerung, geschweige denn vom Programmieren habe. Also frag ich einfach mal drauf los.
    Ich möchte über den Raspberry mit Touchscreen 30 Relais in 3 Zehnergruppen ansteuern, und zwar so, daß bei zwei Zehnergruppen immer nur ein Relais geschlossen ist, bei einer Zehnergruppe sollen es möglich sein, auch 2 oder 3 Relais gleichzeitig anzusteuern.
    Nutzen will ich das als Umschalter meiner Musikanlage. Wie stell ich das an?
    Es gibt ja USB Relaiskarten, gänge sowas?
    Würde mich über eine Antwort freuen, ehe ich das alles kaufe und dann nicht weiter weiß

    Danke, Matthias

  23. Ben sagt:

    Hallo,
    Danke für das Tutorial!
    Habe aber mal eine Frage um sicher zu gehen:
    Wo muss ich am Relais Ausgang die Masse anschließen? In der Mitte oder Rechts/Links?
    Kenne mich damit nicht aus 😀

    Danke,
    Ben

  24. Tobias sagt:

    Hallo Felix,

    dank deines Tutorials konnte ich erfolgreich mein „Neuftech 8-CH 5V 8-Kanäle Relais Modul“ an meinen Pi 2 Model B anschließen und ansteuern 🙂
    Nach etwas rumspielerei ist mir folgendes Problem aufgefallen, dass ich mir nicht erklären kann:
    Ich habe mir ein Script gebaut, mit dem ich alle oder gezielt einzelne Relais ein- bzw. ausschalten kann. Dies geschieht mit mehreren
    „GPIO.output(relais, GPIO.LOW)“ bzw. GPIO.HIGH
    Zeilen hintereinander, wobei Relais1 immer durch die jeweilige GPIO Nummer ersetzt wird. Zwischen den einzelnen Befehlen habe ich zum Test noch einen Sleeptimer von jeweils einer Sekunde eingebaut.
    Nun das für mich kuriose:
    Schalte ich alle Relais ein und nach ca. 30 Sekunden alle Relais aus, bleiben sporadisch Relais 1,3 und 6 an. Schalte ich nun gezielt Relais 1 aus, bleibt Relais 1 an. Schalte ich dann gezielt Relais 1 nochmal an und aus, geht Relais 1 aus. Gleiches Spiel mit Relais 3 und 6.
    Schalte ich alle Relais ein und nach ca. 5 Minuten aus, gehen alle Relais aus.
    Wenn die Relais geschalten werden (alle oder einzeln), ist immer das typische Relais klacken zu hören und die dementsprechende LED auf dem Board geht an bzw. aus.

    Dieses Phänomen tritt nur auf, wenn alle Relais eingeschalten sind. Sind z.B. nur Relais 1,3,4,6 und 8 aktiviert, kann ich diese einzeln aus und einschalten wie ich lustig bin.

    Wo liegt mein Fehler? Bin über jeden Tip dankbar.
    Viele Grüße,
    Tobias

    • Felix sagt:

      Hallo Tobias,
      hast du mal die anliegende Spannung der GPIOs von Relais 1,3,6 usw. gemessen, wenn du alle ausgeschaltet werden?

  25. Tobias sagt:

    Hallo Felix,
    nein, werde ich aber morgen mal machen 🙂 Habe mein Bauwerk derzeit nicht zu Hause.
    Ergänzend kann ich noch sagen: Das Problem tritt nur auf wenn Verbraucher an den Relais angeschlossen sind.

    • Tobias sagt:

      Hallo Felix,
      ich habe nun die Spannung der GPIOs in verschiedenen Konstellationen gemessen (sprich: Relais an/aus wie ich es oben beschrieben habe).
      Die Erkenntnis:
      Wenn der GPIO deaktiviert ist, liegen immer 0,0 V an.
      Wenn der GPIO aktiviert ist liegen immer 3,228V oder 3,229 V an.
      Mit meinem technischen Verständnis würde ich sagen das passt soweit.
      Ich bin nun am überlegen, einen ULN2803 Testweise zwischen GPIOs und Relaiseingänge zu installieren, da ich bei meinen aktuellen Recherchen oft gelesen habe, dass es nicht wirklich ratsam ist, die GPIOs direkt an das Relais anzuschließen.
      Wie siehst du das?

      Viele Grüße

    • Felix sagt:

      Die Spanungen sind soweit in Ordnung.
      Was du machen kannst ist einen normalen NPN Transistor zu verwenden und diesen zu schalten, sodass 5V an das Relais kommen: Basis (3.3V GPIO), Collector (5V Pi), Emitter (zum Relais Pin)

    • Tobias sagt:

      Hallo,

      nach einem Dauertest bin ich mir nun sicher, dass das Problem gelöst ist.
      Ich habe nun einen ULN2803A zwischen Pi und Relais eingebaut. Das Relais wird mit einem externen Netzteil mit 5 V versorgt.

  26. A. K. sagt:

    Hallo Felix, erstmal Danke dafür, dass Du in diesem Forum so viele interessante Informationen zur Verfügung stellst. Du fragst danach in welchem Zusammenhang die Relaissteuerung am Raspberry eingesetzt wird.
    Ich steuere in unserem Haus eine Vielzahl von Geräten über den Raspberry, so z. B. die Rolläden, NAS, Drucker, Zirkulationspumpe zum Warmwasser, ….; alles in Abhängigkeit des „Betriebszustandes des Hauses“, eingeschalteter Geräte (z. B. PCs) und der Uhrzeit. Basis ist ein C-Programm, dass als eine Art Scheduler funktioniert. Alle Steuerungsinformationen sind dabei in einer mysql-DB hinterlegt und können somit jederzeit ohne Programmunterbrechung verändert werden. Das Programm hat eine eigene Auslastungskontrolle und gibt- wenn immer möglich – die Steuerung an Betriebssystem zurück. Trotz einer erheblichen Anzahl von Steuerungsereignissen, erreiche ich einen Idle-Wert von ca. 99% auf dem Raspberry. Da mir die GPIOs ausgehen plane ich nun eine Ansteuerung der GPIOs über I2C Schieberegister-Module, z.b 2307. Hier fehlt mir noch die Information der Ansteuerung des I2C über die Programmiersprache C, wenn Du hier eine Info-Quelle hast, wäre das super, Gruß André.

    • Felix sagt:

      Hallo Andre,
      dein Projekt klingt interessant. Um dein GPIO Problem zu lösen könntest du einen MCP23017 per I2C ansprechen. Ich habe dazu bereits zwei Artikel geschrieben (Teil1, Teil2), jedoch benutze ich dazu Python. Ich denke allerdings, dass es nicht all zu viel Aufwand sein sollte den Code in C zu übersetzen. Auch auf Github gibt es wahrscheinlich einige Bibliotheken in C.
      LG, Felix

  27. Nils sagt:

    Ich verwende das Relais für sie automatische Bewässerung meiner Balkonpflanzen.

  28. Gunter sagt:

    Hier mal ein Hinweis für die Nutzer von Relaiskarten mit einer Steckbrücke (Jumper):
    Wenn Ihr diesen Jumper entfernt, dann wird auf der Karte VCC von JD-VCC getrennt.
    JD-VCC ist die Versorgungsspannung der Relaisspulen (5Volt). Hier könnt Ihr nun die 5Volt (Pin2 und Pin4 des Pi) anlegen. VCC wird mit den 3,3Volt (Pin1 und Pin 17 des Pi) verbunden. Jetzt stehen den Spulen der Relais die richtige Spannung zur Verfügung ohne dass Ihr Eure GPIOs gefährdet.
    Aber vorsicht bei den 8er Relaiskarten, hier überfordert die Last von 8 angezogenen (geschalteten) Relais recht schnell die Kapazität Eures Netzteils und der Pi kann wegen Spannungsschwankungen abstürzen.

    Noch ein Hinweis:
    Wenn Ihr, wie im Tutorial empfohlen, Euren Verbraucher über die NC/C Pins der Relais einschaltet, (LED leuchtet und der Verbraucher ist aus bzw. LED leuchtet nicht und der Verbraucher ist an) dann habt Ihr diesen Zustand immer auch im Ruhe zustand der Relais, also z.B. beim Booten des Pi. Das ist nicht wirklich sinnvoll.

    Besser Ihr nutzt nur die NO/C Kontakte der Relais zum Einschalten der Verbraucher – wenn also via Low-Pegel vom GPIO die LED eingeschaltet ist, und an der Relaisspule Spannung liegt, sollte auch Eure Last mit Strom versorgt werden.
    Solange der GPIO PIN nicht als Output definiert ist (als beim Booten und vor dem Start Eures Programmes) wird auch das Relais nicht ungewollt Euren Verbraucher einschalten. Setzt doch einfach den GPIO Pin auf „ON“ und dann erst teilt Ihr ihm mit dass er ein Output ist, dann wird das Relais erst dann schalten, wenn Ihr den GPIO kontrolliert auf „LOW“ setzt.

    GPIO.output(RELAIS_1_GPIO, GPIO.HIGH) # PIN an aber Relais und LED aus
    GPIO.setup(RELAIS_1_GPIO, GPIO.OUT) # GPIO Modus zuweisen


    GPIO.output(RELAIS_1_GPIO, GPIO.LOW) # PIN aus aber Relais und LED an

  29. gruß marco sagt:

    hallo,
    ich baue einen voll automatischen enten/hühnerstall mit solar panel und 12v batterie.
    die tür funktioniert schon seit etwa zwei jahren. aber jetzt kommt noch ein fütterungsautomat hinzu, und da hab ich mir gedacht ich probiers mal mit nem raspberry.
    ich hoffe es klappt.
    danke jedenfalls schonmal für das tutorial.

  30. Ernst Kloppenburg sagt:

    Hallo,

    im Tutorial-Text steht „und nimm möglichst keine zwielichtigen China-Teile“. Ein guter Hinweis.

    Ich möchte anregen, dann auch die Links zu Relais-Karten bei Amazon etwas zu verwenden. Aktuell verweisen sie auf Chinesische Händler, die über Amazon liefern (und sich, wie in der c’t zu lesen war, dabei an keine deutschen Standards halten müssen).

    Alternativen wären:
    http://www.watterott.com/de/4-Channel-Relay-Module-10A

  31. TimeMen sagt:

    Hey,

    Gibts in der Steuerung der GPIOs per Bash oder Python einen unterschied?
    Ich komme mit Python einfach nicht klar…
    Da würde ich eher C lernen wolle.

    Wenn ich bei uns mal ein Relais finden würde, würde ich das gerne zwischen Arduino und Stromversorgung hängen, und dann per Bash schalten. Oder notfalls mit einer Python Datei. Denn so könnte ich ganz einfach den Arduino per Datei anschalten, ihn seine Messungen machen lassen bzw. die Simulation starten, und wenn er fertig ist dann wieder per Raspi abschalten.

    LG
    TimeMen

    • Felix sagt:

      Per Bash kannst du auch GPIOs schalten. Bsp für Pin 27:

      sudo echo "27" > /sys/class/gpio/export
      echo "out" > /sys/class/gpio/gpio27/direction
      echo "1" > /sys/class/gpio/gpio27/value

      Alternativ geht es auch mit WiringPi.

  32. Axel sagt:

    Ein freundliches „Hallo“ in die Runde…

    Sehr umfangreiche und gut verständliche Infos die hier zusammengetragen wurden. Ich bin jetzt seit einiger Zeit mit 3 Raspis daheim am herumspielen und steuere bereits erfolgreich einige Dinge in meiner Haussteuerung über den Raspi.
    Aktuell möchte ich meine Lüftungsanlage automatisieren. Diese wird derzeit noch mit einem Bedienteil gesteuert, welches neben einem Ein/Aus-Schalter und einem Betriebsstundenzähler einen Drehschalter zum Wählen der Lüfterstufe enthält.
    Der besagte Drehschalter leitet eine kleine Spannung (ca. 2V) weiter. Mit dem hier besprochenen Relais bzw. seinem Bruder mit 8 Kanälen könnte ich den Schalter ersetzten und der Rest passiert in Software. Das würde ich soweit hinbekommen.
    Ich möchte jedoch hardwareseitig sicher stellen, dass niemals mehr als einer der Kanäle geschaltet ist. Der Drehschalter kann auch immer nur eine Position einnehmen und ich möchte nicht ausprobieren, ob die Steuerung ein Schalten von mehr als einem Kanal gleichzeitig überlebt.

    Ich wäre dankbar für einen Hinweis auf eine Baugruppe die sich quasi verhält wie eine Gruppe Radio-Buttons, also jeweils sicherstellt dass bei einer Betätigung zuvor der aktuell durchgeschaltete Kanal unterbrochen wird. Meine Elektronik-Kenntnisse reichen leider nicht so weit, das ich wüsste wonach ich bei Google & Co suchen müsste.
    Gibt es ein Bauteil oder eine Baugruppe die dies so leistet?

    VG,
    Axel

  33. petere sagt:

    Hallo Felix,
    wie gewohnt eine super Anleitung von dir.
    Ich möchte das Relais zum an/ausschalten einer IR-Lampe (akkubetrieben) für intervallmäßige Nachtaufnahmen nutzen. Da mein PI samt Kamera und Lichtsensor ebenfall per Akku betrieben wird, wäre es super das Relais wirklich nur dann mit Strom zu versorgen, wenn es die Lampe anschalten soll, d.h. wenn der Lichtsensor ‚dunkel‘ meldet.
    Soweit ich es verstanden habe zieht das Relais aber auch Strom, wenn es nicht angezogen ist.?
    Besteht ggf. Möglichkeit, das Relais von einem gewöhnlichen GPIO Pin (nicht VCC) aus mit Spannung zu versorgen oder ist die Pin-Leistung nicht ausreichend dafür?
    Hast du Ideen zur Umsetzung?
    Danke für deine Hilfe.

  34. petere sagt:

    Ok, danke für den Hinweis…

  35. PotPirat sagt:

    Ich würde gerne per cronjob um 6 Uhr morgens ein Relais schalten, aber nur wenn ein Schalter ein GPIO.High Signal ausgibt. ist der schalter Low soll nichts geschehen.
    Mein Code sieht bis jetzt noch sehr schmal aus:

    import time
    import RPi.GPIO as GPIO
    
    
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(17,GPIO.IN)
    GPIO.setup(27,GPIO.OUT)
    
    if GPIO.input(17,GPIO.HIGH):
    	GPIO.output(27, GPIO.HIGH) # an
    else
    	print "Fertig"

    dabei soll das gleiche script auch nochmal um 8 uhr morgens starten aber je nach dem auf welcher position der schalter steht eins von beiden starten und das andere nichts tun. wäre sehr froh über eine korrektur meines scripts. lg und danke

    • Felix sagt:

      Ich habe deinen Code im Kommentar angepasst. Was du allerdings mit „eins von beiden starten und das andere nichts tun“ meinst, verstehe ich nicht. Du hast doch nur ein Relais definiert?

  36. Jan sagt:

    Hallo Felix,
    ich würde gerne einen Türöffner bauen, den ich zusätzlich zum vorhandenen Öffnungstaster an meiner Klingelanlage nutzen kann. Die Türöffnung erfolgt mit 12V. Kann ich diese Konstellation mit den von dir angegebenen Komponenten lösen? Am liebsten wäre mir, wenn ich das Relais ohne externes Netzteil betreiben könnte.
    Bin Neuling auf dem Gebiet der Elektrotechnik und würde mich freuen, wenn du mir helfen würdest.

    • Felix sagt:

      Hallo Jan,
      ja das funktioniert. Die 12V müssen aber natürlich extern angeschlossen werden. Falls dein Relais sich nur mit 5V schalten lässt, so kannst du einen Transistor verwenden. An die Basis kommt der GPIO und an den Kollektor die 5V vom Pi. Emitter an den Relais Input und fertig.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Blog abonnieren

Abonniere Tutorials-RaspberryPi, um kein Tutorial mehr zu verpassen!