Forum: Projekte & Code Arduino: serielles Ansprechen eines HD44780 Displays über SoftSerial


von Ralph S. (jjflash)



Lesenswert?

Nachdem ich nun wirklich viel Zeit habe, habe ich mich doch tatsächlich 
mit Arduino beschäftig (grundsätzlicher Natur).

Das erste "Projekt" das ich also mit Arduino gemacht habe möchte ich 
hier "vorstellen" und es ist entstanden aus einem Mißverständniss 
meinerseits in einem Nachbarthread.

Hier geht es darum, mit einem Arduino einen zweiten Arduino anzusteuern, 
an den ein HD44780 kompatibles Textdisplay angeschlossen ist. 
Grundsätzlich habe ich so etwas funktionierend in reinem C auf einem 
PFS154 realisiert gehabt und hier ging es darum, das mit Arduino zu 
realisieren mit den (wenigen) Kenntnissen, die ich über Arduino habe.

Die Datenübertragung wird mittels SoftwareSerial hergestellt, so dass 
auf Sender- sowie auf Empfängerseite der Harware-Uart für andere Zwecke 
frei bleibt. Zur Hardwareansteuerung des LC-Displays wird die 
arduinoeigene LiquidCrystal.h verwendet.

Da der Empfänger-Arduino zum Sender keinen Wert zurückgeben kann, genügt 
eine einzelne Daten- plus Masseleitung zum Senden. Somit ist der 
Verdrahtungsaufwand, sollte mit dem Empfänger so etwas wie eine 
Backplane-Platine entsthen noch geringer als mit den gängigen I2C 
Adaptern mit PCF8574.

Empfängerseitig habe ich nur einen Sketch programmiert und aus der darin 
enthaltenen Klasse ganz bewußt keine  Library gemacht, da das 
Display-Interface in sich nur eine Firmware darstellt, aus der eben nur 
diese eine Funktion gemacht wird und deshalb die Wiederverwertbarkeit 
eher nicht gegeben ist.

Grundsätzlich kann der Empfänger von jedem UART Zeichen empfangen. Das 
serielle Protokoll ist bewußt "langsam" gewählt, damit die Übertragung 
stabil bleibt, aber dennoch schnell genug ist um die (wenigen) Zeichen 
gut anzeigen zu können. Das serielle Protokoll ist: 4800 Baud, 8 N 1

Was kann das Display-Interface:
Das Interface verarbeitet Steuercodes eines Terminals, das heißt ein \n 
\r \t \b wird als NewLine, Carriage Return, Tabulator, Backspace 
interpretiert. Befindet sich der Cursor in der 2. Zeile des Displays, 
wird der Inhalt auch tatsächlich nach oben gescrollt.

Zusätzlich kann über Methoden der Klasse der Cursor ein/ausgeschaltet 
werden, das Display gelöscht, der Cursor positioniert werden. Zudem kann 
ein userdefiniertes Bitmap als Zeichen in das Display eingesetzt werden 
und im Empfänger selbst sind bereits Bitmaps definiert, die u.a. 
deutsche Umlaute, Ohm-, Sigma- hochgestelltes "o" abbilden können.

Außerdem (weil mir das in der Handhabung einfach lieber ist) beiinhaltet 
die Klasse ein schlankes printf, mit ein paar speziell an das Interface 
angepasste Platzhalter. Vieles aus einem "originalen" printf wurde 
entfernt, damit der Flashbedarf klein bleibt. Dafür wurde ein 
"Pseudofloat" eingeführt, welches schlicht eine Dezimalzahl ausgibt, bei 
der aber bestimmt werden kann, an welcher Stelle ein Dezimalpunkt 
eingefügt wird.

Diejenigen, die so etwas ablehnen, können den gewohnten Stream aus 
Arduino verwenden, der ebenso funktioniert, weil die Klasse diesen 
Stream erbt.

Im Anhang gibt es ein Archiv, in dem zum einen der Empfängersketch 
enthalten ist: stxlcdrecv_uart.ino sowie eine weitere gepackte 
Zip-Datei, die mittels der Libraryverwaltung on Arduino installiert 
werden kann.

Jetzt bin ich am überlegen gewesen, ob ich jede einzelne Sourcedatei 
hier noch einmal getrennt mit anhänge, aber ich denke dass das irgendwie 
zu viel ist. Denjenigen, den das interessiert, kann sich wirklich die 
Zip-Datei herunterladen und sich das ansehen (eventuell sieht das ja 
auch Arduino F. und Veit .... und geben ihre Kommentare ab, von diesen 
beiden habe etwas über Arduino gelernt).

Aus diesem Grund hier zusätzlich zur Dokumentation (die fast länger 
gebraucht hat als der Code) nur die 3 Demo-Programme aus der Library.

Das LCD-Interface (Receiver) bestimmt den Arduino-Pin A4 als RxD (der 
jedoch geändert werden  kann), für Demoprogramme des Senders wird 
ebenfalls A4 verwendet, hier ist A4 dann logischerweise der TxD. 
Grundsätzlich müssen also nur die beiden A4 Leitungen der Arduinos und 
die Masse miteinander verbunden werden.

-----------------------------------------

Ich sehe schon: ich habe fast schon wieder zu viel geschrieben und meine 
Finger sind irgendwie zu schnell.

Ich wünsche Euch, je nachdem was Ihr macht, entweder viel Spaß beim 
Ausprobieren, beim Analysieren oder wenn es euch gefällt auch beim 
Stänkern und Meckern.

Viele Grüße,
Ralph
von Horst (alteskind)


Lesenswert?

n bisschen arg viel Code, aber schöne PDF
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.