Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Экономия пинов Arduino: подключение 4×3 клавиатуры по трём аналоговым входам

Компоненты и материалы

Arduino UNO1 шт.
Матричная клавиатура 4×3 (12 клавиш)1 шт.
Резистор 330 Ом1 шт.
Резистор 1 кОм3 шт.
Резистор 3 кОм1 шт.

Инструменты

Приложения

О проекте

Введение

Обычная 4×3 матричная клавиатура требует 7 цифровых пинов (4 строки + 3 столбца). На Uno/Nano пинов мало. Предлагаемое решение — всего 3 аналоговых входа.

Принцип схемы

Каждый столбец — делитель напряжения с уникальными резисторами строк. При нажатии клавиши на аналоговый вход попадает характерное напряжение. Нижний резистор делителя (R5=R6=R7=1 кОм) общий для столбца, верхние (R1=0, R2=330 Ом, R3=1 кОм, R4=3 кОм) — по строкам. Получаем 4 чётко разделенных диапазона АЦП на каждом из 3 входов (A0, A1, A2).

Диапазоны АЦП (0–1023) для каждой строки (примерно):

Интервалы максимально широки, допускают резисторы ±5%. Для 4×4 клавиатуры добавляется 4-й аналоговый вход и резистор.

Подключение к Arduino

Три столбца клавиатуры → A0, A1, A2. Строки через резисторы R1–R4 к +5В. R1=0 реализовано перемычкой (проводом). Назначение пинов можно менять.

Работает и при 3.3В питании — АЦП референс от VCC, относительные значения не меняются.

Прототип

Собран из подержанных кнопок, 5-пиновый разъём для подключения к Arduino.

Код (Analog4x3Keybf.ino)

/* Analog 4x3 Keypad with 3 analog inputs
   G. Carrera - 19/11/2018 */
const int NADCm100[4] = {923, 669, 412, 156};
const int NADCp100[4] = {1123, 869, 612, 356};
const char key[13] = {'1','4','7','C','2','5','8','0','3','6','9','E'};
int keyval[3];
int i, colp, val;

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

void loop() {
  char k = KeyPad();
  if (k != 'N') {
    Serial.print("key = "); Serial.println(k);
    delay(500);
  }
}

char KeyPad() {
  KeyScan();
  if (keyval[0]+keyval[1]+keyval[2] < 40) return 'N';
  delay(10); // антидребезг
  KeyScan();
  for (i=0; i<3; i++) {
    if (keyval[i] > 40) {
      colp = i; val = keyval[i];
      for (int j=0; j<4; j++) {
        if (val >= NADCm100[j] && val <= NADCp100[j]) {
          return key[colp*4 + j];
        }
      }
    }
  }
  return 'N';
}

void KeyScan() {
  keyval[0] = analogRead(A0); delay(1);
  keyval[1] = analogRead(A1); delay(1);
  keyval[2] = analogRead(A2); delay(1);
}

Схемы

Схема делителей напряжения для 3 столбцов и 4 строк (см. фото в статье).

Производственный процесс

  1. Программирование анимаций на матрицах WS2812 8×8 и 16×16 через Arduino и Excel
  2. Умный датчик полива «Thirst Alert» на Arduino — DIY сигнализация засухи для растений
  3. Итальянские словесные часы на Arduino Nano, NeoPixel, LCD и RTC
  4. Надежный счетчик кВт·ч на Sigfox с Arduino MKR Fox 1200
  5. Bluetooth-монитор температуры на Arduino Nano с NTC-термистором
  6. Бесконтактный жестовый замок: APDS-9960 + Arduino для безопасного доступа
  7. Набор-компаньон для Arduino Nano — необходимые компоненты и инструменты для DIY-электроники
  8. Набор USB-MIDI адаптера для Arduino Micro / Leonardo — полный список деталей
  9. Гальванически разделённый аналоговый вход для Arduino на LM331 и оптопаре 4N25
  10. Точный тест времени реакции на Arduino UNO