Матричная клавиатура

Я пытаюсь запрограммировать механическую клавиатуру, работающую на 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();
            
}

Это схема, "грязный скетч".: schematic

, 👍0

Обсуждение

два сверху - это бессмысленно ... как они связаны?, @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


1 ответ


Лучший ответ:

1

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

Вместо этого вы должны принять эту схему (скопированную из "Справки по матрице клавиатуры" Дэйва Дрибина). Конечно, вы поставите катоды на выводы ваших колонок, а аноды-на ключи.

schematic

Таким образом, правильная схема использует каждую комбинацию диодов и клавиш параллельно, а не последовательно.

,