Реле Tianbo - ресурс 10 млн переключений

Подключение сенсорного экрана к микроконтроллеру AVR

Сенсорные экраны (Touch Screen) находят все большее применение - это устройство ввода информации представляет собой экран, реагирующий на прикосновения к нему.

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

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Мы рассмотрим подключение четырехпроводного сенсорного экрана к микроконтроллеру AVR, на котором реализуем сенсорный USB интерфейс для подключения к компьютеру для реализации сенсорной мышки. Данный тип сенсорного экрана используется, например, в игровой приставке PlayStation Portable (PSP) или Nintendo DS.

Для нашего проекта потребуется:

  • микроконтроллер ATmega168 (или ATmega328);
  • кварцевый резонатор 16 МГц;
  • монтажная плата для 28-выводных микроконтроллеров AVR (использовалась макетная плата Olimex  AVR-P28);
  • программатор микроконтроллеров AVR;
  • плата с установленным разъемом miniB USB;
  • сенсорный экран от игровой приставки PSP;
  • коннектор для подключения сенсорного экрана;
  • два резистора номиналом 68 Ом, один резистор номиналом 1.5 кОм;
  • соединительные провода.

Подключение сенсорного экрана к AVR

Резистивный сенсорный экран состоит из стеклянной панели и гибкой пластиковой мембраны. И на панель, и на мембрану нанесено резистивное покрытие.

Принцип действия 4-проводного резистивного сенсорного экрана

Пространство между стеклом и мембраной заполнено микроизоляторами, которые равномерно распределены по активной области экрана и надежно изолируют проводящие поверхности. Когда на экран нажимают, панель и мембрана замыкаются, и контроллер с помощью аналогово-цифрового преобразователя регистрирует изменение сопротивления и преобразует его в координаты прикосновения (X и Y). В общих чертах алгоритм считывания таков:

  1. На верхний электрод подается напряжение +5 В, нижний заземляется. Левый с правым соединяются накоротко и проверяется напряжение на них. Это напряжение соответствует Y-координате экрана.
  2. Аналогично на левый и правый электрод подается +5 В и «земля», с верхнего и нижнего считывается X-координата.

Алгоритм работы показан на иллюстрации ниже.

Алгоритм работы с сенсорным экраном (Touch Screen)
Кликните для увеличения

Как видно, работа данного алгоритма означает, что электроды должны непрерывно переключаться, чтобы быстро определить координаты. Подключение сенсорного экрана была выбрано следующее:

Выводы
микроконтроллера

Выводы сенсорного
экрана ВОВ-09224)

Соответствие выводов
для чтения координаты X

Соответствие выводов
для чтения координаты Y

PC4

X1

5 В

АЦП

PC3

Y1

не подключен

GND

PC2

Y2

АЦП

5 В

PC1

X2

GND

не подключен

Подключение очень простое – прямое подключение сенсорного экрана к линиям ввода/вывода микроконтроллера, но заметьте (как видно из таблицы), два из них обязательно должны быть подключены к входным каналам АЦП. Питание сенсорного экрана подается через вывод микроконтроллера, подтянутый к 5 В и другой вывода микроконтроллера, подтянутый к GND.

Подключение сенсорного экрана к AVR

Для реализации интерфейса USB HID требуется несколько резисторов подключенных к двум выводам внешних прерываний микроконтроллера ATMega168, а также следует учесть, что вывод USB порта D+ подключен к выводу INT0 микроконтроллера.

Реализация USB HID интерфейса на микроконтроллерах AVR возможна с помощью библиотеки V-USB. Более подробная информация: Objective Development. На страничке загрузок Вы можете найти данные библиотеки, исходные файлы, примеры использования и полезную документацию, а также все необходимые рекомендации для применения библиотеки в своих устройствах.

Первоначальная задача при разработке кода для микроконтроллера – убедиться, что мы можем получить надежные координаты от сенсорного экрана, прежде чем организовывать передачу данных по интерфейсу USB. Вы можете скачать исходный код программы микроконтроллера для чтения данных АЦП от сенсорного экрана.

