CraftDuino v2.0
  • - это CraftDuino - наш вариант полностью Arduino-совместимой платы.
  • CraftDuino - настоящий конструктор, для очень быстрого прототипирования и реализации идей.
  • Любая возможность автоматизировать что-то с лёгкостью реализуется с CraftDuino!
Просто добавьте CraftDuino!

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

0. Начало
1. Цифровой ввод — кнопка
2. Аналоговый вывод — Fading

3. Аналоговый ввод – потенциометр

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

Крайние выводы переменного резистора подключаются к земле и +5V, а со среднего снимаем напряжение, зависящее от положения отводного контакта.
Т.е. если отводной контакт упирается в нижнее положение – то получаем 0V, а если в верхнее – то +5V.

В качестве примера можно воспользоваться стандартным скетчем AnalogInput (Sketchbook — Examples — Analog – AnalogInput)

принципиальная схема:

Код скетча:

/*
 * AnalogInput
 * by DojoDave <http://www.0j0.org>
 *
 * включает и выключает светодиод, подключённый к 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, термины, начало работы
КМБ для начинающих ардуинщиков
Состав стартера (точка входа для начинающих ардуинщиков)
  • 0
  • 7 августа 2009, 11:33
  • admin

Комментарии (12)

RSS свернуть / развернуть
+
0
А почему бы просто не подавать питание для светодиода с центральной ноги переменного резистора? Зачем сначала считывать, а потом снова выводить?
avatar

Oboroten

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

Zoltberg

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

matlaber

  • 2 февраля 2010, 15:24
+
0
А что вы, собственно, на «Analog 0»(см пинмэппинг=) при этом подаёте?
avatar

Zoltberg

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

matlaber

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

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

Zoltberg

  • 2 февраля 2010, 21:27
+
0
Спасибо, столкнулся с той же проблемой. Думал что МК в качестве опорного напряжения берет напряжение питания, а оказывается надо отдельно подводить.
avatar

Mr_Floppy

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

Nauro

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

Zoltberg

  • 4 ноября 2010, 14:09
+
0
только что проверил. Модифицировал скетч из заметки:
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

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

admin

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

Nauro

  • 12 ноября 2010, 10:47

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.