Экономия пинов Arduino: подключение 4×3 клавиатуры по трём аналоговым входам
Компоненты и материалы
| Arduino UNO | 1 шт. |
| Матричная клавиатура 4×3 (12 клавиш) | 1 шт. |
| Резистор 330 Ом | 1 шт. |
| Резистор 1 кОм | 3 шт. |
| Резистор 3 кОм | 1 шт. |
Инструменты
- Паяльник
Приложения
- Arduino IDE
О проекте
Введение
Обычная 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) для каждой строки (примерно):
- Строка 1 (R1=0): ~1023 (5В)
- Строка 2 (330 Ом): ~669–869
- Строка 3 (1 кОм): ~412–612
- Строка 4 (3 кОм): ~156–356
- Нет нажатия: ~0
Интервалы максимально широки, допускают резисторы ±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 строк (см. фото в статье).
Производственный процесс
- Программирование анимаций на матрицах WS2812 8×8 и 16×16 через Arduino и Excel
- Умный датчик полива «Thirst Alert» на Arduino — DIY сигнализация засухи для растений
- Итальянские словесные часы на Arduino Nano, NeoPixel, LCD и RTC
- Надежный счетчик кВт·ч на Sigfox с Arduino MKR Fox 1200
- Bluetooth-монитор температуры на Arduino Nano с NTC-термистором
- Бесконтактный жестовый замок: APDS-9960 + Arduino для безопасного доступа
- Набор-компаньон для Arduino Nano — необходимые компоненты и инструменты для DIY-электроники
- Набор USB-MIDI адаптера для Arduino Micro / Leonardo — полный список деталей
- Гальванически разделённый аналоговый вход для Arduino на LM331 и оптопаре 4N25
- Точный тест времени реакции на Arduino UNO