Перейти к содержанию

Как подключить несколько кнопок к одному аналоговому входу?

Обновлено Редакция GAW

Кнопки, подключённые к аналоговому входу, работают как делитель напряжения. Верхнее плечо — подтягивающий резистор R0 = 10 кОм к питанию, нижнее — резистор нажатой кнопки Rn на общий провод. Если делитель питается от того же напряжения, что и опорное АЦП, код не зависит от питания:

N=1024⋅RnR0+Rn.N = 1024 \cdot \frac{R_n}{R_0 + R_n}.

Коды и пороги

У ATmega328P (Arduino UNO) АЦП 10-битный, код 0x3FF соответствует опорному напряжению минус один шаг. Для пяти кнопок и R0 = 10 кОм:

Кнопка, RnНапряжение при 5 ВКод АЦППорог до следующей
0 Ом0 В046
1 кОм0,45 В93138
2,2 кОм0,90 В184255
4,7 кОм1,60 В327419
10 кОм2,50 В512767
не нажата5 В1023—

Порог ставят посередине между соседними кодами: программа сравнивает результат с порогами по порядку и узнаёт кнопку. Номиналы берут из ряда E12 так, чтобы коды шли с запасом.

Хватит ли точности

Даташит обещает погрешность АЦП 2 младших разряда, а главный источник ошибки — допуск резисторов. Даже с резисторами ±5 % код кнопки 4,7 кОм остаётся в пределах 305–350, а кнопки 2,2 кОм — 170–200: до порогов далеко. Больше 6–8 кнопок на один вход ставить не стоит — коды сближаются, и допуск резисторов начинает решать.

Сопротивление такого источника — R0 и Rn параллельно, не больше 5 кОм, а даташит рекомендует для АЦП источник до 10 кОм, так что отдельный буфер не нужен. Дребезг контактов здесь тоже есть: значение читают несколько раз и принимают кнопку, когда код устойчиво попал в одно окно. Как подключать одиночную кнопку к цифровому входу, рассказано в ответе о резисторе для кнопки, а устройство АЦП — в статье «АЦП».

Похожие вопросы

Что будет, если нажать две кнопки сразу?

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

Нужно ли стабилизированное питание для такой клавиатуры?

Нет, если делитель питается от того же напряжения, что служит опорным для АЦП, — у Arduino UNO это AVCC. Код зависит только от отношения сопротивлений, и колебания питания на него не влияют.

Сколько кнопок можно подключить к одному аналоговому входу?

Ограничение — расстояние между кодами. У пяти кнопок с резисторами от 0 до 10 кОм соседние коды отличаются на 90–185 единиц, и резисторы ±5 % их не путают. При 6–8 кнопках окна сужаются, и нужны резисторы 1 % и тщательный подбор номиналов.

Источники

  1. Microchip. ATmega48A/PA/88A/PA/168A/PA/328/P Data Sheet (DS40002061B) — 24.7 — результат 10-битного преобразования: 0x000 — общий провод, 0x3FF — опорное напряжение минус один шаг; 24.6.1 — АЦП рассчитан на источник с выходным сопротивлением около 10 кОм или меньше; табл. 29-15 — абсолютная погрешность 2 младших разряда
  2. Vishay. D/CRCW e3: Standard Thick Film Chip Resistors (Document Number 20035) — допуск сопротивления стандартных чип-резисторов ±5 % и ±1 %

Нашли ошибку?