Wer mehrere oder ein größeres Projekt hat, wird schnell feststellen, dass die GPIO Pins des Raspberry’s schnell zu wenig werden. Für all jene wird in diesem Tutorial gezeigt, wie man mittels eines I2C Port Expander sehr einfach die GPIO Pins um ein vielfaches erhöhen kann.
In manchen Situationen kann es vorkommen, dass man mehr GPIO Pins benötigt, als es Ausgänge hat und man an die physikalischen Grenzen stößt. Doch dafür gibt es die sehr nützlichen Port Expander. Auf die Benutzung einer dieser gehen wir in diesem Beitrag näher ein.
Zubehör & Allgmeines
Für dieses Tutorial benötigst du folgendes Zubehör:
- MCP23017
- LEDs (am besten in verschiedenen Farben)
- einen Taster
- Widerstände
- Breadboard
- Jumper Kabel
Zu erst einmal der Aufbau der Mikrochips:
Wie man sieht sind die Unterschiede minimal, für dieses Tutorial ist es egal, welcher verwendet wird.
Vorbereitung
Eine kleine Erklärung der wichtigsten Pins:
- GPA0-7 und GPB0-7 sind die GPIO Pins
- A0, A1, A2 werden an + (3.3V) bzw. – (GND) angeschlossen und legen intern den Namen fest. Sind mehrere Port Expander angeschlossen, muss jeder dadurch eindeutig identifizierbar sein. Beim ersten I²C würde man alle an GND anschließen, beim nächsten A0 an 3.3V und die beiden anderen an GND. Beim dritten a! an 3.3V und die anderen zwei an GND usw. Es ist also mögich bis zu 2³ also 8 Port-Expander anzuschließen.
- VDD (Pin 9) bekommt die Eingangsspannung (3.3V)
- VSS (Pin 10) wird an GND angeschlossen
- SCL (Pin 12) wird an den GPIO Pin 5 des Pi’s angeschlossen
- SDA (Pin 13) wird an den GPIO Pin 3 des Pi’s angeschlossen
Dementsprechend habe ich eine kleine Schaltung mit 3 LEDs gebaut (als Vorwiderstände 330Ω).
(Den Taster benötigen wir erst in Teil 2 des Tutorials.)
Als erstes muss nun im Pi die Ntzung des I2C freigeschaltet werden.Am einfachsten geht dies mittels
sudo raspi-config
Unter „Advanced Options“ > „I2C“ wird es aktiviert.
Bei älteren Raspbian Versionen muss man zusätzlich eine Datei bearbeiten
sudo nano /etc/modules
und fügt an das Ende diese beiden Zeilen an:
i2c-bcm2708 i2c-dev
Mit STRG + O und STRG + X speichern und beenden.
Jetzt müssen die Module aus der Blacklist Datei genommen werden, da sie sonst nicht funktionieren.
sudo nano /etc/modprobe.d/raspi-blacklist.conf
und vor die beiden Einträge eine Raute # setzen.
#blacklist spi-bcm2708 #blacklist i2c-bcm2708
Erneut mit STRG + O und STRG + X speichern und beenden.
Damit wir den I2C nun auch ansprechen können, müssen wir noch ein paar Pakete installieren.
sudo apt-get install python-smbus i2c-tools
Anschließend den Pi noch herunterfahren, einige Sekunden warten und vom Strom trennen.
sudo shutdown now
Hardware testen
Nachdem alles angeschlossen ist und alle Verbindungen nochmals überprüft worden sind, starte den Pi und warte bis er hochgefahren ist.
Ich nutze einen Raspberry Pi Rev.2, daher teste ich es mit
sudo i2cdetect -y 1
Wer einen Pi Rev.1 hat, muss anstelle der 1 eine 0 eingeben.Die Ausgabe sieht folgendermaßen aus:
pi@raspberrypi ~ $ sudo i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: 20 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --
Unter der Adresse 0x20 (hexadezimal) befindet sich also der I2C. Wäre A2 z.B. an 3.3V angeschlossen (A1 und A0 an GND), so wäre er unter der Adresse 0x24 ansprechbar. Das ist, wie bereits erwähnt, wichtig, wenn man mehrere Port Expander angeschlossen hat, um sie eindeutig ansprechen zu können.
Um die LEDs anzusprechen, müssen die Ports entweder als Input oder Output deklariert werden (Rev1 Benutzer bitte wieder anpassen).
sudo i2cset -y 1 0x20 0x01 0x00
Ich gebe ein paar Beispiele, die erläutern, wie der Befehl funktioniert:
i2cset -y 1 0x20 0x01 0x00 #alle Pins von GPB sind Output i2cset -y 1 0x20 0x01 0x04 #GPB2 ist Input, der Rest von GPB Output (da 0x04 in binär 00000100) i2cset -y 1 0x20 0x00 0x80 #GPA7 ist Input, der Rest von GPA Output
Als erstes wird also die Adresse angesprochen, die man mittels i2cdetect herausgefunden hat. Der zweite Wert ist in dieser Tabelle (aus dem Datenblatt):
Nachdem wir also die Richtung (IODIRB) angegeben haben (0 = Output, 1 = Input), wollen wir die drei LEDs leuchten lassen (Binär 00000111 = 0x07):
sudo i2cset -y 1 0x20 0x15 0x07
Würden wir die GPA Pins benutzen, stände statt 0x15 eben 0x14.
Damit die LEDs aufhören zu leuchten, müssen wir den Pegel der Pins wieder auf 0 setzen:
sudo i2cset -y 1 0x20 0x15 0x00
Im nächsten Tutorial schreiben wir ein Skript, dass automatisch auf die Pins zugreift und lesen Input Werte ein.
60 Kommentare
Guten Tach,
sehr schönes Tutorial! Kompliment!
Da ich leider nur sehr begrenzte Kenntnisse im Bereich Elektronik besitze, habe ich da eine Frage:
sudo i2cset -y 1 (1) 0x20 (2) 0x15 (3)0x07
(zur besseren Orientierung habe ich die Zahlen in den Klammern hinzugefügt)
Also (1) gibt die Adresse des Slave an (zu finden mit „sudo i2cdetect -y 1“)
(2) ist die „HEX“-Adresse der Zeile, die aussagt, was passieren soll (15=OLATB ==>Zustand der B-Pins soll verändert werden).
(3) in welchem Zustand die Pins, nach dem Kommando sind ( 07 in HEX-Rechner => 111 = 00000111 => GPB 0 – GBP 2 auf High, GBP 3 – GBP 7 auf LOW)
So, wie ich das gerade schreibe, und dabei nochmal dein Tutorial lesen, klingt das irgenwie logisch(für mich). Eventuell sitze ich auch einfach nur lange genug dran, um mir mein Geschreibsel schön zu reden 😉
Kannst Du mir bitte sagen, ob ich richtig stehe und das Licht an geht, oder nicht?
Vlt. könntest Du dem Tutorial noch ein paar mehr Beispiele hinzufügen, damit so Knalltüten wie ich, das noch besser verstehen?
Danke, und schöne Grüße,
Rogon….
Hi Rogon,
vielen Dank für das Lob 🙂
ja deine Ausführung stimmt soweit. Was ist noch genau unklar? Waren die 3 Beispiele nicht hilfreich? Verbesserungsvorschläge sind immer willkommen.
LG Felix
Hallo Felix,
zunächst einmal vielen Dank, für die schnelle Antwort.
—!!!Heureka!!!—
Unklar ist eigentlich nichts, ich habs dann ja doch verstanden.
Bei der Elektrik ist bei mir so:
Ich sitze in einem dunkeln Raum. Jemand gibt mir einen Würfel in die Hand, und erst wenn er das Licht anschaltet, glaube ich auch wirklich, dass es ein Würfel ist.
Also Unsicherheit auf Grund völliger Unkenntnis.
Deine Tutorials sind super! Kurz, knapp und knackig und am Ende funktioniert es sogar auch noch 😉
Vergiss bitte die Bemerkung mit den zusätzlichen Beispielen…
Zu leicht soll man es auch nicht machen, ein bisschen muss der Grips schon arbeiten.
Werde, aus Freude, jetzt erstmal ne Runde mit den LED´s blinken 😉
Nochmals vielen Dank für Deine Hilfe. Keep on running…
LG Rogon…
Hi Rogon,
nochmal danke für das Lob! Freut mich, dass es dir gefällt.
Sollte bei irgendeinem Tutorial etwas unklar sein, schreib es in die Kommentare oder mir per Mail. Ich versuche so schnell es geht zu antworten.
LG Felix
Hallo,
ich habe das Problem, dass der Chip im Pi nur ganz kurz sichtbar ist. Wenn ich versuche zu schreiben kommt nur Error: Write failed
wenn ich im 0,5s Takt den Befehl sudo i2cdetect -y 1 ausführe wird nur in 10s einmal die 20 in der „Tabelle“ angezeigt, ansonsten wieder nur die — .
Ich habe schon überprüft, ob nicht ein Kurzschluss oder manche Pins ausversehen verbunden werden, aber das ist nicht der Fall. Habe auch den Chip ausgewechselt, jedoch bleibt das Problem bestehen
Was mache ich hier falsch? :/
Wenn du den IC schon gewechselst hast, kann man einen Defekt davon ausschließen. Es muss also entweder an der Verkabelung oder am Pi.
Du könntest z.B. nochmal ein sauberes Image probieren, vielleicht hast du etwas installiert, was Konflikte verursacht.
Das Problem hatte ich auch.
In meinem Fall musste ich einfach ganz fest auf den Chip drücken (obwohl er meiner Meinung nach bereits richtig drin war).
Ich benutze ein Breadboard, aber die Beinchen von dem Chip sind halt kürzer als gewöhnliche Kabel, daher muss man da wohl einfach fest drücken.
Jetzt funktioniert es jedenfalls. 🙂
Ok, ich ziehe das mit dem Wackelkontakt zurück.
Es ist wie beim Kommentar von Stefan: Die RESET-Leitung muss auf VDD stehen, sonst kommt es manchmal spontan zu einem Reset und es klappt dann nichts mehr!
In der Anleitung des Microchips ist die Signalrichtung der RESET-Leitung falsch eingezeichnet (der Pfeil müsste in Richtung des Microchips zeigen). Im beschreibenden Text dazu im Datenblatt ist es aber richtig (must be externally biased).
hallo,
bei mi funktioniert es nicht. Er zeigt mir keinen angeschlossen IC an in der Tabelle.
habe alles genauso wie gesagt gemacht.
bitte um Hilfe^^
Moin moin, also ich muss die ganzen Tutorials hier auch mal loben und den Verfasser. Ich vermute mal das Felix derjenige ist der hier immer schnellstmöglich alle Fragen beantwortet und die Tuts einstellt. Vielen Dank dafür.
Ich hätte allerdings auch mal wieder eine Frage zu der Schaltung. Wie kann ich einen einzelnen PIN wieder auf 0 setzen? Mit 0x20 0x15 0x08 kann ich PIN 4 direkt auf 1 setzen, aber wie kann ich den jetzt wieder 0 setzen ohne die anderen PINs der Bank anzusprechen? Mit 0x20 0x15 0x00 werden ja alle pins auf 0 gesetzt.
Gruß
Holger
Hallo Holger,
vielen Dank für die lieben Worte 🙂
Es gibt zwei Möglichkeiten: Entweder du schreibst eine Funktion, der du einen Pin und den Zustand angibst, allerdings diese deren Zustände vorher ausließt (falls Output) und entsprechend wieder setzt. Dann änderst du nur den Wert des Pins, der angegeben wurde und setzt die ganze Reihe.
Der „einfachere“ Weg ist eine Bibliothek zu nehmen, wie z.B. diese hier: https://github.com/adafruit/Adafruit-MCP23017-Arduino-Library
Ich vermute, dass die dortigen Funktionen ebenfalls alle Ports gleichzeitig ansprechen, aber eben die Werte vorher auslesen.
Hi Felix, danke für den Tip. Ich denke ich werde es selbst auslesen und dann neu schreiben. Habe ich gerade schon einmal versucht und hatte die Befürchtung, dass es bei den Pins wo es keine Änderung gibt, eine kurze Unterbrechung gibt. Augenscheinlich ist dies aber nicht so. Gemessen habe ich es allerdings noch nicht 😀
Gruß
Holger
Hallo,
ich habe da auch ein Problem. Und zwar lief bis gestern noch alles reibungslos. Nun habe ich heute 2 weitere Boards angeschlossen und seit dem kann ich keinen i2c Port mehr schalten. Er lässt sich zwar über Putty schalten aber das Relay Board reagiert nicht. Hast du eine Idee woran es liegen könnte?
Das ist der Code mit dem ich es vorhin nochmal versucht habe:
i2cset -y 1 0x20 0x12 0xFF
Er soll alle Port A Pins des ersten Boards einschalten.
Hoffe du kannst mir helfen.
Ansonsten ein sehr gutes Tutorial 😉 Alles sehr gut erklärt !!! TOP-Arbeit!
Danke für deine Hilfe und das Tutorial.
Hallo Manuel,
da du die Adressen manuell einstellen musst (Binär durch Anschluss an Plus/Minus), müssen diese natürlich für alle drei unterschiedlich sein (Pins A0, A1, A2). Hast du das beachtet? Im Beispiel sind alle 3 auf Minus, d.h. binär 000 (=dezimal 0). Du solltest einen auf 001 (=dezimal 1) und einen auf 010 (=dezimal 2) setzen.
LG Felix
Hi Felix,
danke für deine schnelle Antwort. Ich habe allerdings das 16 Port I2C Board:
https://www.pi-supply.com/product/quick2wire-raspberry-pi-i2c-mcp23017-port-expander-board-kit/
und habe dazu dieses Relay Board:
http://www.avc-shop.de/epages/64272905.sf/de_DE/?ObjectPath=/Shops/64272905/Products/RELM-16
Aber wieso funktioniert es auf einmal nicht mehr wenn es doch vorher einwandfrei funktioniert hat.
LG,
Manuel
Solange du nur einen angeschlossen hast klappt es, aber sobald du mehrere dran hast nicht mehr? Wahrscheinlich weil sie die gleiche Adresse haben, was nicht sein darf. Sind auf dem Board die Dipschalter für die Adressierung?
Edit: Kurz ins Datenblatt geschaut und ja, das sollte die Adressierung sein.
HI! Danke für das Tutorial! Wenn ich das jetzt richtig verstehe müsste ich wenn ich diese Art von Pin Erweiterung benutze auf Dauer alles auf Platinen löten, richtig? Kennst du evtl. noch andere Möglichkeiten die vll. ähnlich klein sind aber ohne Löten auskommen?
Viele Grüße, Sebastian
Hi Sebastian,
ich löte eigentlich nur, wenn ich sicher bin, dass es dauerhaft so bleiben soll.
Fürs experimentieren benutze ich kleine oder große Breadboards.
hallo wenn ich das ganze probiere mit
sudo i2cdetect -y 1
bekomme ich eine fehlermeldung:
Error: No i2c-bus specified!
Usage: i2cdetect [-y] [-a] [-q|-r] I2CBUS [FIRST LAST]
i2cdetect -F I2CBUS
i2cdetect -l
I2CBUS is an integer or an I2C bus name
If provided, FIRST and LAST limit the probing range.
was mache ich nur falsch? hbe alles schritt für schrit so gemacht 🙁
Hast du auch in der raspi-config I2C freigeschaltet?
Also bei mir scheint das i2cdetect nicht zu funktionieren. Die Ausgabe mit -y 1 bzw. 2,3 ist „error Could not open file. … no such file or directory „
Welches Raspberry Pi Modell hast du und wofür soll 2,3 stehen? Klingt sehr danach, dass die Installation nicht (vollständig) geklappt hat.
Ich habe auch diese meldung. habe den pi2
habe aber eig alles befolgt was hier steht, wie kann ich den Fehler finden?
Error: No i2c-bus specified!
Usage: i2cdetect [-y] [-a] [-q|-r] I2CBUS [FIRST LAST]
i2cdetect -F I2CBUS
i2cdetect -l
I2CBUS is an integer or an I2C bus name
If provided, FIRST and LAST limit the probing range.
Welchen Befehl hast du eingegeben?
Schau dir auch das mal an: https://www.raspberrypi.org/forums/viewtopic.php?t=74763
ich habe „sudo i2cdetect -y0“ sowie mit „-y1“ getestet.
meine blacklist ist komplett leer, keine einträge.
i2c tools auf auf neuster version.
python-smbus auf neuster version.
die datei /etc/modules hat in den letzten beiden zeilen den diese befehle „i2c-bcm2708
i2c-dev“
Dazwischen muss ein Leerzeichen:
sudo i2cdetect -y 1
leerzeichen war vorhanden
doch nicht^^
es geht
unter lsmod
ist i2c_dev sowie i2c_bcm2708 geladen.
spi_bcm2708 ist nicht geladen, aner benötige ich auch nicht oder
howdy-ho
das tutorial ist jetzt zwar schon ein wenig älter.. aber obwohl ich es haarklein befolgt habe und sogar exakt den selben expander-chip verwende, habe ich nur probleme..
auffällig hierbei ist folgendes:
– beim i2cdetect tauchen „UU“s auf.. nach recherchen handelt es sich hier um reservierte adressbereiche die allerdings nicht mit dem 0x20 kollidiern..
– durchschnittlich jedes dritte mal beim verwenden eines der i2c befehle, gibts probleme.. soll heißen.. beim i2c detect wird der 0x20’er nichtmehr gefunden.. oder beim setzen der pins, oder setzen als input/output wird nen error beim write rausgehaun
– hin und wieder wirkt es auch so beim setzen der pins.. als wäre dort ein kurzer.. sowohl die powerLED am PI als auch eine kontroll LED die ich angebracht habe, ist für den bruchteil einer sekunde aus.. allerdings für so kurze zeit das das board normal weiterläuft und alles..
– voller zuversicht hatte ich natürlich direkt 2 chips verkabelt.. die adresse war(wenn es mal angezeigt wurd) 0x22.. wenn ich raten müsste würde ich sagen das 0x21 der erste ist.. und 0x22 der zweite.. während 0x20 vlt. sogar beide gleichzeitig anspricht??
da ich echt am verzweifeln bin(da es bei etlichen anderen leuten scheinbar problemlos funktioniert) und mir nicht ein chip nach dem andern(oder das PI selbst) zerschießen will.. brauch ich also echt unterstützung und wäre extrem dankbar..
Hey,
kannst du einen Wackelkontakt ausschließen? Das Problem sagt mir in der Form leider nichts, ich selbst hatte es noch nicht und bisher wohl auch keiner der das Tutorial befolgt hat.
Die Adresse (0x20) gibst du – wie im Tutorial beschrieben – mit den drei A0-A2 Kontakten an. Möchtest du einen Chip mit der Adresse 0x22 ansprechen, so muss A0 und A2 an GND aber A1 an 3.3V.
Ich würde dir wirklich gerne besser helfen, aber das klingt sehr merkwürdig. Klappen denn andere I2C Anwendungen bei dir (gibt einige Tutorials hier mit I2C)?
das mit der pin adressierung hab ich soweit schon verstanden.. und der 0x22 wurd ja auch angezeigt als ich , wie beschrieben , voller zuversicht direkt zwei chips angestöpselt habe..
wackelkontakt kann ich ziemlich gut ausschließen.. zudem ich das problem(mit dem das er mal angezeigt wird und mal nicht) auch habe wenn ich definitiv außer reichweite bin um an dem raspi irgendwas zu bewegen..
ich würde das ganze gerne mit fotos mit dir abgleichen.. in skype/steam heiß ich ebenfalls „sgtigram“.. ansonsten kannst du mich gern mal unter der hinterlegten email anschreiben
grüße
– sgtigram
Erstmal muss ich sagen dass das Tutorial großartig ist allerdings verstehe ich nicht wie ich 4 Expander anschließen kann. Könntest du oder wer anderes mir das nochmal erklären? Eventuell mit einem Bild der Schaltung?
Du hast doch die Pins A0, A1 und A2. Jeder dieser Pins kann entweder Zustand AN oder Zustand AUS haben (=ein Bit). Wir haben also 2^3 = 8 Möglichkeiten eine Nummer zu vergeben, sprich du kannst bis zu 8 Expandern eine eindeutige Nummer zuweisen.
Schau dir am besten mal das Binärsystem genauer an.
Okay, das habe ich verstanden aber der Pi hat ja nur 2 I2C Anschlüsse, dann ist es doch nicht möglich 4 Expander anzuschließen. Sorry, wenn ich das nicht verstehe aber ich kenne mich damit nicht wirklich aus…
Der I2C ist ein Bussystem. Alle Expander hören also immer zu, reagieren aber nur auf ihre Adresse. D.h., dass alle Expander quasi parallel angeschlossen werden.
Vielen Dank für die ausführliche Beschreibung! Funktioniert fehlerlos.
Für die Besitzer des Raspi 3 ist es noch einfacher: In den Einstellungen – I2C aktivieren.
Dazu noch ein Tip falls Python (3) den Import des smbus Moduls verweigert:
sudo apt-get install python3-smbus
Eine Frage habe ich noch:
Sollte man an den Ausgängen zum Schalten von 8 Relais (Relaiskarte) noch ein ULN2003 anhängen oder schafft das die 5V Leitung des Raspi’s ?
Müsstest du mal schauen, wie viel Strom das 8er Relais braucht. Mit gutem Netzteil kann der Pi einige Hundert mA über den 5V Anschluss abgeben.
Hallo Felix,
Danke für den tollen Artikel, via einer I2C Verbindung kann ich also max. 8 MCP23017 Bausteine ansteuern, die ich durch A0, A1, A2 adressiere.
Ich möchte mehrere MCP23017 auf einer Leiterplatte unterbringen. Auf der einen Seite in Verbindung mit dem Raspberry über den I2C, GND, und 3,3 V Anschluss, auf der anderen Seite via Anschlußklemmen zum Schalten von Relais.
Hast Du oder hat jemand einen Tipp, wie ein Platinenentwurf für 2 oder 1 MCP23017 auf einer Platine aussehen muß. Wie wäre ein kreuzungsfreier Entwurf oder gibt es so etwas zum Kaufen.
Vielen Dank, André
Hey, als erstes Kompliment für die vielen Ideen und Anregungen auf dieser Website. Ich habe mich hier mal querbeet durchgelesen aber eine Sache habe ich noch nicht explizit gefunden: Wie schließe ich andere Geräte an den Pi an, die mehr Spannung brauchen als die GPIOs zur verfügung stellen? Da geht die eigentliche Stromversorgung nicht mehr über die GPIOs sondern über eine externe Quelle, zB Batterien und ich weiß nicht wie man die mit dem Pi verbindet. Und/oder gibt es sonst eine möglichkeit, solche Motoren mit einer Powerbank zu verbinden, zwecks einfacherer Lagerung?
Gruß, Aaron
Hi Aaron,
wenn mehr Strom bzw. Spannung gebraucht wird, muss natürlich eine externe Quelle genutzt werden.
Bei Motoren kannst du auf Treiber Boards / ICs zurückgreifen, welche es sehr einfach machen: Raspberry Pi Schrittmotor ansteuern mit L293D / ULN2003A
Hey Felix,
erstmal vielen vielen Dank und zwar für alle deine Tutorials.
Ich sag mal leise mein kleines Projekt baue ich quasi auf deinen Tutorials auf ;-).
So nun habe ich aber ebenfalls eine kleine Frage:
Ich möchte gerne das KeyPad (4×4) via dem MCP betreiben.
In deiner KeyPad Datei / Script wird via GPIO die jeweiligen Eingänge auf pull up bzw. down gelegt.
Abwechselnd für row und für col um festzustellen welche Taste betätigt wird.
Nun ich wollte jetzt nicht die ganze KeyPad Datei umschreiben.
Gibt es einen einfachen Ansatz das via MCP zu realisieren?
Vielen Dank schon mal für deine Mühen und nochmals Vielen Vielen Dank für die Tutorials.
Gruß
Alex
Hallo Felix,
Also ich habe nun, wie manch anderer, ebenfalls meine Gedanken weiter schweifen lassen.
Ich würde sagen das es vermutlich mit bus.write_byte_data(DEVICE,GPIOA,1) [aus Tutorial 2 erweitert] klappen könnte …..
Liege ich damit falsch ?!?
Ja, du kannst mit read und write ja die zusätzlichen Pins auslesen und beschreiben. Das müsstest du allerdings im Code der Keypad Matrix anpassen.
PS: Danke für das Lob 🙂
Hi Felix
wie auch alle die Anderen eine super Beschreibung. Es funktioniert bei mir auch so wie du beschrieben hast, nur nach einiger Zeit kann ich den MCP nicht mehr ansprechen und er hat die gesetzten Bits vergessen? Ich habe die Verkabelung mehrfach kontrolliert. Wenn ich den Raspi neu starte geht alles wieder und dann nach eine halben Stunde oder so geht nix mehr.
Hast du eine Idee. PS ich habe schon 2 mal den MCP gewechselt.
Hallo,
erstmal vielen Dank für die tolle Anleitung.
Eine Frage bezüglich der 3,3V Versorgung. Der MCP23017 kann ja auch problemlos an einem Arduino mit 5V betrieben werden. Wenn ich nun gerne 5V Ausgangssignal am Pi hätte könnt ich den MCP23017 doch einfach mit 5V statt 3,3V versorgen.
Damit der I2C Bus am Pi dann nicht zu viel Spannung vom MCP23017 bekommt kommt vor dem Pi ein Pegelwandler in den I2C-Bus. (z.B. der hier: http://bit.ly/2xXZEiN )
Funktioniert das so ohne das etwas kaputt geht?
Solange die GPIOs max. 3.3V abbekommen, ist das möglich.
Hallo Felix…
Kann man die Pins des Expanders auch noch anders ansprechen als mit den Hex Adressen?
Ich hab da so verständnisprobleme..
Mein Ziel ist es (um einbeispiel zu nennen) eine Reihe von Relais / Schützen anzusteuern & über nen Eingang abzufragen ob das betreffende Element tatsächlich geschaltet hat (könnte ja auch defekt sein)
Ich versuche also sowas wie
if GPA00 == high -> GPB00 = high
if GPA01 == high -> GPB01 = high
(alle GPAxx sind Eingänge, alle GPBxx sind Ausgänge..)
In dem Beispiel ist ein Schalter am Eingang GPA00, die Spule eines Relais an GPB00 (natürlich über nen Transistor), ein schliesserkontakt des ersten Relais am Eingang GPA01
Eine weitere Spule eines anderen Relais an GPB01
Dazwischen dann noch diverse Zeitfunktionen etc…
Und so weiter…
Mein Problem ist nun das Relais Nr.1 auf keinen Fall abfallen darf auch nicht wenn Relais 73 noch geschaltet werden muss…
Ich hoffe ich könnte das einigermaßen verständlich rüberbringen…
Gruß Skipper
Die grundsätzliche Kommunikation findet über die Hex Adressen stat. Es gibt allerdings auf Github o.ä. auch Bibliotheken, die ein Mapping vornehmen, was es ein wenig einfacher zu schreiben macht. Vielleicht ist das etwas für dich?
Hallo Felix,
Das könnte tatsächlich helfen..
Welche Bibliotheken sind das denn?
LG Skipper
Kann dir keine konkreten nennen (benutze sie nicht), aber weiß, dass es auf Github einige dazu gibt (in verschiedenen Sprachen). Einfach mal stöbern.
Hallo, klasse Anleitung! Im Text fehlt leider der Hinweis, dass die Reset-Leitung auf 5V (bzw. Vdd) liegen sollte (im Schaltplan ist es korrekt). Hat mich eine gute Stunde gekostet… 😉
Ich habe bereits eine Z-Wave Karte an den oben genannten Pins angesteckt. Läuft eine I2C Karte paralell zum Z-Wave Modul oder kann ich mir die Anschaffung sparen?
Hi! Ich komme derzeit immer mehr bei dem Thema Raspi und den tollen Möglichkeiten des Raspis an. Warum gibt es sowas nicht schon länger. Deine Seite ist auch super, ich habe hier schon einige Ideen gesammelt und Verständnis über die Gesamtzusammenhänge bekommen; deutlich besser als durch das ein oder andere Buch, das ich mir schon bestellt habe.
Bei einer Fragestellung komme ich trotz umfangereicher Recherche noch nicht so ganz geistig mit, ich hoffe, Du kannst mir einen Tipp geben. In der Frage von Philipp vom 02.12.2016 wurde das schon einmal leicht angedeutet.
Grundsätzlich war die Idee, einen Raspi mit FHEM zentral im Keller hängen zu haben und diverse Sensoren im Haus zu verteilen (Fenster-/Türkontakte, Bewegungsmelder, Abstandssensoren, Feuchte, Temp etc.), und sie per Verkabelung am Raspi zusammenzuführen. Da ich die Anzahl der Sensoren und ankommenden Kabel noch nicht genau benennen kann, möchte ich den Raspi entsprechend vorbereiten und dann nciht unbedingt jeden GPIO-Pin belegen, sondern vorbereitend eine „externe“ Lösung mit einer Platine zu schaffen, die daneben hängt und die die einzelnen Kabel bündelt.
Ich habe nun deiner Antwort vom 03.12.2016 entnommen, ich kann einfach einen oder mehrere I2C-PortExpander wie MCP23017nehmen kann, entsprechend der in dem Tutorial https://tutorials-raspberrypi.de/gpios-mittels-i2c-port-expander-erweitern beschriebenen Anschlusschema anbinden kann? Kann ich damit dann in das FHEM rein? Oder habe ich da was wichtiges vergessen oder gar eine etwas zu naive Vorstellung?
Grüße. Matteo
Guten Tag, erstmal Daumen hoch für deine Anleitung.
Ich habe mir einen PCF8574T Port Expander geholt und möchte gerne darüber ein Relaismodul
mit 8 Relais schalten.
Ich bin deiner Anleitung gefolgt, bis „i2cset -y 1 0x20 0x01 0x00“
Ich habe die Pins P0-P7 an allen 8 Relais angeklemmt.
wie bekomme ich es jetzt hin, damit ich durch ein i2cset Befehl P0-P7 einzelnd ein und aus schalten
kann.
Die Porterweiterung über I2C wird allgemein verwendet. Aber für 8, 16 oder 24 zusätzliche Ausgänge ist das doch eine teure Variante. Diese IC sind ab 1 Euro zu haben und für die Änderung eines Pins müssen viele Daten übertragen werden. Das sind ja nicht nur die Nutzdaten sondern auch die Gerätenummer und die Registeradresse.
Schieberegister wie 74HC595 die für 5 Cent zu kriegen sind erfüllen den Zweck genau so.
Hi Aro,
dann schreibe uns doch einfach ein kleines Tut, so dass wir alle etwas davon haben, statt nur zu schreiben, es ginge auch.
Die Frage ist nämlich WIE geht es auch. Ich denke, die Schieberegister werden softwareseitig nicht wie die ICs angesprochen und muss dann nicht immer das gesamte Register übergeben werden, wenn man einen State ändern will? Was ist nun der Vorteil gegenüber den ICs, ech nur der Preis? Bei großen Projekten ist das ganz sicher ein Argument, abe bei Homeandwendungen ist das bestimmt zu vernachlässigen, oder?
Danke.
Guten Tag,
habe jetzt auch mal drei Fragen an Felix:
1. Bis zu welchem Strom kann man den 3,3V-Ausgang (Pin 1) des PI belasten? Habe dazu keine Spezifikation finden können (immer nur zu den einzelnen GPIOs)
Plane hier eine komplexere Steuerung mit 2 (oder sogar 3) 23017, 40LEDs (SMD, 2mA mit Rv=750Ohm) und ein paar Eingängen.
2. Wofür sind die anderen Register beim MCP23017?
3. Kann man beim MCP23017 auch eine Interrupt-Stuerung realisieren, wie Du sie im Projekt „Raspberry Pi Ampelschaltung mit GPIO“ in einem Kommentar verlinkt hast (add_event_detect)? Oder muß ich die entsprechenden Eingangssignale dann über „echte“ GPIOs vom PI realisieren?
Hallo,
auch ich danke dir erst einmal für deine Mühe.
Ist wirklich interessant hier.
Aber ich habe hier leider ein Problem.
Ich habe 3 MCP23017 gesteckt und verkabelt. Diverse LED dazu mit NPNs verkabelt.
Über i2cdetect -y 1 finde ich 20, 21 und 22.
Ein sudo i2cset 0x20 0x00 0x00 bringt mir jedoch nur ein: Error: Write failed
Was könnte da los sein?
Ich habe 2 gleiche Pi hier und bei beiden habe ich das Problem. Es ist eine frische Installation drauf ohne irgendwelchen SchnickSchnack.
Hallo Malu,
ich weis nicht, ob Deine Frage noch aktuell ist. Ich vermute mal, das bei Deinem „sudo i2cset 0x20 0x00 0x00“ das „-y 1“ fehlt: „sudo i2cset -y 1 0x20 0x00 0x00“