Матричная клавиатура
Я пытаюсь запрограммировать механическую клавиатуру, работающую на Arduino Pro Micro (5V/16MHz). Я использую матричный подход (4x12), и хотя я считаю, что код и проводка (оба из которых я проверял несколько раз) верны, я не могу заставить первые две строки работать, несмотря ни на что. Я пробовал подключать его к другим контактам, и это работает, но только для двух рядов за раз, когда я подключаю все 4 ряда, два сверху не работают. Код:
/*cols and rows*/
byte rows[] = {2,3,4,5};
const int row_Count = 4;
byte cols[] = {6,7,8,9,10,14,15,16,18,19,20,21};
const int col_Count = 12;
byte keyboard[col_Count][row_Count];
void read_layout() {
/*do the columns*/
for (int col_Index=0; col_Index < col_Count; col_Index++) {
/*setup for registering the column state*/
byte cur_Col = cols[col_Index];
pinMode(cur_Col, OUTPUT);
digitalWrite(cur_Col, LOW);
/*do the rows*/
for (int row_Index=0; row_Index < row_Count; row_Index++) {
byte row_Col = rows[row_Index];
pinMode(row_Col, INPUT_PULLUP);
keyboard[col_Index][row_Index] = digitalRead(row_Col);
pinMode(row_Col, INPUT);
}
/*disable the column*/
pinMode(cur_Col, INPUT);
}
}
void print_layout() {
for (int row_Index=0; row_Index < row_Count; row_Index++) {
Serial.print(row_Index);
Serial.print(F(": "));
for (int col_Index=0; col_Index < col_Count; col_Index++) {
Serial.print(keyboard[col_Index][row_Index]);
if (col_Index < col_Count) Serial.print(F(", "));
}
Serial.println("");
}
Serial.println("");
}
void setup() {
Serial.begin(115200);
delay(2000);
/*init the rows*/
for(int i=0; i<row_Count; i++) {
pinMode(rows[i], INPUT);
}
/*init the cols*/
for (int i=0; i<col_Count; i++) {
pinMode(cols[i], INPUT_PULLUP);
}
}
void loop() {
read_layout();
print_layout();
}
Это схема, "грязный скетч".:
@sesonab, 👍0
Обсуждение1 ответ
Лучший ответ:
Вы используете диоды последовательно, что приводит к накоплению прямых напряжений в нижних рядах вашей схемы. Из-за этого накопления порог "low" не будет пересечен, и входной вывод не сможет распознать нажатую клавишу.
Вместо этого вы должны принять эту схему (скопированную из "Справки по матрице клавиатуры" Дэйва Дрибина). Конечно, вы поставите катоды на выводы ваших колонок, а аноды-на ключи.
Таким образом, правильная схема использует каждую комбинацию диодов и клавиш параллельно, а не последовательно.
- Отправка мультимедийных клавиш клавиатуры с помощью библиотеки клавиатур
- Своеобразное поведение arduino pro micro
- Arduino nano как клавиатура HID
- Arduino Pro Micro, получить данные с контакта Tx?
- Keyboard.h не найден
- Нажать клавишу Windows, используя «keyboard.press();»
- Распиновка аналога Arduino Pro Micro
- Не удается загрузить скетч - avrdude: butterfly_recv(): programmer is not responding
два сверху
- это бессмысленно ... как они связаны?, @jsotolaвы проверили, доступна ли библиотека матричных клавиатур?, @jsotola
Вы "вращали" строки, чтобы увидеть, вызывают ли проблему контакты порта или матрица? Вы пробовали использовать меньшее количество строк и увеличивать его одну за другой? Почему вы меняете режимы вывода строк, они всегда могут быть
INPUT_PULLUP
? -- Несвязанный: условие вprint_layout () ' не препятствует печати последней запятой.
col_Index "там всегда ниже, чем "col_Count". -- Несвязанный: Вы можете автоматизировать вычисление размеров, напримерconst int col_Count = sizeof cols / sizeof cols[0];
., @the busybee@jsotola Я сделал [грязный скетч](https://archive.is/aOstH/91e28281c0bde7117145dfd7ffe3f5778a0801dd.png), "два сверху" относится к R1 и R2, и я не использую библиотеку клавиатуры, потому что считаю ее ненужной и, по-видимому, несколько нажатий клавиш одновременно не регистрируются., @sesonab
@thebusybee Я пробовал переключать контакты строк, в частности, не было проблем с "первыми двумя строками", проблема началась только тогда, когда я подключил к ней более 2 строк, тогда работали бы только "последние две". Идея с INPUT_PULLUP состояла в том, чтобы периодически проверять, когда я хочу, а затем переключаться на ВВОД, я не уверен, что это имеет смысл, потому что я впервые использую этот PIN-режим. Спасибо за другие советы, я их уже реализовал., @sesonab
Пожалуйста, добавьте скетч в свой вопрос, чтобы он не потерялся со временем. -- У вас действительно есть все эти диоды последовательно, например 4 для самого верхнего ряда на схеме? Их прямые напряжения складываются, и тогда вход может не распознать "НИЗКИЙ УРОВЕНЬ". Пожалуйста, проведите эксперимент со статическим уровнем на одном столбце и измерьте напряжение на выводе строк., @the busybee
@thebusybee Не уверен, что вы подразумеваете под "добавить скетч", он уже есть в ОП, следует заархивировать его и опубликовать ссылку здесь или что? В любом случае, ты прав. Я попробовал закоротить одну из колонок, и это сработало! Но я хочу иметь диоды, чтобы предотвратить появление призраков, как бы вы это сделали? Соедините диоды последовательно, но по строкам, а не по столбцам?, @sesonab
Оставлять ссылку на внешний ресурс в комментарии-это совсем не "в ОП". ;-) Я воспользовался предоставленной процедурой и добавил ее к вашему вопросу; ну, во-первых, она нуждается в одобрении из-за моей низкой репутации., @the busybee
@thebusybee, Ах, прошу прощения, я думал, вы имеете в виду скетч Arduino (code)., @sesonab
Извинения приняты. :-D Ну, это была ваша формулировка по ссылке на схему. ;-), @the busybee