Die häufigste Form von 7-Segment Anzeigen sind „Common Cathode„, für die u.a. die Mikrochips MAX7219 bzw. MAX7221 gedacht sind. Es gibt weiterhin auch noch „Common Anode„, die meist einiges billiger sind. Diese sind aber nicht direkt mit einem solchen Mikrochip kompatibel. Wie das allerdings trotzdem funktioniert wird in diesem Tutorial gezeigt. Wer mehr über Anoden oder die Unterschiede erfahren will, kann dies hier tun.
Zubehör
Inspiriert von diesem Artikel, kam mir die Idee Anoden Displays auch für den Pi kompatibel zu machen. Dazu brauchen wir:
- 1-8 Common Anode 7-Segment Anzeigen (z.B. diese hier)
- MAX7219 LED Display Driver (oder MAX7221)
- ggf. Lötutensilien und Lötzinn
Verbindung
Werfen wir also zunächst einen Blick auf das Datenblatt des ICs.
Die Verbindung mit dem RaspberryPi sieht so aus:
- RPi Pin 2 (5V) => Pin 19 (V+)
- RPi Pin 2 (5V) mit 10k Ohm Widerstand => Pin 18 (ISET)
- RPi Pin 6 (GND) => Pin 4 und Pin 9 (GND)
- RPi Pin 19 => Pin 1 (DIN)
- RPi Pin 23 => Pin 13 (CLK)
- RPi Pin 24 => Pin 12 (LOAD)
Nun geht es an die Anschlüsse zwischen der 7-Segment Anzeige und dem MAX7219. Dazu der Aufbau einer solchen Anzeige (um sicherzugehen, dass die Pins genauso sind, kannst du jeden einzelnen Pin an zwei 1.5V Batterien in Reihe teste, V+ an den Pluspol und den jeweiligen Pin an den Minuspol; welchen V+ Pin du anschließt, spielt dabei keine Rolle):
Normalerweise würde bei einer Kathoden Anzeige DIG 0 – DIG 7 an jeweils das V+ eines Displays (daher auch maximal 8 Anzeigen pro MAx7219) und SEG A bis SEG DP parallel an die jeweiligen Anschlüsse der Segment Anzeige (SEG A an alle Pin A der Anzeigen, usw.).
Da Anoden nun aber andersherum gepolt sind, müssen wir die Anschlüsse ebenso vertauschen:
- DIG 0 => Anschlüsse A (parallel an alle)
- …
- DIG 7 => Anschlüsse DP (parallel an alle)
- SEG A => V+ der Anzeige ganz rechts
- SEG B => V+ der zweiten Anzeige von rechts
- …
- SEG DP => V+ der Anzeige ganz links (nur bei 8 Anzeigen)
Hast du weniger als 8 Anzeigen, so gehst du von rechts nach links alle durch und einige SEG Pins bleiben leer. Bspw. habe ich nur 4 Segmente angeschlossen also an SEG A – SEG D.
Aufgelötet an eine Lochrasterplatine sieht das bei mir so aus:
Ansteuerung
Zu erst einmal installieren wir eine Bibliothek für den MAX7219/7221, damit wir diesen einfacher ansteuern können. Falls du dies bereits gemacht hast (z.B. wegen der LED Dot Matrix) kannst du es natürlich überspringen.
git clone https://github.com/rm-hull/max7219.git
&& cd max721
Nach der Installation
sudo python setup.py install
kannst du die Anzeigen bereits testen. Inspiriert von diesem Artikel habe dazu ein Skript für den Pi geschrieben:
sudo nano examples/segment.py
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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
#!/usr/bin/env python import max7219.led as segment #speichert die Werte aller Segment Anzeigen (max. 8) digValues = [0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000] def display(dig, value): values = {} values['0'] = 0b01111110 values['1'] = 0b00001100 values['2'] = 0b10110110 values['3'] = 0b10011110 values['4'] = 0b11001100 values['5'] = 0b11011010 values['6'] = 0b11111010 values['7'] = 0b00001110 values['8'] = 0b11111110 values['9'] = 0b11011110 values[-1] = 0b00000000 #leeres Zeichen values[' '] = 0b00000000 values['A'] = 0b11101110 values['b'] = 0b11111000 values['C'] = 0b01110010 values['d'] = 0b10111100 values['E'] = 0b11110010 values['F'] = 0b11100010 values['G'] = 0b01111010 values['H'] = 0b11101100 values['I'] = 0b01100000 values['J'] = 0b00011100 values['K'] = 0b11101010 values['L'] = 0b01110000 values['O'] = 0b01111110 values['P'] = 0b11100110 values['q'] = 0b11001110 values['r'] = 0b10100000 values['S'] = 0b11011010 values['t'] = 0b11110000 values['U'] = 0b01111100 values['-'] = 0b10000000 values['_'] = 0b00010000 bPosition = 0b00000001 if dig < 1: bPosition = bPosition<<dig-1 #alle Segment Anzeigen durchgehen for x in range(8): if (values[value]) & (1 << x) : digValues[x] |= bPosition else: digValues[x] = (0b11111111 ^ bPosition) & digValues[x] #Senden segment.send_byte(x, digValues[x]) def showvalue(value): n = [char for char in str(value)] #alle nicht belegten Anzeigen mit dem leeren Zeichen fuellen n = ([-1]*8 + n)[-8:] n.reverse() index = 7 for i in n: display(index, i) index = index -1 def main(): segment.init() segment.clear() while True: x = str(raw_input('Bitte Wert eingeben: ')) showvalue(x) if __name__ == "__main__": main() |
Wie du siehst habe ich bereits alle Zahlen und einige Buchstaben vordefiniert. Manche Buchstaben (z.B. M, N, X, Y, … lassen sich auf einer 7-Segment Anzeige nicht richtig darstellen, daher fehlen sie). Du kannst für weitere Zeichen auch noch Kombinationen definieren, achte jedoch darauf, dass du von hinten anfängst (z.B. nur Segment G wäre 0b10000000, Segment A entsprechend 0b00000010 usw.)
Hier noch zwei Bilder mit Eingabe „1234“ und „StOP“ (achte auf Groß/Kleinschreibung, da ich nicht alle Buchstaben definiert habe).
Viel Spaß damit!
10 Kommentare
Hallo,
ich finde deine Anleitung super und würde gern etwas ähnliches selber bauen.
Der Unterschied wäre, dass ich folgende 7-Segment-Anzeige verwenden würde:
http://www.conrad.de/ce/de/product/1050575/7-Segment-Anzeige-Rot-569-mm-74-V-Ziffernanzahl-1-Kingbright-SA23-12SURKWA
Stellt der MAX7219 dafür genügend Spannung zur Verfügung? An sich bräuchte ich auch nicht die Möglichkeit, um so viele Anzeigen ansteuern zu können.
Hast du für das ansteuern einer großen Anzeige andere Ideen?
Viele Grüße
Interessante Frage. Habe mich ehrlich gesagt selbst noch nicht damit beschäftigt, da die meisten LEDs ja mit 3.3V bis 5V laufen.
Laut Datenblatt darf die Eingangsspannung zwischen 4V und 5.5V sein, daran solltest du also nicht mehr anschließen. Ich habe aber ein wenig gesucht und diese drei Threads gefunden, die sich mit der gleichen Frage beschäftigen: Link 1, Link 2, Link 3.
Solltest du es zum laufen bekommen, würde ich mich über eine Rückmeldung freuen 🙂
Hallo, der MAX7219 kann nur mit einer Spannung von +5V betrieben werden. Da der IC die LEDs sowohl treibt (über die Segmente) als auch die Stromsenke (über Digits) liefert, kann keine Spannung >5V für die LEDs zur Verfügung gestellt oder aufgenommen werden. Die verlinkte 7-Segmentanzeige hat eine Vorwärtsspannung von etwa 7.8V pro Segment (also knapp 2V pro LED), kann also keinesfalls direkt am IC betrieben werden, sie würde nicht mal schwach aufleuchten.
In diesem Fall ist mir keine andere Lösung bekannt, als einen zweiten Stromkreis zu erzeugen, der eine höhere Spannung bereit stellt (z.B. 12V). Das bedeutet dann aber auch, dass man mindestens einen 12V-kompatiblen LED-Treiber und eine Senke zusätzlich in die Schaltung einplanen muss. Der MAX IC kann in diesem Fall die Ansteuerung dieser beiden Komponenten übernehmen und verbleibt weiter in seiner 5V Welt. Eine mögliche Schaltung findet sich hier:
http://embedded-lab.com/blog/?p=7628
(Achtung: Bei der Berechnung der Vorwiderstände der LEDs wurden hier die Spannungsabfälle am Treiber und der Senke nicht berücksichtigt. Diese können aber recht hoch ausfallen, inbesondere beim ULN2803A (bis zu 1.6V).)
Unsere pi sagt uns nach „sudo python setup.py install“ , „python: can´t open file setup.py:errno 2 no such file or directory“
Sag kann das sein?
Hallo,
bin zufällig auf deine Anleitung für 7-Segment-Anzeigen gestossen und habe mich inspirieren lassen. Zur Verfügung stand eine ausgebaute Dig 3-Kathoden-Anzeige. Beim erstenTest leuchteten alle Segmente. Die Installationschritte zur Ansteuerung sind nach deiner Anleitung erfolgt. Allerdings stecke ich fest bei deinem Skript segment.py mit folgender Fehlermeldung :
Traceback (most recent call last):
File „/home/pi/max7219/Segment.py“, line 3, in
import max7219.led as segment
ImportError: No module named max7219.led
Hast du einen Hinweis, woran es liegen könnte ? Bin Python-Anfänger
Der Name der importierten Bibliothek stimmt nicht (mehr) bzw. diese existiert nicht oder wurde nicht installiert.
Hallo, vielen Dank für den Hinweis. Habe inzwischen das Problem lösen können. Leider gibts am Ende des Skripts ein weiteres Problem:
Traceback (most recent call last):
File „/home/pi/Segment.py“, line 83, in
main()
File „/home/pi/Segment.py“, line 76, in main
segment.init()
AttributeError: ‚module‘ object has no attribute ‚init‘
>>>
Bräuchte Hilfe, wo liegt das Problem?
Hallo Ernst,
Habe das gleiche Problem, finde aber keine Lösung.
>>>import max7219.led as segment
>>>ImportError: No module named max7219.led
Darf ich fragen, wie Du das gelöst hast?
genau da bin ich auch steckengeblieben, hat jemand eine lösung dafür?
Hallo,
da ich eine sehr große 7 Segment Anzeige benötige (genau genau genommen 2 Module um eine zweistellige Zahl darzustellen), würde ich gerne 7 LED Strips auf einer Platte als die 7 Segment Anzeige verwenden.
Dazu benötige ich für die in Summe 14 LED Strips noch ein Relais Board zur Ansteuerung. Um die notwendigen GPIO für das Relais Board zu bekommen, benötige ich auch noch einen GPIO Port Expander (z.B. MCP23017).
Wenn ich die Ansteuerung der 7 Segment Anzeige richtig verstanden habe, könnte ich mir aber den GPIO Port Extender sparen und über den MAX7219/MAX7221 meine 2 Anzeigen ansteuern – nur eben über das Relais Board.
Kann das so funktionieren?
Danke