Матричная клавиатура

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем grand, 6 июн 2015.

  1. grand

    grand Гик

    Приобрел китайскую 4*3 клавиатуру.
    Подключил ее как в примерах инета нарисовано - напрямую к пинам 2-8.
    Запускаю скетч на основе модуля Keypad.h.
    Она, вроде, и работает, но как хочет.... то пропускает нажатия, то нет... иногда может вообще не определять нажатия - хоть с какой силой дави на нее(((

    Возможно ее как-то четко отрегулировать?
     
  2. Deniss

    Deniss Гик

    все это из за дребезжание кнопок.
    Нужно сделать примерно так:

    если нажата кнопка 1{
    задержка 10
    Если нажата кнопка 1 {
    действие кнопки
    }}
     
  3. grand

    grand Гик

    Нет, немного не то...
    Если бы дело было в дребезге, то они бы просто "пачками" выводились, а тут...
    Просто на некоторые нажимаешь - ничего не выводится, понажимаешь, может раз проскочит, а может и нет... а некоторые кнопки могут нормально выводится, а в след раз - нет...
    Странно(

    И чаще - верхняя и нижняя строка показываются все символы, а 2 средние - нет..
     
  4. Deniss

    Deniss Гик

    [​IMG]
    Вот так примерно нажимается любая кнопка. Ардуина думает что кнопка нажимается более 1 раза от этого то работает/то не работает, в общем как повезет. А резисторы подключал?
    Возможно далее в коде есть защита от вывода "пачками" поэтому пачек и нет))
     
    Arduiner001 нравится это.
  5. geher

    geher Гуру

    Вообще-то в библиотеке keypad уже встроен антидребезг.
    Возможно, проблема в существенной задержке между проверками состояния клавиатуры, когда программа выполняет какие-то другие действия.
    Насколько я понял, библиотека keypad не использует таймер или прерывания, а потому может пропустить нажатие кнопки в такой ситуации.
    Если оно так, то возможны варианты:
    1. Дробление длинных операций с целью вставки большего числа вызовов сканирования клавиатуры.
    2. Повесить таймер, чтобы достаточно часто опрашивал клавиатуру и сохранял события нажатия кнопок в буфере, который затем и проверять (но тогда в сложившейся ситуации могут быть задержки между нажатием кнопки и реакцией на нее).
    3. Если нет возможности как-то увеличить частоту сканирования клавиатуры (например, нет желания или возможности переделать чужую библиотеку для работы с какой-нибудь железкой, а таймеры уже заняты другими библиотеками), то можно сделать "контроллер клавиатуры" - отдельный МК, программа в котором занята только опросом клавиатуры. Можно добавить к обработке клавиатуры еще какие-нибудь функции, не создающие длительных задержек. Обмен между этим "контроллером клавиатуры" и основной ардуиной можно реализовать по UART (там есть буферизация).
    Естественно, в простых проектах это бессмысленное расточительство, и лучше решить вопрос при помощи вариантов 1 и 2.

    Также может просто быть где-то неустойчивый контакт в подключении клавиатуры.
     
  6. Tomasina

    Tomasina Сушитель лампочек Модератор

    или шлейф клавиатуры где-то надломлен.
     
    grand нравится это.
  7. balsoft

    balsoft Нерд

    А ты попробуй без библиотеки. Щас с компа зайду, скину код. Отключи все остальное и попробуй чисто с клавиатурой работать.
     
  8. balsoft

    balsoft Нерд

    код в этом виде не проверялся, я делал его под 4*4 клаву
    подключение-первые 4 пина клавы к пинам 2-5, остальные 3 к пинам 6-8(притяни их резами к земле)
    Код (Text):

    int startOut=2;//Начало пинов выхода
    int startIn=6;//начало пинов входа
    int x=3;//ширина клавы
    int y=4;//высота клавы
    char keypadchar(){

    char keys[ y ][ x ]={{'1','2','3'},
                                    {'4','5','6'},
                                    {'7','8','9'},
                                    {'*','0','#'}};//Клавиатура
    for (int i=startOut;i<startOut+y;i++){
      pinMode(i,OUTPUT);
      digitalWrite(i,HIGH);
      for (int j=startIn;j<startIn+x;j++){
        if(digitalRead(j)) {  digitalWrite(i,LOW);return keys[i-startOut-1][j-startIn-2];}//возвращаем символ
      }
      digitalWrite(i,LOW);
    }
    return;//Если ничего не нажато
    }
     
     
    grand нравится это.
  9. balsoft

    balsoft Нерд

    Еще раз перечитал тему попробуй для начала просто резами последние 3 котнакта к земле притянуть.