Funksteckdosen mit Raspberry Pi steuern

Inspiriert durch einen Artikel auf greinert-dud.de habe ich die folgende Schaltung entworfen, um die verbereiteten Funktsteckdosen der Marke Elro mit meinem Raspberry Pi steuern zu können:

Raspberry-I2C-Funksteckdosen-Schaltung

Zusammengebaut sieht das Ganze so aus:

Kern der Schaltung ist ein I2C IO-Expander von Typ MCP23017. Mit diesem wird der in der Fernbedienung verbaute Funkkodierer HX2262 angesteuert.

Zur Zeit verwende ich noch das Funkmodul der Originalfernbedienung. (Update: Verwendet wird jetzt dieses Funkmodul) Angschlossen sind hier nur noch Masse und der Pin DOUT des HX2262 bzw.PT2262. (baugleiche Chips) Den Chip und die meisten SMD-Bauteile habe ich ausgelötet. Dies war nötig, da die Fernbedienung und deren Funkmodul mit 12 Volt betrieben werden. Die IO-Expander MCP23017 hingegen wurde vom Raspberry nur mit maximal 5 Volt versorgt. Durch diesen Pegelunterschied von 7 Volt konnten die beiden ICs nicht mehr sauber miteinander kommunizieren. Was für den MCP23017 der logische Zustand 1 war (5 Volt), war für den PT2262 0, da relativ zu seiner Versorgungsspannung -7V.

Da sich die Ausgangsspannung des PT2262 damit auch von 12V auf 5V verringert hat, musste der Vorwiderstand für das Funkmodul verkleinert werden. Ich habe daher parallel zum vorhandenen 10 kΩ SMD-Widerstand einen weiteren 10 kΩ Widerstand eingelötet, der auf dem Bild deutlich zu erkennen ist.

Anschluss des Raspberry Pis

Die Anbindung der Platine an den Raspberry Pi erfolgt über ein 26-poliges Flachbandkabel. Relevant für die hier beschriebene Funktion sind auf Seite des Raspberrys aber nur die folgenden Pins:

  • Pin 2 +5V
  • Pin 3 SDA (I2C)
  • Pin 5 SCL (I2C)
  • Pin 6 Masse

SDA und SCL müssen mit den entsprechenden Pins des MCP23017 verbunden werden.

MCO23017 und Raspberry Pi

Verbinden der beiden ICs

Die folgende Tabelle zeigt die Verbindungen zwischen den ICs:

 Funktionsweise der Elro Steckdosen

Die Elro Steckdosen nutzen eine Tristate Logik. Neben den bekannten digitalen Zuständen 0 (Masse) und 1 (VCC) wird ein hochohmiger Zustand (X) verwendet. (Als wäre der betreffende Pin nicht angeschlossen) Es gibt jeweils einen Eingang für die Schaltzustände An oder Aus sowie für jeden der adressierbaren Schalter.

Der Standardzustand an allen Eingängen ist X. Bei einem Schaltvorgang werden die beteiligten Eingänge auf 0/Masse geschaltet.

Um z.B. Steckdose A einzuschalten, werden die Eingänge A10/D1 und A5 auf Masse gelegt. Der HX2262 Chip wandelt diese Schaltzustände dann in ein serielles Signal um, das dann über den Pin DOUT an das Funkmodul übertragen wird. Die Übertragung findet jedoch erst statt, wenn auch der Pin /TE mit Masse verbunden wird.

Zusätzlich wird über die Pins A0 bis A4 die Hausadresse festgelegt. Die werksseitig eingestellte Adresse lautet 11111. Dies bedeutet, dass alle 5 Pins auf Masse gelegt sind. Durch die Ansteuerung dieser Pins mit dem IO-Expander kann die Hausadresse dynamisch geändert werden. Es können also 32 Hausadressen mit jeweils 5 Steckdosen adressiert werden. Insgesamt können so 160 Geräte geschaltet werden.

Damit die Übertragung nicht schon während der Initialisierung des IO-Expanders beginnt, steuere Ich den /TE Pin mit einen NPN-Transistor an (Q1, Typ BC547A). So wird der Schaltzustand 1 auf dem verbundenen Ausgang GPB7 des IO-Expanders benötigt, um die Übertragung zu starten.

