Шановні друзі!
26 та 31 грудня магазин працюватиме до 16 години. 1 та 2 січня магазин працювати не буде.
Вітаємо всіх з Різдвом та Новим Роком!
Мобільна версія Форум Arduino Документація Гарантійні умови 0 0
UA RU
Графік роботи магазину:
Пн-Пт: 8.00 - 19.00
Сб: 10.00 - 17.00
Нд: вихідний
Каталог
Напиши статтю і отримай знижку!

Підключення 2.8 TFT LCD Screen модуля до STM32 (частина 2 - touchscreen)

2017-02-02

Всі статті →

Парфенюк Богдан

В проєкті використано:

Дана стаття являється прикладом-підказкою для підключення резистивної сенсорної панелі на контролері TSC2046 до stm-ки через популярний інтерфейс SPI. Про особливості ініціалізації та використання цього інтерфейсу іншим разом (але в коді уже використовується тому кому цікаво може ознайомитися з ним глибше). Також, нагадаю що маючи викладений нижче алгоритм роботи та код програми, можна не прикладаючи багато зусиль (переписати лише ініціалізацію ніжок) підключити даний дисплей до будь-якого контролера stm32. У моєму випадку це stm32f103vet6.

Схема підключення

Дослідивши питання на рахунок живлення контролера дисплея та тачскріна виявилося що цей TFT LCD Screen модуль з легкістю може розпізнавати інформаційні сигнали від 0V до 3.3V як логічні “0” та “1” відповідно (тобто все що більше приблизно 2V він (модуль) сприймає як логічну одиницю). Це дуже важливо при підключенні до stm32 на пряму, адже у цьому контролері логічна одиниця рівна 3.3V. Також живлення теж можна поміняти з 5V до 3.3V, підпаявшись плюсом до однієї з ніжок стабілізатора на модулі (як це показано нижче на малюнку№1 червоною стрілкою). Подавши так само 3.3 V на підсвітку можна повністю відмовитися від 5V.

Малюнок 1 (зеленим позначені піни тачскріна)

Так як я використовую свою демоплату то у мене усе під’єднується через розєм XS9 (Малюнок 2). Потрібне я помітив червоними підписами відповідних виводів нашого LCD шилда. Живлення та підсвітка 3.3V.

Малюнок 2

І як ви вже здогадались дисплей в даному прикладі під’єднаний через FSMC інтерфейс, але про нього двома словами не скажеш тому опис підключення дисплею таким чином буде представлений в іншій статті.

Код програми та логіка роботи тачскріна

