Главная » Статьи » Проекты

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


Разница времени заряда (Т2 и T1) дает возможность определить наличие прикосновения к сенсору



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

Итак, алгоритм работы известен и описан на просторах интернета:
 
  • первым делом разряжаем «сенсор» подключая его к минусу питания. Для этого переводим порт на выход и подаём на него «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




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


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

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

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

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


 фото плат:

         
                                               Основная плата                                                                                      Плата сенсоров        



  Еще одним плюсом будет служить то, что дизайн клавиатуры будет ограничен только вашей фантазией:








Файлы к проекту:

Материалы статьи любезно предоставлены товарищем kip96


Категория: Проекты | Добавлено: 21.01.2012
Просмотров: 40986 | Комментарии: 21 | Рейтинг: 4.8/16
Всего комментариев: 21
21 pchela5   (16.05.2017 16:18) [Материал]
>>можно ли на одном и том же таймере одновременно и ШИМ, и прерывания использовать?
да, надо только понимать, для чего это делаешь.

20 abomin   (14.05.2017 14:23) [Материал]
А вот такой вопрос: можно ли на одном и том же таймере одновременно и ШИМ, и прерывания использовать?

0  
19 exersizze   (09.05.2017 15:07) [Материал]
Ага

18 abomin   (08.05.2017 21:04) [Материал]
А второй таймер для PWM нужен... Придётся циклы считать?

+1  
17 exersizze   (08.05.2017 19:26) [Материал]
abomin, отпускание можно определять по уменьшению времени заряда на сенсоре. А для определения длительности нажатия прикручиваем второй таймер. В общем вполне реализуемо.

16 abomin   (08.05.2017 11:20) [Материал]
Народ, а как на сенсорной кнопке отследить отпускание? И можно ли детектировать короткое\длинное нажатие?

+1   Спам
15 kip96   (03.03.2012 11:04) [Материал]
На бумагу. Как в домофонах, лампочки стоят с боку. Но в домофонах видно лучи от лампочки, и не равномерно. А ультрофиолет не видно почти, а бумага ярко начинает светится! На видео -просто светит на клавиатуру.

14 exersizze   (03.03.2012 10:16) [Материал]
получается что-то вроде люминисценции? А светодиоды светят в торцы бумаги или из-под нее? Жаль нет уф сидов посмотреть на это вживую)

13 kip96   (02.03.2012 23:24) [Материал]
"суперсекретная" библиотека "подсветка 2.bas" с неприведенным кодом)))) находится в файле к проекту. Отвечает за бегущий огонёк при включении
$include "подсветка 2.bas как раз её и вызывает. Сделано для того, чтобы не отвлекать от основного кода.
dream, синяя подсветка- это ультрофиолет. А клавиатура распечатанна на мелваной бумаге. Вот такой прикольный эфект получился.
ЗЫ долго писал, exersizze опередил. Не, именно ультрофиолетовыми, синий не подходит.

12 exersizze   (02.03.2012 23:18) [Материал]
В файле "подсветка 2.bas" поочередное зажигание светодиодов при старте основной программы, это видно на первом видео.
Синяя подсветка организована отдельно по спецтехнологии)) kip96 поделился секретом: как я понял простой лист мелованной бумаги подсвечивается ультрафиолетовыми/синими светодиодами. Подробнее лучше у него самого поспрашивать.

11 RD3AVJ   (02.03.2012 22:19) [Материал]
2 dream: вторая слева картинка над видео, вот ссылка: http://avrproject.ru/sensorkeyboard/100_1616.jpg
и на схеме есть...
А вот в программе есть строка " $include "подсветка 2.bas" 'подключаем приветствие ", в которой автор указал, видимо, на "суперсекретную" библиотеку "подсветка 2.bas" с неприведенным кодом))))

10 dream   (02.03.2012 21:50) [Материал]
Можно поинтересоваться, как реализована синяя подсветка?

9 thetaftemenot   (23.01.2012 12:35) [Материал]
то что я искал, спасибо

8 kip96   (23.01.2012 12:14) [Материал]
они, родимые, и стоят.

7 sherman   (23.01.2012 00:10) [Материал]
какие диоды используются в схеме? 1n4148 пойдет?

6 niko-lay   (22.01.2012 17:44) [Материал]
а ну понял, этож как в конденасаторе: если увеличиваем толщину диэлектрика между обкладками, то должны увеличить площадь пластин чтобы сохранить емкость.

+1   Спам
5 kip96   (22.01.2012 13:06) [Материал]
Quote
Уменьшая это число повышаем чувствительность, но естественно уменьшаем помехоустойчивость

Максимум что пробывал - крышка от CDbox. При этом нажатие приходилось увеличивать. Не силу,а площадь нажатия.
Увеличить чувствительность можно повысив частоту контроллера. При этом вполне возможно S(3) As Byte , T(3) As Byte нужно будет изменить на Word.

4 niko-lay   (22.01.2012 11:45) [Материал]
Наконец-то увидел реализацию на баскоме, а то везде Си да асм)) Такой вопрос, а какое максимальное расстояние может быть между сенсорами и пальцем? просто обдумываю разместить клавиатуру внутри корпуса а на лицевой панели просто наклеить наклейку с цифрами, расстояние получиться миллиметра 2 (толщина пластика лицевой панели)

3 sherman   (21.01.2012 20:44) [Материал]
о спасибо!!!!! давно обдумывал опробовать такой метод. Кстати вот тут есть зачетная анимашка иллюстрирующее изменение паразитного питания кнопки:
http://www.getchip.net/posts/060-drajjver-sensornojj-klaviatury-touch-me-na-attiny2313/

2 exersizze   (21.01.2012 17:15) [Материал]
Это все для краткости записи, вместо того чтобы писать
Code
Dim S0 As Byte
Dim S1 As Byte
Dim S2 As Byte
Dim S3 As Byte

Сокращаем до одной строки
Code
Dim S(3) As Byte


обрати внимание на переменную А, которую завели дальше. В ней хранится порядковый номер переменной S и T. И затем в программе If T(a) > S(a) Then .... заместо (а) подставится число и будет: If T1 > S1 Then, If T2 > S2 и так далее

1 4ester   (21.01.2012 15:58) [Материал]
объясните пожалуйста не могу понять вот что
Dim E As Byte , S(3) As Byte , T(3) As Byte , A As Byte , F As Byte
задаем переменные что означают числа в скобках? S(3)
и как потом происходит с ними работа S(a)
второй раз сталкиваюсь с подобным и не как не пойму

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]






авторизация
Логин:
Пароль: