HMI-Unit als Hardware Komponente

Für fast jede App brauche ich ein Display, ein paar LED’s, einen Buzzer und ein paar Eingabetasten. Es ist mühsam und verbraucht jedes mal viel Speicherplatz.
Wäre es nicht Super ein Modul zu haben, das über eine serielle Schnittstelle kommuniziert und dabei die immer gleichen Elemente zur Verfügung stellt?

Die HMI Unit hat dann verschiedene Elemente zur Verfügung, die über die serielle Schnittstelle angesteuert werden können, das sind: Tasten, LED’s, Buzzer und ein Display. Alle Nachrichten werden mit einem Newline (\n oder 0x0A) abgeschlossen, und haben ein Leerzeichen als Trennzeichen. Damit baue ich dann verteilte Systeme, oder nutze das HMI-Unit zum Debuggen.

– Hardware
Prozessor: Arduino Micro (ATmega32u4)
Display: PCD8544 / Nokia 5110, 84 x 48 Pixel
Backlight LED vom Display: Dimmbar per PWM über einen HW Treiber
LED’s: 3 LED’s verschiedener Farbe über einen HW Treiber, Dimmbar per PWM
Tasten: 6 Tasten (4 Cursor + 2 Extra)
Buzzer: Ein Piezo Buzzer
Schnittstelle: UART

– Display
Angeschlossen an D3 bis D7 nach Angaben der Bibliothek, sowie GND und 3,3V Spannungsversorgung. X = 0 und Y = 0 ist links oben. Xmax = 83 und Ymax = 47. Textgröße: ‚vergrößerungsfaktor‘. Jeder Schritt macht ein Pixel um diesen Faktor größer. 1 ist default 6×8, 2 ist 12×16, 3 ist 18×24, etc.

Kommandos:
Steuerwort Modus Startpunkt Endpunkt\n
Steuerwort Modus Text\n
Steuerwort Modus Textgröße\n
Steuerwort Modus Cursorpos\n

mit Steuerwort = dsp
Modus = line, text, clean, size, curs
Startpunkt = x, y Koordinate (immer 2 Stellen)
Endpunkt = x, y Koordinate (immer 2 Stellen)
Textgröße = 1,2,3 … 8 (Vergrößerungsfaktor)
Cursorpos = xpos, ypos (abhängig von Textgröße, (jeweils immer 2 Stellen)
bei 1: x: 0 bis max. 8, y: min. 0 bis max.14
bei 8: x: 0, y: 0)
x nach rechts, y nach unten, das ist die Pixelposition!
Für Text 6 bits breit und 8 bits hoch, jeweils mal Vergrößerungsfaktor
Der Fontsize ist laut Bibliothek 5 bit breit und 7 bit hoch plus je 1 bit zwischenraum.

mit Modus:
line : zeichnet eine Linie von Startpunkt zum Endpunkt
text : gibt einen Text am Cursor aus. Pixelstartposition ist links oben.
clean: löscht das Display
size : setzt die Textgröße
curs : setzt die Cursorposition

Rückmeldungen:
– unbekanntes Steuerwort\n
– unbekannter Display Modus\n
– Textgröße wird nicht unterstützt\n
– Cursorpos außerhalb\n
– Ok\n

– LED’s:
Die drei Farbleds laufen über den invertierenden HW Treiberbaustein ULN2803A. Die Backlight LED wird über einen Transistor invertierend angeschlossen. Angeschlossen an: D13 LED Backlight, D9, D10 und D11 die drei Farb LED’s.
Achtung: Dadurch sind alle LED’s invertiert anzusteuern! Da diese vier Pins auch PWM fähig sind, lassen sich die LED’s damit auch Dimmen!

Kommandos:
Steuerwort Typ Modus [Wert]\n

mit
Steuerwort = led
Typ = rot, blau, gruen, back
Modus = an, aus, blink, dimm
[Wert] für blink = die Halbperiode in Millisekunden
[Wert] für dimm = 0 bis 255 für die PWM von 100% bis 0%

Rückmeldungen:
– unbekanntes Steuerwort\n
– unbekannter LED Typ\n
– unbekannter LED Modus\n
– LED Blinkwert zu klein\n < 100ms
– LED Dimmwert zu groß\n > 255
– Ok\n

– Buzzer
Ist ein einfacher Piezo Buzzer und wird an D12 angeschlossen.

