Scope Die LCD-Ansteuerung eines HD4478 mit dem Arduino Version. Created.2.22 Autor Erik Bartmann Internet http://www.erik-bartmann.de Email arduino@erik-bartmann.de Arduino LC-Display-Ansteuerung Seite 2
Das LCD vom Typ HD4478 Liebe Freunde, ich möchte euch in diesem Arduino-AddOn die Programmierung eines LC- Displays zeigen. Bei meinem ersten Besuch beim Computerclub² hatte ich das Vergnügen, das Arduino-Board und eine Schaltung zur Ansteuerung eines LC-Displays vorzustellen. Da die Zeit für eine derartige Präsentation leider sehr begrenzt ist, möchte ich an dieser Stelle noch weitere Informationen liefern, um euch falls nicht schon geschehen - gegebenenfalls noch mehr für die Materie zu begeistern. So ein Arduino-Board ist ja schon eine feine Sache und Du kannst eine Menge unterschiedlichster Sensoren an die Eingänge des Mikrocontrollers anschließen. Doch wenn es z.b. darum geht, einen Status eines digitalen Ausgangs anzuzeigen, bleibt uns lediglich eine Leuchtdiode, um das zu realisieren. An oder Aus bzw. LOW- oder HIGH-Pegel! Das sind die einzigen Möglichkeiten, die Dir bei dieser Variante zur Verfügung stehen. Möchtest Du jedoch ein etwas anspruchsvolleres Design in Form einer alphanumerischen Anzeige, dann bietet sich ein LC-Display an. Es handelt sich dabei um ein Anzeigemodul, das auf der Basis einer Flüssigkristallanzeige (Liquid Crystal Display) arbeitet. Hört sich schon recht merkwürdig an, nicht wahr? Etwas Flüssiges wird zur Anzeige von irgendwelchen Informationen genutzt. Doch die Sache ist schnell erklärt, wenn sich dahinter auch etwas viel komplexeres verbirgt. Die in der Anzeige enthaltenen Flüssigkeitskristalle können durch eine von außen angelegte Spannung in ihrer Ausrichtung beeinflusst werden. So können sie Einfluss auf die Polarisationsrichtung des Lichtes nehmen. Ich habe für unser Beispiel ein LCD-Modul vom Typ HD4478 von Hitachi verwendet, was ein sehr verbreitetes Modul ist. Es ist aus einer 5x8 Punkt-Matrix aufgebaut wobei jeder einzelne Punkt durch den auf dem Modul befindlichen Treiberchip angesteuert wird. Dieser Treiber nimmt uns eine Menge Arbeit ab, denn wir müssen uns nicht darum kümmern, bei welchem Buchstaben oder welcher Ziffer, die wir anzeigen lassen wollen, welche Punkte der Matrix anzusteuern sind. Diese Aufgabe übernimmt der besagte Treiberchip. Arduino LC-Display-Ansteuerung Seite 3
Die AD-Wandlerschaltung Auf dem folgenden Foto siehst Du einen Schaltungsaufbau auf einem Steckbrett auch Breadboard genannt. Die beiden Hauptakteure sind natürlich Das Arduino Mikrocontrollerboard Das LCD-Modul vom Typ HD4478 Diese Schaltung, die ich hier aufgebaut habe, erfüllt einen ganz praktikablen Zweck. Es handelt sich um eine AD-Wandler Schaltung. 9V Batterie Vorwiderstand für die Hintergrundbeleuchtung Potentiometer Wie Du schön erkennst, wird auf dem LC-Display eine interessante Information angezeigt. In der ersten Zeile steht eine allgemeine statische Information, die sich nicht ändert und Aufschluss darüber gibt, wo sich die Schaltung zum Zeitpunkt der Aufnahme befand. Hey, wir waren beim Computerclub². Soweit so gut! In der zweiten Zeile erscheint jetzt etwas noch Interessanteres. Dort wird ein Spannungswert angezeigt, der an einem analogen Eingang des Arduino-Boards anliegt. Dieser Wert kann über das angeschlossene Potentiometer verändert werden. Im Moment beträgt dieser Wert 3,48 Volt. Arduino LC-Display-Ansteuerung Seite 4
Ich denke, dass es jetzt höchste Zeit wird, Dir den Schaltplan zu zeigen. Potentiometer Wenn Du noch nie einen Schaltplan gesehen hast, so lasse Dich nicht verunsichern. Das ist alles halb so wild! Du erkennst schon alleine anhand der Größe der im Schaltplan verwendeten Symbole, welche die Hauptkomponenten sind. Links oben der Arduino Mikrocontroller und rechts unten das LCD-Modul. Damit beide Bauteile miteinander kommunizieren können, sind wer hätte es gedacht mehrere Verbindungsleitungen erforderlich, die hier in grün dargestellt sind. Arduino LC-Display-Ansteuerung Seite 5
Der analoge Eingang Wenden wir uns zunächst einmal der Messwertaufnahme zu. Der Arduino hat 6 analoge Eingänge (A bis A5), von denen wir in dieser Schaltung lediglich einen nutzen. Das Potentiometer stellt einen variablen Spannungsteiler dar, dessen beide festen äußeren Anschlüsse jeweils mit +5V bzw. Masse verbunden sind. Der mittlere Anschluss ist variabel und wandert je nach Einstellung mal Richtung +5V, mal Richtung Masse. Auf diese Weise kann ein variabler Spannungswert zwischen +5V und Masse dem analogen Eingang A zugeführt werden. Also das mit dem variablen Spannungsteiler habe ich noch nicht so Recht verstanden. Wie kann ich mir das vorstellen? Hey, kein Problem! Als ich das zum ersten Mal gehört habe, musste ich auch scharf nachdenken. Was ist überhaupt ein Spannungsteiler? Nun ja, er teilt die anliegende Spannung in einem bestimmten Verhältnis auf und wird im einfachsten Fall aus 2 Widerständen aufgebaut. Auf der linken Seite liegt die Versorgungsspannung U von +5V an und auf der rechten Seite befindet sich quasi der Ausgang mit der Ausgangsspannung U2, die über dem Widerstand R2 Arduino LC-Display-Ansteuerung Seite 6
abgegriffen wird. Diese beiden Widerstände teilen die Versorgungsspannung auf. Ein Teil fällt am Widerstand R und ein anderer an R2 ab. Wir können dazu eine Formel aufstellen, die die Verhältnisse darstellt. Sieht zwar ganz nett aus, doch wie kommt sie zustande? Ganz einfach! Es handelt sich um eine Verhältnisgleichung. Die Versorgungsspannung U fällt über den beiden Widerständer R und R2 ab, wobei die Ausgangsspannung U2 lediglich über dem Widerstand R2 angegriffen wird. Beide Seiten der Gleichung stehen im gleichen Verhältnis zueinander. Um jetzt die Ausgangsspannung U2 genau berechnen zu können, muss diese Gleichung einfach nach U2 umgestellt werden. War gar nicht so schwer, oder!? Jetzt kommt das Potentiometer ins Spiel. Wie ich schon erwähnte, kannst Du dieses Bauteil als einen variablen Spannungsteiler ansehen. Schau her: Der Abgriff der Ausgangsspannung U2 liegt an Pin 2 des Potentiometers und dieser Pin wandert je nach Einstellung rauf oder runter und teilt den Widerstand in unterschiedliche Größen. Arduino LC-Display-Ansteuerung Seite 7
Die nächsten beiden Bilder machen es sicherlich noch ein wenig klarer: Das linke Schaltbild zeigt eine Potentiometereinstellung, wo der Abgriff an Pin 2 weit oben ist. R ist also im Verhältnis zu R2 viel kleiner. Beim rechten Bild ist es genau umgekehrt. Der Abgriff ist nach unten gewandert und R ist viel größer als R2. Ein einzelner analoger Eingang verkraftet Spannungswerte im Bereich von V bis +5V, der unter keinen Umständen überschritten werden darf. Andernfalls wird der Mikrocontroller zerstört! Ein analoges Signal hat in Wirklichkeit unendlich viele Abstufungen, die dem Mikrocontroller zugeführt werden. Dieser ist jedoch aus bautechnischen Gründen nicht in der Lage, jedes kleinste µv zu erkennen. Ein einzelner analoger Eingang hat eine Auflösung von Bit. Das bedeutet, dass er die maximal zulässige Spannung von +5V in Bit =.24 gleiche Häppchen teilt. Daraus ergibt sich die maximale Empfindlichkeit von Das sind also gerundet 4,9 mv. Arduino LC-Display-Ansteuerung Seite 8
Der Schaltplan unter die Lupe genommen Ich denke, dass Du jetzt soweit mit Hintergrundwissen versorgt bist, dass wir uns dem Schaltplan im Besonderen widmen können. Du hast ihn zu Beginn zwar schon einmal gesehen, doch jetzt wollen wir uns einigen Details widmen. Das LCD-Modul besitzt unterschiedliche Anschlussleitungen, wobei wir diese in zwei Kategorien unterteilen können. Steuerleitungen o RS (Register-Select) o R/W (Read/Write) o E (Enable) Datenleitungen o D bis D7 Arduino LC-Display-Ansteuerung Seite 9
Registerwahl (Register-Select) Read/Write Enabled Datenbus D bis D7 (8-Bit) Die Steuerleitungen an den Pins 4, 5 und 6 regeln quasi den Transfer der Informationen auf dem LCD-Modul. Schauen wir uns zunächst die RS-Leitung an. Das hier vorgestellte LCD-Modul kann Informationen in zwei Zeilen darstellen. Es ist zudem möglich, jede einzelne Stelle anzusprechen, um gezielt ein oder mehrere Zeichen zu platzieren. Wenn wir also Informationen an das Modul schicken, muss demnach unterschieden werden, ob es sich um Steuerinformationen oder Anzeigeinformationen handelt. RS-Leitung Das wird durch die entsprechende Ansteuerung der RS-Leitung geregelt. : Befehl bzw. Steuerinformation : Daten bzw. Anzeigeinformation R/W-Leitung Wir können nicht nur Informationen an das Modul zu Anzeige schicken, sondern auch lesen. Was aber für uns keine weitere Bedeutung hat, denn wir möchten ausschließlich Daten verschicken. Aus diesem Grund ist die R/W-Leitung fest mit Masse verbunden. : Schreiben : Lesen Arduino LC-Display-Ansteuerung Seite
Enable-Leitung Bei der Enable-Leitung handelt es sich um eine Taktleitung, die für die Synchronisation sämtlicher Leitungen zuständig ist. Kommen wir jetzt zu den Datenleitungen. Vielleicht ist Dir im Schaltplan aufgefallen, dass lediglich die Anschlüsse D4 bis D7 verwendet wurden. Da es sich um die Datenleitungen handelt und wir nur die Hälfte der zur Verfügung stehenden Pins nutzen, bedeutet das jedoch nicht, dass uns etwas von der Funktionalität verloren geht. Das Display kann sowohl im 8-Bit, als auch im 4-Bit Modus betrieben werden. Da in fast allen Schaltungen der 4-Bit-Modus verwendet wird, werden wir das auch hier tun. Um einen Bytewert auf eine 8-Bit Leitung zu schicken, ist eine einzige Operation von Nöten. 8-Bit-Modus LSB MSB Um die gezeigte Bitkombination an das LC-Display zu schicken, ist eine einzige Operation notwendig. Arduino LC-Display-Ansteuerung Seite
. Schritt 2. Schritt 4-Bit-Modus LSB MSB Im. Schritt werden die obersten 4 Bits, im 2. Schritt, die untersten 4 Bits übertragen. Das bedeutet zwar ein wenig Mehraufwand, was sich sicherlich auf die Ausführungsgeschwindigkeit auswirkt, doch immer noch so schnell passiert, dass wir den Unterschied zum 8-Bit Modus nicht wahrnehmen würden. Wie aber können wir jetzt etwas auf das LC-Display schicken, um etwas zu sehen? Es hängt sicherlich in erster Linie davon ab, was wir auf die Datenleitungen (D4 bis D7) schicken, doch auch die Steuerleitungen R/W (ist auf : Masse gelegt, weil wir nur auf das Display schreiben), R/S und Enabled spielen sicherlich ebenfalls eine entscheidende Rolle. Das Zusammenspiel aller Leitungen macht in der Summe das aus, wie sich das Display verhält. Wenn Du Deinen Mikrocontroller programmierst, dann bedienst Du Dich einem vordefinierten Befehlssatz, damit das ausgeführt wird, was Du beabsichtigt hast. Ähnlich verhält es sich mit dem LC-Display. Alleine das LC-Display, was ja genau genommen nur eine Flüssigkeitskristallanzeige ist, besitzt ja keine Logik. Zu Ansteuerung wird der schon erwähnte Treiber benötigt. Dieser Baustein enthält die Logik bzw. einen Befehlssatz, um die Anzeige zu steuern. Arduino LC-Display-Ansteuerung Seite 2
Die Programmierung Jetzt hast Du so viel über die technischen Hintergründe erfahren, dass es wirklich Zeit wird, sich mit der Programmierung auseinander zu setzen. Im Arduino-Umfeld werden alle Programme Sketche genannt. Hier also unser Sketch, der folgende Aufgabe erfüllt: Kontinuierliches Einlesen des Wertes am analogen Eingang A Umrechnen des Wertes ( bis.23) in einen Spannungswert (V bis +5V) Kontinuierliche Anzeige des errechneten Spannungswertes Arduino LC-Display-Ansteuerung Seite 3
Ein Sketch wird immer in 3 Blöcke unterteilt, die folgende Aufgaben haben: Definitionsbereich o Mögliches Einbinden von Bibliotheken o Definition von Variablen bzw. symbolischen Konstanten Initialisierungsbereich o Einmaliger Aufruf der setup-funktion (z.b. Initialisierung von Variablen) Arbeitsbereich o Fortwährender Aufruf der loop-funktion (z.b. Abfrage von Sensorwerten und Ausgabe an die verschiedenen Ports) Hier eine kleine Grafik, die den Ablauf bzw. die Sketch-Struktur wiedergibt. Wo finde ich denn in unserem Schaltplan diese Blöcke wieder? Arduino LC-Display-Ansteuerung Seite 4
Ok, hier ist der erste Block, der für die Deklarierung und Initialisierung verantwortlich ist. In Zeile 2 binden wir über die #include-anweisung eine Bibliothek in unseren Sketch-Code ein. Warum machen wir das? Die Antwort ist ganz einfach! Die komplette Ansteuerung des LCD- Moduls mit den Steuer- bzw. Datenleitungen ist eine komplexe Angelegenheit und Bedarf fundierter Kenntnisse des Datenblattes des Moduls HD4478. Ein findiger Programmierer hat sich dieser Sache angenommen und einen Sketch-Code programmiert, der diese Aufgabe übernimmt. Das Einzige, was für uns jetzt von Interesse ist, ist die Angabe, welche Pins des LCD- Moduls an welchen Pins des Arduino angeschlossen werden. Der Programmierer der Bibliothek, die auch Library genannt wird, hat quasi eine Schnittstelle geschaffen, der diese Informationen übergeben werden muss. Alles Weitere wird durch die Library übernommen. Wie sie funktioniert, hat uns erst einmal nicht zu interessieren. Die Definition der einzelnen Pins und ihre Belegung erfolgt dann in den Zeilen 4 bis 2. In Zeile 3 erfolgt die besagte Übergabe der zuvor definierten Pin-Informationen an die Schnittstelle. Wie sieht diese Schnittstelle aber aus? Nun, es handelt sich um die Instanziierung eines sogenannten Objektes. Stelle Dir dieses Objekt als einen besonderen Datentyp vor. Wenn Du Dich mit der Programmierung im Allgemeinen schon einmal auseinander gesetzt hast, sind Dir Datentypen wie int, char, float - um nur einige zu nennen - sicherlich schon einmal über den Weg gelaufen. Wurden Variablen damit deklariert, können sie Werte speichern, die später im Programmablauf genutzt werden. Bei Objekten ist die Sache viel komplexer und es würde den Rahmen sprengen, alles zu erklären. Ich verweise an dieser Stelle auf mein Arduino-Buch, in der die objektorientierte Programmierung für den Arduino bzw. die Erstellung eigener Libraries detailliert beschrieben wird. Arduino LC-Display-Ansteuerung Seite 5
Jedenfalls wird mit in der Zeile 3 eine Variable lcd vom Datentyp LiquidCrystal initialisiert. Das ist möglich, weil wir in Zeile 2 die entsprechende Library in unseren Sketch-Code mit eingebunden haben. Wir übergeben bei der Instanziierung, wie dieser Vorgang genannt wird, die notwendigen Informationen über die Pinbelegung, damit die Library das LCD-Modul korrekt ansteuern kann. Das ist schon fast alles. Kommen wir zum zweiten Block. Dieser wird wie schon erwähnt einmalig ausgeführt und wird durch die setup-funktion repräsentiert. An dieser Stelle teilen wir unserem lcd-objekt mit, wie viele Spalten und Zeilen unser LCD-Modul denn hat (Zeile 7). Es existieren unterschiedliche Module mit z.b. 4 Zeilen und abweichender Spaltenanzahl. Die Library ist derart programmiert, dass sie auf diese Unterschiede entsprechend reagieren kann. Das kleine Wörtchen begin(...) stellt in der objektorientierten Programmierung eine sogenannte Methode dar. Das hört sich schon recht wichtig und kompliziert an, ist aber nichts anderes als eine Funktion, die im objektorientierten Umfeld eben diesen Namen bekommen hat. Spätestens an dieser Stelle wirst Du sicherlich bemerkt haben, dass Objekte in der Programmierung etwas ganz besonderes sind. Sie können nicht nur Werte speichern, sondern legen auch ein Verhalten an den Tag, das durch eben diese Methoden beeinflusst werden kann. Dieses Verhalten wird in Zeile 8 ganz deutlich. Ich teile dem lcd-objekt über die clear-methode mit, es möchte doch bitte den Inhalt im LCD-Modul löschen. In der Zeile 9 schreibe ich mit der print-methode etwas in das LC-Display, was nach dem Löschen unmittelbar in der ersten LCD-Zeile erfolgt. Arduino LC-Display-Ansteuerung Seite 6
Jetzt der dritte Block: Hier erfolgen die ständige Abarbeitung, also das Einlesen des analogen Wertes, die schon beschriebene Umrechnung und die Anzeige des Spannungswertes. Über die setcursor-methode in Zeile 24 wird der Cursor, also die Stelle, wo die nächste print- Ausgabe erfolgen soll, positioniert. In Zeile 25 erfolgt das Abfragen des analogen Eingangs über die analogread-funktion. Dieser Wert wird der Variablen analogerwert des Datentyps int zugewiesen. In der darauffolgenden Zeile 26 passiert die Umrechnung des Wertes, der ja im Bereich von bis.23 sein kann, in einen entsprechenden Spannungswert, in dem dieser mit 4,9 mv multipliziert wird. In den Zeilen 27 bis 29 wird dieser Wert zusammen mit dem Formelzeichen U und dem Zusatz Volt zur Anzeige gebracht. Auf diese Weise haben wir einen schönen AD-Wandler mit dem Arduino-Board + LCD-Modul gebaut bzw. programmiert. Es gibt weitere interessante LCD-Module, wie z.b. das Folgende. Hier sind die Möglichkeiten nahezu unbegrenzt und werden nur durch Deine Kreativität beschränkt. Viel Spaß damit Arduino LC-Display-Ansteuerung Seite 7