KMR-1.8 SPI TFT-Display keine Anzeige

Hallo Forengemeinde,

ich starte derzeit meine ersten Versuche mit Displays am Arduino und stecke einmal wieder seit Tagen fest und finde keine Lösung.
Nachdem mich "agmue" bei meinem Einstiegsprobleme mit dem OLED-Display auf einen sinnvollen Weg gebracht hat hoffe ich auch zu meinem TFT-Display Ansätze hier Lösungsansätze zu bekommen.

Ich bin im Besitz eines 1,8"" TFT-Display's mit der Bezeichnung KMR-1.8 SPI. Außer der Hintergrundbeleuchtung habe ich diesem Display bislang nichts entlocken können. Aus diesem Grund kann ich leider nicht sagen ob dieses defekt ist, oder ich die Ansteuerung einfach nicht gebacken kriege.

Die Webseite des Verkäufers macht die folgenden Angaben:

Spannungsversorgung: 3,3 / 5V
Auflösung: 128x160
Größe: ca. 54mm x 35mm 1,8"
Chip: ST7735
Schnittstelle: SPI-BUS
Logikspannung: 3,3

Ich dem Display weder mit der Library für ST7735, ILI9341 noch ILI9361C irgend eine Reaktion entlocken können. Laut Aufdruck ist angeblich ebenfalls eine I2C Schnittstelle vorhanden. Der I2C Scanner findet aber keine Adresse.

  • Für SPI: Welche Anschlüsse außer MOSI, Clock,Reset müssen noch angesprochen (CS,A0..?) und wie mit dem Arduino verbunden werden?
  • Hat irgendjemand dieses Shield in Funktion und wie?
  • Gibt es eine einfache Möglichkeit zu prüfen ob das Display überhaupt etwas anzeigt?

vielen Dank für Ihre/Eure Mühe im Voraus
Helmut

KMR-1.8 SPI.png

KMR-1.8 SPI_Rückseite.png

Datenblatt fand ich auf die Schnelle Keines - aber dort hat Jemand zumindest Leben aus dem Display gezaubert.

Hast Du die Widerstände zwischen Display und Arduino?
Nein: -> tot

Welchen Arduino nutzt, ist vll. auch nicht ganz unwichtig ...

MfG

Hallo postmaster-ino,

vielen Dank für die schnelle Rückmeldung.

Ich verwende einen Arduino UNO!

Die Widerstände habe ich leider nicht verwendet, da ja lt. Angabe des Verkäufers 3,3V - 5 Volt angegeben war.

Ich werde dann noch einmal deinen Vorschlag testen, obwohl das ein anderes Shield ist.

mit freundlichen Grüßen
Helmut

Hi

Wenn Du mir keinen Link auf DEIN Display lieferst, bin ich wohl gezwungen, mir Informationen zusammen zu suchen.

Liegt also weniger an meinem Fund, mehr an Deinen fehlenden Infos, Was Du eigentlich hast/willst/tust.
Auch ein Link zu 'Deinem Verkäufer' wäre besser, als 'Nö, habe ja was gaaanz Anderes ...'

MfG

hwh53:
Die Widerstände habe ich leider nicht verwendet, da ja lt. Angabe des Verkäufers 3,3V - 5 Volt angegeben war.

Nee, das stimmt leider nicht:

hwh53:
.
Spannungsversorgung: 3,3 / 5V → gilt für VCC
Logikspannung: 3,3

Jemand, der sich darum auch keine Gedanken gemacht hat, scheint das Display zum Laufen gebracht zu haben: Arduino Tutorial: Making the KMR-1.8 SPI (TFT Display) work!

SCL und SDA gehören zu I2C und brauchen m. E. bei SPI nicht angeschlossen zu werden. SD-CS wird nur bei Verwendung einer SD-Karte benötigt. Sonst sieht das Anschlußbild für mich ganz schlüssig aus.

Hallo postmaster-ino,

hier der gewünschte Link:

