(098) 067-12-26 Киевстар (098) 067-12-26   Киевстар
(066) 142-24-48 Vodafone (066) 142-24-48   Vodafone
(098) 067-12-26 Lifecell (063) 642-36-59   Lifecell

График работы магазина:

Пн-Пт: 10.00 - 19.00

Сб-Вс: выходные

г. Киев, ул. Васильковская, 30
ст.м. "Васильковская"

Каталог

Школа робототехники intRobots

Обзор pi-TOP - ноутбук на базе Raspberry

Недавно мне в руки попался эдакий конструктор - ноутбук на базе Raspberry - pi-TOP, который нужно собрать своими самому. Обзор процесса сборки и того, что получилось можно прочитать в этой статье.

Школа РОБОТОТЕХНИКИ intRobots

Сегодня цивилизованный мир делает успехи в астрофизике, биохимии, генной инженерии, нейрофизиологии, электронике и искусственном интеллекте, борется со старением и смертностью, готовится к пилотируемым полетам на Марс и развивает экологические технологии.

Измерение силы тока датчиком SCT-013-030

Давно хотел приобрести датчик тока SCT-013 и сделать небольшой контрольный прибор в своем домашнем электрощитке. Больших токов у меня не бывает, больше 30А точно нет, посему выбор пал на SCT-013-030, с максимальным током измерения 30А.

Блочное шифрование в IoT

Исторически сложилось, что для IoT (Internet of Things) на базе ZigBee сетей в первую очередь стояла цель минимизировать энергопотребление, потому вопрос безопасности остался без внимания. В данной статье предлагается пример безопасной IoT системы с

Комплекс домашней автоматизации (Часть 2)

Следующим этапом разработки комплекса домашней автоматизации стал проект уличной метеостанции.
Напиши статью и получи скидку!

Підключення 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.com/docs/DS_ILI9325DS.pdf

Ваша оценка статьи:

Отлично
Хорошо
Удовлетворительно
Плохо
Очень плохо

Благодарим Вас за обращение! Ваш отзыв появится после модерации администратором.
Пока нет отзывов на эту статью.
оплата картами Visa и MasterCard