Код прикладаю в архіві. Там цілий проект EmBits (http://www.emblocks.org/web/downloads-main). Це найшвидший спосіб перевірити усе в діїі та застосувати. Це IDE безкоштовне. Тільки встановити і вже можна відразу працювати.

Не буду тут розповідати про принцип роботи резистивного тачскріна, цього і так достатньо в інтернеті і нічого нового я не відкрию. Тому опишу тільки логіку роботи своєї програми та прикладу в архіві проект з кодом. Одна тільки є особливість – це робота сенсора без використання пінів D_IRQ та T_BUSY. Це все не через те що я хотів зекономити ніжки контролера (хоча не без цього), просто хотілося показати і відобразити таку можливість роботи (використовуючи тільки одне SPI).

Все починається з функції get_touch(command);

unsigned int get_touch (uint8_t command) //communication with TSC2046

{ int d_in=0; //zero data in

GPIO_ResetBits(GPIOB, GPIO_Pin_7); //chip select TOUCH

SPI1->DR = command; //send command

while(!(SPI1->SR & SPI_SR_RXNE)); //wait

d_in = SPI1->DR; //ignore this enter

SPI1->DR = 0; //send zero bytes - cont receiving data from module

while(!(SPI1->SR & SPI_SR_RXNE)); //wait

d_in = SPI1->DR; //receive high byte

d_in <<= 8; //move it 8

SPI1->DR = 0; //send zero bytes - cont receiving data from module

while(!(SPI1->SR & SPI_SR_RXNE)); //wait

d_in |= SPI1->DR; //receive low byte

return d_in; }

Ми відправляємо в цю функцію команду яка відправляється в по SPI до TSC2046 і виконується, це в принципі все що потрібно. Таким чином відправивши GET_X (0x98) ми отримаємо у відповідь значення “x” , а коли відправимо GET_Y (0xD8) отримаємо “y”.

Але значення ці міняються і не можна просто зчитати їх і все. Їх потрібно зберегти, підсумувати та знайти середнє арифметичне для точності. Тому функція spi_touch (uint16_t i) робить це

void spi_touch (uint16_t i) //i - how many scans to do (resolution)

{ uint32_t tmpx=0, tmpy=0;

uint8_t iii=0;

int ii=0;

while(i>0){ d_in_x = get_touch (GET_X) ; d_in_y = get_touch (GET_Y) ;

if (d_in_y == 0) d_in_x = 0;

if (d_in_x == 0) d_in_y = 0;

if ((d_in_y != 0) && (d_in_x != 0)){ if(iii>7)

{ // більше 5 разів поспіль значення не нуль (щоб не записувати одиночні спрацювання)

tmpx = tmpx+(get_touch (GET_X)/ DIV_TOUCH) ;

tmpy = tmpy+(get_touch (GET_Y)/ DIV_TOUCH) ;

ii++; }

iii++; }

else {iii=0;}

i--; }

//normalize direction of ACD outs

if(tmpx)

{ d_in_x=tmpx/ii; d_in_y=tmpy/ii; } //calculate real coordinates }

Ось тут і проявляється особливість алгоритму яку треба ввести щоб було можливо обійтися без додаткових пінів тач-контролера. Ми не чекаємо сигналу від T_BUSY щоб почати зчитування , ми просто дивимся коли значення будуть відмінні від нуля, якраз тоді і починаємо зчитування (для точності і вірності спрацювання робим це після декількох зчитаних значень поспіль які відмінні від нуля).

Тепер коли у нас є середні значення координат по ординаті та абсцисі і ми впевнені що це дійсно вони (а не випадкове спрацювання що теж як би треба враховувати) і вони дійсно такі (середнє арифметичне) ми можемо приступати до калібрування тачя.

Для калібровки потрібно вивчити і оцінити усі алгоритми і вибрати для себе підходящий по точності.

Для цього потрібно прочитати даташит та відповідне розяснення калібровки від Texas Instruments. Я обрав для себе калібровку по трьом точкам.

Це функції Touch_Calib() та touch_correct().

В main() ми робимо калібровку а потім у бескінечному циклі:

spi_touch (15);

touch_correct(d_in_x,d_in_y);

Маючи значення ікса та ігрека можемо детектувати натиски та дотики (якщо значення нульові то нічого не робимо, якщо значення відмінні від нуля то в цих координатах детектуємо натиск ). Я таким чинов в перериванні по теймеру перевіряю змінну яка говорить мені в якому місці був натиск.

ВИСНОВОК:

При повторені цього проекту слід почати з самого малого, отримувати значення координати абсциси та ординати.

Потім тільки переходити далі і підключати функції калібровки (spi_touch(), Touch_Calib() та touch_correct();)

При відладці програми слід використовувати аналізатор логічних рівнів (наприклад Saleae Logic Analyzer), це дасть зрозуміти, чи у правильній формі ми відправляємо команди по SPI до TSC2046.

Також додаю відео роботи цього приклада.

Успіхів при повторені!

Литература: 1. Даташит на контроллер починаючи з 50 сторінки. https://arduino.ua/docs/DS_ILI9325DS.pdf

Ваша оцінка статті:

Відмінно
Добре
Задовільно
Погано
Дуже погано

Загальна оцінка:

Оцінка "Підключення 2.8 TFT LCD Screen модуля до STM32 (частина 2 - touchscreen)"
5 з 5
зроблена на основі 3 оцінок 3 клієнтських відгуків.

Дякуємо Вам за звернення! Ваш відгук з'явиться після модерації адміністратором.
Богдан
22.03.2019 15:26:33
https://drive.google.com/file/d/0B7M8jl0dcU2tb1lBb3htWExPMXM/view
Богдан
22.04.2018 20:05:27
ссилка на архів в коментах під відео в ютубі
Максим
07.03.2018 16:14:03
Нет ссылки на архив программы. Первая часть статьи,где есть ссылка, очень помогла.
оплата картами Visa і MasterCard