q-dex q-dex

Программирование MultiTouch экранов

В последние годы на замену устаревшим кнопочным устройствам ввода стали приходить сенсорные экраны. Однако радиолюбители могут столкнуться с определенными сложностями при разработке устройств на базе таких экранов: в рунете есть статьи по программированию резистивных сенсоров, однако материалы по MultiTouch экранам найти довольно сложно. В этой статье мы подробно разберем все, что связано с MultiTouch экранами, их программирование и разработкой устройств на их основе. Но все по порядку.

Классификация

Сенсорные экраны бывают следующих видов: резистивные, ёмкостные, инфракрасные, оптические, индуктивные.

В основе резистивного экрана применяется многослойная структура, состоящая из двух слоев электропроводящих поверхностей, разделенных изоляционным материалом. При касании проводящая поверхность соединяется с основой пластины, благодаря чему замыкается электрическая цепь, сопротивление этой цепи зависит от точки касания, микроконтроллер экрана замеряет это сопротивление и преобразует его в координаты.

Чувствительным элементом ёмкостного экрана является стекло, на поверхности которого нанесено прозрачное проводящее покрытие. По краям экрана расположены электроды, равномерно распределяющие переменное напряжение по поверхности экрана. Касание экрана вызывает импульс тока в точку касания. Сила тока из каждого угла обратно пропорциональна расстоянию до точки. Основываясь на этих данных, контроллер и вычисляет координаты точки. Проекционно-ёмкостной экран обладает возможностью распознавания одновременного нажатия в двух и более точках. На подложку из стекла наносится два слоя электродов, разделенные диэлектриком и формирующие решетку.

Оптические экраны представляю собой стеклянную панель с инфракрасной подсветкой. Для регистрации касания применяются либо цифровая камера, либо в матрицу экрана встраивается 4-й светочувствительный субпиксель. Оптические экраны мало распространены и встречаются редко.

Для определения точки касания в инфракрасных сенсорных экранах применяются две линейки инфракрасных светодиодов (вертикальная и горизонтальная) и две линейки фотодиодов, расположенных по другую сторону от светодиодов. При касании часть фотодиодов перестают получать свет от светодиодов, зная какие фотодиоды закрыты, можно получить координаты точки касания.

Индукционные экраны реагируют только на специальное перо. Применяются, когда требуется реакция именно на нажатия пером (обычно в графических планшетах). Индуктивная чувствительность обеспечивается использованием трёх резонансных катушек индуктивности. Одна из них расположена в наконечнике тактильного пера или стилусе, которая образует в нём резонансный контур, а две другие – внутри сенсорной панели. Регистрируя изменения сигнала на катушка можно определить не только положение пера, но и угол наклона и степень нажатия.

Наиболее распространены резистивные и ёмкостные экраны. О них и поговорим более подробно.

Резистивный или ёмкостный сенсор?

До 2007 года на рынке доминировали резистивные сенсорные экраны, однако с выходом iPhone от Apple популярность стали набирать ёмкостные экраны, которые, несмотря на недостатки, имеют ряд серьезных преимуществ перед резистивными экранами. Ёмкостные экраны имеют большую точность позиционирования, однако резистивные экраны позволяют использовать стилусы, что в некоторых случаях позволяет добиться более точного указания точки. Для того чтобы резистивный экран отреагировал на касание обычно нужно приложить усилие к нажатию, а ёмкостному экрану достаточно легкого касания. Резистивный экран требует калибровки, ёмкостный экран лишен этого недостатка. Также эта особенность упрощает работу разработчиков по созданию программного обеспечения для таких экранов. Электропотребление ёмкостного экрана будет выше, так как он постоянно должен поддерживать переменное напряжение на поверхности, а резистивный экран тратит энергию только в момент касания. Разновидность ёмкостных экранов MultiTouch позволяет регистрировать одновременно более одной точки касания, обычно от 5 до 8, однако бывают экраны позволяющие регистрировать более 20 точек касания. Эта особенность позволила применить систему жестов для управления устройствами. Перечисленные преимущества и обеспечили популярность ёмкостных экранов на рынке цифровых устройств.

Alientek ATK-7

