Сенсорная клавиатура

 Принцип работы сенсорной клавиатуры заключается в измерении паразитной ёмкости сенсора. Сенсор имеет определённую ёмкость, которая заряжается через высокоомный резистор. Прикасаясь к «сенсору». Мы меняем его емкость, и время заряда немного увеличивается. Для того, что бы «засечь» нажатие, необходимо просто измерять время заряда «сенсора» и сравнивать его с эталонным. Получается всё просто!

Разница времени заряда (Т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, я решил пойти дальше, и реализовать полноценный драйвер сенсорный клавиатуры. 

Итак задача:

  1. драйвер должен обрабатывать не менее 10 сенсоров (а лучше 12, как на всех клавиатурах)
  2. индикация прикосновения каждого сенсора
  3. передача кода сработавшего сенсора 

 Да , но у 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


Взято с: avrproject.ru


Категория: AVR
Метки:

Написать коментарий

*
= 4 + 2

Добавить изображение

Последние статьи