In meinem nächsten Artikel erläutere ich die nötigen Vorbereitungen am Raspberry.

4.80 avg. rating (95% score) - 5 votes

28 Gedanken zu “Funksteckdosen mit Raspberry Pi steuern

  1. Pingback: Vorbereiten des Raspberry Pi auf I2C | G-SURF

  2. Pingback: Preiswertes 433,92 Mhz Funkmodul für Raspberry Pi | G-SURFG-SURF

  3. Pingback: Raspberry Pi: MCP23017 I2C IO-Expander mit Python steuern | G-SURFG-SURF

  4. Pingback: Raspberry Pi: MCP23017 für die Steuerung von Funksteckdosen | G-SURFG-SURF

  5. Hallo

    Coole Sache…ich wollte mir für Zuhause für mein Gira System auch so was bauen, so dass ich die Jalousetten über mein Rassberry steuern kann. Wo bekommt man denn die Codes für Gira her, also woher weiß ich was ich dem Funksender für Mitteilungen für die Jalousien Aktoren mitgeben muss?

    Bin das recht neu in dem Thema und kenne daher die ganze Technik der Funkübertragung und Codierung nicht…

    Thx Matze

  6. Ich habe mich in diesem Fall nicht mit den Funksignalen beschäftigt. Das nimmt mir alles der HX2262 aus der Fernbedienung ab. Im Endeffekt schaltet man seine Pins auf 0 oder 1 (oder hochohmig) und der IC wandelt die anliegenden Pegel in ein serielles Signal um. Dieses Signal wird dann auf das Funkmodul gegeben und zum Empfangsmodul auf der Gegenseite übertragen. Dort wandelt ein anderer IC das Signal wieder in entsprechende Zustände seiner Pins um. Wie genau das Signal zwischen Sender und Empfänger aussieht, musste ich für diese Lösung nicht wissen.
    Wenn du das Funkmodul direkt mit dem Raspberry Pi ansprechen willst (Stichwort Bitbanging), muss dir das verwendete Protokoll komplett bekannt sein. Entweder du greifst das Signal vor dem Sendemodul mit einem Oszilloskop ab, oder du findest die entsprechenden Informationen im Netz. Eine bessere Lösung fällt mir da spontan nicht ein.

  7. danke für die schnelle Antwort…ich glaube ich muss mich erst einmal in das ganze Thema einlesen, bevor ich anfang 😉

    Falls ich mal Zeit finde und was schaffe melde ich mich und teile meine Erfahrungen…auf Dauer will ich von meinem Handy aus (über Rassberry) oder zeitgesteuert die Jalousien steuern können…

    Mal sehen was die Zeit bringt…

    Thx Matze!

    • Ich denke so schwieirig wird das Ganze gar nicht werden. Du bist vermutlich nicht der erste, der sich mit dieser Problemstellung beschäftigt.
      Das Schalten per Handy oder Zeitsteuerung kannst du relativ problemlos mit openHAB realisieren. Zur Ausführung von zeitgesteuerten Jobs habe ich da gerade einen Artikel in Arbeit. 😉

  8. Pingback: Raspberry Pi « Frackmente

  9. Hi,
    bin auch dabei den i2c-Anschluss des raspberry pi zu verwenden.
    Eines ist mir unklar: Ich hab irgendwo gelesen die IO-Ports am Raspberry
    – also auch die I2C-Ports ?? – vertragen nur 3,3V.
    Klappt das mit dem IO-Expander, der ja vom Raspberry 5 V bekommt?
    Dann hat doch der Expander am I2C-Bus 5V und der Raspberry 3,3 V ???

    • Die Frage ist auf jeden Fall berechtigt. Der Raspberry verfügt über interne Pullup-Widerstände, die den I2C-Bus mit 3,3V versorgen. Bei der Datenübertragung über den Bus zieht der sendende Teilnehmer diesen auf 0 herunter. (pulldown) Der RPi wird also vom MCP23017 nicht mit 5V angesteuert. Du solltest aber auf keinen Fall den Bus über externe Pullups mit 5V versorgen. Dann könnte dein Raspberry Pi schaden nehmen.

      Gruß

      Jan

      • Der MCP23017 hat dann wohl an SCL und SDA keine Pull-Ups? Kenne das Teil nicht, habe mir aber vorhin noch das Datenblatt angesehen – leider keine Info über Pull-Ups darin gefunden?!
        Aber das Teil läuft ja auch mit 3,3 V ! Aber wirklich nicht einfach zu bekommen.
        Ich wollte eigentlich einen PCF8574 verwenden. Läuft auch mit 3,3 V, hat aber nur 8 IO-Ports.

  10. Hallo,

    zunächst dickes Thumb-Up für das ausführliche Tutorial! Bin gerade selber dabei das nachzubauen, muss aber noch einiges besorgen. Wenn ich Deinen obigen Schaltplan mit dem Foto Deiner Platine vergleiche, vermisse ich die beiden Kondensatoren (link vom MCP23017 und über dem PT2262). Gleichermaßen den 2,2k Widerstand zwischen VDD und Reset am MCP23017. Wäre spitze wenn Du dahingehend aufklären könntest. 🙂

    Liebe Grüße!

      • Danke! Ich habe nach zig „unterschiedlichen“ Anleitungen im Netz versucht, den mcp23017 zur Zusammenarbeit zu überreden – und ihn nicht ein Mal auch nur im i2cdetect zu Gesicht bekommen. Ein 2k2 und zwei 100nF später ist er nun endlich da!

  11. Pingback: Raspberry Pi und Funktsteckdosen: Leserbeitrag | G-SURF

  12. Pingback: Raspberry Pi: rcswitch-pi und openHAB | G-SURF

  13. Ich verwende diese Schaltung hier über USB am RPi:
    http://www.maltepoeggel.de/?site=usbfunk

    Damit lassen sich nicht nur ELRO Funksteckdosen sondern auch Düwi und Intertechno ansteuern. Der Bauteilaufwand ist auch sehr gering und mit dem Konsolentool ist in wenigen Minuten eine Zeitschaltuhr per Cronjob gebastelt. Und die originale Fernbedienung bleibt ganz 🙂

    • Nettes Projekt. Auf dem Raspberry Pi lohnt aber der Aufwand nicht, da man ein entsprechendes Funkmodul auch direkt ansteuern kann. Der ATMega mit Software USB-Stack usw. ist daher überflüssig. Siehe auch hier.

      • Habe gerade mal einen Blick in die Sourcen zu rcswitch geworfen. Zur Generierung des Funkprotokolls wird da einfach delayMicroseconds() benutzt. Ich könnte mir vorstellen, da Linux ja nun kein Echtzeitbetriebssystem ist, das je nach CPU Auslastung ein wenig Jitter entsteht was sich womöglich in der Zuverlässigkeit des schaltens wiederspiegeln könnte. Deshalb finde ich die I2C oder aber USB Lösung besser auch wenn es mehr Aufwand ist. Der PT2262 oder die Interrupts im AVR garantieren ein zuverlässiges Timing. Vielleicht könnte man auch mit einer Kombination aus beidem den AVR Microcontroller über I2C ansprechen, und der generiert gleich das Funkprotokoll 🙂

          • Dein _delay_us() auf dem Microcontroller garantiert dir aber auch immer die selbe Zeit, da der Mikrocontroller kein Multitasking macht wie der RPi. Der Linux Kernel sieht den Delay und wechselt womöglich den Task um in der Zeit etwas anderes auszuführen, was heißt das delayMicroseconds() mit dem selben Parameter nicht zwingend um die selbe Zeit verzögert, je nachdem was die CPU des RPi noch so zu tun hat.

            Und in der USB Lösung dort wird ja sowohl der USB Stack als auch die Generierung des Protokolls per Timer Interrupt schon realisiert. Hatte damit auch noch nie Aussetzer. Das Ding fix auf I2C umgeschrieben und USB wäre wieder für andere Spielereien frei. Andererseits… Never change a running system 😉

  14. Raspberry Pi: Einfacher Schreibzugriff mit SPI und Python
    #!/usr/bin/python
    import os
    from time import sleep
    device=’/dev/spidev0.0′
    devaddr=0x40 usw.

    Hallo , ich will die Register des mcp23s17 mit read(device) lesen. Funktioniert aber nicht. Wo liegt da der Fehler ?

    Gruß und Danke

Schreibe einen Kommentar zu JG Antworten abbrechen

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

Spamschutz * Time limit is exhausted. Please reload the CAPTCHA.