В основном, требуется два обращения к АЦП, одно для координаты X, второе – для координаты Y. Однако, мы не можем просто установить надолго один вывод сенсорного экрана на один канал АЦП, выводы должны будут постоянно меняться.

Была написана функция для каждой координаты, которая меняет соответствие выводов и производит чтение данных АЦП.

void read_x(void)
{
DDRC = 0b00010010; // Output on PC4(5V) and PC1(GND), Input on PC4(ADC)
sbi(PORTC, 4); //pull PC4 to 5V
cbi(PORTC, 1); //pull PC1 to GND

_delay_ms(1); //wait for screen to initialize

ADMUX = (1 << MUX1); //ADC2
ADCSRA = (1 << ADEN)|(1 << ADSC)|(1<<

while(ADCSRA & (1 << ADSC));
l = ADCL;
h = ADCH & 0x03;
h = h << 8;
h = h + l;
}


В этом случае, нам потребуется лишь глобальная переменная h для значений АЦП.

Задержка после переназначения соответствия выводов порта важна. Было обнаружено, что без включения задержки, значения АЦП были не последовательны и имели место отклонения. Связано это с тем, что мы подаем питание на одну из линий сенсорного экрана, а затем быстро переключаемся на входной канал АЦП. Задержка в 1 мс решила данную проблему.

Теперь, когда мы знаем что аппаратная и программная часть обслуживающая сенсорный экран работает, мы можем приступить к использованию полученных данных в вычислении движения для нашей сенсорной «мыши». Для проекта был использован пример кода для реализации USB мышки. Он реализован для такой же архитектуры, которую используем мы: целевой микроконтроллер, тактовая частота, Fuse-биты, поэтому никаких изменений в make-файле делать не требовалось.

Как же применить данные, полученные от АЦП, для реализации движения мышки.

В основной программе (main.c) используется член dx структуры reportbuffer как значение скорости по оси X (также для оси Y). В основном, нам необходимо загрузить 8-битное значение со знаком в reportbuffer.dx и это переместит курсор мыши на некоторой скорости.

Код для микроконтроллера реализует следующее:

  • включает таймер для отсчета интервалов чтения АЦП;
  • заполняет небольшой буфер значениями данных АЦП;
  • вычисляет разность последовательных данных для определения направления движения;
  • запускает алгоритмы сравнения и выражения проверки условий;
  • вычисляет скорость;
  • загружает данные в буфер reportbuffer.dx.

Однако, была некоторая проблема: данные от АЦП – это 10-битные значения без знака, которые загружаются в переменные h и hl. Когда мы делаем вычисления, сравнения и другие операции для определения направления движения, то должны использовать знаковые или беззнаковые 8-битные, 16-битные или long-значения. Это создает относительно большие проблемы в ходе любых операций между бинарными значениями с различной размерностью. В целом, было необходимо преобразовать беззнаковый 10-битный результат АЦП в 8-битный беззнаковый. Выражение ниже реализует эту операцию:

char xshifted = ((XDIFF>>3)|((XDIFF&0x8000)>>8));

Другая проблема выявлена в ходе отладки – прерывания, вызываемые процедурой printf, конфликтовали с прерываниями USB, поэтому невозможно было отображать целые значения, необходимые для отладки. Решение – написание кода для последовательной отладки с библиотеками USB.

Исходный код программы микроконтроллера - USB Touchscreen Mouse

Исходный код и hex.-файл для отладки - SerialDebug USB Touchscreen Mouse (чтение данных АЦП)

Как работает резистивный четырехпроводный сенсорный экран:

sparkfun.com

Перевод: Vadim по заказу РадиоЛоцман

На английском языке: The AVR based USB Touchscreen Mouse

Электронные компоненты. Бесплатная доставка по России
Для комментирования материалов с сайта и получения полного доступа к нашему форуму Вам необходимо зарегистрироваться.
Имя
Фрагменты обсуждения:Полный вариант обсуждения »
  • Очень классно!