Тачскрин - распиновка
- Войдите на сайт для отправки комментариев
Сб, 12/11/2016 - 22:02
Достал шилд с тачскрином такого плана, пины:

С горем пополам была подобрана библиотека, кино увидел, доволен
Теперь хочу поднять тач. Кто сталкивался, на какие ноги выведены четыре резистивные линии, из этих? Не могу понять логику китайческой конституции наименований....
Не выдержал неопределённости, вызвонил напрямую со шелйфа тача всю цепочку до пинов дуины.
#include "TouchScreen.h" // These are the pins for the shield! #define YP A2 // must be an analog pin, use "An" notation! #define XM A1 // must be an analog pin, use "An" notation! #define YM 6 // can be a digital pin #define XP 7 // can be a digital pin #define MINPRESSURE 10 #define MAXPRESSURE 1000 // For better pressure precision, we need to know the resistance // between X+ and X- Use any multimeter to read it // For the one we're using, its 300 ohms across the X plate TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300); void setup(void) { Serial.begin(9600); } void loop(void) { // a point object holds x y and z coordinates TSPoint p = ts.getPoint(); // we have some minimum pressure we consider 'valid' // pressure of 0 means no pressing! if (p.z > MINPRESSURE && p.z < MAXPRESSURE) { Serial.print("X = "); Serial.print(p.x); Serial.print("\tY = "); Serial.print(p.y); Serial.print("\tPressure = "); Serial.println(p.z); } }На консоль компорта ничего не гонит... уже в замешательстве, ВТФ?
Нашел статью по правке общедоступной библиотеки под конкретно ЭТОТ шилд. Попробовал, кино дала (значит такой же по контроллерам шилд). Но тач (там тоже у человека тач не реагировал, он поправил - заработало) - тач всёравно молчит. Именно не врёт, не инвертирован/сдвинут а именно МОЛЧИТ вообще! Это ж не микросхема,а просто токопроводящая плёнка с 4 контактами, почему он не реагирует вообще??
У меня такой же шилд работает.
Помню когда его подключал тоже с тачем не сразу получилось.
Посмотрел сейчас свой рабочий скетч, там пины прописаны не такие как у вас.
У меня:
Таксс.... уже теряю самоконтроль... Не работает даже в таком виде...

Как вывести хоть какой-то вразумительынй итог? Чтоб или "таки неисправен, не тратить время, оторвать к чертям его, и юзать без тача", или копать дальше? Дайте ссылку на компетентный гайд, как проверить резистивный тач по всем осям, буду весьма признателен... пока не расстрелял сиё поделие из своего арбалета....
Почитай как работает тач, выставь на ногах нужные лог уровни и прочти функцией analogRead.
ха, отдает максимум (1023), нажатия не влияют
построил грамотную схему проверки

...итог: отщёлкнул и снял рамку с экрана вместе с тачем, аккуратно снял тач (ушел на полку пока), вернул рамку. Кино в разы улучшилась - снизу оказалась приятная матовая самсунговская (не ноунейм) матрица с неплохим изображением и углами. Там, где будет юзаться и без тача сойдёт, а за свои $4 дивайс и так весьма хорош, при том по месту взял а не с Китая. Всем спасибо за участие
// the regular Adafruit "TouchScreen.h" library only works on AVRs // different mcufriend shields have Touchscreen on different pins // and rotation. // Run the UTouch_calibr_kbv sketch for calibration of your shield #include <Adafruit_GFX.h> // Core graphics library //#include <Adafruit_TFTLCD.h> // Hardware-specific library //Adafruit_TFTLCD tft(A3, A2, A1, A0, A4); #include <MCUFRIEND_kbv.h> MCUFRIEND_kbv tft; // hard-wired for UNO shields anyway. #include <TouchScreen.h> #if defined(__SAM3X8E__) #undef __FlashStringHelper::F(string_literal) #define F(string_literal) string_literal #endif // These are the pins for some typical shields! // S6D0154: YP=A1, XM=A2, YM=7, XP=6 // ST7783 : YP=A2, XM=A1, YM=6, XP=7 // ILI9320: YP=A2, XM=A3, YM=8, XP=9 // ILI9325: YP=A1, XM=A2, YM=7, XP=6 // ILI9325BG: YP=A2, XM=A1, YM=6, XP=7 // ILI9341: YP=A2, XM=A1, YM=7, XP=6 // ILI9488: YP=A1, XM=A2, YM=7, XP=6 // R65109V: YP=A2, XM=A1, YM=6, XP=7 // most mcufriend shields use these pins and Portrait mode: uint8_t YP = A2; // must be an analog pin, use "An" notation! uint8_t XM = A3; // must be an analog pin, use "An" notation! uint8_t YM = 8; // can be a digital pin uint8_t XP = 9; // can be a digital pin uint8_t SwapXY = 0; uint16_t TS_LEFT = 920; uint16_t TS_RT = 150; uint16_t TS_TOP = 940; uint16_t TS_BOT = 120; char *name = "Unknown controller"; // For better pressure precision, we need to know the resistance // between X+ and X- Use any multimeter to read it // For the one we're using, its 300 ohms across the X plate TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300); TSPoint tp; #define MINPRESSURE 20 #define MAXPRESSURE 1000 #define SWAP(a, b) {uint16_t tmp = a; a = b; b = tmp;} int16_t BOXSIZE; int16_t PENRADIUS = 3; uint16_t identifier, oldcolor, currentcolor; uint8_t Orientation = 0; //PORTRAIT // Assign human-readable names to some common 16-bit color values: #define BLACK 0x0000 #define BLUE 0x001F #define RED 0xF800 #define GREEN 0x07E0 #define CYAN 0x07FF #define MAGENTA 0xF81F #define YELLOW 0xFFE0 #define WHITE 0xFFFF void show_Serial(void) { Serial.print(F("Found ")); Serial.print(name); Serial.println(F(" LCD driver")); Serial.print(F("ID=0x")); Serial.println(identifier, HEX); Serial.println("Screen is " + String(tft.width()) + "x" + String(tft.height())); Serial.println("Calibration is: "); Serial.println("LEFT = " + String(TS_LEFT) + " RT = " + String(TS_RT)); Serial.println("TOP = " + String(TS_TOP) + " BOT = " + String(TS_BOT)); Serial.print("Wiring is: "); Serial.println(SwapXY ? "SWAPXY" : "PORTRAIT"); Serial.println("YP=" + String(YP) + " XM=" + String(XM)); Serial.println("YM=" + String(YM) + " XP=" + String(XP)); } void show_tft(void) { tft.setCursor(0, 0); tft.setTextSize(2); tft.print(F("Found ")); tft.print(name); tft.println(F(" LCD")); tft.setTextSize(1); tft.print(F("ID=0x")); tft.println(identifier, HEX); tft.println("Screen is " + String(tft.width()) + "x" + String(tft.height())); tft.println("Calibration is: "); tft.println("LEFT = " + String(TS_LEFT) + " RT = " + String(TS_RT)); tft.println("TOP = " + String(TS_TOP) + " BOT = " + String(TS_BOT)); tft.print("\nWiring is: "); if (SwapXY) { tft.setTextColor(CYAN); tft.setTextSize(2); } tft.println(SwapXY ? "SWAPXY" : "PORTRAIT"); tft.println("YP=" + String(YP) + " XM=" + String(XM)); tft.println("YM=" + String(YM) + " XP=" + String(XP)); tft.setTextSize(2); tft.setTextColor(RED); tft.setCursor((tft.width() - 48) / 2, (tft.height() * 2) / 4); tft.print("EXIT"); tft.setTextColor(YELLOW, BLACK); tft.setCursor(0, (tft.height() * 6) / 8); tft.print("Touch screen for loc"); while (1) { tp = ts.getPoint(); pinMode(XM, OUTPUT); pinMode(YP, OUTPUT); pinMode(XP, OUTPUT); pinMode(YM, OUTPUT); if (tp.z < MINPRESSURE || tp.z > MAXPRESSURE) continue; if (tp.x > 450 && tp.x < 570 && tp.y > 450 && tp.y < 570) break; tft.setCursor(0, (tft.height() * 3) / 4); tft.print("tp.x=" + String(tp.x) + " tp.y=" + String(tp.y) + " "); } } void setup(void) { uint16_t tmp; tft.begin(9600); tft.reset(); identifier = tft.readID(); // if (identifier == 0) identifier = 0x9341; if (0) { } else if (identifier == 0x0154) { name = "S6D0154"; TS_LEFT = 914; TS_RT = 181; TS_TOP = 957; TS_BOT = 208; } else if (identifier == 0x7783) { name = "ST7781"; TS_LEFT = 865; TS_RT = 155; TS_TOP = 942; TS_BOT = 153; SwapXY = 1; } else if (identifier == 0x7789) { name = "ST7789V"; YP = A2; XM = A1; YM = 7; XP = 6; TS_LEFT = 906; TS_RT = 169; TS_TOP = 161; TS_BOT = 919; } else if (identifier == 0x9320) { name = "ILI9320"; YP = A3; XM = A2; YM = 9; XP = 8; TS_LEFT = 902; TS_RT = 137; TS_TOP = 941; TS_BOT = 134; } else if (identifier == 0x9325) { name = "ILI9325"; TS_LEFT = 900; TS_RT = 103; TS_TOP = 96; TS_BOT = 904; } else if (identifier == 0x9325) { name = "ILI9325 Green Dog"; TS_LEFT = 900; TS_RT = 130; TS_TOP = 940; TS_BOT = 130; } else if (identifier == 0x9327) { name = "ILI9327"; TS_LEFT = 899; TS_RT = 135; TS_TOP = 935; TS_BOT = 79; SwapXY = 1; } else if (identifier == 0x9329) { name = "ILI9329"; TS_LEFT = 143; TS_RT = 885; TS_TOP = 941; TS_BOT = 131; SwapXY = 1; } else if (identifier == 0x9341) { name = "ILI9341 BLUE"; TS_LEFT = 920; TS_RT = 139; TS_TOP = 944; TS_BOT = 150; SwapXY = 0; } else if (identifier == 0) { name = "ILI9341 DealExtreme"; TS_LEFT = 893; TS_RT = 145; TS_TOP = 930; TS_BOT = 135; SwapXY = 1; } else if (identifier == 0 || identifier == 0x9341) { name = "ILI9341"; TS_LEFT = 128; TS_RT = 911; TS_TOP = 105; TS_BOT = 908; SwapXY = 1; } else if (identifier == 0x9486) { name = "ILI9486"; TS_LEFT = 904; TS_RT = 170; TS_TOP = 950; TS_BOT = 158; } else if (identifier == 0x9488) { name = "ILI9488"; TS_LEFT = 904; TS_RT = 170; TS_TOP = 950; TS_BOT = 158; } else if (identifier == 0xB509) { name = "R61509V"; TS_LEFT = 889; TS_RT = 149; TS_TOP = 106; TS_BOT = 975; SwapXY = 1; } else { name = "unknown"; } switch (Orientation) { // adjust for different aspects case 0: break; //no change, calibrated for PORTRAIT case 1: tmp = TS_LEFT, TS_LEFT = TS_BOT, TS_BOT = TS_RT, TS_RT = TS_TOP, TS_TOP = tmp; break; case 2: SWAP(TS_LEFT, TS_RT); SWAP(TS_TOP, TS_BOT); break; case 3: tmp = TS_LEFT, TS_LEFT = TS_TOP, TS_TOP = TS_RT, TS_RT = TS_BOT, TS_BOT = tmp; break; } Serial.begin(9600); ts = TouchScreen(XP, YP, XM, YM, 300); //call the constructor AGAIN with new values. tft.begin(identifier); show_Serial(); tft.setRotation(Orientation); tft.fillScreen(BLACK); show_tft(); BOXSIZE = tft.width() / 6; tft.fillScreen(BLACK); tft.fillRect(0, 0, BOXSIZE, BOXSIZE, RED); tft.fillRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, YELLOW); tft.fillRect(BOXSIZE * 2, 0, BOXSIZE, BOXSIZE, GREEN); tft.fillRect(BOXSIZE * 3, 0, BOXSIZE, BOXSIZE, CYAN); tft.fillRect(BOXSIZE * 4, 0, BOXSIZE, BOXSIZE, BLUE); tft.fillRect(BOXSIZE * 5, 0, BOXSIZE, BOXSIZE, MAGENTA); tft.drawRect(0, 0, BOXSIZE, BOXSIZE, WHITE); currentcolor = RED; delay(1000); } void loop() { uint16_t xpos, ypos; //screen coordinates tp = ts.getPoint(); //tp.x, tp.y are ADC values // if sharing pins, you'll need to fix the directions of the touchscreen pins pinMode(XM, OUTPUT); pinMode(YP, OUTPUT); pinMode(XP, OUTPUT); pinMode(YM, OUTPUT); // digitalWrite(XM, HIGH); // digitalWrite(YP, HIGH); // we have some minimum pressure we consider 'valid' // pressure of 0 means no pressing! if (tp.z > MINPRESSURE && tp.z < MAXPRESSURE) { // is controller wired for Landscape ? or are we oriented in Landscape? if (SwapXY != (Orientation & 1)) SWAP(tp.x, tp.y); // scale from 0->1023 to tft.width i.e. left = 0, rt = width // most mcufriend have touch (with icons) that extends below the TFT // screens without icons need to reserve a space for "erase" // scale the ADC values from ts.getPoint() to screen values e.g. 0-239 xpos = map(tp.x, TS_LEFT, TS_RT, 0, tft.width()); ypos = map(tp.y, TS_TOP, TS_BOT, 0, tft.height()); // are we in top color box area ? if (ypos < BOXSIZE) { //draw white border on selected color box oldcolor = currentcolor; if (xpos < BOXSIZE) { currentcolor = RED; tft.drawRect(0, 0, BOXSIZE, BOXSIZE, WHITE); } else if (xpos < BOXSIZE * 2) { currentcolor = YELLOW; tft.drawRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, WHITE); } else if (xpos < BOXSIZE * 3) { currentcolor = GREEN; tft.drawRect(BOXSIZE * 2, 0, BOXSIZE, BOXSIZE, WHITE); } else if (xpos < BOXSIZE * 4) { currentcolor = CYAN; tft.drawRect(BOXSIZE * 3, 0, BOXSIZE, BOXSIZE, WHITE); } else if (xpos < BOXSIZE * 5) { currentcolor = BLUE; tft.drawRect(BOXSIZE * 4, 0, BOXSIZE, BOXSIZE, WHITE); } else if (xpos < BOXSIZE * 6) { currentcolor = MAGENTA; tft.drawRect(BOXSIZE * 5, 0, BOXSIZE, BOXSIZE, WHITE); } if (oldcolor != currentcolor) { //rub out the previous white border if (oldcolor == RED) tft.fillRect(0, 0, BOXSIZE, BOXSIZE, RED); if (oldcolor == YELLOW) tft.fillRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, YELLOW); if (oldcolor == GREEN) tft.fillRect(BOXSIZE * 2, 0, BOXSIZE, BOXSIZE, GREEN); if (oldcolor == CYAN) tft.fillRect(BOXSIZE * 3, 0, BOXSIZE, BOXSIZE, CYAN); if (oldcolor == BLUE) tft.fillRect(BOXSIZE * 4, 0, BOXSIZE, BOXSIZE, BLUE); if (oldcolor == MAGENTA) tft.fillRect(BOXSIZE * 5, 0, BOXSIZE, BOXSIZE, MAGENTA); } } // are we in drawing area ? if (((ypos - PENRADIUS) > BOXSIZE) && ((ypos + PENRADIUS) < tft.height())) { tft.fillCircle(xpos, ypos, PENRADIUS, currentcolor); } // are we in erase area ? if (ypos > tft.height() - 10) { // press the bottom of the screen to erase tft.fillRect(0, BOXSIZE, tft.width(), tft.height() - BOXSIZE, BLACK); } } }шилд такой же на ili 9328 работает
...ну попробуем вечерком, никаких проблем, тач далеко не убирал. Мне кажется там просто свои значения сопротивлений, которые не влазят в дефолтные пределы калибровки, отбрасываются, и ничего на выходе. Отпишусь как попробую. Мог бы свой обработчик под конкретно мой экземпляр наваят, но лениво, спасибо.
Ну сопротивление слоя тача от края до края (ось Х) я выставлял, там около 300 ом у меня и было. А калибровать там
а калибровать - это здесь.
Игрался значениями еще тогда - не помогло
Это выход АЦП в 10бит, показания крайних левого, правого, верхнего, нижнего нажатий
Суть в чём, у меня тач кажись немного с приветом, и у него в ненажатом состоянии показания АЦП по осям аналогичны показаниям нажатия в крайней левой (по X) и крайней нижней (по Y) точках, а должны быть нули. При том сопротивления в ненажатом состоянии - нет (изолятор)
ну нуль у него, не совсем нуль:) а как раз и есть в 300 Ом.
Чет я не вкурил, вы жалуетесь, что у него сопротивление в точке[0;0] как в ненажатом состоянии = 300 Ом. То что сопротивление в ненажатом =бесконечность