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

Тогда пробуем!

Итак, алгоритм работы известен и описан на просторах интернета:
 
  • первым делом разряжаем «сенсор» подключая его к минусу питания. Для этого переводим порт на выход и подаём на него «0»
  • далее, переводим порт на вход и запускаем таймер. «Сенсор» заряжается через резистор 1Мом, а таймер считает время заряда
  • после того на PINe появилась лог «1», останавливаем таймер

Родился такой код:

Config Portd.= Output
Waitms 5
Config Pind.= Input                        'переводим ряд в состояние приёма
Start Timer0
Bitwait Pind., Set                         'ждём, когда зарядится ёмкость кнопки
Stop Timer0                            
                                   


 Теперь нам осталось только сравнивать время заряда с начальным, и если оно заметно превышает, то отреагировать на это:

= 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., 1000 , 200


'#############################################
' ОСНОВНОЙ ЦИКЛ
'#############################################

Do
For E = 0 To 3                                   'поочерёдно подключаем ряды
Portd = Lookup(, Dta)
For A = 1 To 3                                   'в каждом ряду проверяем строки
Gosub Sensor
If T(a) > S(a) Then                              'и если сработала
= E * 3                                         'вычисляем номер кнопки
= 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., Set                   'ждём, когда зарядится ёмкость кнопки
Case 2 : Bitwait Pind., Set
Case 3 : Bitwait Pind., Set
End Select
Stop Timer0
T(a) = Timer0                                    'запоминаем ёмкость кнопки
Timer0 = 0                                       'переводим входы на выход
Ddrd = &B1111111
Portd.= 0
Portd.= 0
Portd.= 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., 200 , 200
Waitms 100
End If
Ddrb = &B11110000
Return

Dta:
Data &B0001 , &B0010 , &B0100 , &B1000




Программа отрабатывает довольно чётко, каждое нажатие.


 Основной критерий – это комплектующие и печатная плата. (Всё-таки сенсор!) Резисторы и диоды, желательно новые и с одной линейки, (партии).

 Памяти, код, занимает не много, поэтому драйвер вполне можно реализовать в составе другой программы, а можно использовать и отдельно.

 На вывод кода отведено четыре вывода, что вполне достаточно для любых способов. 

 Ну и преимущества сенсорной клавиатуры очевидны! Кроме «вечности», она облегчает изготовление лицевых панелей устройств!




Файлы к проекту:
  • Печатная плата
  • Исходники и прошивка в Bascom-AVR


Полная версия статьи

авторизация