Sollte ich das Display durch den Anschluss ohne Vorwiderstände zerschossen haben,
dann muss ich halt damit leben. Der Verlust ist ja nicht so riesig. :wink:

Trotzdem vielen Dank für die Information.

Mit freundlichen Grüßen
Helmut

Hallo agmue;

danke für deinen Hinweis.

Den von Dir geposteten Link werde ich mir morgen einmal vornehmen.

Gruß
Helmut

hwh53:
Den von Dir geposteten Link werde ich mir morgen einmal vornehmen.

Dann drücke ich die Daumen :slight_smile:

Hallo agmue,

den Lösungsansatz von Michael Schoeffler habe ich nachgestellt und getestet.
Der Cardreader funktioniert lt Ausgabe auf dem Seriellen Monitor findet er auch die ..bmp's auf der SD-Card, aber auf dem Display nach wie vor keine Reaktion.

Ist Dir irgend eine Möglichkeit bekannt wie man den Treiberchip auf dem Shield identifizieren bzw mittels einfachstem Code nur mal irgendwelche Zeichen auf dem Display erscheinen lassen kann?

Danke für deine Geduld mit mir

Helmut

hwh53:
Ist Dir irgend eine Möglichkeit bekannt wie man den Treiberchip auf dem Shield identifizieren

Bei diesem Typ nicht.

Der Anbieter schreibt "Chip: ST7735", was ich für plausibel halte.

hwh53:
... mittels einfachstem Code nur mal irgendwelche Zeichen auf dem Display erscheinen lassen kann?

Hast Du schon mal TFT Display Text probiert?

Yepp, habe ich ebenfalls probiert.

ich glaube ich werfe das Ding in den Elektronschrott. Leider schon zuviel Zeit damit erfolglos verdaddelt.

Ich werde mir mal ein anderes Display zum Probieren besorgen.
Hast Du einen Tipp, welches?

Gruß
Helmut

Hallo agmue,

bevor ich das Display entsorge habe ich noch einmal wild rumprobiert und tatsächlich irgendwelche Reaktionen auf dem Display erzeugen können.

In der Abbildungl von Michael Schoeffler ist der Pin 8 des Displays (bei bezeichnet mit SDA) nicht angeschlossen. Da ich davon ausging, dass das Display sowieso hin ist, habe ich einmal wild umgesteckt.

Bei der Kombination (SDA -> MOSI verbunden) zeigen sich wilde horizontale Streifenmuster (bis zu 3 schwarzen Balken) auf dem Display. Das Muster flackert und verändert sich sofern ein neues .BMP von der SD-Karte gelesen wird.
Also müssen doch über diese "Hintertür" irgendwelche Daten in das Display gelangen. Da sonst nur weiß (Hintergrundbeleuchtung?) oder schwarz und nicht das geringste zucken feststellbar.

Über welche Schnittstelle kommuniziert der Cardreader, SPI oder I2C, da der ja anscheinend problemlos funktioniert. So auch die Ausgaben im seriellen Monitor. Filenamen der .bmp's werden korrekt wiedergegeben.

Hast Du irgendeine Idee hierzu? Mein Shield falsch beschriftet? Falsche Schnittstelle? ............?

Gruß
Helmut

Du hast drei "Schnittstellen":

  • SPI am Display, ausgewählt mit CS
  • SPI am Cardreader, ausgewählt mit SD-CS
  • I2C am Display mit SDA und SCL

Wenn Du 1 abgeschossen hast, dann könnten 2 und 3 noch funktionieren.

Halllo agmue,

habe mir das Display vor der endgültigen Entsorgung noch einmal vorgenommen und es funktioniert incl. Cardreader! Der Fehler lag in der Verkabelung, da die Beschriftung des Displays zum Teil missverständlich ist. Zum 2. blockiert der MISO-Anschluss, nur erforderlich für den Reader, auch das Display wenn dieser Pegel und die Signalrichtung nicht stimmen.

