Предисловие автора
Доброго времени суток, Хабр. Как планировала, продолжаю цикл статей, которые помогут Вам в знакомстве с 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)
FGV
10.07.2018 20:58А чтоб рассчитать нужное сопротивление надо воспользоваться законом Ома ...
где хоть один пример расчета?
AntonSazonov
10.07.2018 22:53+2Столько нелепостей, что даже комментировать не хочется. Но я всё же приведу пару примеров...
Baud (Бод) — количество передачи символьной информации в секунду. Не битов.
Потенциометр может принимать значения от 0 до 1023. А вот аналоговый вход/выход передаёт значения только в диапазоне от 0 до 255.
Потенциометр — вещь аналоговая. Нет там никакого дискретного диапазона. 0-1023 — это диапазон аналогового входа на Arduino.
KsanderT
10.07.2018 23:29-1Baud (Бод) — количество передачи символьной информации в секунду. Не битов.
количество переключений в секунду, именно тех самых битовvilgeforce
10.07.2018 23:54Если напряжением можно кодировать 4 различных состояния — как тогда быть? А если 16?
AntonSazonov
11.07.2018 01:12количество переключений в секунду, именно тех самых битов
Откуда вы это взяли?
vasimv
11.07.2018 05:10По-моему, вы оба немного правы и немного не правы. :)
Количество переключений в секунду — да. Но не битов. И да, это количество символьной информации, только символ в данном случае — не байт. :)
saw_tooth
10.07.2018 23:09+1Короткие объяснения по коду. Деление на 4 необходимо для следующего. Потенциометр может принимать значения от 0 до 1023. А вот аналоговый вход/выход передаёт значения только в диапазоне от 0 до 255. Поэтому деление нам в данном случае просто необходимо.
Вобще не поддается какой либо конструктивной критике. Только маты
И вобще эта функция достаточно часто бывает полезна при работе с Arduino
А еще полезно знать о том, что битовый сдвиг так же делит числа на 2, и Вашу map функцию можно заменить на банальное i >> 2.
Серия статей продолжается…vasimv
11.07.2018 05:11Со сдвигом бит надо быть осторожнее. Лучше все-таки писать «x/2», компиляторы сами там разберутся — сдвигать или делить (по скорости, впрочем, на современных микроконтроллерах — одинаково).
SergeyMax
Я ардуинщик, я так вижу (с)
siryoshka
Всё что не имеет // Reset, уже относится к аналоговой технике.
DmitriyDev
Уж лучше пусть ардуины программирует, чем под подъездами пиво пьёт. (с)
А если серьёзно, может так и лучше объяснять, ведь почти все датчики для ардуино имеют дополнительное питание.
Т.е. я считаю что ардуинщик должен разбираться в схемотехнике. Но ведь это статься для новичков, а если новичёк сможет хотя бы заставить светодио мигать и ничего не спалит, это уже хорошо. ИМХО.
saw_tooth
Нет не лучше… я повторю — не лучше.
Не так давно в около ембеддреских статьях, сначала начал появлятся «ардуино контроллер», далее начались сравнение голых контроллеров и Ардуино (то есть ардуино стал для масс людей априори в лице контроллера).
Теперь мы нашли +5 вольт вывод у потенциометра… я очень боюсь представить что будет дальше…
Зачем новичкам, изначально культивировать
не вернуюлживую информацию, ведь это будет усвоено и принято за истину, и дальше эта же ложь пойдет по другим людям — так не далеко и до плоской Земли, уж простите.DmitriyDev
Не заю.
С одной стороны, я думаю что неплохо сделать порог вхождения как-можно более низким.
С другой же стороны, я вижу ваш негативный опыт с похожим подходом и понимаю что люди не всегда хотят понимать как что-то на самом деле работает.
Т.е. я исходил из обучения в школе:
Сначала говорят что V = V1 + V2, через некоторое время добавляют какие-то странные вектора, а чуть позже говорят: -вы знаете, мы должны ввести в формулу ещё и скорость света, учите общую теорию относительности.
С другой же стороны школьники не набегают на форумы NASA и не рассказывают как правильно строить спутники (я надеюсь).
vasimv
Ну, про то как работает резисторный делитель — все-таки надо было рассказать. И про то как использовать закон Ома для расчета токоограничительного резистора для светодиода.