Geschrieben am

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

6 Gedanken zu „SPI-Display mit U8glib am Teensy betreiben

  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.

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

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

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

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

Kommentar verfassen