Используем сенсорную клавиатуру на STM32L-Discovery

Уже давно пришла отладочная плата STM32L-Discovery на базе STM32L152RB6, на борту которой помимо семисегментного дисплея присутствует сенсорная клавиатура, которую можно использовать как четыре сенсорных кнопки или один слайдер.

Собственно о данной клавиатуре и пойдет речь, посмотрим из чего она состоит и как её можно использовать, всем кому интересно добро пожаловать под кат.

Техническая сторона вопроса
Для работы со слайдером в МК используется три пары портов ввода\вывода, каждая пара из которых коммутируется аналоговым переключателем:
  • PA6, PA7 (группа 2)
  • PC4, PC5 (группа 9)
  • PB0, PB1 (группа 3)
Поэтому стоит обратить внимания на интерфейс маршрутизации (Routing interface) если приспичит работать с тачем без готовой библиотеки:

В даташите AN2869 подробно в картинках изображены принципы построения тачскира на МК, как видно из рисисунке, есть куча свободных портов и групп коммутации с помощью которых можно в общем установить 12 – 19 тачскрин кнопок, в зависимости сколько выводов у МК.

Используем Touch-Sensing Library
ST любезно предоставило библиотеку для управления тачскрином, она такая же жирная как PLL так как она содержит много лишнего кода для нашей платки и к тому же тянет за собой PLL. При большом желании можно все вкратце описать на примере работы с регистрами на прямую, но без повторения львиной доли кода TSL это будет трудновато, поэтому решил не изобретать велосипед заново а использовать уже стандартные функции по работе с тачем. Для начала скачаем и установим саму библиотеку. После добавим заголовочные файлы, для работы с функциями:

В main.c подключим заголовочный файл #include «stm32_tsl_api.h», в главной функции напишем код инициализирующий тач и осуществляющий обработку нажатий:
RCC_Configuration();
  //Инициализируем порты LCD
  Init_GPIOs ();
  //Настраиваем тач
  TSL_Init();
  sMCKeyInfo[0].Setting.b.IMPLEMENTED = 1; 
  sMCKeyInfo[0].Setting.b.ENABLED = 1;
  sMCKeyInfo[0].DxSGroup = 0x00; 
  //Включаем LCD
  LCD_GLASS_Init();
while(1){  
  TSL_Action();
  //функция обработки слайдера как 4 раздельных кнопки
  Button();
}

Определим постоянные для обнаружения и позиции нажатия:
#define SLIDER_DETECTED (sMCKeyInfo[0].Setting.b.DETECTED)
#define SLIDER_POSITION (sMCKeyInfo[0].UnScaledPosition)

Функция вывода нажатия номера кнопки:
void Button(void){
  uint8_t *Message;  

  //проверяем нажатие и его позицию
  if ((SLIDER_DETECTED)&&(TSLState == TSL_IDLE_STATE))
  {   
    if( SLIDER_POSITION <= 25 )
      Message = "1";     
    if( (SLIDER_POSITION > 25 ) && (SLIDER_POSITION <= 110 ))        
      Message = "2";     
    if( (SLIDER_POSITION > 110 ) && (SLIDER_POSITION <= 200 ))        
      Message = "3";     
    if( SLIDER_POSITION > 200 )        
      Message = "4";   
   LCD_GLASS_DisplayString(Message);
  } //cбрасываем нажатие
  else if((!TSL_GlobalSetting.b.CHANGED) && (TSLState == TSL_IDLE_STATE))
  {
        LCD_GLASS_DisplayString(Message);
  }
}

Отталкиваясь от значения SLIDER_POSITION, можно вывести на дисплей где именно происходит касание, или перевести все это в проценты и использовать как обычный слайдер, для управления своей примочки. В заголовочном файле discover_functions.h имеется функция позволяющая работать с тачскрином в качестве слайдера: Slider_value().

В качестве примера выкладываю исходники проекта, в нем есть все, даже что-то лишние из заголовочных файлов можно найти, в общем подключена вся библиотека PLL и TSL. Хотелось как всегда рассказать больше и подробнее, но больше чем написано в доках рассказать пока нечего. Пока писал, вспомнил что где-то валяется сенсорная панелька от плеера, нужно её приделать к контроллеру и опробовать на практике что написано в AN2869, тогда то будет, что описать более значительно.

[1] AN2869
[2] STM32 Touch Sensing Library
[3] Проект для работы с сенсорной клавиатурой
[4] Вся документация к STM32-Discovery на базе STM32L152RB6
  • 0
  • 26 августа 2011, 22:44
  • pkm

Комментарии (21)

RSS свернуть / развернуть
Да ну… С библиотекой неинтересно. Расписал бы кто, как, например, происходит определение позиции на слайдере? И отчего он такой интересной формы?
0
  • avatar
  • _YS_
  • 28 августа 2011, 00:10
А ты апнот почитай. Форма интересная надо полагать для того, чтобы замерять положения пальца между площадками и вместо 4 позиций получить много. Похожие гребеночки в электронных штангелях. Сами гребенки имеют период около миллиметра, а с разрешением в 10мкм оно как раз определяет положение между ними.
0
Скурил аппноут. Никакой конкретики про работу с перекрывающимися сенсорами — только их дизайн.
0
форма такая-для линейности характеристики. и для экономии пинов контроллера=)
0
В стандартной прошивке на дискавери, мне показалось что тач работает довольно тормозно. Это фича прошивки? Можно сенсорную панель опрашивать быстрее?
0
  • avatar
  • ACE
  • 28 августа 2011, 02:15
По умолчанию время обнаружения касания 2 мс, думаю меньше ставить нет особого смысла могут быть лишние срабатывания от внешних возмущений.
Проблема стандартной прошивки вполне возможна, Slider_value в стандартной прошивке обрабатывается заметно если быстро пальцем елозить, но это еще из-за того что выставлена высокая скорость проверки касания, если пожертвовать точностью можно ускорить отображение. В общем для нормальной работы скорость вполне приемлемая.
0
Hi.
Спасибо за труды!
А вот проект скачать — УВЫ, 404
Пож-та, перезалейте.

Удачи!
0
либа есть на гитхабе
github.com/mobyfab/STM32F0XX-Touch-driver
0
прокоментируйте строчки кода пожалуйста, что откуда и как работает…
0
распишите подробнее, ни хрена не понятно. На русском нет толкового описания. А лепить по шаблону не понимаю что за чем невозможно.
0
на новом сайте st сам чёрт хрен сломает
0
на фотке видно, что сами сенсорные кнопки покрыты маской. Получается, что прямого контакта пальца с проводником не происходит?
0
Нет и не должно. Сенсоры емкостные.
0
Это радует))
Я так понял, для одной сенсорной кнопки нужна любые 2 ацп входа? Не подскажите, где можно почитать про реализацию сенсорной кнопки без этой здоровой библиотеки? Просто мне нужно всего лишь реагировать на 3 кнопки (не слайдер), поэтому не хотелось бы использовать крупную либу
0
для одной сенсорной кнопки достаточно одного _цифрового_ входа.
0
Но зачем тогда в дискавери для одной кнопки используется 2 порта?
0
точней, не порта, а пина
0
разные подходы.
0
гг, ясно))
И еще вопрос: если буду делать сенсорную кнопку с применением кондера+резистора+цифрового входа, то есть ли вероятность сжечь пин статикой? (на проводнике будет маска)
0
нет
я вообще очень много и долго игрался с голыми и много тыкал пальцами. ни один не сгорел.
синтетику на теле и шерстяное кресло не рассматриваем ;)
0
Сенсорные входы группируются по 4 штуки, соответственно в одной группе могут быть 3 кнопки и конденсатор, заряжаемый с них по очереди — по времени его заряда определяется наличие пальца у кнопки. Здесь же они развешаны на разные группы, каждой кнопке выходит по конденсатору, но обрабатываются одновременно.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.