Главная » Статьи » Проекты |
Сенсорная клавиатура
Принцип работы сенсорной клавиатуры заключается в измерении паразитной ёмкости сенсора. Сенсор имеет определённую ёмкость, которая заряжается через высокоомный резистор. Прикасаясь к «сенсору». Мы меняем его емкость, и время заряда немного увеличивается. Для того, что бы «засечь» нажатие, необходимо просто измерять время заряда «сенсора» и сравнивать его с эталонным. Получается всё просто! Разница времени заряда (Т2 и T1) дает возможность определить наличие прикосновения к сенсору Тогда пробуем! Итак, алгоритм работы известен и описан на просторах интернета:
Родился такой код:
Config Portd.0 = Output
Waitms 5 Config Pind.0 = Input 'переводим ряд в состояние приёма Start Timer0 Bitwait Pind.0 , Set 'ждём, когда зарядится ёмкость кнопки Stop Timer0 Теперь нам осталось только сравнивать время заряда с начальным, и если оно заметно превышает, то отреагировать на это:
S = S + 10 'время заряда пустого сенсора
If T > S Then ... 'реагируем на прикосновение Т.е. при замере пустого сенсора , время заряда присваиваем переменной S. Увеличиваем на 10. При этом числе, сенсор устойчиво срабатывал через довольно толстую плёнку от канцелярской папки. Уменьшая это число повышаем чувствительность, но естественно уменьшаем помехоустойчивость., поэтому в зависимости от лицевой панели, нужно стремиться к увеличению! После удачных экспериментов на Attiny 2313, я решил пойти дальше, и реализовать полноценный драйвер сенсорный клавиатуры. Итак задача:
Да , но у Attiny 2313 можно использовать 7+8+2=17 ног, а необходимо 12 сенсоров + 12 индикаторов + хотя бы 2 на вывод информации, и ещё попищать бы! Будем прибегать к хитростям. Индикацию сделаем по стандартной схеме чарлиплексинга. Для этого нам понадобится всего четыре ноги. Всё равно не хватает. Значит, будем придумывать матрицу «сенсор». Из 12 сенсоров нам нужно 3 столбца и 4 строки. Принцип также известен: заряжаем сначала первые четыре сенсора, подключая резистор 1Мом и замеряем их время заряда, Потом второй ряд, и третий. И того на одном порте остаётся четыре свободные ноги, через которые будем выводить информацию. Кому как удобно, я просто вывел двоичный код кнопки. Получился такой драйвер. Код программы:
$regfile = "attiny2313.dat"
$crystal = 8000000 'работаем на частоте 8 мГц Dim E As Byte , S(3) As Byte , T(3) As Byte , A As Byte , F As Byte Config Porta = Output Config Timer0 = Timer , Prescale = 1 Stop Timer0 Timer0 = 0 $include "подсветка 2.bas" 'подключаем приветствие Portb = 0 Ddrb = &B00000000 'отключаем порт В '############################################# ' в начале программы замеряем ёмкость кнопок и запоминаем Portd = &B0001 For A = 1 To 3 'проверяем поочереди все кнопки в ряду S(a) = 0 For E = 0 To 50 'количество проверок Gosub Sensor If S(a) < T(a) Then S(a) = T(a) 'и запоминаем максимальное значение Next E S(a) = S(a) + 10 'определяем порогсрабатывания Next A Sound Porta.1 , 1000 , 200 '############################################# ' ОСНОВНОЙ ЦИКЛ '############################################# Do For E = 0 To 3 'поочерёдно подключаем ряды Portd = Lookup(e , Dta) For A = 1 To 3 'в каждом ряду проверяем строки Gosub Sensor If T(a) > S(a) Then 'и если сработала F = E * 3 'вычисляем номер кнопки F = F + A Gosub Knopka End If Next A Next E Loop '***************************************** 'замер состояния кнопок Sensor: Ddrd = &B1111111 'PortD на выход, Waitms 5 'и разряжаем ёмкость сенсоров Ddrd = &B0001111 'переводим строки в состояние приёма Start Timer0 Select Case A Case 1 : Bitwait Pind.6 , Set 'ждём, когда зарядится ёмкость кнопки Case 2 : Bitwait Pind.5 , Set Case 3 : Bitwait Pind.4 , Set End Select Stop Timer0 T(a) = Timer0 'запоминаем ёмкость кнопки Timer0 = 0 'переводим входы на выход Ddrd = &B1111111 Portd.4 = 0 Portd.5 = 0 Portd.6 = 0 'разряжаем ёмкость кнопок Return '****************************************** Knopka: Waitms 50 Gosub Sensor 'ещё раз перепроверяем If T(a) > S(a) Then 'через время Select Case F 'и выдаём код Case 1: Ddrb = &B11110011 Portb = &B00110010 Case 2: Ddrb = &B11110110 Portb = &B00100100 Case 3: Ddrb = &B11111100 Portb = &B00011000 Case 4: Ddrb = &B11110011 Portb = &B01100001 Case 5: Ddrb = &B11110110 Portb = &B01010010 Case 6 : Ddrb = &B11111100 Portb = &B01000100 Case 7: Ddrb = &B11111010 Portb = &B10011000 Case 8: Ddrb = &B11110101 Portb = &B10000001 Case 9: Ddrb = &B11111001 Portb = &B01110001 Case 10: Ddrb = &B11111010 Portb = &B11000010 Case 11: Ddrb = &B11110101 Portb = &B10110100 Case 12: Ddrb = &B11111001 Portb = &B10101100 End Select Sound Porta.1 , 200 , 200 Waitms 100 End If Ddrb = &B11110000 Return Dta: Data &B0001 , &B0010 , &B0100 , &B1000 Программа отрабатывает довольно чётко, каждое нажатие. Основной критерий – это комплектующие и печатная плата. (Всё-таки сенсор!) Резисторы и диоды, желательно новые и с одной линейки, (партии). Памяти, код, занимает не много, поэтому драйвер вполне можно реализовать в составе другой программы, а можно использовать и отдельно. На вывод кода отведено четыре вывода, что вполне достаточно для любых способов. Ну и преимущества сенсорной клавиатуры очевидны! Кроме «вечности», она облегчает изготовление лицевых панелей устройств! фото плат: Основная плата Плата сенсоров Еще одним плюсом будет служить то, что дизайн клавиатуры будет ограничен только вашей фантазией: Файлы к проекту: Материалы статьи любезно предоставлены товарищем kip96 | ||
Просмотров: 41329 | Комментарии: 21 | Рейтинг: 4.8/16 |
Всего комментариев: 21 | |||||||||||||||||||
| |||||||||||||||||||
авторизация
рубрики
Проекты [46] |
Как подключить [32] |
Инструменты [3] |
Полезная информация [18] |
Объявления [3] |
метки