Die bisher größte Herausforderung mit allen Arduino-Projekten war es bis jetzt, das SPI-OLED-Display mit der U8glib am Teensy zum Laufen zu bekommen. Die Library an sich ist – sobald man sie verstanden hat – wirklich einfach zu bedienen und zu programmieren. Schwieriger war es aber, durch den Dschungel an Bezeichnungen für die Anschlüsse und die Masse an möglichen Konfigurationen durchzublicken. Darum ist dies auch kein vollständiges Tutorial sondern eher ein „so hat es bei mir funktioniert“. Wer eine andere Konfiguration hat, wird um eine eigene Recherche nicht herum kommen.
Komponenten: SPI-Display, U8glib, Teensy
Bei mir hat es mit diesen Teilen funktioniert:
- Teensy 3.1
- U8glib – Achtung: in der Version 1, nicht in der neuen Version 2!
- OLED SPI-Display (farbig gelb/blau oder weiß)
SPI-Display mit Teensy verbinden
Diese Pins habe ich verbunden:
DC | CS | SCL | SDA | RST |
11 | 12* | 10 | 9 | 13 |
Pin 12 muss man zwar angeben, jedoch nicht verbinden!
Einstellungen U8glib
Mit dieser Konfiguration konnte ich dann die U8glib erfolgreich am Teensy betreiben. Wichtig ist in jedem Fall, dass der Reset-Pin manuell konfiguriert wird!
#define OLED_RESET 13 U8GLIB_SSD1306_ADAFRUIT_128X64 u8g(10, 9, 12, 11, 13); // SW SPI Com: SCK = 10, MOSI = 9, CS = 12, DC = 11, RST = 13
Display mit I²C
Das gleiche Display gibt’s auch mit dem I¹C-Protokoll, da hat bei mir diese Zeile gut funktioniert:
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_NO_ACK|U8G_I2C_OPT_FAST);
Demo-Sketch – Erster Entwurf für das Monotron-Interface
#include "U8glib.h" byte variable = 0; byte randNumber; #define OLED_RESET 13 U8GLIB_SSD1306_ADAFRUIT_128X64 u8g(10, 9, 12, 11, 13); // SW SPI Com: SCK = 10, MOSI = 9, CS = 12, DC = 11, RST = 13 const uint8_t pfeil[] U8G_PROGMEM = { 0x10, // 0010000 0x38, // 0111000 0x54, // 1010100 0x10, // 0010000 0x10, // 0010000 0x1e, // 0011110 0x0, // 0000000 0x0, // 0000000 }; const uint8_t MidiIn[] U8G_PROGMEM = { 0x1c, // 0011100 0x36, // 0110110 0x63, // 1100011 0x55, // 1000001 0x55, // 1000001 0x63, // 1100011 0x36, // 0110110 0x1c, // 0011100 }; void draw(void) { //Presetname u8g.setColorIndex(1); u8g.drawBox(0,0,128,16); u8g.setColorIndex(0); u8g.setFont(u8g_font_helvB10); u8g.drawStr( 2, 12, "04 Hellbass"); u8g.drawBitmapP( 116, 4, 1, 8, MidiIn); u8g.setColorIndex(1); //Parameternamen u8g.setFont(u8g_font_profont12); u8g.drawStr( 0, 28, "LFO R"); u8g.drawStr( 0, 42, "LFO G"); u8g.drawBitmapP( 0, 52, 1, 8, pfeil); if (variable >= 64) { u8g.drawStr( 10, 60, "Cutoff"); } else { u8g.drawStr( 10, 60, "Pitch"); } u8g.drawStr( 72, 28, "VCF C"); u8g.drawStr( 72, 42, "VCF P"); //Menü u8g.setColorIndex(1); u8g.drawBox(64,48,31,16); u8g.drawBox(97,48,31,16); u8g.setColorIndex(0); u8g.drawStr( 68, 60, "LOAD"); u8g.drawStr( 102, 60, "SAVE"); u8g.setColorIndex(1); //Parameterwerte u8g.setPrintPos(36, 28); u8g.print(variable/2); u8g.setPrintPos(36, 42); u8g.print(randNumber); u8g.setPrintPos(108, 28); u8g.print(variable); u8g.setPrintPos(108, 42); u8g.print(randNumber/2); //Linien //u8g.drawLine(62, 17, 62, 48); //u8g.drawLine(50, 48, 128, 48); //u8g.drawLine(50, 48, 50, 64); } void setup(void) { // set SPI backup if required //u8g.setHardwareBackup(u8g_backup_avr_spi); // assign default color value if ( u8g.getMode() == U8G_MODE_R3G3B2 ) { u8g.setColorIndex(255); // white } else if ( u8g.getMode() == U8G_MODE_GRAY2BIT ) { u8g.setColorIndex(3); // max intensity } else if ( u8g.getMode() == U8G_MODE_BW ) { u8g.setColorIndex(1); // pixel on } else if ( u8g.getMode() == U8G_MODE_HICOLOR ) { u8g.setHiColorByRGB(255,255,255); } } void loop(void) { // picture loop u8g.firstPage(); do { draw(); } while( u8g.nextPage() ); //Programm randNumber = random(128); variable++; if (variable>=128) { variable = 0; } }
Hi Götz, wie immer, ein super Beitrag.
Könntest du bitte in dem Beitrag mitaufnehmen, welche zusätzliche Bauelemente man zum Anschließen des Displays an Teensy benötigt.
Viele Grüße, Asho
Nachtrag, hast du wirklich Teensy 3.1 (und nicht 3.2) benutzt?.
In deinem Video linkst du das Teensy 3.2.
Vielen Dank Asho!
Zum Anschließen des Displays brauchst du nichts weiter außer den passenden Kabeln oder Steckbrücken, wenn du das ganze im Breadboard machst. Also ganz easy! 😉
Ich benutze den Teensy 3.1 hab aber den 3.2 verlinkt, weil das die Version ist, die man jetzt noch kaufen kann. Einziger Unterschied: der 3.2er hat eine bessere 3,3V Stromversorgung.
Viele Grüße
Götz
Hi, kann man für „Rest“ auch ein anderes PIN(statt 13) wählen. Konfiguration in Code vorrausgesetzt. Wenn nein, warum nicht
Gruß & Danke
Ein Hinweis:
ich habe dein Sketch benutzt auf mein Display(SPI 128X64 OLED LCD Display SSD1306). Das Bild wird erst dann stabil angezeigt, wenn man cs auch an Pin 12 anschließt. Sonst hat mann nur „Salat“ auf dem Display
Für Hardware-SPI musst du spezielle Pins verwenden – ob das allerdings auch für den Reset-Pin gilt weiß ich nicht. Hast du’s einfach mal ausprobiert?
Ich beabsichtige die Kanalnamen meiner DAW (Samplitude) über Arduino (derzeit Mega) auf LCD bzw. dann 24 Oled
darzustellen. MIDI kein Problem! Aber Sysex ist echt schwer. Suche seit einer Woche im Internet, jedoch kein
Erfolg. Ich bitte um Eure Meinung.
Hallo Bernhard,
ja, kompliziertes Thema. Wenn du magst schreib mal in meinen Discord-Kanal – vielleicht weiß dort jemand eine Lösung:
https://discord.gg/zNwPrvN
Hallo Götz, in deinem Video sprichst du von Hardwarebeschleunigung durch Nutzung der u8g mit dem Teensy. Wie genau hängt das zusammen und gibt es einen merklichen Vorteil beispielsweise gegenüber der LIbrary von Adafruit?