SPI-Display mit U8glib am Teensy betreiben

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:

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;
 }
 
}

Beteilige dich an der Unterhaltung

9 Kommentare

  1. 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

  2. Nachtrag, hast du wirklich Teensy 3.1 (und nicht 3.2) benutzt?.
    In deinem Video linkst du das Teensy 3.2.

  3. 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

  4. Hi, kann man für „Rest“ auch ein anderes PIN(statt 13) wählen. Konfiguration in Code vorrausgesetzt. Wenn nein, warum nicht
    Gruß & Danke

  5. 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

  6. 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?

  7. 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.

  8. 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?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert