Martin's Bastelstube: I2C-Displays + Tasten
Kurze Einführung:
Es gibt viele gute Gründe für ein Display auf dem Roboter.
Schließlich muss man wissen, was die Software gerade denkt und entscheidet,
damit man Fehler im Programm oder bei der Verdrahtung der Sensoren erkennen kann.
Je nach Einsatzfall und nach Geldbeutel kann man verschiedene Typen von Displays
wählen. Manchmal findet man auch ein bestimmtes Display in der Schublade
(oder auf dem Elektroschrott) und möchte es über den I2C-Bus
an den Roboter anschließen.
Einfache numerische Displays sind am einfachsten anzusteuern -- man muss nur die
7 Segmente der Anzeige in der richtigen Kombination aufleuchten lassen, schon ergibt
sich eine lesbare Zahl (oder – in günstigen Fällen – ein
Buchstabe).
|
|
|
|
|
|
Um die Lesbarkeit zu erhöhen, gibt es spezielle Displays, die zusätzlich zu den
Segmenten auch noch die Kreuzungspunkte ansteuern können. Das ergibt dann 13 Segmente.
Weil die Decodierung kompliziert ist, haben die meisten dieser Anzeigen gleich den Decoder-Chip
gemeinsam mit den LEDs in einem Gehäuse integriert.
|
|
|
|
Alphanumerische Displays können Zahlen und Buchstaben, meistens auch
bestimmte Sonderzeichen, darstellen. Dazu benutzen sie kompliziertere Anzeigeelemente
mit 14 - 16 Segmenten oder eine Punktmatrix (mindestens 5 * 7 Punkte) für
jedes Zeichen. Die meisten alphanumerischen Displays haben einen "Character Generator"
eingebaut. Das ist ein Speicher, in dem steht, welche Display-Segmente für ein
bestimmtes Zeichen eingeschaltet werden müssen.
|
|
|
Graphische Displays haben eine völlig freie Punktmatrix. Damit sind auch
die Zwischenräume zwischen den Zeichen beschreibbar, und man kann Linien und
Grafiken darstellen. Dafür müssen aber viel mehr Daten zwischen dem Controller
und dem Display bewegt werden. Wenn der Controller ein "A" darstellen will,
muss er nicht nur den Zeichencode 0x41 ans Display schicken, sondern eine Bitmap-Grafik, die
beschreibt, welcher Punkt hell und welcher dunkel dargestellt werden soll.
Im Gegenzug bekommt man viel größere Freiheiten, was die Gestaltung der
Informationen auf dem Display angeht. Man kann Zeichensätze in verschiedenen
Größen und Schriftstärken verwenden – wenn man sie vorher dem
Controller ins Programm geschrieben hat.
|
|
|
|
Alphanumerische und graphische Displays haben meistens einen eigenen Controller, der die
regelmäßige Ansteuerung der Anzeigeelemente übernimmt. Im günstigen
Fall hat dieser Controller schon eine I2C-Schnittstelle, ansonsten muss man seine
Anschlüsse über einen I/O-Expander an den I2C-Bus anschließen.
|
Inzwischen habe ich so viele verschiedene Display-Boards gebaut, dass man eine Übersichtstabelle
braucht ...
LED-Display 1 Ziffer oder 1½ Ziffern:
Dies ist bei weitem das einfachste und billigste Display.
Der Roboter kann damit nur ganz einfache Zustandsinformationen nach außen
mitteilen.
Gerade weil diese Variante so einfach ist (auch in der Ansteuerung über den
I2C-Bus), ist sie aber als Übung für Neulinge interessant.
Für die Platine reicht Basismaterial mit einseitiger Kupferbeschichtung.
An Stelle des Dezimalpunkts bei einstelligen Anzeigen kann man auch die Segmente
b + c einer weiteren Ziffer bei 1½stelligen Anzeigen ansteuern, das
verdoppelt gleich den darstellbaren Zahlenraum. Zu diesem Zweck habe ich auch
verhätnismäßig hochohmige Vorwiderstände von 330 Ohm in die
Schaltung eingebaut, damit ein einzelner Ausgang des PCF8574 auch ohne Schaden den
Strom für zwei LED-Segmente liefern kann.
Wie sieht denn so ein LED-Display mit PCF8574 überhaupt aus?
Als Demonstration, wie klein man diese Anzeige bauen kann, habe ich sie
ohne Platine als freifliegenden Aufbau an einem Luftballondraht aufgebaut.
Die Beschreibung zum Nachbauen findet ihr hier.
Die nötigen Programme:
LED-Display 2 oder 4 Ziffern mit TIL311:
Der LED-Baustein TIL311 hat eine kleine Matrix aus einzelnen LEDs und den dazugehörigen Decoder-Chip
in einem transparenten Gehäuse vereinigt. Er kann die Dezimalziffern 0 bis 9 und die
Hexadezimalziffern A bis F darstellen.
Man kann den Zifferncode im Chip speichern. Das Display mit 4 Ziffern nutzt diese Fähigkeit aus,
damit alle Ziffern mit nur einem I2C-Chip PCF8574 angesteuert werden können.
Ich habe eine Platine mit 2 Ziffern und eine mit 4 Ziffern gebaut.
Die Version mit 2 Ziffern braucht keine besondere Vorbereitung – man schreibt einfach einen 8-Bit Zahlenwert
in den I2C-Baustein PCF8574 und der Wert wird hexadezimal auf den Ziffern angezeigt.
Die Version mit 4 Ziffern muss Ziffer für Ziffer geschrieben werden.
Die niederwertigen 4 Bit des PCF8574 werden mit dem gewünschten Zahlenwert für die Ziffer beschrieben,
und dann wird auf einem der höherwertigen Bits kurz ein LOW-Puls geschrieben. Das ergibt drei I2C-Schreibzyklen pro Ziffer.
Im Beispielprogramm I2C-Demo_PCF8574_TIL311.cc findet ihr eine Funktion
TIL311x4_write_hex,
die diese Aufgabe für euch übernimmt.
Wie sieht denn so ein LED-Display mit PCF8574 und TIL311 überhaupt aus?
Die nötigen Programme:
LED-Display 4 Ziffern:
Dies ist immer noch ein sehr einfaches und günstiges Display. Es reicht, um
Variableninhalte, Sensor-Messwerte und Uhrzeiten anzuzeigen. Der Display-Controller
SAA1064 erlaubt es, die Helligkeit der Anzeige einzustellen.
Mein Prototyp ist auf der I2C-Lochrasterplatine aufgebaut, aber ich habe auch schon
einen Entwurf für eine geätzte Platine.
Die Dance-Clock in
Martin's Bastelstube, Teil XVII
benutzt vier SAA1064 für ihre zwei Anzeigen.
Wie sieht denn so ein LED-Display mit SAA1064 überhaupt aus?
Die nötigen Programme:
Name |
Verwendung |
kopieren nach |
Bemerkungen |
I2C_SAA1064.h |
Bibliothek-Header |
RobotBuilder\*lib\include |
Funktionen für Benutzung des Bausteins SAA1064 |
I2C_SAA1064.cc |
Bibliothek-Funktionen |
RobotBuilder\*lib\src |
I2C-Test_SAA1064.cc |
Testprogramm |
in euer Projekt-Verzeichnis |
Beispiel für Verwendung des SAA1064 |
I2C-Demo_SAA1064.cc |
Demonstrationsprogramm |
in euer Projekt-Verzeichnis |
Vorführung aller Fähigkeiten des SAA1064 |
qfixI2C.h |
Bibliothek-Header |
RobotBuilder\qfix\qfixlib\incl |
Neue Funktionen für den I2C-Bus,
I2C-Datenrate nur 100 kBit/s
|
qfixI2C.cc |
Bibliothek-Funktionen |
RobotBuilder\qfix\qfixlib\src |
gbI2C.h |
Bibliothek-Header |
RobotBuilder\GoldBoard\lib\include |
Neue Funktionen für den I2C-Bus,
I2C-Datenrate nur 100 kBit/s
|
gbI2C.cc |
Bibliothek-Funktionen |
RobotBuilder\GoldBoard\lib\src |
seg7_font.h |
Bibliothek-Header |
RobotBuilder\*lib\include |
Funktionen zum Schreiben auf 7-Segment- Anzeigen |
seg7_font.cc |
Bibliothek-Funktionen |
RobotBuilder\*lib\src |
LED-Display 4½ Ziffern + 8 Tasten:
Der MAX6959 ist deutlich kleiner als ein SAA1064, aber mit einer sehr ausgefeilten Technik
zur Ansteuerung der Anzeigeelemente kann er mit weniger Anschlusspins mehr Informationen
darstellen und nebenbei noch 8 Tasten abfragen.
Wie sieht denn so ein LED-Display mit MAX6959 überhaupt aus?
Die nötigen Programme:
LED-Display 14 Ziffern + 4 Tasten:
Der MAX6955 nimmt mit seinem 40-poligen DIL-Gehäuse sehr viel Platz auf der Platine
in Anspruch. Aber ich habe noch wunderbar altmodische Taschenrechner-Displays aus den
70er Jahren, die in einer zweiten Ebene über dem Chip schweben und so den Platz doppelt nutzen.
Theoretisch kann der MAX6955 ganze 16 7-Segment-Ziffern ansteuern,
doch werden seine Pins ähnlich wie beim MAX6959
mehrfach verwendet.
So kann man seine vollen Möglichkeiten nur dann ausnutzen, wenn man viele Displaymodule
mit einzelnen oder Doppelziffern verwendet.
Deshalb konnte ich von meinem Taschenrechner-Display mit 9 Ziffern leider auch nur 8 Ziffern in
Betrieb nehmen. Dafür habe ich noch zwei Extra-Displays mit je 3 Ziffern hinzugefügt,
das ergibt insgesamt 14 Ziffern.
Wie sieht denn so ein LED-Display mit MAX6955 überhaupt aus?
Die nötigen Programme:
LCD-Display 4 Ziffern:
LCD-Anzeigen verbrauchen nur einen Bruchteil des Stroms, den eine LED-Anzeige braucht.
Das ist vielleicht nicht so wichtig bei einem Roboter, der einen dicken Akku für
große Motorströme hat. Bei anderen batteriebetriebenen Schaltungen kann
das aber sehr wichtig sein.
Dieses Display besteht aus einem großen Glas, das vier 7-Segment-Ziffern
anzeigen kann (wie es zum Beispiel in Messgeräten eingesetzt wird) und einem
LCD-Treiberchip PCF8577. Bei dieser Anzeige wird jedes Segment direkt angesteuert,
damit kann man das Display aus verschiedenen Winkeln sehr gut und kontrastreich ablesen.
Die weiter unten vorgestellten LCD-Anzeigen steuern die Display-Elemente in einer
Matrix (in Zeilen und Spalten) an, was den Kontrast (den Helligkeitsunterschied
zwischen hellen und dunklen Bildpunkten) stark verringert.
Der PCF8577 hat – genau wie der MAX6955 weiter oben – ein großes
40-poliges DIL-Gehäuse, aber er findet trotzdem bequem unter dem Display-Glas
Platz.
Damit man das Display wieder leicht herunternehmen kann, habe ich eine 40-polige
IC-Fassung in zwei Teile gesägt und die Kontaktstreifen an den Rändern
der Platine eingelötet.
Wie sieht denn so ein LCD-Display mit PCF8577 überhaupt aus?
Die nötigen Programme:
LCD-Display 3x12 Zeichen COG:
Es gibt alphanumerische LCD-Displays in Chip-On-Glass-Technik (COG). Da ist der
Display-Controller nicht auf einer zusätzlichen Platine aufgelötet, sondern
das nackte Controller-Chip ist kopfüber auf den Glas-Träger des Displays
geklebt (auf den Fotos als schwarzes Quadrat zu sehen).
Das fertige Display ist dann nur wenige Millimeter dünn.
Bei Conrad Electronic gibt es solche Displays zu kaufen. Sie haben einen I2C-Anschluss,
deshalb muss man nur wenige Pins anschließen. Der verwendete Controller ist wahrscheinlich
ein PCF2116,
mein Prototyp verwendet ein Display mit ähnlichem Display-Controller PCF2104.
Wie sieht denn so ein LCD-Display in COG-Technik überhaupt aus?
Die nötigen Programme:
Die Programme werden ständig verbessert und verändert – es lohnt sich
also, von Zeit zu Zeit nachzuschauen, ob hier eine neue Version liegt.
LCD-Display mit Textmodul über PCF8574:
Manchmal bekommt man alphanumerische LCD-Anzeigen, die schon intern mit einem I2C-Baustein
ausgestattet sind, damit man sie leicht und mit wenigen Leitungen anschließen kann.
Ein solches Modul ist das LCM015, das man hier und da in Elektronik-Webshops finden kann.
Im Inneren hat es einen HD44780 LCD-Controller, der fest mit einem I2C I/O-Expander PCF8574 verdrahtet ist.
Der LCD-Controller wird im 4-Bit Modus betrieben. Man muss für jedes Zeichen, das aufs Display
geschrieben werden soll, 6 Bytes in den PCF8574 schreiben. Das gibt allerdings keine sichtbaren
Verzögerungen, weil auf dem Display ja sowieso nur 20 Zeichen sichtbar sind.
Am unteren Rand des Displays gibt es noch 9 feste Symbole, die man zusätzlich nutzen kann.
Für einen ersten Test habe ich das LCM015-Modul auf einem I2C-Experimentierboard untergebracht,
dann sind schon gleich die I2C-Stecker und der Spannungsregler an der richtigen Stelle.
LCD-Display mit Standard-Textmodul:
Es sind sehr viele alphanumerische LCD-Anzeigen frei verfügbar, sie werden in
allen möglichen Geräten eingebaut. Diese Art von Displays gibt es an vielen
Stellen günstig zu kaufen oder man bekommt welche beim Ausschlachten von alten
Elektrogeräten in die Finger.
Sehr verbreitet bei diesen Displays ist der LCD-Controller HD44780 von Renesas
(ehemals Hitachi Semiconductor). Sein Befehlssatz ist einfach zu verstehen, er hat
allerdings ein paralleles Interface, das wir erst für den I2C-Bus erreichbar
machen müssen.
Der Chip-Hersteller Maxim hat einen Vorschlag, wie man einen parallelen I2C-Controller
über den I2C I/O-Expander MAX7300 anschließen kann (s.u.). Allerdings sind die
MAX7300 sehr teuer und schwer zu bekommen.
Ich habe einfach zwei I2C I/O-Expander PCF8574(A) genommen und den LCD-Controller daran
angeschlossen – das funktioniert auch. Diese Chips sind wesentlich günstiger und
überall zu bekommen. Mit den überzähligen I/O-Leitungen kann man zum
Beispiel noch die Hintergrundbeleuchtung des Displays (sofern vorhanden) oder LEDs
schalten. Oder man kann noch ein paar Tasten abfragen.
Wie sieht denn so ein LCD-Textmodul mit I/O-Expander überhaupt aus?
Hauruck-Anleitung für den Anschluss eines Textmoduls mit 2 * 16 Zeichen:
Wir suchen uns ein Display,
das auf das Standard-Bobby-Format 38 * 78 mm passt
oder passend gemacht werden kann.
|
|
Dieses würde passen, aber kann mit 2 * 10 Zeichen zuwenig
Information darstellen.
|
|
Dieses geht ganz gut. Zwar etwas zu groß, aber auf den äußeren
Platinenstreifen laufen keine Leiterbahnen, das können wir absägen.
|
|
Das Display ist zurechtgestutzt auf Bobby-Maße. Wo es möglich ist,
werden Löcher für die Abstandsbolzen gebohrt. Die Kontaktreihe
bekommt einen Stecker (Buchsenleiste im Raster 2.54 mm) nach unten.
|
|
Erste Probemontage auf der Trägerplatine. Der Gegenstecker wird im gesteckten
Zustand eingelötet, dann stimmen die Abstände später genau.
Überstehende Drahtenden werden erst nach dem Löten abgeschnitten.
|
|
Das waren die festen elektromechanischen Vorgaben. Was jetzt noch an Platinenfläche
frei geblieben ist, kann für die übrige Elektronik vergeben werden ...
|
|
... zum Beispiel so für die Ansteuerung mit 2 * PCF8574. Ich habe hier die
DIP-Schalter zum Einstellen der I2C-Geräteadresse weggelassen und die Adresspins
der I/O-Exander fest verdrahtet.
Außerdem auf der Platine: 2 Taster, Trimmer zum Einstellen des LCD-Kontrasts
und Anschluss für 4 LEDs.
|
|
Zum Nachlöten: Das ist die Schaltung für den obigen Aufbau
(mit kleinen Abweichungen).
|
|
Auf dem freien Stück der Display-Platine, wo keine Leiterbahnen verlaufen, werden
Löcher für 4 LEDs gebohrt. Die LEDs werden mit Sekundenkleber befestigt.
Ein Flachbandkabel führt zum Stecker auf der unteren Platine.
|
|
Fertig!
Jetzt können wir die Anzeige einsetzen.
|
|
Die nötigen Programme:
8 Tasten:
Manchmal reicht das schöne Display nicht aus, man möchte auch
ein paar Einstellungen am Roboter vornehmen oder sich durch
verschiedene Menü-Ebenen blättern.
Dazu braucht man ein Tastenfeld mit Richtungstasten.
Die einfachste Variante mit 8 Tasten und PCF8574:
8 Tasten mit Textdisplay:
Hier habe ich einfach nur das Standard-Textmodul noch mit auf die Platine genommen.
Es gibt eine kleine Version mit 16x2 Zeichen und eine große mit 20x4 Zeichen.
Die einfachste Variante mit 8 Tasten und PCF8574:
Die Version mit 16x2 Zeichen gibt es auch leicht verändert als Shield für den Arduino
– siehe
Martin's Bastelstube, Teil XXVII.
LCD-Display direkt am Controller-Board:
Man kann ein LCD-Display auch direkt am Controller-Board anschließen, ohne dass man viel
Elektronik dazwischen schalten muss.
Das erkläre ich euch in
Martin's Bastelstube, Teil XII.
|
E-mail:
Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein!
|