Kommandos:
Steuerwort Modus [Wert] [Wert2]\n

mit Steuerwort = buz
Modus = an, aus, intervall [Wert] [Wert2]
[Wert] = Halbintervalldauer in ms (für an und aus gleichlang, 4 Stellen)
[Wert2] = Anzahl der Intervalle (100 = maximum)

Rückmeldungen:
Ok\n
Intervallzähler zu groß\n

– Tasten
Die sechs Tasten: Werden als Tastenmatrix mit zwei Zeilen zu drei Spalten angeordnet.
Folgende Tasten sind angeschlossen:
Cursor Left, Cursor Right, Cursor Up, Cursor Down, Key A und Key B
Die Spalten liegen auf den Pins A1, A2 und A3, die Zeilen auf A4 und A5. Damit ergibt sich folgende Matrix:

    A1 A2 A3
    Spalte 1 Spalte 2 Spalte 3
A4 Zeile 1 Key B Cursor Right Cursor Up
A5 Zeile 2 Key A Cursor Down Cursor Left

Kommandos:
Steuerwort Modus\n

mit Steuerwort = key
Modus = push, pull, get

push : Die HMI Unit sendet die aktuell gedrückten Tasten bei Änderung (Event pressed) über die UART

pull : Die aktuell gedrückten Tasten werden über die UART abgefragt mit get

Rückmeldungen:
Tastencode aller aktuell gedrückten Tasten:
B
A
left : L
down : D
up : U
right: R

Taste U gedrückt: U\n
Taste L und A gedrückt: LA\n
Keine Taste gedrückt sendet nichts zurück!

Anmerkung: Bei drei gedrückten Tasten gleichzeitig werden auch mal vier Tasten angezeigt. Ich empfehle also nicht mehr als zwei Tasten gleichzeitig zu verwenden!

– Status der HMI Unit
Gibt zurück, um welches System es sich handelt.
Keys: 6<\n>
Led’s: Rot, Gruen, Blau, Back<\n>
Sound: Buzzer<\n>
Display: 84Spalten * 48Zeilen<\n>

Kommandos:
Steuerwort\n

mit Steuerwort = sts

Rückmeldungen:
– unbekanntes Steuerwort\n
– Gerätestatus

– UART (serielle Schnittstelle)
Die UART wird angeschlossen an Portpins PD3 und PD2, als UART natürlich.

– Demo
Initialwerte sind Textgröße 1 und Startposition Cursor: 0, 0. Mein Textlogo „SEaP:“ soll mittig ausgegeben werden, mit der Vorgabe: Textgröße 2. Die Ausgabe erfolgt von einem Terminalprogramm am PC, das „Ok\n“ ist immer die Antwort vom HMI-Unit:

dsp size 2\n
Ok\n
dsp curs 12 16\n
Ok\n
dsp text SEaP:\n
Ok\n
dsp line 12 08 72 08\n
Ok\n
dsp line 12 40 72 40\n
Ok\n
led blau an\n
Ok\n
led gruen an\n
Ok\n
led blau aus\n
Ok\n
led rot an\n
Ok\n
led gruen aus\n
Ok\n
led rot aus\n
Ok\n
buz an\n
Ok\n
buz aus\n
Ok\n
key push\n
Ok\n

– Varianten:
Anzahl der Tasten und LED’s lassen sich anpassen und auch das Display kann ein grafisches Display oder ein LCD Display oder eine Siebensegment Anzeige sein. Das hängt von der Anwendung ab.

– Foto:

Die fertige HMI Unit

– Der Sketch:
HMI_Unit


Links und Literaturhinweise:

Display
https://lastminuteengineers.com/nokia-5110-lcd-arduino-tutorial/

LED Treiber
https://www.st.com/resource/en/datasheet/uln2804a.pdf

Dimmbare LED’s
https://www.arduino.cc/reference/en/language/functions/analog-io/analogwrite/

Tastenmatrix
https://arduinogetstarted.com/tutorials/arduino-keypad

Terminalprogramme
https://www.der-hammer.info/pages/terminal.html
https://coolterm.sooftware.com/windows

Veröffentlicht von

Jürgen

Ich bin Software Ingenieur und habe meine Schwerpunkte in allen Aktivitäten, die zur Software Entwicklung gehören. Am längsten bin ich als Software Entwickler von Embedded Software in C tätig.