Более одной кнопки в одном выводе

12

Я делаю какой-то проект, и я использую Arduino для создания прототипа, мне нужно использовать 10 кнопок (вместе с другими вещами), и мне не хватает контактов.

Одно из решений, которое я мог бы придумать, - это использовать аналоговые контакты и использовать каждый из них для двух кнопок, примерно так:

схематический

смоделировать эту схему - схема, созданная с использованием CircuitLab

Таким образом, я могу прочитать вывод A0 и узнать, какой из них нажимается, посмотрев, составляет ли напряжение 5 В или половину этого.

Это хорошая идея? Различные кнопки НИКОГДА не должны нажиматься одновременно, и это единственная проблема, о которой я могу подумать.

Есть ли лучшие способы?

MyUserIsThis
источник
Сколько булавок вы пытаетесь использовать?
W5VO
@ W5VO Мне бы понадобилось 22, с 10 кнопками, на плате всего 18 ... поэтому две кнопки для каждого аналогового контакта, мне нужно всего 5 аналоговых контактов, а на плате их 6.
MyUserIsThis
1
Просто к сведению, многие производители автомобилей используют тот же подход для управления аудиосистемой на рулевом колесе. Они имеют (дают или беру) 8 кнопок, каждая со своим собственным резистором. Это позволяет им проложить один провод (или пару проводов, чтобы гарантировать чистый возврат) от колеса к аудиоголовке. Это совершенно хороший подход.
DoxyLover
Я полагаю, что вы можете использовать три контакта для теоретического ввода бесконечного числа переключателей с использованием некоторых регистров сдвига. Также можно использовать 8 контактов для ввода 256 переключателей с использованием мультиплексоров.
Элвин Вонг

Ответы:

22

Зачем тратить несколько аналоговых выводов на два переключателя каждый, когда вы можете использовать любое количество кнопок на одном аналоговом выводе?

Два способа сделать это. Один в серии, другой параллельно.

введите описание изображения здесь

введите описание изображения здесь

Вот как работает управление аудиосистемой на руле автомобиля. И как работают некоторые из старых встроенных контроллеров ipod.

В зависимости от используемых резисторов, если вам нужно одновременно нажимать несколько кнопок и насколько чувствителен ваш аналоговый вход, вы можете иметь все 10 кнопок на одном выводе.

проезжий
источник
Спасибо, я тоже думал об этом, но также думал, что, возможно, показания напряжения были не настолько точными, как мне нужно, чтобы иметь возможность полагаться на этот метод. Я тоже попробую и посмотрю, как это работает.
MyUserIsThis
Так как мои основы анализа резисторной сети не совсем надежны, я попытался использовать CircuitLab для моделирования последовательной цепи и вывести таблицу истинности для измерения напряжения на выводе аналогового входа. Я обнаружил, что комбинации B2 + B3 дают 2,499 В, а комбинации B1 + B4 - 2,498 В. С такими близкими цифрами, я думаю, что типичный 10-разрядный АЦП не сможет правильно дифференцировать комбинации с несколькими входами. Что ты говоришь ? Конечно, один ключ за раз, будет работать отлично - без сомнения. Примечание B1 = Button1.
icarus74
На самом деле, B2 + B4 дает 1,666 В, в то время как B2 + B3 + B4 также дает 1,666 В! Решением может быть использование разных значений резисторов для R1, R2, R3, R4 и не сохранять все их значения 1К. Что сказать ?
icarus74
7
Лестница 2R / R превращает кнопки в Ц / А, и каждое сочетание нажатий кнопок будет иметь уникальное значение. Я бы доверял его работе с кнопками N-3, где N - это разрешение АЦП
Скотт Сейдман
1
@ icarus74 да, использование разных значений вместо всех 1k даст уникальные комбинации. Попробуйте 1к, 2к, 4к, 8к, 16к и т. Д. (Или 1к, 4к, 16к и т. Д. Для более широкого диапазона)
прохожий
10

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

введите описание изображения здесь

Это матрица 2х2. Полезная матрица больше, потому что при таком размере вы не экономите никакие контакты при индивидуальном подключении переключателей.

С матрицей 3х3 вы можете получить 9 переключателей. Вам нужно 10, так что вы можете добавить еще одну строку или еще один столбец и поддерживать 12 переключателей, или просто поставить 10-й переключатель на свой собственный вывод.

Преимущество здесь состоит в том, что вы можете использовать цифровой ввод-вывод, который дешевле и обычно более многочислен, чем аналоговый ввод-вывод. Регистр сдвига является дешевым способом , чтобы добавить больше цифровой ввод - вывод, если вы бежите.

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

