Сей пост следовало бы назвать что-то типа «Работа с тачскрином». Но я буду придерживаться уже устоявшихся названий этого цикла статей. Если Вы пробежитесь по просторам интернета в поисках русскоязычной информации по управлению тачскрином микроконтроллерами AVR, то найдёте немало статей, почти на всех крупных радиолюбительских форумах. Однако, присмотревшись, обнаруживается, что это одна и та же статья, скопипащенная с англоязычного источника. Кроме того, авторы даже не удосуживаются исправить ошибки и неточности, и оные кочуют с форума на форум. Принципиально выделяется из этого множества статья написанная DI HALT- ом на его сайте. Там действительно вопрос рассмотрен в плане практической собственной реализации. Её я и предлагаю читателям в качестве теоретической части. Однако и у Артёма не рассмотрены проблемы привязки тачскрина к конкретному дисплею, а это вопрос интересный. Одно дело — положить тачскрин на стол, лихо водить по нему и наблюдать изменение координат на символьном дисплее. Совершенно другое — когда нужно чётко привязать координату нажатия к точке на графическом дисплее. Общепринятую схему, которая кочует из сайта на сайт я бы представил по другому. Вот так.
Пусть отличия и несущественные, но эта схема более полно представляет резистивную матрицу, т.е. тачскин. ?змерения параметров эквивалентных резисторов (для моего конкретного дисплея) дали следующие результаты: сопротивление x-плёнки — 504 Ом, y-плёнки — 340 Ом, переходное сопротивление при нажатии приблизительно 800 Ом, переходное сопротивление без нажатия — бесконечно велико, разрыв. Это позволяет нам утверждать, что влияние сопротивлений плёнок тачскрина при считывании координат будет несущественным, т.к. входное сопротивление АЦП согласно даташиту существенно больше.
Макет я сделаю на ATmega8A — она работает на 16 МГц при питании 3,3 В. Фото перед Вами. Плата ATmega128 kit работает здесь как стабилизатор на 3,3 В 🙂Непосредственно калибровку нужно производить так. Смотрим ВН?МАТЕЛЬНО исходник и рисунок (Figure) ниже!!! В разделе define раскомментируем строку
//#define KALIBR.
Компилируем и заливаем прошивку в контроллер. При касании стилусом на экране наблюдаем следующую картину:
Это отображаются напряжения в условных единицах с делителей напряжений, образованных токопроводящими координатными плёнками тачскрина. Теперь перпендикулярно границ видимой части дисплея по периметру стилусом проводим следующим образом:
т.е. очень плавно ведём его и при резком изменении значения напряжения координаты с нуля до какого-то значения отмечаем это значение. Так нужно сделать несколько (i) раз для каждой стороны периметра дисплея. При этом у нас наберётся 4 массива значений: — Uy_min[i] — для верхней стороны дисплея; — Ux_max[i] — для правой стороны; — Uy_max[i] — для нижней стороны; — Ux_min[i] — для левой стороны. После присваиваем Ux_min и Uy_min МАКС?МАЛЬНОЕ значение из одноимённых массивов, а Ux_max и Uy_max — М?Н?МАЛЬНОЕ значение соответственно. Почему берём минимальные и максимальные значения видно из рисунка, ведь резистивные качества плёнок по координатам не одинаковые для всех точек. ?, если взять, допустим, средние значения, то, при нажатии точки у границы дисплея, подсветится точка у противоположной границы по той же координате. А в нашем случае у границ дисплея просто будет область, очень маленькая и не существенная (на рисунке выделена красным НЕ В МАСШТАБЕ!!!), где контроллер просто не будет реагировать на нажатие. Теперь, порывшись в мозгах, и, вспомнив математику за пятый класс, выводим формулу для отображения координат —
X(Y) = (ADCx(y) — Ux(y)_min)*Kx(y);
где: X(Y) — значение координаты по х или у, соответственно;
ADCx(y) — значение АЦП по координатам;
Ux(y)_min — минимальные измеренные значения (см. выше);
Kx(y) — коэффициент равный:
Kx = 320/(Ux_max — Ux_min);
Ky = 240/(Uy_max — Uy_min);
Полученные значения Ux_max, Ux_min, Uy_max, Uy_min вставляем в раздел define, комментируем строку #define KALIBR , откомпилируем и прошьём микроконтроллер — можно работать. Для демонстрации я взял стилус из дочкиного телефона и нарисовал картинку:
Нажатие на цвет палитры вверху меняет цвет , соответственно на цифру — толщину рисуемых точек. Вы сами видите, что есть некоторые бока (точки, вероятно от дребезга). Ещё на значениях координат, близких к максимальным (320 — х, 240 — у) наблюдается некоторое несоответствие точки нажатия с точкой прорисовки — наверное сказывается нелинейность резистивных плёнок — мы ведь предположили, что функция линейна! А в целом рисовать прикольно. Если бы размер побольше, можно сделать полноценный планшет для рисования. Дополнительно нужно организовать сохранение рисунков, перекачку на комп — это всё не так сложно сделать.
Архив с исходником.
P.S. В дальнейшем продумаю функцию автокалибровки — у кого есть предложения?
Вот это да, просто СУПЕР!!! ? вот только пусть попробуют сказать что в Украине нет хороших специалистов! Вы некогда не пробывали разрабатывать чтото типо планшета или тач-фона? Просто, по моему у Вас неплохо бы получилось. А вот по поводу дисплея мы уже говорили на эту тему помните? Я получил этот дисплей MB-TFT-24-S3D-S http://www.kosmodrom.com.ua/prodlist.ph … rix&page=0 вроде бы целый без повреждений но ещё боюсь к нему подходить не зная как с ним работать. Вы говорили что у Вас тоже есть такой, как он поживает, не запускали его?
Пока не запускал, но скоро возьмусь и за него.
>> В дальнейшем продумаю функцию автокалибровки — у кого есть предложения?
Сделайте, как в коммуникаторах. При включении по четырем сторонам экрана нарисованы точки и надо по очереди нажимать стилусом на них.