Как мне подключить 5 кнопок к ардуино, чтобы я мог использовать наименьшее количество входов, все кнопки подключены к земле
Проблема здесь в том, что я хочу подключить 5 входных кнопок к Arduino, но я не хочу использовать 5 входных контактов Arduino, есть ли какое-либо матричное соединение, с помощью которого я могу уменьшить количество используемых входов. Условия здесь следующие:
Все кнопки будут подключены к земле и инициализированы с помощью:
pinMode(PIN_NUMBER, INPUT_PULLUP)
Требуется только цифровой вход, а не аналоговый
@Shakti Phartiyal, 👍-3
Обсуждение4 ответа
Лучший ответ:
Требуется только цифровой вход, а не аналоговый
Я бы подумал о том, чтобы переключатели выдавали разные напряжения в зависимости от того, какая кнопка была нажата, и подавали результирующий уровень аналогового сигнала на один из них (вход MOD): -
Конечно, ему не обязательно работать на частоте 1 МГц; RSET можно выбрать, чтобы он работал в свободном режиме, скажем, на частоте 1 кГц. Результирующий рабочий цикл (установленный переключателями) может быть прочитан под программным управлением через линию цифрового ввода.
так что это показывает, как считывать аналоговый уровень с цифровым выводом, и это принятый ответ. тогда чего-то не хватает в вопросе. это вопрос X->Y, и мы не знаем проблемы X и почему нельзя использовать аналоговый вывод, @Juraj
Если у всех переключателей один вход заземлен, вы не можете использовать матрицу.
В любом случае лучше всего использовать матрицу 2 * 3, в которой используется 5 сигналов, то же самое, что и индивидуальное переключение (хотя вы можете разделить стробоскопы с другими сигналами, например стробоскопами дисплея)
Если вам разрешено использовать аналоговый вход, вы можете подтянуть вход к высокому уровню с помощью одного резистора и позволить каждому переключателю подтягивать его к низкому уровню с другим сопротивлением. Затем каждый переключатель приводит к различному аналоговому напряжению, и вы можете расшифровать показания АЦП во входе переключателя. Таким образом, требуется только один вход.
Предполагая отсутствие заземления: вы можете полностью сделать это только с 2 контактами GPIO (с внутренними слабыми подтяжками), 5 переключателями, 2 диодами, 2 резисторами: по одному переключателю на каждый из контактов на резистор на землю (проверьте, проверив входное напряжение ) 2 переключателя между GPIO, отличающимися только направлением их последовательных диодов, и один без диода (проверьте, переведя другой контакт в режим вывода, низкое выходное напряжение и посмотрите, изменяет ли это «высокое» состояние»)., @Marcus Müller
Если вы не хотите использовать аналоговый вход, но не возражаете против добавления еще одного компонента, вы можете обойтись тремя цифровыми контактами, два из которых подключены к сдвиговому регистру (например, SN74HC164) и один общий возврат чтения со всех кнопок. Двоичный счетчик тоже можно использовать, но с довольно большой задержкой.
Если вы не против еще большего усложнения, вы можете использовать внешнюю логику для инициализации регистра, и в этом случае будет достаточно двух выводов — одного для вывода тактового сигнала, а другого для ввода обратной связи.
Вот простая схема, которую можно расширить для сканирования любого количества кнопок, объединив регистры в цепочку или выбрав микросхемы с большим количеством битов.
В отличие от ответов, расширяющих функцию «цифрового ввода» (как подразумевается OP) для включения ШИМ и последовательной связи, этот метод использует простейший цифровой ввод-вывод: один контакт циклически выбирает кнопку, другой считывает, нажата ли она или нет.
Один и тот же двухконтактный принцип (выход селектора + вход обратной связи) можно использовать во многих различных комбинациях. Например, вы можете подключить одну сторону каждого переключателя к земле, как вы упомянули в своем вопросе. Другие стороны возвращаются к Arduino через аналоговый мультиплексор (например, 74HC4051). Адрес мультиплексора выбирается двоичным счетчиком (например, 74HC193), и счетчик сбрасывается собственным выводом QD, когда достигает значения 0x08.
Если у вас есть только один цифровой контакт, вы можете использовать шину 1-wire. Например, DS2408 имеет 8 контактов GPIO с открытым стоком.
Если вы можете использовать аналоговый вход, то ответ Брайана правильный.
Некоторые простые корректировки номиналов резисторов создают равные шаги напряжения для аналого-цифрового преобразователя, как показано ниже.
Для случая с 4 переключателями это дает 5 В, если переключатель не нажат, и 0–3,75 В с примерно равными шагами, если переключатель нажат. Этот подход хорошо работает до 16 коммутаторов и выше.
Общий подход к расчету номиналов резисторов следующий:
- Выберите значение подтягивающего резистора; скажем, 10 кОм.
- Решите, сколько коммутаторов требуется: N = 16.
- Верхний переключатель генерирует 0 вольт, замыкая аналого-цифровой вход на землю.
Следующее переключение вниз будет генерировать Vcc / N вольт:
R = 10 тыс. × 1/(N-1) = 666,7 Ω
Выберите ближайшее стандартное значение 5 %: 680 Ом
Повторить для переключателей от i = 2 до N – 1:
Следующее переключение вниз будет генерировать Vcc × i / N вольт, но вы должны вычесть номиналы резисторов над ним. Это помогает избежать кумулятивных ошибок.
R = 10 000 × i/(N - i) - 680 &Омега; - ...
Выберите ближайшее стандартное значение 5%.
Для конкретного примера с 16 переключателями у вас должны получиться следующие номиналы резисторов: 680, 750, 910, 1000, 1200, 1500, 1800, 2200, 2700, 3900, 5600, 7500, 13 K, 27 K и 82 K. . Даже с резисторами 5 % все результирующие напряжения находятся в пределах 0,25 % полной шкалы от их номинальных значений.
- Rasberry Pi, управляющий Arduino - считывает "призрачный" вход - не завершает логический цикл
- Состояние ввода остается HIGH, когда функция, вызываемая с помощью ввода, также использует тот же ввод для вызова другой функции
- Невозможно сделать действительно основную работу скетча
- Как переключить светодиод при нажатии кнопки?
- Нажать клавишу Windows, используя «keyboard.press();»
- Чтение из Serial
- Устранение дребезга кнопки с помощью прерывания
- Хорошая кнопка debouncing/Библиотека StateChange
Посмотрите схемы практически любой клавиатуры (просто погуглите: "схема клавиатуры" и выберите вкладку "Изображения"). Кто-нибудь из них использует переключатели, заземленные с одной стороны? Есть «матричные» решения, но ваши «кнопки, подключенные к земле» выбрасывают все эти решения из окна. Решение с **одним контактом** возможно, если вы позволите использовать аналоговый вход и несколько резисторов., @Bimpelrekkie
@Andyaka да, только по одному, @Shakti Phartiyal
@Bimpelrekkie, что я имею в виду под «кнопками, подключенными к земле», заключается в том, что один из двух выводов кнопки (переключателя) будет подключен к общему заземлению. Я не знаю, делает ли этот комментарий проще или даже сложнее., @Shakti Phartiyal
@ShaktiPhartiyal это ничего не изменило.., @muyustan
@Andyaka, не могли бы вы уточнить / проиллюстрировать, как и что именно вы имеете в виду?, @Shakti Phartiyal
@ShaktiPhartiyal является ли то, что «один терминал всегда подключен к земле» фактическим ограничением, или вы добавили это ограничение, надеясь упростить решение? Поскольку без этого ограничения (и нескольких диодов) двух цифровых выводов ввода-вывода вполне достаточно, с этим ограничением вам потребуется аналоговый входной контакт, или обширная внешняя логическая схема, или один контакт для каждой кнопки., @Marcus Müller
@MarcusMüller Я добавил их, хорошо, что я снимаю это ограничение? Я все еще не хочу использовать аналоговый вход., @Shakti Phartiyal
@ShaktiPhartiyal, вы усложняете нам и себе жизнь, добавляя ограничения, такие как заземление и отсутствие аналогового входа. Вы получите больше предложений, если оставите все как можно более открытым, поэтому спросите: «Как определить, какая (из 5) кнопка нажата, используя как можно меньше контактов на моем микроконтроллере». Тогда вы можете получить некоторые предложения. Посмотрите на предложения и посмотрите, соответствует ли это вашим потребностям. Если у вас есть ограничения, объясните, **почему** они существуют, у вас должна быть **уважительная причина**. Например, «мне не нравятся аналоговые входы» не является веской причиной., @Bimpelrekkie
это школьное задание?, @jsotola
@Nick Чем этот вопрос об Arduino больше, чем EE? Это справедливо для любого MCU с ограниченным количеством доступных контактов., @Maple
пожалуйста, объясните, почему вы не хотите использовать аналоговый контакт и приняли решение, которое позволяет считывать аналоговое значение с помощью цифрового контакта., @Juraj
@Juraj Я не хочу использовать аналог из-за возможных помех и колебаний напряжения., @Shakti Phartiyal
И все же вы приняли ответ Андьяки, который требует от вас генерировать аналоговое напряжение для управления микросхемой ШИМ. Вас действительно беспокоит шум, или вы просто суеверны? Все, что связано с переключателями, в любом случае должно иметь дело с устранением дребезга (форма шума)., @Dave Tweed