Дорогие друзья! Обращаем ваше внимание, на то, что наш интернет-магазин переехал в новый офис,
расположенный по адресу Васильковская 30. Пожалуйста ознакомьтесь с картой.
В связи с переездом, 24.07 интернет магазин "Ардуино в Украине" будет работать с 14:00. Благодарим за понимание!
(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
ст.м. "Васильковская"

Каталог

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

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

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

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

Генератор радиошума в диапазоне 2.4 ГГц

Генераторы шума обычно используются для научных экспериментов и для тестирования приемо-передающего или антенного оборудования, но еще с помощью них, можно улучшить уже существующую беспроводную инфраструктуру.

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

Комнатная метеостанция. Основная функция устройства – это сигнализация об аварийных ситуациях, но поскольку на плате установлен микроконтроллер ATmega328p, я решил добавить несколько датчиков для автономности и организации обратной связи.

Роутер на Raspberry Pi 3 с дисплеем

В проекте используются Raspberry Pi 3 и OLED (SSD1306 128x64 I2C или SPI). Для корпуса используется акриловый «сэндвич», так как так наглядней, и обычный 5-вольтовый источник питания силой тока около 0,5 А (этого вполне достаточно: устройство потребляет
Напиши статью и получи скидку!

Підключення 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