Бесспорно, что кнопочная клавиатура является одним из основных способов введения информации (выбор режима работы, установка параметров и т.д.) в микроконтроллерную поделку. Но иногда, гордый вид торчащих механических кнопок придаёт «громоздкость» внешнему виду вашего устройства. В этом случае можно применить сенсорную клавиатуру, благо, хорошее описание принципа действия и готовые схемные решения найти в интернете не составляет проблем. Не оставит в беде и Arduino, предложив радиолюбителю выбрать между сенсорной кнопкой или 9-12-кнопочной панелью. Однако, покупать сенсорную кнопку на своё устройство для меня было как-то не спортивно, а готовые 9 или 12-кнопочные клавиатуры были как-то чересчур для моих устройств, причём во многих из них информация передавалась по интерфейсу UART, который у меня обычно уже занят под иные задачи, а программную реализацию интерфейса делать было не особо охота. Поэтому, взяв прототипом реализацию сенсорной клавиатуры от небезызвестного мистера Chan(а), я сделал сенсорный модуль на 1, 2 и 3 кнопки, что зачастую вполне достаточно для работы с микроконтроллерными устройствами.
Ограничение на количество сенсорных кнопок накладывает применяемый микроконтроллер – Attiny13A-SSU , но даже его применение для однокнопочного сенсорного модуля по себестоимости выходит дешевле аналогичного модуля от Arduino.
Выводы модуля:
VCC – питание 3-5 В;
GND – земля;
SIG1-SIG3 – цифровой сигнал нажатия кнопки.
При нажатии кнопки, на соответствующем цифровом выводе появится логическая «1», хотя вы можете исправить в коде программы на «0», тогда будет полная имитация нажатия механической кнопки.
Схема сенсорного модуля на 3 кнопки
В случае слишком большой чувствительности сенсорных кнопок (на выходе модуля появляется сигнал до прикосновения к сенсорной панели) можно уменьшить сопротивление резисторов R1-R3. Исходник программы, как я уже упоминал, основан на коде от мистера Chan(а), однако функцию опроса сенсорных кнопок и определение нажатой кнопки я полностью переделал, повысив помехоустойчивость и реализовав надёжное определение нажатия и отпускания сенсорной кнопки.
В архиве представлен исходный код и прошивка для трёх исполнений модуля – на 1, 2 и 3 кнопки, единственное отличие битов конфигурации для последнего случая – установить галочку напротив бита RSTDISBL (на рисунках ниже - конфигурация для 1 и 2-х кнопок).
Список радиоэлементов
Обозначение | Тип | Номинал | Количество | Примечание | Магазин | Мой блокнот |
---|---|---|---|---|---|---|
DD1 | МК AVR 8-бит | ATtiny13A | 1 | Поиск в магазине Отрон | ||
C1 | Конденсатор | 0.1 мкФ | 1 | Поиск в магазине Отрон | ||
R1-R3 | Резистор | 1 МОм | 3 | Поиск в магазине Отрон | ||
Скачать список элементов (PDF)
Прикрепленные файлы:
- TOUCH SENSOR - код.rar (122 Кб)
- TOUCH SENSOR - Плата под ЛУТ.rar (36 Кб)
Комментарии (29) | Я собрал (0) | Подписаться
Для добавления Вашей сборки необходима регистрация
[Автор]
А проект очень неплохой, думаю, как раз есть повод заказать пару ATTiny13.
[Автор]
[Автор]
Можно ли будет повесить резистор транзистор и реле, или нужно триггер ставить?
[Автор]
Может автор снизойдёт и напишет ещё одну прошивку с триггером? Многие и многие будут очень благодарны. Тем более, что знающему человеку это на 5 мин. работы. Код в несколько строк.
P.S. Сам пробовал добавить код триггера, но увы... знаний недостаточно. Ошибки, ошибки, ошибки.
Допишите сами, логика триггера в простейшем представлении будет выглядеть. Специально жирно и в лоб. На самом деле есть более красивые и правильные реализации.
Прошивку не смотрел, почему то не могу скачать архив.
Будем полагать что состояние кнопки у автора хранится в переменной KEY_Level
char KEY_Level_TRIG // в этой переменной будем хранить состояние "кнопки"
if(KEY_Level==1){cnt++;} //если уровень на кнопке ==1, прибавляем одну единицу в счетчик
switch (cnt) //проверяем наш счетчик
{
case 0: //если в нем ноль(по умолчанию)
KEY_Level_TRIG=0; // Записываем в нашу переменную флаг единицу
break;
case 1: //нажали второй раз, в счетчик записалась единичка ,
KEY_Level_TRIG=1; // записываем в нашу переменную-флаг единицу
break;
default: // после третьего нажатия в счетчик запишется "3", и он обнуляется.
cnt=0;
break;
Простейший пример, чтобы понять логику, но применять его все же затратно.
....
char KeyBuffer; //Переменная считывания кода нажатой сенсорной кнопки
bit b1=0,b2=0,b3=0;
void main(void)
{...
while (1)
{
TOUCH_CompareKey();
KeyBuffer=TOUCH_GetKey();
if(KeyBuffer==1){ b1++; SIG1=b1;}
else if(KeyBuffer==2){b2++; SIG2=b2;}
else if(KeyBuffer==3){b3++; SIG3=b3;};
delay_ms(10);
};
В основном цикле делаем так:
TOUCH_CompareKey();
KeyBuffer=TOUCH_GetKey();
if(KeyBuffer==1 & KeyBuffer!=KeyLevelTrig) SIG1= ~SIG1;
else if(KeyBuffer==2 & KeyBuffer!=KeyLevelTrig) SIG2= ~SIG2;
KeyLevelTrig = KeyBuffer;
delay_ms(10);
Изящно ли или нет, но работает
Не могу понять как создается он. Через блокнот посмотрел что там, пробовал изменить на 2313, ничего не дало. Если есть возможность, помогите разобраться.