Практическое программирование Arduino/CraftDuino — Аналоговый ввод – потенциометр


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 — Аналоговый ввод – потенциометр”»

  1. А почему бы просто не подавать питание для светодиода с центральной ноги переменного резистора? Зачем сначала считывать, а потом снова выводить?

    • Ну во-первых — это просто пример ввода аналого сигнала — светодиод чисто для идикации того что считали;) во-вторых — с 50к потенциометра будет, мягко говоря, неравномерная хр-ка «угол поворота/яркость», а тут можно программно масштабировать=)

  2. Подскажите, почему при моделировании схемы аналогового ввода с Ардуины (мега328) в Протеусе я получаю на выходе функции analogRead(0) число, равное 1023, которое я вижу виртуальным терминалом? То есть не происходит, собственно говоря, ацепирование входа.

    • А что вы, собственно, на «Analog 0»(см пинмэппинг=) при этом подаёте?

    • На «Analog 0» я подаю сигнал со среднего вывода потенциометра, у которого один вывод посажен на землю, а на второй подается +5В.

    • Как говорится «Ви путете смияца»
      Но, скорей всего вы не запитали АЦП=)
      Подключите 20-ю ногу (AVCC) к терминалу POWER (ну или к тому выводу потенциометра, куда подаёте +5В)

      PS: Порлогаю, вы используете анимированный резистор, если нет — рекомендую. Называется POT-HG и его можно «крутить» во время симуляци — очень удобно.
      Удачи=)

    • Спасибо, столкнулся с той же проблемой. Думал что МК в качестве опорного напряжения берет напряжение питания, а оказывается надо отдельно подводить.

  3. Добрый день. Подключаю потенциометр — крайние ноги к +5 и GND, среднюю на аналоговый пин 0. Делаю val=analogRead(0) и Serial.println(val,DEC); в итоге в крайнем правом положении в консоль выводятся числа от 200 до 300, а в крайнем правом — от 500 до 600. Разброс в пределах сотни и постоянно меняется число. Про 0 и 1023 даже не слышно. Что я делаю не так?)

    • Хммм…
      1. Скетч целиком в студию.
      2. Проверяем контакты, правильность подключения,(дважды=))
      проверяем исправность потенциометра тестером.
      3. Сопротивление потенциометра какое?
      4. Марка потенциометра (что на нём написано?) может какойто хитровымучанный…
      5. Попробуйте подключить другой.
      6. Попробуйте вообще его отключить и посмотреть на шум эфира — наводки на вход.

    • только что проверил. Модифицировал скетч из заметки:

      int potPin = 0;    // потенциометр подключается к 0-му порту
      int ledPin = 13;   // светодиод подключается к digital pin 13
      int val = 0;       // переменная для хранения значения входного напряжения
      
      void setup() 
      {
        pinMode(ledPin, OUTPUT);  // настраиваем ledPin как выход
         Serial.begin(9600);     // инициализация работы с COM-портом
      }
      
      void loop() 
      {
        val = analogRead(potPin);    // считываем значение с потенциометра
        Serial.println(val, DEC);    // выводим значение
        digitalWrite(ledPin, HIGH);  // зажигаем светодиод
        delay(val);                  // задержка, зависит от значения
        digitalWrite(ledPin, LOW);   // гасим светодиод
        delay(val);                  // опять задержка
      }

      результат:

      0
      1
      2
      3
      5
      6
      11
      12
      ....
      541
      962
      1023

      Т.о. всё работает, вот только шаг изменения сильно зависит от самого потенциометра.

    • Спасибо. Вроде бы всё заработало как надо. Просто упростил скетч, выбросив из него индикацию на светодиодах.
      И еще одна странность, то, что я описал выше наблюдалось при заливке скетча под виндой. При перезаливке в убунте всё показывало 1023 при любых параметрах. Грешу на общую со светодиодами землю. Теперь буду пробовать в комплексе всё запускать.

Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Android Arduino Bluetooth CraftDuino DIY IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна конкурс манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение