TFT scherm 1.8 spi

Aan dit artikel wordt nog gewerkt. Een aantal dingen kloppen vermoedelijk niet.


1.8TFT 128 x 160 Display Pin Outs.
Er zijn 16 pinnen en een SD kaart aan de achterzijde van het display.
Na wat zoekwerk lijkt het er op dat er verschillende soorten 1.8 spi tft schermen zijn. En van dezelfde naam (b.v. KMR 1.8) kunnen er nog verschillende drivers zijn. De S6D02A1 van Samsung, ST7735 van Sitronix en de ILI9163 van Ilitek (linken naar library's) die gelijk zou zijn aan de S6D02A1. Alle drie voor de KMR 1.8 PSI ftf scherm. (zie Arduino forum link) Het lijkt ook dat de versie met 2 rijen pinnen en de HY-1.8, maximaal 5V en 3.5V aan kunnen en de KMR-1.8 met 1 rij pinnen maximaal 3.3V.
Ik heb veel gezocht maar geen datasheet van de schermen kunnen vinden. Wel hier en daar op Ebay en bij Adafruit.
Je kan dus gokken en het scherm op 5V aansluiten maar weet dan dat als het scherm defect gaat na een tijdje, dat het kan komen door de te hoge voedingsspanning.
Een 3.3V TFT display. Voeding mag uit de Arduino komen maar voor de SDA-SCL-CS-AO-RESET aansluitingen met de Arduino wordt wel aangeraden om een levelshifter te gebruiken. Dus niet zomaar rechtstreeks aansluiten aan de Arduino zoals de afbeelding van Hackster toont.
Afbeelding van Hackster.io.


Met de volgende sketch, ook van het forum door Bodmer geplaatst, kan je zien welke driver in jouw scherm gebruikt wordt. Dat moet je weten om de juiste library te gebruiken.


// Read the ID from the TFT controller
// The sketch only supports displays with a bi-directional SPI data line (often labelled SDA)

// Bit bashes SPI so it does NOT assume hardware SPI wired up
// No other libraries are needed

// Original author unknown
// Adapted by Bodmer 22/5/16, updated 16/9/16

// Change the pin settings to suit your hardware

// UNO etc
//#define TFT_MOSI 11
//#define TFT_SCK 13
//#define TFT_CS 9
//#define TFT_DC 8
//#define TFT_RESET 7

//Mega
#define TFT_MOSI 51
#define TFT_SCK 52
#define TFT_CS 47
#define TFT_DC 48
#define TFT_RESET 44

/* Example Serial Monitor output:

TFT driver register values:
===========================
Register 0x01: 0x00
Register 0x04: 0x548066
Register 0x09: 0x610000
Register 0x0A: 0x08
Register 0x0B: 0x00
Register 0x0C: 0x06
Register 0x0D: 0x00
Register 0x0E: 0x00
Register 0x0F: 0x00
Register 0x2E: 0x1834B4
Register 0xDA: 0x54
Register 0xDB: 0x80
Register 0xDC: 0x66
===========================

Looks like driver chip is: ILI9163 (based on datasheet ID)

*/

char *chip = "Unknown ";

uint32_t readwrite8(uint8_t cmd, uint8_t bits, uint8_t dummy)
{
uint32_t ret = 0;
uint8_t val = cmd;
int cnt = 8;
digitalWrite(TFT_CS, LOW);
digitalWrite(TFT_DC, LOW);
pinMode(TFT_MOSI, OUTPUT);
for (int i = 0; i < 8; i++) { //send command
digitalWrite(TFT_MOSI, (val & 0x80) != 0);
digitalWrite(TFT_SCK, HIGH);
digitalWrite(TFT_SCK, LOW);
val <<= 1;
}
if (bits == 0) {
digitalWrite(TFT_CS, HIGH);
return 0;
}
pinMode(TFT_MOSI, INPUT_PULLUP);
digitalWrite(TFT_DC, HIGH);
for (int i = 0; i < dummy; i++) { //any dummy clocks
digitalWrite(TFT_SCK, HIGH);
digitalWrite(TFT_SCK, LOW);
}
for (int i = 0; i < bits; i++) { // read results
ret <<= 1;
if (digitalRead(TFT_MOSI)) ret |= 1;;
digitalWrite(TFT_SCK, HIGH);
digitalWrite(TFT_SCK, LOW);
}
digitalWrite(TFT_CS, HIGH);
return ret;
}

void showreg(uint8_t reg, uint8_t bits, uint8_t dummy)
{
uint32_t val;
val = readwrite8(reg, bits, dummy);

Serial.print("Register 0x");
if (reg < 0x10) Serial.print("0");
Serial.print(reg , HEX);
Serial.print(": 0x");
if (val < 0x10) Serial.print("0");
Serial.println(val, HEX);
}

void setup() {
// put your setup code here, to run once:
uint32_t ID = 0;
Serial.begin(9600);
Serial.println("TFT driver register values:");
Serial.println("===========================");
digitalWrite(TFT_CS, HIGH);
// digitalWrite(TFT_SCK, HIGH);
pinMode(TFT_CS, OUTPUT);
pinMode(TFT_SCK, OUTPUT);
pinMode(TFT_MOSI, OUTPUT);
pinMode(MISO, INPUT_PULLUP);
pinMode(TFT_DC, OUTPUT);
pinMode(TFT_RESET, OUTPUT);
digitalWrite(TFT_RESET, HIGH);
digitalWrite(TFT_RESET, LOW); //Hardware Reset
delay(50);
digitalWrite(TFT_RESET, HIGH);
showreg(0x01, 0, 0); //Software Reset
delay(100);
ID = readwrite8(0x04, 24, 1);

if ((ID & 0xFF8000) == 0x5C8000uL) chip = "ST7735 (based on datasheet ID)";
if (ID == 0x7C89F0uL) chip = "ST7735 (empirical value)";
if (ID == 0x548066uL) chip = "ILI9163 (based on datasheet ID)";
if (ID == 0x5C0000uL) chip = "S6D02A1 (based on datasheet ID)";

showreg(0x04, 24, 1); //RDDID
showreg(0x09, 32, 1); //RDSTATUS
showreg(0x0A, 8, 0);
showreg(0x0B, 8, 0);
showreg(0x0C, 8, 0);
showreg(0x0D, 8, 0);
showreg(0x0E, 8, 0);
showreg(0x0F, 8, 0);
showreg(0x2E, 24, 8); //readGRAM
showreg(0xDA, 8, 0);
showreg(0xDB, 8, 0);
showreg(0xDC, 8, 0);

Serial.println("===========================");
Serial.println();
Serial.print("Looks like driver chip is: " );Serial.println(chip);
}

void loop() {

}



bronnen:
Arduino forum
instructables.com
hackster.io/H0meMadeGarbage
Youtube
Henry's Bench
Github voorbeeld sketchen