Низкая чувствительность переменных резисторов
- Войдите на сайт для отправки комментариев
Сб, 24/12/2016 - 12:15
Всем доброго времени суток,
Я простой человек, и я не могу в электронику. Собрал midi-usb девайс по этой схеме:
https://cdn.instructables.com/F2L/4QL3/HYQDUAUW/F2L4QL3HYQDUAUW.LARGE.jpg
Arduino взял pro mini.
Залил туда это:
int chanVal_1; int oldChanVal_1; int chanVal_2; int oldChanVal_2; int chanVal_3; int oldChanVal_3; int chanVal_4; int oldChanVal_4; void setup(){ Serial.begin(31250); } void loop(){ chanVal_1 = map(analogRead(A0), 0, 1023, 0, 127); chanVal_2 = map(analogRead(A1), 0, 1023, 0, 127); chanVal_3 = map(analogRead(A2), 0, 1023, 0, 127); chanVal_4 = map(analogRead(A3), 0, 1023, 0, 127); //****************************************************** 1 if(abs(chanVal_1 - oldChanVal_1) > 1){ Serial.write(0xB0); //Serial.print("::"); Serial.write(1); //Serial.print("::"); Serial.write(chanVal_1); } //****************************************************** 2 if(abs(chanVal_2 - oldChanVal_2) > 1){ Serial.write(0xB0); //Serial.print("::"); Serial.write(2); //Serial.print("::"); Serial.write(chanVal_2); } //****************************************************** 3 if(abs(chanVal_3 - oldChanVal_3) > 1){ Serial.write(0xB0); //Serial.print("::"); Serial.write(3); //Serial.print("::"); Serial.write(chanVal_3); } //****************************************************** 4 if(abs(chanVal_4 - oldChanVal_4) > 1){ Serial.write(0xB0); Serial.write(4); Serial.write(chanVal_4); } oldChanVal_1 = chanVal_1; oldChanVal_2 = chanVal_2; oldChanVal_3 = chanVal_3; oldChanVal_4 = chanVal_4; delay(64); }
Подключил 4 переменных резистора 10кОм и получил беду в виде их низкой чувствительности при плавном вращении. Если кручу резко, работают отлично. Если ооочень плавно кручу, то вообще не реагируют. Могу открая до края мееедленно крутить и ни одного сигнала не передастся.
Подскажите пожалуйста где беда? Заранее спасибо.
Строки 54-57 нужно раскидать по соответствующим блокам, обозначенным 1, 2, 3, 4. Иначе при медленном вращении изменение сигнала не превышает 1 за цикл, но ты помещаешь новое значение в oldChanVal и изменение не накапливается.
Спасибо большое! Но частично проблема осталась. Иногда перескакивает через 2 значения, пробовал уменьшать задержку, но это не помогло, может ли это быть погрешностью самих резисторов?
Не совсем понятно, что значит "перескакивают", но если я правильно понял, oldChanVal_1 нужно не присваивать chanVal_1, а инкрементировать на величину шага (например, на 2).
PS. И - да, шумы резисторов еще никто не отменял. Можно попытаться уменьшить, зашунтировав конденсатором.
Nareg Беда в том, что ты ыводишь дельту, т.е. изменение за весьма кототкое время, а при медленном вращении эта дельта меньше 1 и в результате ничего не выводится.
Очень равномерно вращать рукой не получится, поэтому возможно получение любых значений.
Вообще желательно озвучить саму задачу, т.к. смысл такого применения не вполне ясен.
возможно подразумевался энкодер, а применен переменный резистор.
Задержка стоит не в том месте.
Задача простая) midi контроллер. Пробовал даже из встроенных скетчей midi-usb, всё равно скачет зараза, купил другие переменные резисторы, та же песня.
Этот попробовал, тоже значения спонтанные (1,2,5,7,11 и т.д.) :(
Однако да, вернулся к старому скетчу
Шаг поставил 0,5. Это помогло, но, если крутить аккуратно, то значение начинает скакать туда сюда, или же после выравнивания значения и отпускания ручки, всё равно продолжает передаваться сигнал, будто резистор ещё вращается. Что же делать? Как же быть?:)
UPD:
Поменял на 0,9. Теперь изредка попадаю на промежуточное значение. Но всё равно попадаю.
Это в перлы!
Если взять вот такой http://www.chipdip.ru/product/3590s-2-104/ резистор за более 1000 руб, тогда можно попробовать поймать один бит изменения оцифровки при повороте ручки на 3 градуса. Правда после долгого и упорного сглаживания результата.
И прочитайте, наконец, чем целые числа в компьютере отличаются от тех, которые записываются с десятичной точкой.
Точно! Только и всего! Всё что было нужно это высмеять меня и предложить купить деталь в которой сами не уверены:)
Хвала человеку который придумал форумы:) Они так помагают.
Спасибо за помощь парни!
Под этим сообщением можно написать какое я быдло и если не разбираюсь, то лучше сторожить кукурузу.
Технические форумы такие технические форумы.
P.S. за пару советов действительно спасибо. Вроде кондёра и с кодом.
С Новым Годом всех и Рождеством! Всем хороших праздников, а мне бан:)
С наступающим это да, с наступающим!
Резистор такой у меня есть. Позволяет устанавливать напряжение с точностью до пятого знака. А теперь включаем мозги и следим за последовательностью рассуждений. Разрядность АЦП 10 бит - 1024 отсчёта. После функции мап количество отсчётов уменьшится в 8 раз и изменение переменной (помним что она челое число) будет происходить не меньше чем на единицу при изменении значения АЦП на 8. Кроме того, при оцифровке получамое значение не стабильно в силу целого ряда причин. Поэтому можно получить изменение ваших переменных даже без вращения резистора. Получаемое значение целое. Поэтому сравнение с любой(!) величиной меньше единицы равнозначно сравнению с нулём, только отъедает огромное количество памяти и времени процессора. Сравнение с нулём абсолютной разности тоже лишнее действие. Достаточно сравнить старое и новое значение. Из всего сказанного простые выводы для улучшения скетча. Надо сглаживать получаемые от АЦП значения и только потом применять функцию мап. Сравнивать старое и новое значение надо с помощью !=. В этом случае вы будете получать новые значения при любой скорости вращения резистора. Но при этом всегда найдётся его положение при котором будет идти изменение сигнала на единицу без вращения. Избавиться от этого можно увеличив в вашем скетче сравниваемую величину до двойки или больше. Но тогда присвоение старому значению АЦП надо внести под соответствующий if что бы получить изменение при медленном вращении.
Если взять вот такой http://www.chipdip.ru/product/3590s-2-104/ резистор за более 1000 руб
...
https://ru.aliexpress.com/item/Free-Shipping-5pcs-3590S-2-103L-3590S-2-1...
Оно?