Страница 1 из 1

Надежность чтения резистивных кнопок

Добавлено: Пт авг 18, 2023 11:01:54
dim3740
Здравствуйте. Общеизвестная схема и библиотека подключения к аналоговому одному порту линейки резисторов и замыкающих кнопок, предусматривает калибровку и задание границ напряжений.

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

Причем проблемы именно с дребезгом. Какие меры применимы? Они такие же как и для цифровых кнопок или нет?

На фото фрагмент из библиотеки.

Re: Надежность чтения резистивных кнопок

Добавлено: Пт авг 18, 2023 11:37:34
OKF
Ну а какой дребезг может быт у резистивных кнопок! Точность определения - да, дребезг - нет.

Re: Надежность чтения резистивных кнопок

Добавлено: Пт авг 18, 2023 11:41:17
veso74
Измерьте свои собственные значения АЦП и поместите их в код. Напр. на мой keypad значения совпадают. Для дрезбега добавьте меры, доступные для цифровые кнопки, например, начать с элементарные: чтение, пауза, чтение или несколько раз прочитать и усреднить. До сих пор мне не приходилось делать код сложнее, чем эти два, хотя более сложные методы бесконечны. Но и устройства для простого использования.

Изображение

Код: Выделить всё

U usb = 5.03V
бутон / измерено / данни от производителя:
 
бутон 1 = 1023 / 1023
бутон 2 = 931 / 930
бутон 3 = 854 / 850
бутон 4 = 788 / 790
бутон 5 = 731 / 730
бутон 6 = 683 / 680
бутон 7 = 640 / 640
бутон 8 = 602 / 600
бутон 9 = 569 / 570
бутон 10 = 539 / 540
бутон 0 = 512 / 510
бутон 11 = 487 / 490

Код: Выделить всё

    if (kb > 965) button = 1;
    else if (kb > 890) button = 2;
    else if (kb > 820) button = 3;
    else if (kb > 760) button = 4;
    else if (kb > 705) button = 5;
    else if (kb > 660) button = 6;
    else if (kb > 620) button = 7;
    else if (kb > 585) button = 8;
    else if (kb > 555) button = 9;
    else if (kb > 525) button = 10;
    else if (kb > 500) button = 0;
    else if (kb > 470) button = 11;

Re: Надежность чтения резистивных кнопок

Добавлено: Пт авг 18, 2023 11:58:20
dim3740
Верно, ступил... Вывожу в монитор показатели ADC, и при отпускании кнопок проскальзывают значения, в корне отличные от диапазона. Чем объяснить? Провода? Не держит питание?

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

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

Добавлено after 10 minutes 10 seconds:
veso74, вероятно, у меня что с питанием или с наводками на кеупад. Девиация до плюс\минус 10-15 значений.

