Малаток-меню
Авторизация

Наш опрос
Какие языки программирования вы используете?

Всего ответов: 10
Мини-чат
200
Статистика


Наш линк
Malatok.at.ua
Полезные ссылки
Это может быть интересно
[
Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Модератор форума: Stalker753, Викр, Дмытрохан 
Форум » РАДИОТЕХНИКА » Полезные устройства » Сенсорная клавиатура
Сенсорная клавиатура
incubus Дата: Суббота, 14.12.2013, 22:23 | Сообщение # 1
Почетный друг сайта
Группа: Модераторы
Сообщений: 190
Награды: 4
Репутация: 200
Замечания: 0%
Статус: Офлайн
Принцип работы сенсорной клавиатуры заключается в измерении паразитной ёмкости сенсора.
Сенсор имеет определённую ёмкость, которая заряжается через высокоомный
резистор. Прикасаясь к «сенсору». Мы меняем его емкость, и время заряда
немного увеличивается. Для того, что бы «засечь» нажатие, необходимо
просто измерять время заряда «сенсора» и сравнивать его с эталонным.
Получается всё просто!


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


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

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

  • далее, переводим порт на вход и запускаем таймер. «Сенсор» заряжается через резистор 1Мом, а таймер считает время заряда

  • после того на PINe появилась лог «1», останавливаем таймер


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

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

Итак задача:

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

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




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

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

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

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

     
    фото плат:


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

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


    С дураком спорить бесполезно!
     
    Форум » РАДИОТЕХНИКА » Полезные устройства » Сенсорная клавиатура
    Страница 1 из 11
    Поиск:
    Новый ответ
    Имя:
    Текст сообщения:
    Опции сообщения:
    Код безопасности:
    Яндекс.Метрика
    24 log 24 LOG statistick
    счетчик посещений
    Если вы видите это,
    то ваш браузер устарел
    и не поддерживает технологий
    CSS 3.0