Ich habe die "Signale" mittlerweile alle über Pegelwandler geführt. Für den MISO, nur für den Cardreaders erforderlich, war ein 2. Pegelwandler erforderlich, da das Signal von 3,3Volt nach 5Volt in die andere Richtung zum Arduino geführt werden muss. Ich hatte halt derzeit keinen bidirktionalen Pegelwandler in der Bastelkiste.

Leider habe ich immer noch Probleme mit den vertauschten Farben Rot und Blau unter der Adafruit bzw. TFT Library. Mit der Ucglib funktioniert die Farbdarstellung einwandfrei.

Mit der Ucglib bekomme ich es nicht hin ein BMP-Bild von der SD-Karte darzustellen. Mir fehlt leider der nötige Behl dazu. Bei der TFT-LIB sind leider die Farben vertauscht, also unbrauchbar.

Hast Du einen Lösungsansatz wie ich die Bilder über die Ucglib darstellen kann bzw. wie ich die TFT- (Adafruit)- Library umbauen kann, so dass die Farben korrekt dargestellt werden?

Gruss
Helmut

hwh53:
habe mir das Display vor der endgültigen Entsorgung noch einmal vorgenommen und es funktioniert incl. Cardreader!

Danke für die Rückmeldung!

Noch besser wäre es, wenn Du Dein nun gewonnenes Wissen zum Nachbauen mit uns teilen würdest. Ein Forum sollte ja aus Nehmen und Geben bestehen :slight_smile:

hwh53:
Leider habe ich immer noch Probleme mit den vertauschten Farben Rot und Blau unter der Adafruit bzw. TFT Library. Mit der Ucglib funktioniert die Farbdarstellung einwandfrei.

Im Jahr 2016 habe ich die Adafruit_TFTLCD für den Treiber ID_9341 um eine Methode zum Invertieren der Farben ergänzt:

// Ergaenzt, um die Displayanzeige invertieren zu können. Getestet fuer ILI9341.
void Adafruit_TFTLCD::invert(void) {
    driver = ID_9341;
    CS_ACTIVE;
    writeRegister8(ILI9341_SOFTRESET, 0);
    delay(50);
    writeRegister8(ILI9341_DISPLAYOFF, 0);

    writeRegister8(ILI9341_INVERTON, 0);

    writeRegister8(ILI9341_SLEEPOUT, 0);
    delay(150);
    writeRegister8(ILI9341_DISPLAYON, 0);
    delay(500);
    setAddrWindow(0, 0, TFTWIDTH-1, TFTHEIGHT-1);
}

Ob das auch mit dem ST7735 funktioniert, kann ich mangels Hardware nicht probieren.

Du könntest aber zunächst die Grafikdatei am PC invertieren und schauen, ob das den gewünschten Effekt hat. Ein Beispiel, bitte in woof_neg.bmp umbenennen, anbei.

woof_neg.bmp.txt (225 KB)

agmue:
Danke für die Rückmeldung!

Noch besser wäre es, wenn Du Dein nun gewonnenes Wissen zum Nachbauen mit uns teilen würdest. Ein Forum sollte ja aus Nehmen und Geben bestehen :slight_smile:

Halo agmue,
keine Panik, die genaue Beschreibung folgt noch! Wenn auch nicht unbedingt Heute, aber kurzfristig. Es war halt sehr spät gestern :sleeping: und ich muss meine Gedanken und Vorgehensweisen erst einmal für mich sortieren und aufbereiten, um sie verständlich weitergeben zu können.

Gruss
Helmut

hwh53:
... keine Panik, ...

Ich habe heute Baum- und Strauchschnitt gesägt und geknipst, ich bin vollkommen tiefenentspannt. Weit und breit keine Panik, nur lecker duftender Kaffee ;D

So,

es geht ursprünglich um dieses Display: "KMR - 1.8 SPI mit Cardreader"
https://www.marotronics.de/18-TFT-LCD-Modul-128-x-160-SPI-SD-Card-fuer-Arduino-Raspberry-Pi

Die aufgetreten Probleme äußerten sich folgendermaßen:

  • Keine Anzeige
  • Kein Zugriff auf den Cardreader
  • Zuletzt vertauschte Farben Rot und Blau

Hier nun meine Lösung der unterschiedlichen Probleme:

  • Die eltr. Verbindungen zwischen Arduino UNO und dem Display waren, auf Grund der irreführenden Aufdrucke auf dem Shield, falsch. Lösung: Siehe beigefügte PDF-Datei zum korrekten Anschluss. Es ist zu beachten, dass das Display für die Signalleitungen 3,3 Volt verlangt, der Arduino UNO aber 5 Volt liefert. Hier sollte ein Pegelwandler, oder entsprechende Widerstands Spannungsteiler, eingesetzt werden.
  • Beim Einsatz eines Pegelwandlers ist auf die umgekehrte Signalrichtung von MISO zu achten. Über MISO liest der Arduino von dem Cardreader, also umgekehrt 3.3 Volt Signale vom Display zu 5 Volt Arduino. !!!Wichtig: ist dieser PIN falsch beschaltet, bleibt das Display "stumm". Bleibt der PIN unbeschaltet funktioniert das Display.
  • Nachdem nun die generelle Funktion von Display und Cardreader gelöst war fand ich eine Lösung für die Problematik der Vertauschung von Rot und Blau hier im Forum:

mosi_miso:
Hallo,
viele Gedanken, langes Schweigen ... :slight_smile:

Die TFT- Library hat ja die Adafruit Libraries in den "utilities" im Hintergrund.

In der Adafruit_GFX.cpp habe ich nun mit viel Mut und viel hinundher und einem nach langer Zeit wieder aufgespieltem Notepad++ folgende Zeilen umgeschrieben:

uint16_t Adafruit_GFX::newColor(uint8_t r, uint8_t g, uint8_t b)
{
//return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3);
return (r >> 3) | ((g & 0xFC) << 3) | ((b & 0xF8)<< 8);
}

void Adafruit_GFX::background(uint8_t red, uint8_t green, uint8_t blue)
{
background(newColor(red, green, blue));
// background(newColor(blue, green, red));
}

Es funktioniert in dieser Konstellation auch für die Funktionen fill(), stroke() usw.

Das ist natürlich noch etwas unschön wenn man mal ein anderes Gerät mit dem gleichen Sketch laufen lassen will , oder wie postmaster erwähnt es zu einem Update kommt, oder irgendwas anderes.

Wie könnte ich das aus dem Sketch heraus lösen?
Evtl. mit einer eigenen .h? und 'Include?

Da ist mir noch unklar, was der Compiler wann wie liest und zusammenführt, da muss ich mich noch schlau machen ...

Erst mal vielen Dank für die Anregungen!

Dieses "forkeln" hat bei mir jedenfalls geholfen. Mit den entsprechenden Änderungen an ...GFX.h funktioniert nun auch der folgenden Code und stellt das Bitmap mit den richtigen Farben dar:

/*

 Arduino TFT Bitmap Logo example

 This example reads an image file from a micro-SD card
 and draws it on the screen, at random locations.

 In this sketch, the Arduino logo is read from a micro-SD card.
 There is a .bmp file included with this sketch.
 - open the sketch folder (Ctrl-K or Cmd-K)
 - copy the "arduino.bmp" file to a micro-SD
 - put the SD into the SD slot of the Arduino TFT module.

 This example code is in the public domain.

 Created 19 April 2013 by Enrico Gueli

 http://www.arduino.cc/en/Tutorial/TFTBitmapLogo

 */

// include the necessary libraries
#include <SPI.h>
#include <SD.h>
#include <TFT.h>  // mit angepasster Adafruit GFX library. Rot -Blau vertauscht 

// pin definition for the Uno
#define sd_cs  4
#define lcd_cs 10
#define dc     8
#define rst    9

