Предисловие автора


Доброго времени суток, Хабр. Как планировала, продолжаю цикл статей, которые помогут Вам в знакомстве с Arduino. Также, в каждой последующей статье (включая эту) вы сможете найти ответы на самые важные вопросы, которые появляются в комментариях. Для тех кто не читал прошлую часть, сюда.


Зачем нужны резисторы и как их подобрать


В комментариях под прошлыми публикациями возникали вопросы о важности резисторов в схемах и о том как их подобрать. Рассмотрим это на практике диодов. В Arduino на обычных пинах подаётся напряжение в 5 В. А диоды рассчитаны на определённый ток. И если превысить этот предел диод сгорит. Резисторы создают сопротивление и уменьшают ток который проходит сквозь них. А чтоб рассчитать нужное сопротивление надо воспользоваться законом Ома ( I = U / R, где I – сила тока (А), U – напряжение (В) и R – сопротивление (Ом).##Продвигаемся далее в изучении Arduino
Мы научились подключать и зажигать светодиод, а также пользоваться кнопкой. Сегодня мы рассмотрим одну очень интересную вещь. Это будет потенциометр (его также называют переменный резистор)


Что такое потенциометр и как он работает


Потенциометр – это регулируемый делитель электрического напряжения (переменный резистор). Он представляет собой резистор с подвижным контактом.

Чаще всего потенциометры используют для управления громкостью звука а также для управления яркостью освещения.
Давайте теперь поговорим о том, как это работает. У потенциометра есть 3 вывода: плюс (5В), минус (земля) и аналоговый вход. На анимационной картинке выше можно видеть как выглядит рабочий потенциометр внутри. На один крайний вывод мы получаем 5В, а на второй крайний вывод у нас идёт минус. Когда мы крутим ручку потенциометра, то ротор вращается по резистивном веществе. Средний вывод у нас — это аналоговый вывод. Когда ручка находиться в начальном положении то на аналоговый вывод поступает минимальное число. Очевидно что чем дальше мы проворачиваем ручку тем большее число мы получаем на выходе.


Необходимые компоненты и подключение


Для сегодняшних экспериментов нам понадобиться:


  • плата Arduino
  • перемычки/провода
  • макетная плата
  • потенциометр (переменный резистор)

Схема подключения выглядит так:



Пишем код


Вот так выглядит простой код считывания и вывода данных с потенциометра в монитор порта:


int pot = A0;  // потенциометр подключён к А0
int val;  // переменная для хранения значений

void setup() {
  Serial.begin(9600);  // настраиваем скорость обмена данных на 9600 бит в секунду
  pinMode(pot, INPUT);
}

void loop() {
  val = analogRead(pot);  // считываем данные с потенциометра
  Serial.println(val);  // с новой строки выводим значения
}

Монитор порта


В платах Arduino контроллер имеет интерфейс UART. Именно он позволяет нам установить двунаправленный поток связи с компьютером. В Arduino IDE эта связь имеет графическую оболочку. Именно это и есть монитор порта. Чтоб его открыть можно нажать на значок лупы в правом верхнем углу, в панели инструментов выбрать Инструменты => Монитор порта или просто нажать сочетание клавиш Ctrl + Shift + M. Далее для работы нашей программы необходимо выбрать соответствующее значение скорости а именно 9600 бод.


Теперь поинтереснее


Давайте объединим потенциометр и диод. И у нас выйдет плавное управление яркостью светодиода. Подключаем всё по следующей схеме:



После подключения давайте напишем код к нашему импровизированному светильнику:


int pot = A0;  // потенциометр подключён к А0
int val;  // переменная для хранения значений
int LED = 3; // светодиод подключён к 3 пину

void setup() {
  Serial.begin(9600);  // настраиваем скорость обмена данных на 9600 бит в секунду
  pinMode(pot, INPUT); 
  pinMode(LED, OUTPUT); 
}

void loop() {
  val = analogRead(pot);  // считываем данные с потенциометра
  Serial.println(val);  // с новой строки выводим значения
  val = val / 4; // делим значения с потенциометра на 4
  analogWrite(LED, val); // выводим значение переменной, которое получаем после деления на 4
}

Короткие объяснения по коду. Деление на 4 необходимо для следующего. Потенциометр может принимать значения от 0 до 1023. А вот аналоговый вход/выход передаёт значения только в диапазоне от 0 до 255. Поэтому деление нам в данном случае просто необходимо.


Функция map()


Map – это математичесская функция, которая переобразовывает значение переменной из одного диапазона в другой. Функция в коде выглядит следующим образом – map(value, fromLow, fromHigh, toLow, toHigh). Именно она может в нашем коде заменить деление. И вобще эта функция достаточно часто бывает полезна при работе с Arduino. Поэтому наш код теперь выглядит так:


int pot = A0;  // потенциометр подключён к А0
int val;  // переменная для хранения значений
int LED = 3; // светодиод подключён к 3 пину

void setup() {
  Serial.begin(9600);  // настраиваем скорость обмена данных на 9600 бит в секунду
  pinMode(pot, INPUT); 
  pinMode(LED, OUTPUT); 
}

void loop() {
  val = analogRead(pot);  // считываем данные с потенциометра
  Serial.println(val);  // с новой строки выводим значения
  val = map(val, 0, 1023, 0, 255); // применяем функцию
  analogWrite(LED, val);
}

На этом у нас конец третьей части. Спасибо за внимание.

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


  1. SergeyMax
    10.07.2018 20:29

    У потенциометра есть 3 вывода: плюс (5В), минус (земля) и аналоговый вход.

    Я ардуинщик, я так вижу (с)


    1. siryoshka
      10.07.2018 21:23

      Всё что не имеет // Reset, уже относится к аналоговой технике.


    1. DmitriyDev
      10.07.2018 21:32
      +1

      Уж лучше пусть ардуины программирует, чем под подъездами пиво пьёт. (с)
      А если серьёзно, может так и лучше объяснять, ведь почти все датчики для ардуино имеют дополнительное питание.
      Т.е. я считаю что ардуинщик должен разбираться в схемотехнике. Но ведь это статься для новичков, а если новичёк сможет хотя бы заставить светодио мигать и ничего не спалит, это уже хорошо. ИМХО.


      1. saw_tooth
        10.07.2018 23:17

        А если серьёзно, может так и лучше объяснять

        Нет не лучше… я повторю — не лучше.
        Не так давно в около ембеддреских статьях, сначала начал появлятся «ардуино контроллер», далее начались сравнение голых контроллеров и Ардуино (то есть ардуино стал для масс людей априори в лице контроллера).
        Теперь мы нашли +5 вольт вывод у потенциометра… я очень боюсь представить что будет дальше…
        Зачем новичкам, изначально культивировать не верную лживую информацию, ведь это будет усвоено и принято за истину, и дальше эта же ложь пойдет по другим людям — так не далеко и до плоской Земли, уж простите.


        1. DmitriyDev
          11.07.2018 00:10

          Не заю.
          С одной стороны, я думаю что неплохо сделать порог вхождения как-можно более низким.
          С другой же стороны, я вижу ваш негативный опыт с похожим подходом и понимаю что люди не всегда хотят понимать как что-то на самом деле работает.
          Т.е. я исходил из обучения в школе:
          Сначала говорят что V = V1 + V2, через некоторое время добавляют какие-то странные вектора, а чуть позже говорят: -вы знаете, мы должны ввести в формулу ещё и скорость света, учите общую теорию относительности.
          С другой же стороны школьники не набегают на форумы NASA и не рассказывают как правильно строить спутники (я надеюсь).


          1. vasimv
            11.07.2018 05:13
            +1

            Ну, про то как работает резисторный делитель — все-таки надо было рассказать. И про то как использовать закон Ома для расчета токоограничительного резистора для светодиода.


  1. FGV
    10.07.2018 20:58

    А чтоб рассчитать нужное сопротивление надо воспользоваться законом Ома ...

    где хоть один пример расчета?


  1. AntonSazonov
    10.07.2018 22:53
    +2

    Столько нелепостей, что даже комментировать не хочется. Но я всё же приведу пару примеров...


    Baud (Бод) — количество передачи символьной информации в секунду. Не битов.


    Потенциометр может принимать значения от 0 до 1023. А вот аналоговый вход/выход передаёт значения только в диапазоне от 0 до 255. 

    Потенциометр — вещь аналоговая. Нет там никакого дискретного диапазона. 0-1023 — это диапазон аналогового входа на Arduino.


    1. KsanderT
      10.07.2018 23:29
      -1

      Baud (Бод) — количество передачи символьной информации в секунду. Не битов.

      количество переключений в секунду, именно тех самых битов


      1. vilgeforce
        10.07.2018 23:54

        Если напряжением можно кодировать 4 различных состояния — как тогда быть? А если 16?


      1. AntonSazonov
        11.07.2018 01:12

        количество переключений в секунду, именно тех самых битов
        Откуда вы это взяли?


      1. vasimv
        11.07.2018 05:10

        По-моему, вы оба немного правы и немного не правы. :)

        Количество переключений в секунду — да. Но не битов. И да, это количество символьной информации, только символ в данном случае — не байт. :)


  1. saw_tooth
    10.07.2018 23:09
    +1

    Короткие объяснения по коду. Деление на 4 необходимо для следующего. Потенциометр может принимать значения от 0 до 1023. А вот аналоговый вход/выход передаёт значения только в диапазоне от 0 до 255. Поэтому деление нам в данном случае просто необходимо.

    Вобще не поддается какой либо конструктивной критике. Только маты
    И вобще эта функция достаточно часто бывает полезна при работе с Arduino

    А еще полезно знать о том, что битовый сдвиг так же делит числа на 2, и Вашу map функцию можно заменить на банальное i >> 2.
    Серия статей продолжается…


    1. vasimv
      11.07.2018 05:11

      Со сдвигом бит надо быть осторожнее. Лучше все-таки писать «x/2», компиляторы сами там разберутся — сдвигать или делить (по скорости, впрочем, на современных микроконтроллерах — одинаково).


  1. avs24rus
    11.07.2018 05:06

    Желание нести в массы бред, выше здравого смысла.


  1. REPISOT
    11.07.2018 06:18

    Тема расчета резистора для светодиода не раскрыта.