Я бы мирился, но в момент отпускания скажем с 600 может пробить скажем и 300((((

Кнопки на 50 см проводке. Наверное надо смотреть как идет земля. Или экранированный?

Вообщем, особых мер надежности и не надо изобретать. Так?

Re: Надежность чтения резистивных кнопок

Добавлено: Пт авг 18, 2023 12:06:20
mont-oriol
Если в серии из N замеров (N = 100 ... 1000) все значения лежат в диапазоне X1 ... X2, то нажата кнопка такая-то.

Re: Надежность чтения резистивных кнопок

Добавлено: Пт авг 18, 2023 12:29:27
veso74
Трудно угадать дистанционно. Клавиатура не старая? Контакты кнопки окислились? Исключите варианты, которые перечислили, один за другим: измерите напрежение, попробуйте с более качественными проводами и их соединения с клавиатурой, поместите заземленную изолированную пластину под клавиатуру ... Дайте весь код программы. Сфотографируйте экспериментальную установку и поделитесь фото.

Re: Надежность чтения резистивных кнопок

Добавлено: Пт авг 18, 2023 13:15:13
dim3740
Спасибо всем, я попробую все выложить тут... С АЦП почти не работал, посему и догадки причин. Если позволите, все же пара вопросов..

1. Как это "нет дребезга"? Нажимаю кнопку, пошел контакт, пошел потенциал, отпружинило, потенциал пропал и т.п.
2. Разве не нужно обязательно делать паузу перед считыванием? Ведь нажали, пошел ток, емкость/индуктивность проводов... конечно, АЦП защелкнет какое то значение НЕ достигшее устойчивого.
3. Как АЦП меряет? Т.е. "если напряжение 0, то ждем. Если напряжение больше хоть на 1, то запускаем измерение". Или он все время меряет?
4. Если делать "цикл" для проверки постоянства, то АЦП же нужно время, чтоб все обработать и повторно запускать измерение? Это в цикле надо учесть?

Конструкция готовая и сложная для переделки. Хочется найти решение программным путем. Назначение бытовое, время между кнопками - секунды и более .

Re: Надежность чтения резистивных кнопок

Добавлено: Пт авг 18, 2023 13:43:29
mont-oriol
Просто возьмте готовую библиотеку
Если ваша схема не совпадает с той, то соберите по той схеме для минимального количества кнопок, и разберитесь как оно там работает. Потом можно код адаптировать под вашу схему.

Re: Надежность чтения резистивных кнопок

Добавлено: Пт авг 18, 2023 15:44:34
Ariadna-on-Line
Если в роли клавиатуры используется схема делителя, где в одном плече постоянный резистор, а в другом плече резисторы кнопками коротятся на шину питания - то такая схема будет иметь резко нелинейной шаг на выходе. Зато без нажатия - не потребляет тока. Я использовал другую схему - цепочка одинаковых резисторов между плюсом и Землей. Кнопки подают на вход потенциалы с точек этого делителя. Делитель постоянно проводит ток, зато шаг одинаков. Чтобы без нажатых кнопок вход АЦП не "зависал" - он притянут на землю высокоомным резистором. Здесь возможна вероятность нажатия двух кнопок - крайней верхней и крайней нижней. Этот случай и определяет минимальное допустимое сопротивление резисторов цепи делителя. Но при желании можно слегка усложнить схему.
ПС. По-моему использовать библиотеки здесь - это как читать инструкцию по использованию туалетной бумаги.

Re: Надежность чтения резистивных кнопок

Добавлено: Пт авг 18, 2023 17:41:56
mont-oriol
[uquote="Ariadna-on-Line",url="/forum/viewtopic.php?p=4464079#p4464079"]По-моему использовать библиотеки здесь - это как читать инструкцию по использованию туалетной бумаги.[/uquote]
Если я правильно понял вашу мысль, то вам известно решение по анти-дребезгу кнопок настолько простое, что его не стоит заворачивать в отдельную библиотеку.
Вас не затруднит его опубликовать здесь? Ведь это именно то, о чём спрашивал автор вопроса. Поскольку, это не библиотека, тогда может быть скетч, чтобы его можно было протестировать?

Re: Надежность чтения резистивных кнопок

Добавлено: Пт авг 18, 2023 23:42:59
Ariadna-on-Line
Могу даже в двух словах объяснить -
В случае схемного решения описанного мною - дребезг погрешности не вносит. Низкоомный делитель по сравнению с высокоомным входом АЦП с первого же контакта заряжает входную ёмкость АЦП. Дальнейший дребезг уже ничего изменить не в состоянии. В коде не предусматривал мер по борьбе с ним и все работало чики-пуки. В алгоритме опознавания кнопки была проверка на попадание в диапазон значений. Например кнопка дает семпл 100 единиц, а соседние 80 и 120. Значит идет проверка, что семпл больше 90. но меньше 110. И так для всех кнопок. Естественно сначала было проведено измерение значений, высчитаны диапазоны и вписаны в скетч. Это неизбежно, тк резисторы имеют допуск до 5%.
ПС. В вашем коде совершенно напрасно используется функция map(). Работать надо с отсчетами АЦП - семплами, без привязки к вольтажу.