Рассмотрим сенсорные экраны на примере ATK-7 от компании Alientek. Экран имеет разрешение 800х480 и диагональ в 7 дюймов. Данный экран расположен на текстолитовой плате и имеет пины типа DIP, что упростит подключение этого экрана к микроконтроллеру. На плате расположена хорошая цепь питания, включающая себя стабилизаторы. Также все сигнальные линии защищены резисторами, так что можно не опасаться подавать 5в, или где-нибудь напартачить с подключением, ничего не сгорит (по крайней мере, не должно). Экран содержит на борту графический чип SSD1963, у этого чипа выведена 16-и битная шина данных, что позволяет записывать 1 пиксель за 1 так микроконтроллера в память чипа при 16-и битной глубине цвета. Сенсорный экран управляется контроллером FT5206GE1, позволяющим регистрировать до пяти точек касания. Этот чип довольно популярен и используется во многих мобильных телефонах и планшетах.

FT5x06

Данный микроконтроллер выпускается компанией FocalTech и имеет несколько модификаций, рассчитанных на дисплеи разных размеров. Эти чипы поддерживают два интерфейса обмена данными I2C и SPI, однако на ATK-7 выведены контакты только под I2C шину.

Шина I2C имеет всего две линии двунаправленная линия данных SDA и тактовая линия SCL. Стандарт I2C подразумевает наличие 1 ведущего (master) устройства и одного или нескольких ведомых (slave). Чипы FT5x06 работают только в режимы slave, а управляющий микроконтроллер соответственно должен работать в режиме master. Рассмотрим принцип работы I2C шины.

Обмен данных начинается с того, что ведущий формирует состояние СТАРТ: генерирует переход линии SDA из ВЫСОКОГО состояния в НИЗКОЕ при ВЫСОКОМ уровне на линии SCL. Генерацией синхросигнала всегда занимается ведущий. Процедура обмена завершается тем, что ведущий формирует состояние СТОП — переход состояния линии SDA из НИЗКОГО состояния в ВЫСОКОЕ при ВЫСОКОМ состоянии линии SCL. Данные действительны и должны оставаться стабильными только во время ВЫСОКОГО состояния синхросигнала. Для подтверждения приёма байта от ведущего-передатчика ведомым-приёмником в спецификации протокола обмена по шине I2C вводится специальный бит подтверждения, выставляемый на шину SDA, после приёма 8 бита данных: после отправки 8 бит, ведущий генерирует 9 такт импульса синхронизации, при котором приемник выставляет линию SDA в НИЗКИЙ уровень. Подтверждение при передаче данных обязательно, кроме случаев окончания передачи ведомой стороной. Перед началом передачи данных ведущий должен, после перехода шина в состояние СТАРТ, отправить байт, определяющий какой ведомый будет участвовать в обмене данных.

Помимо шины I2C для взаимодействия с FT5206GE1 выведены еще две линии: INT и CS. Когда есть данные для отправки, FT5206GE1 выставляет линию INT в НИЗКОЕ состояние. Для начала взаимодействие с FT5206GE1 ведущий должен выставить линию CS в ВОСОКОЕ состояние. Чип не требует какой либо процедуры инициализации и после подключения питания, достаточно выставить CS в ВЫСОКИЙ уровень для начала работы с ним, однако порты управляющего микроконтроллера все равно надо проинициализировать.

Порядок передачи данных следующий:

  1. Сгенерировать состояние СТАРТ.
  2. Отправить адрес FT5206GE1 для записи данных - 0x70.
  3. Отправить код команды.
  4. Снова сгенерировать состояние СТАРТ.
  5. Отправить адрес FT5206GE1 для чтения данных - 0x71.
  6. Прочитать 1 байт.
  7. Сгенерировать состояние СТОП.

Чипы семейства FT5x06 имеют обширную систему команд, однако для работы хватит вполне небольшого списка команд.

Код Название Описание
00 DEVICE_MODE Прочитать/установить режим устройства
01h GEST_ID Получит код жеста
02h TD_STATUS Получить количество точек касания
03h TOUCH1_XH Получить старшие 4 бита координаты X1
04h TOUCH1_XL Получить младшие 8 бит координаты X1
05h TOUCH1_YH Получить старшие 4 бита координаты Y1
06h TOUCH1_YL Получить младшие 8 бит координаты X1
07h TOUCH2_XH Получить старшие 4 бита координаты X2
08h TOUCH2_XL Получить младшие 8 бита координаты X2
09h TOUCH2_YH Получить старшие 4 бита координаты Y2
0Ah TOUCH2_YL Получить младшие 8 бит координаты Y2
0Bh TOUCH3_XH Получить старшие 4 бита координаты X3
0Ch TOUCH3_XL Получить младшие 8 бита координаты X3
0Dh TOUCH3_YH Получить старшие 4 бита координаты Y3
0Eh TOUCH3_YL Получить младшие 8 бит координаты Y3
0Fh TOUCH4_XH Получить старшие 4 бита координаты X4
10h TOUCH4_XL Получить младшие 8 бит координаты X4
11h TOUCH4_YH Получить старшие 4 бита координаты Y4
12h TOUCH4_YL Получить младшие 8 бит координаты Y4
13h TOUCH5_XH Получить старшие 4 бита координаты X5
14h TOUCH5_XL Получить младшие 8 бит координаты X5
15h TOUCH5_YH Получить старшие 4 бита координаты Y5
16h TOUCH5_YL Получить младшие 8 бит координаты Y5
80h ID_G_THGROUP Прочитать/выставить чувствительность
81h ID_G_THPEAK Прочитать/выставить пиковую чувствительность
82h ID_G_THCAL Порог при расчете фокуса прикосновения
83h ID_G_THWATER Чувствительность при влажности
84h ID_G_THTEMP Температурная компенсация
A0h ID_G_AUTO_CLB_MODE Режим автокалибровки

