*duino и клавиатура 4х4. Расширяем возможности…


В дружных рядах *duin-щиков я совсем недавно посему прошу сильно не пинать. 🙂

Приобрел на ебее кит для duino куда входила матричная клавиатура 4х4. (см. фото).

Подключил, написал простенькую программку. Все исправно работало. Пока однажды 16 кодов выдаваемых клавой не оказалось мало. Вот тут и вспомнилось про модификаторы типа Alt,Ctrl, Shift.
Решил допилить свой кусок кода. В результате получилась своеобразная «Мультитач» — клавиатура, которая различает нажатие двух и более клавиш одновременно. Конечно не все возможные комбинации обрабатываются однозначно, но одновременное нажатие клавиш расположенных в разных строках и столбцах обрабатываются. Я не профессионал в программировании поэтому может это и коряво, но работает!
Кстати, Дуинка у меня Мега2560, поэтому ног для подключения не так жалко.

Код:

/* Написано 04.2012 Григорием aka SkyFort в содружестве с бутылочкой
пивасика.... :)
Любые улучшения и исправления только приветствуются! */

#define _BV(x) (1<<(x)) //Макрос побитового сдвига для удобства

// Определяем ноги Дуинки
int send_Pin[4] = {38,39,40,41}; //Передача
int recv_Pin[4] = {42,43,44,45}; //Прием


void keyboard_init() // Инициализируем... и так понятно
{
  int i;
  for (i = 0; i < 4; i++){
     pinMode(send_Pin[i], OUTPUT);
     pinMode(recv_Pin[i], INPUT);
   }

}

int scanmatrix() // Сканируем матрицу
{
  int i;
  int j;
  int code = 0;
  boolean key;
  for (i = 0; i < 4; i++)
{
  digitalWrite(send_Pin[i], HIGH);
  j = 0;
    for (j = 0; j < 4; j++)
     {
       if(digitalRead(recv_Pin[j]))
       {
         code=code | _BV(j);
         key = true;
       }
     }
if(key)
  {
    code=code | _BV(i+4);
  }
 digitalWrite(send_Pin[i],LOW);
 key = false;
}
return code;
}

int keyboard(int time) // time - противодребезговая задержка
{
int key = scanmatrix();
delay(time);
int key2 = scanmatrix();
// Преобразуем сканкоды кнопок в ASCII
if(key2 == key) {
  switch (key) {
    case 17: return 0x31; break;
    case 18: return 0x32; break;
    case 20: return 0x33; break;
    case 33: return 0x34; break;
    case 34: return 0x35; break;
    case 36: return 0x36; break;
    case 65: return 0x37; break;
    case 66: return 0x38; break;
    case 68: return 0x39; break;
    case 24: return 0x41; break;
    case 40: return 0x42; break;
    case 72: return 0x43; break;
    case 130: return 0x30; break;
    case 136: return 0x44; break;
    case 129: return 0x2a; break;
    case 132: return 0x23; break;
    default: return key; // Модифицированные коды отдаем как есть.
  }
}
return 0; // Ничего не нажато - вернем 0
}

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

void loop(){
  char code;
  boolean flash;
  code = keyboard(150);
  if(code != 0) {Serial.println(code);
}
}

Ну вот как-то так!


Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Android Arduino Bluetooth CraftDuino DIY IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение