Как мне подключить 5 кнопок к ардуино, чтобы я мог использовать наименьшее количество входов, все кнопки подключены к земле

button input

Проблема здесь в том, что я хочу подключить 5 входных кнопок к Arduino, но я не хочу использовать 5 входных контактов Arduino, есть ли какое-либо матричное соединение, с помощью которого я могу уменьшить количество используемых входов. Условия здесь следующие:

  • Все кнопки будут подключены к земле и инициализированы с помощью:

    pinMode(PIN_NUMBER, INPUT_PULLUP)

  • Требуется только цифровой вход, а не аналоговый

, 👍-3

Обсуждение

Посмотрите схемы практически любой клавиатуры (просто погуглите: "схема клавиатуры" и выберите вкладку "Изображения"). Кто-нибудь из них использует переключатели, заземленные с одной стороны? Есть «матричные» решения, но ваши «кнопки, подключенные к земле» выбрасывают все эти решения из окна. Решение с **одним контактом** возможно, если вы позволите использовать аналоговый вход и несколько резисторов., @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


4 ответа


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

2

Требуется только цифровой вход, а не аналоговый

Я бы подумал о том, чтобы переключатели выдавали разные напряжения в зависимости от того, какая кнопка была нажата, и подавали результирующий уровень аналогового сигнала на один из них (вход MOD): -

Конечно, ему не обязательно работать на частоте 1 МГц; RSET можно выбрать, чтобы он работал в свободном режиме, скажем, на частоте 1 кГц. Результирующий рабочий цикл (установленный переключателями) может быть прочитан под программным управлением через линию цифрового ввода.

,

так что это показывает, как считывать аналоговый уровень с цифровым выводом, и это принятый ответ. тогда чего-то не хватает в вопросе. это вопрос X->Y, и мы не знаем проблемы X и почему нельзя использовать аналоговый вывод, @Juraj


5

Если у всех переключателей один вход заземлен, вы не можете использовать матрицу.

В любом случае лучше всего использовать матрицу 2 * 3, в которой используется 5 сигналов, то же самое, что и индивидуальное переключение (хотя вы можете разделить стробоскопы с другими сигналами, например стробоскопами дисплея)

Если вам разрешено использовать аналоговый вход, вы можете подтянуть вход к высокому уровню с помощью одного резистора и позволить каждому переключателю подтягивать его к низкому уровню с другим сопротивлением. Затем каждый переключатель приводит к различному аналоговому напряжению, и вы можете расшифровать показания АЦП во входе переключателя. Таким образом, требуется только один вход.

,

Предполагая отсутствие заземления: вы можете полностью сделать это только с 2 контактами GPIO (с внутренними слабыми подтяжками), 5 переключателями, 2 диодами, 2 резисторами: по одному переключателю на каждый из контактов на резистор на землю (проверьте, проверив входное напряжение ) 2 переключателя между GPIO, отличающимися только направлением их последовательных диодов, и один без диода (проверьте, переведя другой контакт в режим вывода, низкое выходное напряжение и посмотрите, изменяет ли это «высокое» состояние»)., @Marcus Müller


2

Если вы не хотите использовать аналоговый вход, но не возражаете против добавления еще одного компонента, вы можете обойтись тремя цифровыми контактами, два из которых подключены к сдвиговому регистру (например, SN74HC164) и один общий возврат чтения со всех кнопок. Двоичный счетчик тоже можно использовать, но с довольно большой задержкой.

Если вы не против еще большего усложнения, вы можете использовать внешнюю логику для инициализации регистра, и в этом случае будет достаточно двух выводов — одного для вывода тактового сигнала, а другого для ввода обратной связи.

Вот простая схема, которую можно расширить для сканирования любого количества кнопок, объединив регистры в цепочку или выбрав микросхемы с большим количеством битов.

В отличие от ответов, расширяющих функцию «цифрового ввода» (как подразумевается OP) для включения ШИМ и последовательной связи, этот метод использует простейший цифровой ввод-вывод: один контакт циклически выбирает кнопку, другой считывает, нажата ли она или нет.

Один и тот же двухконтактный принцип (выход селектора + вход обратной связи) можно использовать во многих различных комбинациях. Например, вы можете подключить одну сторону каждого переключателя к земле, как вы упомянули в своем вопросе. Другие стороны возвращаются к Arduino через аналоговый мультиплексор (например, 74HC4051). Адрес мультиплексора выбирается двоичным счетчиком (например, 74HC193), и счетчик сбрасывается собственным выводом QD, когда достигает значения 0x08.

,

2

Если у вас есть только один цифровой контакт, вы можете использовать шину 1-wire. Например, DS2408 имеет 8 контактов GPIO с открытым стоком.


Если вы можете использовать аналоговый вход, то ответ Брайана правильный.

Некоторые простые корректировки номиналов резисторов создают равные шаги напряжения для аналого-цифрового преобразователя, как показано ниже.

schematic

Для случая с 4 переключателями это дает 5 В, если переключатель не нажат, и 0–3,75 В с примерно равными шагами, если переключатель нажат. Этот подход хорошо работает до 16 коммутаторов и выше.

Общий подход к расчету номиналов резисторов следующий:

  1. Выберите значение подтягивающего резистора; скажем, 10 кОм.
  2. Решите, сколько коммутаторов требуется: N = 16.
  3. Верхний переключатель генерирует 0 вольт, замыкая аналого-цифровой вход на землю.
  4. Следующее переключение вниз будет генерировать Vcc / N вольт:

    R = 10 тыс. × 1/(N-1) = 666,7 Ω

  5. Выберите ближайшее стандартное значение 5 %: 680 Ом

  6. Повторить для переключателей от 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 % полной шкалы от их номинальных значений.

,