Nach Beispiel 1, in welchem der Arduino Uno ein einfaches zweizeiliges LCD gesteuert hat, kommt darauf aubauend hier ein zweites Beispiel: die Ansteuerung eines GLCD mit 320 mal 240 Pixeln. Es gibt bei ebay recht preiswert GLCD's mit EPSON controller S1D13305 (frühere Bezeichnung: SED1335) oder dem etwas besseren S1D13700 (früher: SED1370); dieses Beispiel verwendet das Display Powertip PG320240WRF-HE4HS1 - ein weißes GLCD mit 320x240 Pixeln und LED-Beleuchtung. Eleganterweise benötigt dieses Display lediglich eine einzige +5V Versorgung (Kostenpunkt: 14,90€ + 2,50€ Versand). Das fast baugleiche PG320240WRF-HE9 geht übrigens auch, es hat den (empfehlenswerteren) S1D13700 controller; die Belegung bleibt gleich.
--
Dieses mal muss erst einmal der Lötkolben ran.
Das Display wird auf einer Universalplatine verlötet und ist so wie ein 'Arduino-Shield' auf die Arduino Platine als Ganzes steckbar. Eine extra Leiterplatte zu entwerfen, ist hier also nicht unbedingt nötig. Der Schaltplan verrät das Nötige:
- das Poti dient zur Einstellung des optimalen Kontrastes.
- der 15Ohm Widerstand begrenzt den Strom der Hintergrundbeleuchtung, er begrenzt den Strom auf ~60mA (120mA sind erlaubt).
- der /DisplayOff Anschluss ist unbenutzt (12k nach VCC)
- Reset hat einen Pullup Widerstand bekommen
- +5V und GND kommt von Arduino Board.
- die Arduino digiIO Pins 0..12 werden benutzt.
- D0..D7 sollten etwa gleiche Länge aufweisen - ist ja schließlich ein paralleler Port an dem jedes Bit zählt.. ;-)
GANZ WICHTIG: ALLES NOCH EINMAL PRÜFEN. Glcds lassen sich nur schwer debuggen.
--
Nun zur Software. Der S1D13305 wird von der arduino Software nicht direkt unterstützt. Und die GLCD library die ich finden konnte, kann mit GLCD mit mehr als 256 pixeln in einer Richtung nicht umgehen, das GLCD hat allerdings 320x240. Aber..
Es gibt eine library von Matt Bommicino für den ähnlichen S1D13700 Controller. Der unterscheidet sich in einigen Punkten, wie z.B. Timings, Clocks und der zusätzlichen Möglichkeit Graustufen einzustellen. Aber vielleicht lässt sich das ja mit kleinen Änderungen anpassen?
Der Schaltplan ist deswegen absichtlich 1:1 kompatibel zu dieser Library. Die Bibliothek selbst wird installiert, indem der Ordner 'S1D13700' aus dem zip mit den Dateien 'S1D13700.{h,c}' in den 'library' Ordner der Arduino Software kopiert wird.
Okay. Testen wir das Beispiel zur library.. (Der source code hier ist 1:1 das Beispiel zur library, aber der Verständlichkeit wegen anders kommentiert).
Leider kompiliert die library nicht: WProgram.h wird per #include eingebunden, ist aber unbekannt. Google verrät, dass diese Header Datei neuerdings 'Arduino.h' heißt. Also per Hand in S1D13700.{c.h} WProgram.h durch Arduino.h ersetzen.
Siehe da es kompiliert. Also programmieren und testen..
E voila, ein freundliches Diagramm mit einem Sinus begrüßt uns, garniert von einem 'Hello World'. Kein Anpassen der Library mehr nötig.. Das ist ja schon fast zu einfach.
<ENDE>
--
Dieses mal muss erst einmal der Lötkolben ran.
Das Display wird auf einer Universalplatine verlötet und ist so wie ein 'Arduino-Shield' auf die Arduino Platine als Ganzes steckbar. Eine extra Leiterplatte zu entwerfen, ist hier also nicht unbedingt nötig. Der Schaltplan verrät das Nötige:
- das Poti dient zur Einstellung des optimalen Kontrastes.
- der 15Ohm Widerstand begrenzt den Strom der Hintergrundbeleuchtung, er begrenzt den Strom auf ~60mA (120mA sind erlaubt).
- der /DisplayOff Anschluss ist unbenutzt (12k nach VCC)
- Reset hat einen Pullup Widerstand bekommen
- +5V und GND kommt von Arduino Board.
- die Arduino digiIO Pins 0..12 werden benutzt.
- D0..D7 sollten etwa gleiche Länge aufweisen - ist ja schließlich ein paralleler Port an dem jedes Bit zählt.. ;-)
GANZ WICHTIG: ALLES NOCH EINMAL PRÜFEN. Glcds lassen sich nur schwer debuggen.
--
Nun zur Software. Der S1D13305 wird von der arduino Software nicht direkt unterstützt. Und die GLCD library die ich finden konnte, kann mit GLCD mit mehr als 256 pixeln in einer Richtung nicht umgehen, das GLCD hat allerdings 320x240. Aber..
Es gibt eine library von Matt Bommicino für den ähnlichen S1D13700 Controller. Der unterscheidet sich in einigen Punkten, wie z.B. Timings, Clocks und der zusätzlichen Möglichkeit Graustufen einzustellen. Aber vielleicht lässt sich das ja mit kleinen Änderungen anpassen?
Der Schaltplan ist deswegen absichtlich 1:1 kompatibel zu dieser Library. Die Bibliothek selbst wird installiert, indem der Ordner 'S1D13700' aus dem zip mit den Dateien 'S1D13700.{h,c}' in den 'library' Ordner der Arduino Software kopiert wird.
Okay. Testen wir das Beispiel zur library.. (Der source code hier ist 1:1 das Beispiel zur library, aber der Verständlichkeit wegen anders kommentiert).
Code:
/* es gibt auch keine fertige Bibliothek für den S1D13305;
* allerdings gibt es eine library von Matt Bommicino für den S1D13700,
* welcher dem S1D13305 sehr ähnlich ist.
*/
#include <S1D13700.h>
/* ein objekt namens 'glcd' vom Typ S1D13700
*/
S1D13700 glcd;
/* auch hier wird wieder zuerst die setup() routine aufgerufen,
* bevor anschließend als hauptprogramm loop() läuft.
*/
void setup() {
/* ich nutze hier absichtlich eine 100%ig
* kompatible pinbelegung zur S1D13700 library. Wer andere Pins nutzen möchte,
* muss vor initLCD() diese Pins zuweisen, z.B. 'glcd.pins.rd = 10;'
*/
glcd.initLCD();
char buf[] = "Hello World!";
/* alle Bildschirm Inhalte löschen */
glcd.clearText();
glcd.clearGraphic();
/* setze Text Ausgabe Position auf Spalte 10, Zeile 1 */
glcd.textGoTo(10,1);
/* schreibe Text an festgelegte Position */
glcd.writeText(buf);
/* neue Text Position Spalte 20 Zeile 28 && erneut Text schreiben */
glcd.textGoTo(20,28);
glcd.writeText(buf);
/*Draw a box on the screen to
contain out upcoming sin wave.
We use two command to double the
border width*/
/* Zeichnen eines Rechtecks von (0,24) -> (319,216) */
glcd.drawBox(0,24,319,216);
/* Zeichnen eines weiteren Rechtecks von (1,25) -> (318,215)
* mit je 1px offset ergibt doppelte Linienstärke
*/
glcd.drawBox(1,25,318,215);
/* Zeichnen des Gitternetzes für das Diagramm mit jeweils einer loop
* in x und y Richtung.
*/
int i;
for (i = 16; i < 320; i+=16)
glcd.drawLine(i,24,i,216);
for (i = 40; i < 216; i+=16)
glcd.drawLine(0,i,319,i);
/* Die Mittellinien in x und y werden mit einer zweiten Linie verstärkt. */
glcd.drawLine(0,119,319,119);
glcd.drawLine(0,121,319,121);
glcd.drawLine(159,24,159,216);
glcd.drawLine(161,24,161,216);
/* Berechne (x,y) Punkte entlang der Sinuskurve */
#define SCREEN_WIDTH 320
#define SCREEN_HEIGHT 240
#define SIN_HEIGHT 60
#define NUM_OF_OSCILLATIONS 2
#define LOOP_INCREMENT (NUM_OF_OSCILLATIONS * 2 * PI) / SCREEN_WIDTH
float currentSin = 0;
int x = 0;
int y = 0;
int oldX = 0;
int oldY = (SCREEN_HEIGHT / 2);
for (x = 0; x < SCREEN_WIDTH; x++) {
currentSin += LOOP_INCREMENT;
/* berechne nächsten y Wert entsprechend x Position */
y = (int) (SIN_HEIGHT * sin(currentSin)) + (SCREEN_HEIGHT / 2);
/* zeichne ein weiteres Stück der Sinuskurve von (oldX,oldY) -> (x,y) */
glcd.drawLine(oldX, oldY, x, y);
/* Verstärkung der Linienbreite durch ein zweite Linie */
if ((x < SCREEN_WIDTH) && (oldX < SCREEN_WIDTH))
glcd.drawLine(oldX + 1, oldY, x + 1, y);
if ((x > 0) && (oldX > 0))
glcd.drawLine(oldX - 1, oldY, x - 1, y);
oldX = x;
oldY = y;
}
}
void loop() {
/* definiere Pin 13 (LED) als Ausgang */
pinMode(13,OUTPUT);
/* Led blinken 500msec an - 500msec aus als Lebenszeichen dass der MC noch läuft. ;-) */
while(1) {
digitalWrite(13,1);
delay(500);
digitalWrite(13,0);
delay(500);
}
}
Leider kompiliert die library nicht: WProgram.h wird per #include eingebunden, ist aber unbekannt. Google verrät, dass diese Header Datei neuerdings 'Arduino.h' heißt. Also per Hand in S1D13700.{c.h} WProgram.h durch Arduino.h ersetzen.
Siehe da es kompiliert. Also programmieren und testen..
E voila, ein freundliches Diagramm mit einem Sinus begrüßt uns, garniert von einem 'Hello World'. Kein Anpassen der Library mehr nötig.. Das ist ja schon fast zu einfach.
<ENDE>