Команда DEVICE_MODE позволяет выбрать между режимами: Work mode и Factory mode. В режиме Factory mode можно получить техническую информацию о сенсорной панели. По умолчанию чип находится в Work mode и все основные действия будут выполняться именно в этом режиме.

Команда GEST_ID позволяет получить код зафиксированного жеста. Коды жестов: 0x10 – движение вверх, 0x14 – движение влево, 0x18 – движение вниз, 0x1C – движение вправо, 0x48 – увеличение, 0x49 – уменьшение, 0x00 – нет жеста.

Команда TD_STATUS позволяет получить количество текущих точек касания, используются только младшие 4 байта.

Группа команд TOUCH1_XH – TOUCH5_YL предназначена для получения координат точек касания. TOUCH1_XH – вернет старшие 4 бита первой зарегистрированной координаты X. TOUCH1_XL – вернет младшие 8 бит первой зарегистрированной координаты X. Для остальных команд все аналогично. Координаты указаны для книжного режима экрана, для альбомного режима координаты следует поменять местами.

Команды ID_G_THGROUP, ID_G_THPEAK, ID_G_THCAL, ID_G_THWATER, ID_G_THTEMP позволяют получить настройки чувствительности сенсора. Также возможно записать новые значения этих параметров.

Команда ID_G_AUTO_CLB_MODE включает/выключает режим автокалибровки.

Существует еще несколько десятков команд, но в данной статье не будем их описывать, полное описание системы команд вы сможете найти в документации к контроллеру.

В завершение приведем программный код некоторых процедур написанных на языке MikroPaskal, процедуры написаны для МК STM34 F407.

Чтение и запись по I2C:

  1. Procedure mtouch_WriteData(datax:byte);
  2. var temp,count:byte;
  3. begin
  4. temp:=datax;
  5. //SDA как выход
  6. GPIO_Config(@GPIOB_BASE, 1 shl T_SDA, _GPIO_CFG_DIGITAL_OUTPUT OR _GPIO_CFG_SPEED_MAX);
  7. delay_us(30);
  8. //запись 8 бит
  9. for count:=0 to 7 do
  10. begin
  11. if ((temp and 0x80)=0x80) then
  12. GPIOB_ODR := GPIOB_ODR or (1 shl T_SDA);
  13. else
  14. GPIOB_ODR := GPIOB_ODR and (not (1 shl T_SDA));
  15. temp := temp shl 1;
  16. //синхроимпульс
  17. GPIOB_ODR := GPIOB_ODR or (1 shl T_CLK);
  18. GPIOB_ODR := GPIOB_ODR and (not (1 shl T_CLK));
  19. end;
  20. //проверка бита подтверждения
  21. //SDA как вход
  22. GPIO_Config(@GPIOB_BASE, 1 shl T_SDA, _GPIO_CFG_DIGITAL_INPUT OR _GPIO_CFG_SPEED_MAX);
  23. delay_us(30);
  24. Set_CLK(1);
  25. if (GPIOB_IDR and (1 shl T_SDA)=(1 shl T_SDA)) then I2C_ERR:=1;
  26. Set_CLK(0);
  27. //SDA как выход
  28. GPIO_Config(@GPIOB_BASE, 1 shl T_SDA, _GPIO_CFG_DIGITAL_OUTPUT OR _GPIO_CFG_SPEED_MAX);
  29. end;
  30. function mtouch_ReadData(Last:byte):word;
  31. var
  32. datax:word;
  33. count:byte;
  34. begin
  35. datax := 0;
  36. //SDA как вход
  37. GPIO_Config(@GPIOB_BASE, 1 shl T_SDA, _GPIO_CFG_DIGITAL_INPUT OR _GPIO_CFG_SPEED_MAX);
  38. delay_us(30);
  39. for count:=0 to 7 do
  40. begin
  41. datax :=datax shl 1;
  42. GPIOB_ODR := GPIOB_ODR or (1 shl T_CLK);
  43. if (GPIOB_IDR and (1 shl T_SDA) = (1 shl T_SDA)) then
  44. datax:=datax+1;
  45. GPIOB_ODR := GPIOB_ODR and (not (1 shl T_CLK));
  46. end;
  47. //SDA как выход
  48. GPIO_Config(@GPIOB_BASE, 1 shl T_SDA, _GPIO_CFG_DIGITAL_OUTPUT OR _GPIO_CFG_SPEED_MAX);
  49. delay_us(30);
  50. if (Last=1) then GPIOB_ODR := GPIOB_ODR and (not (1 shl T_SDA)); else GPIOB_ODR := GPIOB_ODR or (1 shl T_SDA);
  51. GPIOB_ODR := GPIOB_ODR or (1 shl T_CLK);
  52. GPIOB_ODR := GPIOB_ODR and (not (1 shl T_CLK));
  53. result := datax;
  54. end;

