In diesem Tutorial geht es um ein User Projekt, welches mir zugeschickt wurde. Dabei wird aus 7 LEDs eine Würfelform erstellt, welche dann mit dem Raspberry Pi und dem MCP2017 Port Expander per I2C gesteuert werden. Als Programmiersprache für den elektronischen Würfel wurden Python verwendet und stellt damit ein nettes kleines Projekt für Raspberry Pi Einsteiger dar.
Ich wurde von Holger gebeten, daraus ein Tutorial für andere Interessierte zu erstellen. Daher habe ich es nachgebaut und berichte nun darüber.
Zubehör
Folgende Komponenten wurden in diesem Projekt verwendet:
- Raspberry Pi
- 7 (gleichfarbige) LEDs
- MCP23017 Port Expander
- Breadboard
- 10kΩ Widerstand (z.B. im Set)
- 7x 100Ω Widerstand (z.B. im Set), evtl. auch mehr, je nach LED.
- 1x Taster
- Jumper Kabel
Der genaue Vorwiderstand kommt auf die Farbe der LEDs an. Um die optimale Widerstandsgrößen zu berechnen, kannst du z.B. diesen Vorwiderstands-Rechner von Elektronik-Kompendium benutzten.
Aufbau – Raspberry Pi Elektronischer Würfel
Um weniger GPIO Pins des Raspberry Pi’s zu belegen wird ein Port Expander verwendet. Dieser wird über die I²C Schnittstelle angesprochen und erweitert den Pi um 16 IO Pins. Hier findest du eine ausführliche Erklärung des MCP23017 Port Expander.
Die LEDs werden an die Pins des Port Expanders (im rechten Bild GPA0 bis GPA7) mittels Vorwiderstand angeschlossen. Das kürzere Ende der LED wird an Masse vom Raspberry Pi geschlossen. Der Taster ist im offenen Zustand (nicht gedrückt) über einen 10k Widerstand an GND angeschlossen, wohingegen das andere Ende (beim Drücken) mit 3.3V verbunden ist. Somit wird garantiert, dass immer ein eindeutiger Zustand (0 oder 1) erkannt wird. Man redet hierbei auch von einem Pull-Down Widerstand.
Der I2C Bus ermöglicht einen sehr einfachen Aufbau, sodass effektiv nur zwei GPIOs des Pi’s verwendet werden (neben 3.3V und GND) und sieht folgendermaßen aus:
Installation der notwendigen Tools
Um den I2C Bus am Raspberry Pi benutzen zu können, muss dieser zuerst freigeschaltet werden. Dies geschieht, indem man die Konfiguration im Terminal aufruft:
sudo raspi-config
Unter „Advanced Options“ findet sich ein Menüpunkt „I2C“, worüber es aktiviert wird.
Anschließend installieren wir noch eine Bibliothek, die es uns später erlaubt direkt per Python den Port Expander zu steuern:
sudo apt-get install python-smbus i2c-tools
Sobald die Installation vollendet ist, kannst du einen ersten Test starten (sofern der MCP23017 bereits angeschlossen ist):
sudo i2cdetect -y 1
Dieser Befehl zeigt alle verfügbaren, angeschlossenen I2C Module inkl. ihrer Adressen an. Bei identischer Verkabelung, solltest du einen folgenden Output sehen, welcher besagt, dass unser Port Expander sich unter der Adresse 0x20 befindet:
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: -- -- -- -- -- -- -- --
Code zum Würfeln
Als nächstes erstellen wir eine Datei, welche zufällige Zahlen auf dem Würfel anzeigt. Dazu öffnen wir den Terminal Edior
sudo nano wuerfel.py
und fügen folgenden Code ein:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
# -*- coding: iso-8859-1 -*- import smbus import time import random bus = smbus.SMBus(1) # Rev 2 Pi DEVICE = 0x20 # Device Adresse (A0-A2 auf Masse gelegt) IODIRA = 0x00 # Pin Register fuer die Richtung IODIRB = 0x01 # Pin Register fuer die Richtung OLATA = 0x14 # Register fuer Ausgabe (GPA) GPIOB = 0x13 # Register fuer Eingabe (GPB) # Definiere GPB Pin 0 als Input (00000001 = 0x1) # Binaer: 0 = Output, 1 = Input bus.write_byte_data(DEVICE,IODIRB,0x10) # Definiere alle GPA Pins als Output (00000000 = 0x00) bus.write_byte_data(DEVICE,IODIRA,0x00) # Setze alle 8 Output bits auf 0 bus.write_byte_data(DEVICE,OLATA,0) # Mögliche Augenzahl 1,2,3,4,5,6 Auge = [0x08, 0x14, 0x1C, 0x55, 0x5D, 0x77] try: while True: Taster = bus.read_byte_data(DEVICE,GPIOB) if Taster & 0b00000001 == 0b00000001: random.shuffle(Auge) i = random.randint(0, 5) bus.write_byte_data(DEVICE,OLATA,Auge[i]) time.sleep(0.02) except KeyboardInterrupt: bus.write_byte_data(DEVICE,OLATA,0x00) |
Anschließend speichern wir die Datei und beenden den Editor (STRG+O, STRG+X).
Der Code ist recht einfach gehalten und überwiegend selbsterklärend: Solange der Taster gedrückt wird, wird im Millisekunden Takt eine neue Augenzahl auf dem Würfel angezeigt. Die benötigten Pins werden dazu angeschaltet. Sobald der Taster nicht mehr gedrückt wird, bleibt die letzte zufällig erhaltene Zahl auf dem elektronischen Würfel bestehen.
Vorschau des erstellten Projekts
Aufgelötet auf eine Platine, kann der Würfel dann folgendermaßen aussehen:
Anschließend habe ich noch ein Video erstellt, in dem man dieses Projekt noch in Aktion sehen kann:
Falls noch weitere User ihre Projekte vorstellen wollen, könnt ihr mich gerne kontaktieren 🙂
12 Kommentare
Hi,
ich habe dieses Projekt versucht ohne Hilfe auch selbst zu bauen. Mir fehlt der Port Expander.
Ich habe es lediglich auf mein Breadboard geklemmt. Dennoch hapert es beim Schalter und „dem zufälligen entscheiden welches Bild kommen soll“
http://pastebin.com/n77MR5GA
Du musst die anderen Pins dann auch ausschalten, sonst bleiben sie eben an und du bekommst keine richtige Zahl angezeigt.
Hallo,
Ich habe diese Projekt aufgebaut auf einer Platine.
Nun aber erkennt er den port expander nur wen ich Taster gedrückt halte.
Und dazu bleibt die erwürfelte Zahl nicht stehen sondern ich bekomme ein Fehler Code in line 31 und wen ich es starte ohne den Taster gedrückt zuhalten bekomme ich einen in der line 17.
Weiss jemand was ich falsch mache ? oder potenzielle Fehler quellen?
Grüße
Hi ich habe den Würfel nachgebaut jedoch wird mir bei i2cdetect nichts angezeigt.
Am MCP23017 kann es nicht liegen habe ihn schon ausgetauscht (hab ein 5er packen bestellt).Verkabelung habe ich mehrfach neu gemacht. Hast du eine Idee woran es liegen könnte?
Grüße Jan
Hast du I2C per raspi-config evtl. deaktiviert?
Nein I2c habe ich aktiviert habe es jetzt auch mit einem anderen breadboard und raspbian auf einer anderen sd Karte probiert. Ich habe den mcp23017 auch schon ohne LEDs und taster angeschlossen, jedoch hat mein pi das ganze noch kein einziges mal erkannt.(Ich benutze ein pi 3 b mit aktuellem raspbian)
Grüße Jan
Hallo,
habe das gleiche Projekt nachgebaut und alles programmiert, aber es leuchtet nur die LED in der Mitte und wenn ich den Taster drücke, passiert null.
Wahrscheinlich hast du die Pins falsch angeschlossen oder z.B. den IC falsch rum genommen.
der portexpander wird mir auch nicht bei i2cdetect -y 1 angezeigt, obwohl er das vorher gemacht hat.
Hallo,
Ich habe alles aufgebaut und programiert, aber wenn ich den Taster drücke, passiert nichts.
Kann mir Jemand weiterhelfen?
Gruss
J.B.B.
HI, Ihr müsst die SDA1 und SCL1 beachten, ggf. haben die andere Farben:) Bei mir ist es blau und gelb statt orange und gelb. Einfach auf die Portbezeichung schauen. Viel Spaß!
Hallo an alle, die das Problem haben, das der Würfel nicht auf den Taster reagiert
Bei Felix im Code hat sich ein kleiner Fehler eingeschlichen – er hat den Taster an GPB0 angeschlossen in der Verdrahtung und in Zeile 33 in seinem Code auch abgefragt – aber in Zeile 17 hat er GPB4 als Eingang gesetzt, nicht GPB0!
Zeile 17 muß korrekt heissen:
bus.write_byte_data(DEVICE,IODIRB,0x01)