0. Начало
1. Цифровой ввод — кнопка
2. Аналоговый вывод — Fading
3. Аналоговый ввод – потенциометр
Попробуем поработать с аналоговым вводом — для этого используем переменный резистор, подключённый к аналоговому входу.
Крайние выводы переменного резистора подключаются к земле и +5V, а со среднего снимаем напряжение, зависящее от положения отводного контакта.
Т.е. если отводной контакт упирается в нижнее положение – то получаем 0V, а если в верхнее – то +5V.
В качестве примера можно воспользоваться стандартным скетчем AnalogInput (Sketchbook — Examples — Analog – AnalogInput)
принципиальная схема:
Код скетча:
/* * AnalogInput * by DojoDave * * включает и выключает светодиод, подключённый к digital * pin 13. Время задержки между включением и выключением * светодиода зависит от величины, полученной от функции * analogRead(). * В самом простом случае – получить аналоговое значение можно * считывая напряжение с потенциометра, подключённого к * to analog pin 2. * * http://www.arduino.cc/en/Tutorial/AnalogInput */ int potPin = 2; // потенциометр подключается к 2-му порту int ledPin = 13; // светодиод подключается к digital pin 13 int val = 0; // переменная для хранения значения входного напряжения void setup() { pinMode(ledPin, OUTPUT); // настраиваем ledPin как выход } void loop() { val = analogRead(potPin); // считываем значение с потенциометра digitalWrite(ledPin, HIGH); // зажигаем светодиод delay(val); // задержка, зависит от значения digitalWrite(ledPin, LOW); // гасим светодиод delay(val); // опять задержка }
— как видно – это опять же несколько изменённый Blink, время задержки между включением/выключением светодиода зависит от уровня напряжения на входе analog input 2, к которому подключён средний вывод переменного резистора, включенного между землёй и +5V
Более наглядное представление можно получить используя не цифровой вывод Blink-а, а аналоговый Fading-а.
Для этого нужно изменить схему, подключив светодиод на один из PWM-выводов – например, digital pin 9:
И соответствующим образом изменить скетч.
Однако, тут нужно учесть, что значение, получаемой от функции analogRead представляет собой целое число от 0 до 1023, а функция analogWrite оперирует значениями между 0 и 255. Следовательно, нужно привести значение, полученное от analogRead к соответствующему уровню, например, просто разделив на 4.
/* * Dimmer_pot */ int potPin = 2; // потенциометр подключается к 2-му порту int ledPin = 9; // светодиод подключается к digital pin 9 int val = 0; // переменная для хранения значения входного напряжения void setup() { } void loop() { val = analogRead(potPin); // считываем значение с потенциометра val = val/4; // конвертируем из 0-1023 к 0-255 analogWrite(ledPin,val); // устанавливаем значение }
Работает 🙂
читать далее: 4. Аналоговый ввод – осциллограф
По теме
Arduino, термины, начало работы
КМБ для начинающих ардуинщиков
Состав стартера (точка входа для начинающих ардуинщиков)
11 комментариев на «“Практическое программирование Arduino/CraftDuino — Аналоговый ввод – потенциометр”»
А почему бы просто не подавать питание для светодиода с центральной ноги переменного резистора? Зачем сначала считывать, а потом снова выводить?
Ну во-первых — это просто пример ввода аналого сигнала — светодиод чисто для идикации того что считали;) во-вторых — с 50к потенциометра будет, мягко говоря, неравномерная хр-ка «угол поворота/яркость», а тут можно программно масштабировать=)
Подскажите, почему при моделировании схемы аналогового ввода с Ардуины (мега328) в Протеусе я получаю на выходе функции analogRead(0) число, равное 1023, которое я вижу виртуальным терминалом? То есть не происходит, собственно говоря, ацепирование входа.
А что вы, собственно, на «Analog 0»(см пинмэппинг=) при этом подаёте?
На «Analog 0» я подаю сигнал со среднего вывода потенциометра, у которого один вывод посажен на землю, а на второй подается +5В.
Как говорится «Ви путете смияца»
Но, скорей всего вы не запитали АЦП=)
Подключите 20-ю ногу (AVCC) к терминалу POWER (ну или к тому выводу потенциометра, куда подаёте +5В)
PS: Порлогаю, вы используете анимированный резистор, если нет — рекомендую. Называется POT-HG и его можно «крутить» во время симуляци — очень удобно.
Удачи=)
Спасибо, столкнулся с той же проблемой. Думал что МК в качестве опорного напряжения берет напряжение питания, а оказывается надо отдельно подводить.
Добрый день. Подключаю потенциометр — крайние ноги к +5 и GND, среднюю на аналоговый пин 0. Делаю val=analogRead(0) и Serial.println(val,DEC); в итоге в крайнем правом положении в консоль выводятся числа от 200 до 300, а в крайнем правом — от 500 до 600. Разброс в пределах сотни и постоянно меняется число. Про 0 и 1023 даже не слышно. Что я делаю не так?)
Хммм…
1. Скетч целиком в студию.
2. Проверяем контакты, правильность подключения,(дважды=))
проверяем исправность потенциометра тестером.
3. Сопротивление потенциометра какое?
4. Марка потенциометра (что на нём написано?) может какойто хитровымучанный…
5. Попробуйте подключить другой.
6. Попробуйте вообще его отключить и посмотреть на шум эфира — наводки на вход.
только что проверил. Модифицировал скетч из заметки:
результат:
Т.о. всё работает, вот только шаг изменения сильно зависит от самого потенциометра.
Спасибо. Вроде бы всё заработало как надо. Просто упростил скетч, выбросив из него индикацию на светодиодах.
И еще одна странность, то, что я описал выше наблюдалось при заливке скетча под виндой. При перезаливке в убунте всё показывало 1023 при любых параметрах. Грешу на общую со светодиодами землю. Теперь буду пробовать в комплексе всё запускать.