Фил Фрост
источник
Просто вопрос. Почему это лучше, если мне понадобится больше булавок? Таким образом, мне понадобится 6 выводов для матрицы 9x9 плюс еще один вывод для десятого, в то время как в том, что я сделал, мне понадобится всего 5 выводов.
MyUserIsThis
@MyUserIsЭто масштабируется лучше по мере увеличения общего количества переключателей. Например, матрица 5x5 позволяет подключить 25 переключателей к 10 контактам. В качестве более общего комментария, общение обычным способом облегчает кому-то еще понимание того, что вы сделали; и для вас, чтобы узнать, что делают цепи других людей (потому что вы обучили себя стандартной реализации).
Дэн возится от Firelight
@MyUserIsЭто см. Правки. У прохожего тоже хороший ответ.
Фил Фрост
2

Аналоговый вход является правильным подходом, вы должны иметь несколько кнопок. Я также хотел бы предложить использовать IO Expander, например, MCP23017 . Он имеет 16 контактов, которые могут быть входами и выходами и управляется с помощью I2C с помощью двух контактов. У Adafruit есть библиотека Arduino для этого.

BrianK
источник
2

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

Если у вас есть доступ к логическим элементам, вы можете отобразить множество nкнопок на ceil(log2(n + 1))контакты с помощью логической логики. Например, если у вас есть 4 кнопки, но только 2 контакта, вы можете создать такую ​​конфигурацию:

Buttons | Pins
----    | --
0123    | 01
----    | --
0001    | 00
0010    | 01
0100    | 10
1000    | 11

То есть, button0нажатие должно иметь pin0и pin1низкий; button1, pin0Низкой и pin1высокой; button2, pin0Высокая pin1низка; и button3, pin0и pin1высоко.

Отсюда вытекают следующие логические выражения

pin0 = button2 OR button3
pin1 = button1 OR button3

Таким образом, отображение 4 кнопок на 2 контакта может быть реализовано только с двумя вентилями ИЛИ. Тем не менее, вам понадобится дополнительный вывод и некоторая дополнительная логика для указания, нажимается ли какая-либо кнопка вообще.

Конечно, все равно будут проблемы, если одновременно нажимать несколько кнопок.

Кроме того, если вы все еще будете придерживаться подхода с использованием резисторов, рассмотрите возможность использования на резисторах больших значений, кроме 100 Ом, так как 5 В через резисторы порядка 100 сОм дадут ток порядка 10 с мА, что является своего рода излишне высокого. Я предполагаю, что более разумные значения были бы 10 кОм или 47 кОм.

nijoakim
источник
Спасибо за ваш подход. Я тоже думал о чем-то подобном, но у меня нет логических элементов и у меня есть тонны резисторов. И да, я обычно использую для этого резисторы 10 кОм, значение 100 Ом было значением по умолчанию для редактора схем. Еще раз спасибо за вашу помощь.
MyUserIsThis
Я думаю, что в конечном итоге я буду использовать резисторный подход, поскольку мне не придется покупать логические вентили, плюс ваш логический подход экономит мне только 1 контакт, и мне это не нужно. Я буду иметь это в виду, хотя для больших проектов. Большое спасибо.
MyUserIsThis
Ладно! Удачи тебе с твоим проектом!
nijoakim
0

Следующая страница может быть полезна:

http://txapuzas.blogspot.co.uk/2010/07/papertecladoanalogico-varios-pulsadores.html

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

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

Youtube видео: 10 клавиш клавиатуры на одном контакте

Вот схема с сайта выше:

введите описание изображения здесь

введите описание изображения здесь

JohnnyDeauville
источник
2
Пожалуйста, добавьте краткое изложение того, что содержит ссылка, на случай, если она когда-нибудь умрет, особенно если она на испанском языке, а это сайт на английском языке.
PeterJ
Извините, может быть нормальная ситуация, когда в Испании нормально ссылаться на английскую публикацию ... Но ссылка, которая очень интересна, говорит о том, как построить 10-клавишную клавиатуру, используя только один контакт с описанием фотографии, шаг за шагом, диаграммы сделать доску и изображение сделать крышку кнопок. Также код для управления клавиатурой, легко понять. Ницца разработала, я думаю.
JohnnyDeauville
Это не только испанская сторона вещей, я согласен, что диаграмма ясна, выглядит хорошо, и я могу понять, о чем она, просто основываясь на этом. Но Stack Exchange не рекомендует ссылки только на ответы, потому что они бесполезны, если ссылка умирает, представьте, если этот блог будет закрыт / удален завтра, насколько полезным будет ответ. Может быть, вы могли бы включить схему и предложение или два об этом и просто оставить ссылку в качестве ссылки для получения дополнительной информации.
PeterJ
Я новичок в этом форуме, как я могу сделать, что вы говорите мне? Какой-то раздел в спец ...? Спасибо за ваше время
JohnnyDeauville
Я только что включил схему и ссылку, откуда она взялась, но, возможно, также стоит перевести немного больше страницы, чтобы дать некоторый контекст, как она работает и какими будут показания АЦП.
PeterJ