// pin definition for the Leonardo
//#define sd_cs  8
//#define lcd_cs 7
//#define dc     0
//#define rst    1

byte orientation=2; //Ausrichtung der Bitmapgrafik 0 ... 3 , 0 -> Landscape, 2 -> Portrait, 1 + 3 jeweils 180° gedreht


TFT TFTscreen = TFT(lcd_cs, dc, rst);

// this variable represents the image to be drawn on screen
PImage logo;


void setup() {
  // initialize the GLCD and show a message
  // asking the user to open the serial line
  TFTscreen.begin();
  TFTscreen.background(0, 0, 0);
  TFTscreen.setRotation(2);
  TFTscreen.stroke(255, 255, 255);
  TFTscreen.println();
  TFTscreen.println(F("Arduino TFT Bitmap Example"));
  TFTscreen.stroke(0, 0, 0);
  TFTscreen.println(F("Open serial monitor"));
  TFTscreen.println(F("to run the sketch"));


delay(5000);
  // initialize the serial port: it will be used to
  // print some diagnostic info
  Serial.begin(9600);
  while (!Serial) {
    // wait for serial port to connect. Needed for native USB port only
  }

  // clear the GLCD screen before starting
  TFTscreen.background(255, 255, 255);

  // try to access the SD card. If that fails (e.g.
  // no card present), the setup process will stop.
  Serial.print(F("Initializing SD card..."));
  if (!SD.begin(sd_cs)) {
    Serial.println(F("failed!"));
    return;
  }
  Serial.println(F("OK!"));

  // initialize and clear the GLCD screen
  TFTscreen.begin();
  TFTscreen.background(0, 0, 0);

  // now that the SD card can be access, try to load the
  // image file.
  logo = TFTscreen.loadImage("parrot.bmp");
  if (!logo.isValid()) {
    Serial.println(F("error while loading arduino.bmp"));
  }
}

void loop() {
  // don't do anything if the image wasn't loaded correctly.
  if (logo.isValid() == false) {
    return;
  }

  Serial.println(F("drawing image"));

  // get a random location where to draw the image.
  // To avoid the image to be draw outside the screen,
  // take into account the image size.
// int x = random(TFTscreen.width() - logo.width());
// int y = random(TFTscreen.height() - logo.height());
  int x = 0;
  int y = 0;
//Serial.print(x); // Ausgabe der Bildkoordinaten im seriellen Monitor
//Serial.print(" = x   ");
//Serial.print(y);
//Serial.println(" = y");

  // draw the image to the screen
  TFTscreen.setRotation(orientation); //Definition der Bildausrichtung
  TFTscreen.image(logo, x, y);

  // wait a little bit before drawing again
  delay(1500);
}

Bessere Lösungsmöglichkeiten zur Rot-Blau Vertauschung nehme ich gerne entgegen.

Noch offene Probleme:
Laut Verkäufer ist das Display mit dem ST7735 Chipsatz ausgestattet. Damit funktioniert es aber nicht. Mit entsprechenden "Klimmzügen" kriegt man es als ST7789 bedingt zum Laufen. Gibt es da schon irgendwelche Lösungsansätze?

Ich hoffe meine Doku hilft jemandem weiter, der ebenso hilflos, wie ich bis vor kurzer Zeit, mit diesem Display kämpft!

Gruss und schönes Wochenende
Helmut

KMR-1.8 SPI.pdf (429 KB)

Ich hoffe, es ist OK, wenn ich das Bild hier direkt reinstelle?

agmue:
Ich hoffe, es ist OK, wenn ich das Bild hier direkt reinstelle?

Hallo agmue,

Danke, das ist selbstverständlich ok! Habe es leider gestern selbst nicht hinbekommen, wie bindet man hier Bilder ein? "Alte Leute" haben eben manchmal ein Brett vorm Kopf. :wink: Unter "insert Image" wird eine URL erwartet....welche, der lokale Pfad zur Datei?

PS: War der Rest so OK und auch für Anfänger verständlich? :wink:

Gruss
Helmut