Сигналы СТАРТ и СТОП:

  1. Procedure sendSTART();
  2. begin
  3. GPIOB_ODR := GPIOB_ODR or (1 shl T_SDA);
  4. GPIOB_ODR := GPIOB_ODR or (1 shl T_CLK);
  5. GPIOB_ODR := GPIOB_ODR and (not (1 shl T_SDA));
  6. GPIOB_ODR := GPIOB_ODR and (not (1 shl T_CLK));
  7. I2C_ERR:=0;
  8. end;
  9. Procedure sendSTOP();
  10. begin
  11. GPIOB_ODR := GPIOB_ODR and (not (1 shl T_SDA));
  12. GPIOB_ODR := GPIOB_ODR or (1 shl T_CLK);
  13. GPIOB_ODR := GPIOB_ODR or (1 shl T_SDA);
  14. end;

Чтение координаты Xn и Yn:

  1. function MGetXn(n:byte):word;
  2. var
  3. X:Word;
  4. B:Byte;
  5. begin
  6. sendSTART();
  7. mtouch_WriteData(FT5206GE1W);
  8. mtouch_WriteData(6*n-1);
  9. sendSTART();
  10. mtouch_WriteData(FT5206GE1R);
  11. B:=mtouch_ReadData(1);
  12. X:=(B and 0x0F)shl 8;
  13. sendSTART();
  14. mtouch_WriteData(FT5206GE1W);
  15. mtouch_WriteData(6*n);
  16. sendSTART();
  17. mtouch_WriteData(FT5206GE1R);
  18. B:=mtouch_ReadData(1);
  19. X:=X+B;
  20. sendSTOP();
  21. result := X;
  22. end;
  23. function MGetYn(n: byte):word;
  24. var
  25. X:Word;
  26. B:Byte;
  27. begin
  28. MT_Assert;
  29. sendSTART();
  30. mtouch_WriteData(FT5206GE1W);
  31. mtouch_WriteData(6*n-3);
  32. sendSTART();
  33. mtouch_WriteData(FT5206GE1R);
  34. B:=mtouch_ReadData(1);
  35. X:=(B and 0x0f) shl 8;
  36. sendSTART();
  37. mtouch_WriteData(FT5206GE1W);
  38. mtouch_WriteData(6*n-2);
  39. sendSTART();
  40. mtouch_WriteData(FT5206GE1R);
  41. B:=mtouch_ReadData(1);
  42. X:=X+B;
  43. sendSTOP();
  44. result := X;
  45. end;

Узнать текущее количество точек касания:

  1. function MPointsCount:byte;
  2. var b1:byte;
  3. begin
  4. MT_Assert;
  5. sendSTART();
  6. mtouch_WriteData(FT5206GE1W);
  7. if I2C_ERR=1 then begin I2C_ERR:=2; result:= 0; exit; end;
  8. mtouch_WriteData(2);
  9. sendSTART();
  10. mtouch_WriteData(FT5206GE1R);
  11. B1:=mtouch_ReadData(1);
  12. sendSTOP();
  13. result:= B1;
  14. end;

Материал подготовлен на основе информации из Википедии, сайта touchtechn.ru, документации на контроллер FT5206 и личного опыта автора.


589

Регистрационная форма

логин
фамилия
имя
отчество
e-mail
пароль
еще раз
пол

Сколько углов у фигуры?

Q-DEX, авторы: Кураев С.В. Саруханян С.К. © 2016г.-2019г.