Поговорим о клавиатурах. Часть 1. Кнопочная номерная клавиатура 3х4 (Обновлено)

05.08.2017 20:00

jazon



Поговорим о клавиатурах. Часть 1 - Кнопочная номерная клавиатура 3х4 (Обновлено). 


        Приветствую всех тех кто читает эту статью, в ней будет рассмотрена уже давно приобретённая кнопочная номерная клавиатура 3x4. Сразу скажу клавиатура очень понравилась как в плане качества исполнения(пайка, таблица уровней отпечатанная на обратной стороне платы) так и в качестве удобства(большие кнопки, возможность открыть кнопку и подложить под прозрачную поверхность обозначение кнопки что и было сделано в дальнейшем). Итак, начнем потихоньку.... Вот фото взятое от магазина производителя:


        

        На обратной стороне платы клавиатуры, расписана таблица уровней кнопок, что же, нужно проверить её на соответствие реальным величинам. Для начала приведу лишь то что там отпечатано:

  • Button 0 ≈ 510
  • Button 1 ≈ 1023
  • Button 2 ≈ 930
  • Button 3 ≈ 850
  • Button 4 ≈ 790
  • Button 5 ≈ 730
  • Button 6 ≈ 680
  • Button 7 ≈ 640
  • Button 8 ≈ 600
  • Button 9 ≈ 570
  • Button 10 ≈ 540
  • Button 11 ≈ 490 

Чтобы точно убедиться, что всё представленное в тексте соответствует действительности, приведём фото, где расписана эта таблица уровней, да и сам клавиатурный модуль, сразу просим извинить за качество фотографии. Кстати на фото видно что уже сделаны вставки для кнопочек с обозначением и цифрами:


 

        Вот теперь пришло время написать совсем небольшой скетч, для проверки таблицы на соответствие уровням кнопок. Небольшое уточнение, на обратной стороне также есть надпись "Out level for VCC ≈ 5V(0 - 1024)", что примерно переводится как "Выходные уровни даны для напряжения 5 вольт(от 0 до 1024)". А вот собственно и скетч:

/*
 * Keypad 3x4[OUT] -> Arduino Nano[A0]
 * Keypad 3x4[GND] -> Arduino Nano[GND]
 * Keypad 3x4[VCC] -> Arduino Nano[5V]
 */
 
void setup()
{
  Serial.begin(9600);
}

void loop() 
{
  Serial.println(analogRead(0));
}

        Без  труда заливаем этот скетч в Arduino Nano, предварительно соединив проводами нужные контакты. Что ж, монитор порта ещё никто не отменял, нажимая на кнопки, были сделаны наглядные скриншоты состояний уровней кнопок, чтобы сравнить их с таблицей уровней данной от производителя. И если сравнивать с реальной таблицей, заявленной на обратнй стороне модуля, здесь не обошлось без небольшого расхождения значений уровней. А вот и сами скриншоты, можно сравнить уровни в мониторе порта и заявленые в таблице:


          Из показаний монитора порта видно, что в точности соответствуют заявленным уровням 1-я и 10-я кнопка, 4-я и 11-я имеют заниженный уровень, остальные имеют незначительно завышенные уровни состояний. Вот тут то и кроется ложка дегтя, при использовании на различных платах(UNO, Nano, Mega и др.) эти уровни будут еще больше разниться с заявленными в таблице производителя, ведь питание на платах(как показывает практика) тоже разнится от экземпляра к экземпляру. На мной используемой плате Arduino Nano питание с ноги 5V замеренное тестером показало 4,75V. Если делать скетч с внесением в него заявленных уровней, могут возникнуть проблемы - к примеру при нажатии кнопки событие не будет обработано, потому что элементарно при сравнении уровней будет несовпадение реального и заявленного уровня. Данный тест проводился(как уже было сказано) на чистой плате Arduino Nano, в дальнейшем мы будем использовать вспомогательный силовой шилд для Arduino Nano(i/O Wireless Shield), чтобы напряжение на питающих контактах было стабильно равным 5 Вольт. 

        Как вариант - что бы безусловно считать кнопки клавиатуры, можно при использовании клавиатурного модуля, занизить заявленные уровни на 5 единиц в скетче, в общем то можно и больше, но на данном этапе изучения модуля хватит и этого. 


        Вот теперь пришло время написания хорошего, годного скетча, текст которого будет хорошо прокомментирован, и залит в плату Arduino Nano. Видео работы кнопочной клавиатуры тоже будет показано ниже, ну вот собственно и сам скетч:


/*
 * Keypad3x4[OUT] -> Arduino Nano[A0]
 * Keypad3x4[GND] -> Arduino Nano[GND]
 * Keypad3x4[VCC] -> Arduino Nano[5V]
 */
 
//Объявление целочисленной переменной button в которую будет сохраняться результат 
//работы функции обработчика нажатия кнопок getPressedButton()

int button;    

//Константные целочисленные значения кнопок возвращаемые функцией обработчиком getPressedButton()

const int BUTTON_0  = 0;
const int BUTTON_1  = 1;
const int BUTTON_2  = 2;
const int BUTTON_3  = 3;
const int BUTTON_4  = 4;
const int BUTTON_5  = 5;
const int BUTTON_6  = 6;
const int BUTTON_7  = 7;
const int BUTTON_8  = 8;
const int BUTTON_9  = 9;
const int BUTTON_10 = 10;
const int BUTTON_11 = 11;

//DEFAULT_BUTTON это значение будет возвращаться функцией обработчиком если ни одна из кнопок не будет нажата

const int DEFAULT_BUTTON = 15;

//Функция обработчик нажатых кнопок
//Как говорилось в обзоре будем занижать каждый заявленный уровень нажатой кнопки на 5 единиц

int getPressedButton()
{
  int buttonValue = analogRead(0);  // считываем значения с аналогового входа(A0) 
  
  if (buttonValue >= 1018)          // Заявленный уровень 1023 
  {                                 // И если считанный уровень больше, то 
    return BUTTON_1;                // Возвращаем нажатие кнопки 1
  }

  else if (buttonValue >= 925)      // Заявленный уровень 930
  {                                 // И если считанный уровень больше, то
    return BUTTON_2;                // Возвращаем нажатие кнопки 2
  }

  else if (buttonValue >= 845)      // Заявленный уровень 850
  {                                 // И если считанный уровень больше, то
    return BUTTON_3;                // Возвращаем нажатие кнопки 3
  }

  else if (buttonValue >= 785)      // Заявленный уровень 790
  {                                 // И если считанный уровень больше, то
    return BUTTON_4;                // Возвращаем нажатие кнопки 4
  }

  else if (buttonValue >= 725)      // Заявленный уровень 730
  {                                 // И если считанный уровень больше, то
    return BUTTON_5;                // Возвращаем нажатие кнопки 5
  }

  else if (buttonValue >= 675)      // Заявленный уровень 680
  {                                 // И если считанный уровень больше, то
    return BUTTON_6;                // Возвращаем нажатие кнопки 6
  }

  else if (buttonValue >= 635)      // Заявленный уровень 640
  {                                 // И если считанный уровень больше, то
    return BUTTON_7;                // Возвращаем нажатие кнопки 7
  }

  else if (buttonValue >= 595)      // Заявленный уровень 600
  {                                 // И если считанный уровень больше, то
    return BUTTON_8;                // Возвращаем нажатие кнопки 8
  }

  else if (buttonValue >= 565)      // Заявленный уровень 570
  {                                 // И если считанный уровень больше, то
    return BUTTON_9;                // Возвращаем нажатие кнопки 9
  }

  else if (buttonValue >= 535)      // Заявленный уровень 540
  {                                 // И если считанный уровень больше, то
    return BUTTON_10;               // Возвращаем нажатие кнопки 10
  }
  
  else if (buttonValue >= 505)      // Заявленный уровень 510
  {                                 // И если считанный уровень больше, то
    return BUTTON_0;                // Возвращаем нажатие кнопки 0
  }
   
  else if (buttonValue >= 485)      // Заявленный уровень 490
  {                                 // И если считанный уровень больше, то
    return BUTTON_11;               // Возвращаем нажатие кнопки 11
  }
  return DEFAULT_BUTTON;            //Если ни одна из кнопок не нажата, вернуть значение 15
}


void setup() 
{
  Serial.begin(9600);
}

void loop() 
{
  button = getPressedButton();
  switch (button)
  {
  case BUTTON_0: // при нажатии кнопки выводим следующий текст
    Serial.println("Button 0 pressed...");
    break;
  case BUTTON_1:
    Serial.println("Button 1 pressed...");
    break;
  case BUTTON_2:
    Serial.println("Button 2 pressed...");
    break;
  case BUTTON_3:
    Serial.println("Button 3 pressed...");
    break;
  case BUTTON_4:
    Serial.println("Button 4 pressed...");
    break;
  case BUTTON_5:
    Serial.println("Button 5 pressed...");
    break;
  case BUTTON_6:
    Serial.println("Button 6 pressed...");
    break;  
  case BUTTON_7:
    Serial.println("Button 7 pressed...");
    break;
  case BUTTON_8:
    Serial.println("Button 8 pressed...");
    break;
  case BUTTON_9:
    Serial.println("Button 9 pressed...");
    break;
  case BUTTON_10:
    Serial.println("Button 10 pressed...");
    break;
  case BUTTON_11:
    Serial.println("Button 11 pressed...");
    break;
  }
  
}


          Дальнейшее видео хорошо демонстрирует работу тестовых скетчей, только с одним условием: все данные выводятся не в монитор порта а на дисплей LCD1602 подключенный к плате Arduino Nano через I2C конвертор. В общем то - если у вас нет LCD дисплея, пробуйте скетчи с использованием монитора порта, для понимания работы клавиатурного модуля этого будет более чем достаточно. Но если всё же вам интересен более продвинутый ввод/вывод и обработка нажатий - то добро пожаловать, ссылки на тестовые скетчи с использованием LCD дисплея будут даны в конце статьи и в описании самого видео.

Итак, тестовые скетчи с использованием LCD дисплея:

А вот видео работы кнопочной клавиатуры, здесь уже вставлены свои надписи в крышки кнопок:



        Ну и напоследок, хотелось немного анонсировать следующие статьи по работе с данным клавиатурным модулем. По плану - следующая статья будет про то как подавить дребезг контактов кнопок клавиатурного модуля. И пусть многие не согласятся - очень широко распространено мнение, что у таких устройств не бывает такого свойства, но к сожалению дребезг контактов именно на таких кнопках есть априори. Итак, далее - рассмотрим обработчик дребезга контактов, и напишем небольшой примитивнейший калькулятор, и да, очень важно, каждая кнопка, вместо обычного сухого нажатия, будет подзвучена динамиком пъезопищалкой. Но это, уже материал следующей статьи...   



Расскажи о нас

Сообщение

Если у Вас есть опыт в работе с Arduino и собственно есть время для творчества, мы приглашаем всех желающих стать авторами статей публикуемых на нашем портале. Это могут быть как уроки, так и рассказы о ваших экспериментах с Arduino. Описание различных датчиков и модулей. Советы и наставления начинающим. Пишите и размещайте свои статьи в соответсвующей ветке форума.