Anwendung und Programmierung von Mikrocontrollern Sommersemester 2013 Dr.-Ing. Hubert Zitt Kontakt: hubert.zitt@fh-kl.de www.fh-kl.de/~zitt Dr.-Ing. Hubert Zitt Seite 1 von 24
S65 Shield (von oben) Komponenten LCD-Display von Siemens Drehencoder mit Tasterfunktion Reset-Taster Dr.-Ing. Hubert Zitt Seite 2 von 24
S65 Shield (von unten) Komponenten Anschlusspins für Arduino-Board Slot für MicroSD-Karte Dr.-Ing. Hubert Zitt Seite 3 von 24
S65 Shield (Pinbelegung) vom Display nicht verwendete Pins digitale Pins 0, 1, 2, 3, 10 analoge Pins 0, 1, 4, 5 somit kann der I²C-Bus parallel zum Display betrieben werden Dr.-Ing. Hubert Zitt Seite 4 von 24
S65 Shield - das S65 LCD von Siemens Technische Daten LED-Backlight Verwendung u.a. in Handys Darstellung im Hoch- oder Querformat Auflösung: 132 X 176 Pixel 65536 Farben (16 Bit) R(ot) 5 Bit G(rün) 6 Bit B(lau) 5 Bit Dr.-Ing. Hubert Zitt Seite 5 von 24
S65 Shield der Drehencoder Technische Daten Tasterfunktion kurzes Drücken (ab 80 ms) langes Drücken (ab 800 ms) Drehfunktion nach links drehen nach rechts drehen Dr.-Ing. Hubert Zitt Seite 6 von 24
S65 Shield MicroSD Karten Slot Technische Daten getestet mit 2 GB- und 4 GB-Karten Karte muss mit FAT formatiert sein (FAT12, FAT16 oder FAT32) über FATFs (FAT File System Module) programmierbar Dr.-Ing. Hubert Zitt Seite 7 von 24
S65 Shield Displaytreiber Die Libraries für das Display werden entpackt. Die Ordner RotaryEncoder S65Display S65Shield SDcard müssen in das Verzeichnis arduino-1.0/libraries kopiert werden, damit der Entwicklungsumgebung die benötigten Bibliotheken für das Display zur Verfügung stehen. Dr.-Ing. Hubert Zitt Seite 8 von 24
S65 Shield Ansteuerung des Displays mittels SPI SPI (Serial Peripheral Interface) entwickelt von Motorola Bus-System für einen synchronen seriellen Datenbus Schaltungen können nach einen Master-Slave-Prinzip miteinander verbunden werden ein Master, theoretisch unendlich viele Slaves Systeme arbeiten mit einer gewissen Geschwindigkeit (clock), meistens ein Bruchteil des verfügbaren Taktes des Mikrocontrollers Dr.-Ing. Hubert Zitt Seite 9 von 24
S65 Shield Initialisierung des SPI-Bustaktes lcd.init(2) // clock=fcpu/2 -> hier: 8 MHz lcd.init(4) // clock=fcpu/4 -> hier: 4 MHz lcd.init(8) // clock=fcpu/8 -> hier: 2 MHz lcd.init(16) // clock=fcpu/16 -> hier: 1 MHz lcd.init(32) // clock=fcpu/32 -> hier: 500 KHz Dr.-Ing. Hubert Zitt Seite 10 von 24
S65 Shield Befehle zur Initialisierung des Displays #include <S65Display.h> S65Display lcd; void setup() { // Initialisierung des LCD mit 4 MHz (16 MHz geteilt durch 4) lcd.init(4); } Dr.-Ing. Hubert Zitt Seite 11 von 24
S65 Shield LCD-Befehle Linie zeichnen: void drawline(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint16_t color) Rahmen eines Rechteck zeichnen: void drawrect(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint16_t color) Gefülltes Rechteck zeichnen: void fillrect(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint16_t color) Kreis zeichnen: void drawcircle(uint8_t x0, uint8_t y0, uint8_t radius, uint16_t color) Zeichen ausgeben: uint8_t drawchar(uint8_t x, uint8_t y, char c, uint8_t size, uint16_t color, uint16_t bg_color) Text vom RAM ausgeben: uint8_t drawtext(uint8_t x, uint8_t y, char *s, uint8_t size, uint16_t color, uint16_t bg_color) Text vom Flash ausgeben: uint8_t drawtextpgm(uint8_t x, uint8_t y, PGM_P s, uint8_t size, uint16_t color, uint16_t bg_color) Dr.-Ing. Hubert Zitt Seite 12 von 24
S65 Shield LCD-Befehle oft verwendet: Löschen des kompletten Displays mit einer Farbe void clear(uint16_t color) Zeichnen eines Pixel mit einer Farbe an der Position x0,y0 void drawpixel(uint8_t x0, uint8_t y0, uint16_t color) Kompletter Befehlssatz auf meiner Webseite! Dr.-Ing. Hubert Zitt Seite 13 von 24
S65 Shield LCD-Farben uint16_t color Funktion: RGB(red,green,blue) Beispiele: RGB(255,255,255) oder RGB (0xFF,0xFF,0xFF) für weiß clear (RGB(255,255,255)); // LCD wird komplett weiß drawtext(10,10,"hello World!",1,RGB(0,0,255),RGB(255,50,100)); schreibt den Text Hello World! an der Position x= 10 und y = 10 auf das Display Größe: 1 // normale Größe Textfarbe: RGB(0,0,255) // blau Hintergrundfarbe RGB(255,50,100) Dr.-Ing. Hubert Zitt Seite 14 von 24
S65 Shield LCD-Farben für Farben, die oft genutzt werden: #define BG_COLOR RGB(0xFF,0xFF,0x00) // gelb #define BLACK RGB(0x00,0x00,0x00) // schwarz #define WHITE RGB(0xFF,0xFF,0xFF) // weiß #define RED RGB(0xFF,0x00,0x00) // rot Dr.-Ing. Hubert Zitt Seite 15 von 24
S65 Shield Beispielprogramm Textausgabe #include <S65Display.h> #define FG_COLOR RGB(0,0,0) #define BG_COLOR RGB(255,255,255) #define TEXT_COLOR RGB(0,0,0) S65Display lcd; void setup() { lcd.init(4); // Initialisierung des Displays lcd.clear(bg_color); // Display zurücksetzen lcd.drawtext(5, 5,"Hello!",2,TEXT_COLOR, BG_COLOR); } void loop() { delay(1000); lcd.drawtextpgm(20, 50, PSTR("Hello World!"), 1, TEXT_COLOR, BG_COLOR); lcd.drawchar(20, 100, 'X', 1, TEXT_COLOR,BG_COLOR); delay(3000); lcd.clear(bg_color); } Dr.-Ing. Hubert Zitt Seite 16 von 24
S65 Shield Umschaltung Hoch- bzw. Querformat defaultmäßig im Querformat für Ausgabe im Hochformat in Datei S65Display.h die Kommentarzeichen bei folgender Zeile entfernen // #define S65_ROTATE // Hoch- oder Querformat Ausgabe kann auch um 180 Grad gedreht werden: // #define S65_MIRROR // Ausgabe um 180 Grad drehen einfach mal ausprobieren Dr.-Ing. Hubert Zitt Seite 17 von 24
S65 Shield Hinweis zur Textausgabe Default: ASCII Zeichen von 0x20 bis 0x7F um ASCII Zeichen von 0x20 bis 0xFF nutzen zu können, muss in der Datei font_8x12.h die Zeile #define FONT_END7F //chars: 0x20-0x7F rauskommentieren werden Dr.-Ing. Hubert Zitt Seite 18 von 24
S65 Shield Drehencoder Initialisierung #include <RotaryEncoder.h> RotaryEncoder encoder; ISR(TIMER2_OVF_vect){ TCNT2 -= 250; encoder.service(); } void setup() { encoder.init(); // Interrupt Service Routine // bei Überlauf von Timer2 // Initalisierung Rotary Encoder // Initialisierung Timer2 TCCR2B = (1 << CS22); TCNT2 = 0x00; TIMSK2 = (1 << TOIE2); } sei(); Serial.begin(9600); // Interrupts aktivieren // zum Anzeigen der Ereignisse Dr.-Ing. Hubert Zitt Seite 19 von 24
S65 Shield Drehencoder Abfrage (Ausgabe auf Serial Monitor) void loop() { int8_t move,press; move = encoder.step(); press = encoder.sw(); if (move > 0) Serial.println("Es wird nach rechts gedreht"); else if (move < 0) Serial.println("Es wird nach links gedreht"); else if (move == 0) //Serial.println("Da wurde nichts gedreht!"); } if(press) { Serial.print("Es wurde gedrueckt: "); if(press == SW_PRESSEDLONG) Serial.println("... lang!"); if(press == SW_PRESSED)Serial.println("... kurz!"); } Dr.-Ing. Hubert Zitt Seite 20 von 24
S65 Shield Drehencoder weiterführende Infos mehrere Beispielprogramme im Entwicklungssystem, siehe File Examples S65Shield siehe Datei RotaryEncoder.cpp, z.b. zum Abändern der Zeiten für kurzes oder langes Drücken des Tasters default: (80...800) ms kurz gedrückt > 800 ms lang gedrückt Dr.-Ing. Hubert Zitt Seite 21 von 24
S65 Shield MicroSD Karte - Initialisierung #include <SDcard.h> SDcard sd; void setup() { sd.init(2); TCCR2B = (1 << CS22); TCNT2 = 0x00; TIMSK2 = (1 << TOIE2); // Karte initialisieren // Timer2 initialisieren } sei(); //Interrupts aktivieren ISR(TIMER2_OVF_vect) { static uint8_t count=1; TCNT2 -= 250; encoder.service(); // Interrupst Service Routine // 1000 Hz } if(--count == 0){ count = 10; sd.service(); } // 100 Hz Dr.-Ing. Hubert Zitt Seite 22 von 24
S65 Shield MicroSD Karte - mounten void MountSDCard() { lcd.clear(bgcolor); lcd.drawtextpgm(5,5,pstr("mount card..."),1,rgb(255,255,255),rgb(255,0,0)); lcd.drawtextpgm(5,20,pstr("please insert if not! "),1,RGB(255,255,255),RGB(255,0,0)); } do { delay(500); } while(sd.mount()!= 0); Dr.-Ing. Hubert Zitt Seite 23 von 24
S65 Shield MicroSD Karte Zugriff auf Dateisystem Bibliothek stellt FatFS (FAT File System Module) zur Verfügung Implementierung eines Dateisystems (FAT12, FAT16, FAT32) Befehlsreferenz: http://elm-chan.org/fsw/ff/00index_e.html Dr.-Ing. Hubert Zitt Seite 24 von 24