Arduino как Мультиплексор
Это своего рода эксперимент, у меня просто есть вопрос о том, как работают порты Arduino. Рассмотрим этот пример: есть целевое устройство, которым я пытаюсь управлять с помощью Arduino. Устройство использует типичную сканированную клавиатуру (8 выходных столбцов и 5 входных строк, которые вступают в контакт всякий раз, когда пользователь нажимает клавишу). Я пытаюсь эмулировать эту клавиатуру с помощью Arduino. Конечно, стандартным способом сделать это было бы прочитать 8 столбцов и произвести соответствующий вывод по 5 строкам. Однако Arduino недостаточно быстр, чтобы заставить его работать. Итак, я иду с идеей мультиплексора. 8 цифровых выводов Arduino подключены к столбцам, а 5 цифровых выводов Arduino - к строкам. Рельс GND НЕ подключен.
Итак, идея такова. По умолчанию все контакты Arduino настроены на ВВОД в подпрограмме init (). Всякий раз, когда мне нужно эмулировать нажатие клавиши, я просто устанавливаю соответствующий вывод строки в положение OUTPUT и LOW, то же самое для вывода столбца. Таким образом, это должно работать как своего рода мультиплексор, так как контакты Arduino управляются МОП-транзисторами, а входное состояние имеет высокий импеданс, и во время выходного состояния оба контакта будут привязаны к GND Arduino, который устанавливает жесткое соединение между ними (установка HIGH должна работать, нет никакой разницы).
Вот тестовый код, который должен нажимать клавишу каждые 5 секунд:
pinMode(ROW0_PIN,OUTPUT);
digitalWrite(ROW0_PIN,LOW);
pinMode(COLUMN0_PIN,OUTPUT);
digitalWrite(COLUMN0_PIN,LOW);
Sleep(5000);
pinMode(ROW0_PIN,INPUT);
pinMode(COLUMN0_PIN,INPUT);
Sleep(5000);
Теперь эта штука работает. Однако он работает только в том случае, если подключен один вывод столбца. Когда я подключаю любые два контакта, целевое устройство перестает отвечать. Что я обнаружил, так это то, что на самом деле, когда я это делаю
pinMode(COLUMN0_PIN,OUTPUT);digitalWrite(COLUMN0_PIN,LOW);
,
соседние контакты каким-то образом тоже активируются, что приводит к тому, что все выходы столбцов соединяются вместе и посылают сигнал на входы строк.
Если все контакты настроены на ВХОД, он работает нормально, то есть нет связи между строками и столбцами.
Мой вопрос таков: почему это происходит? Позвольте мне перефразировать его: каким-то образом установка цифрового вывода на выход приводит к тому, что другие цифровые выводы теряют свое состояние высокого импеданса, хотя все они настроены на вход. Я не проверял, происходит ли это в аппаратном порту или нет, просто рассмотрите схемы, пожалуйста.
@Jimmy Falcon, 👍-1
Обсуждение1 ответ
Лучший ответ:
У меня нет уверенности в том, что происходит, но я подозреваю, что вы видите эффекты входных зажимных диодов. Каждый цифровой вывод имеет зажимные диоды, которые удерживают его потенциал между GND и Vcc, ±порог диода .
Пока все контакты настроены на
ВХОД
, они могут свободно плавать относительно друг друга, при условии, что разность потенциалов остается в пределах Vcc+2×diode_threshold.Когда вы устанавливаете один штифт на
ВЫХОД
LOW
, вы привязываетесь к GND. Другие штифты все еще могут плавать над этим, но только очень слабо под ним. Зажимные диоды обеспечивают однонаправленные пути тока от этого штифта (который теперь является GND) к любому другому штифту.
Да, должно быть, так оно и есть. Есть идеи, как это обойти, пожалуйста? Может быть, добавить внешние диоды для создания смещения напряжения?, @Jimmy Falcon
@JimmyFalcon: Извините, но понятия не имею. Подключение узлов к GND плавающей микросхемы-очень нетрадиционный способ достижения электрического контакта., @Edgar Bonet
- Установка pinmode() в заголовочном файле
- Доступ к физическим контактам Arduino Due из Arduino IDE
- Использовать один и тот же пин для двух целей
- Возможно ли, чтобы цифровой контактный режим Arduino переключился с ВЫХОДА на ВХОД?
- Безопасно ли припаивать скользящий переключатель к неиспользуемым выводам GPIO?
- Может ли режим pin повредить Arduino с подключенной электроникой?
- Скетч останавливается, если кнопка нажата при загрузке
непонятно, что вы пытаетесь сделать ... эмуляция клавиатуры не предполагает использования матрицы ... вы пытаетесь программно "нажимать клавиши" на реальной клавиатуре?, @jsotola
Существует старинное устройство, которое использует типичную схему матрицы клавиатуры. Я пытаюсь эмулировать нажатия клавиш на этой клавиатуре с помощью Arduino. Обычно вы делаете это, следуя выходам и производя данные о входных данных. Но Arduino в этом случае слишком медленный, и этот подход не работает. Итак, я ищу простой способ сделать это. Конечно, я могу использовать дополнительные мультиплексоры, но смысл в том, чтобы сохранить его "только для Arduino"., @Jimmy Falcon
Arduino, вероятно, достаточно быстр - вам просто нужно быть более умным в своем программировании., @Majenko
устройство активирует только одну из строк столбца за один раз ... он считывает состояние строк строк, чтобы определить, нажата ли какая-либо из клавиш в выбранном столбце .... ваш код должен определить, какая из строк столбца считывается, и он должен активировать только одну из строк строк в течение времени обращения к столбцу, @jsotola
Я не ищу советов или объяснений о том, как работает матрица клавиатуры или как ее запрограммировать, это учебник просто. Я пытаюсь реализовать мультиплексор с поперечной матрицей с помощью Arduino. Матрица клавиатуры была просто примером, иллюстрирующим идею, забудьте матрицу клавиатуры. :) Фактический вопрос заключается в поведении pinMode() и в том, почему изменение состояния вывода каким-то образом влияет на другие контакты., @Jimmy Falcon
Сложность заключается во внутренней схеме АВР, я не думаю, что ваша идея сработает. Так что это скорее [X-Y-проблема](https://en.wikipedia.org/wiki/XY_problem).-- Не могли бы вы отредактировать свой вопрос и добавить некоторую информацию о времени, пожалуйста? Измеряли ли вы время, когда устройство активирует свои сканирующие выходы? Схема полного цикла была бы оптимальной. А вы измеряли время, необходимое вашей программе? Подсказка: стандартная функция вывода библиотеки Arduino работает довольно медленно из-за "универсальных" номеров выводов., @the busybee
Спасибо за уточнение, на самом деле я говорю о клавиатуре ZX Spectrum, выходы-это адресные строки процессора Z80. Многие люди уже пытались сделать это программно, Atmega 328 недостаточно быстра. Он *будет* работать, если Xtal заменен на 24 МГц, также используя прерывание для чтения строки IORQ (которая активна именно тогда, когда процессор считывает ключевую плату). То, что я пытаюсь сделать здесь, - это достичь всего этого с помощью голого Arduino. Просто пытаюсь найти новые, более простые способы. По-видимому, лучший способ сделать это-использовать кучу CD4051BE., @Jimmy Falcon
Как быстро будет достаточно быстро? Что вы подразумеваете под "соседние контакты каким-то образом тоже активируются", Может быть, им нужны небольшие физические подтягивающие резисторы? Вы можете ускорить процесс, записывая данные в строку параллельно с помощью PORTC/DDRC/PINC и параллельно читая с помощью PIND & PINB. Изменение pinMode на A0-A4 для ВЫВОДА или нет-это просто возня с битами в DDRC и PORTC-см. https://arduinoprosto.ru/q/81338/6628 и https://arduinoprosto.ru/q/22985/6628, @Dave X