СоХабр закрыт.

С 13.05.2019 изменения постов больше не отслеживаются, и новые посты не сохраняются.

H Arduino для начинающих. Часть 3 в черновиках Tutorial

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


Доброго времени суток, Хабр. Как планировала, продолжаю цикл статей, которые помогут Вам в знакомстве с 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);
}

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

–2
~2400

комментарии (20)

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

Я ардуинщик, я так вижу (с)
0
siryoshka ,  
Всё что не имеет // Reset, уже относится к аналоговой технике.
+1
DmitriyDev ,  
Уж лучше пусть ардуины программирует, чем под подъездами пиво пьёт. (с)
А если серьёзно, может так и лучше объяснять, ведь почти все датчики для ардуино имеют дополнительное питание.
Т.е. я считаю что ардуинщик должен разбираться в схемотехнике. Но ведь это статься для новичков, а если новичёк сможет хотя бы заставить светодио мигать и ничего не спалит, это уже хорошо. ИМХО.
+1
saw_tooth ,  
А если серьёзно, может так и лучше объяснять

Нет не лучше… я повторю — не лучше.
Не так давно в около ембеддреских статьях, сначала начал появлятся «ардуино контроллер», далее начались сравнение голых контроллеров и Ардуино (то есть ардуино стал для масс людей априори в лице контроллера).
Теперь мы нашли +5 вольт вывод у потенциометра… я очень боюсь представить что будет дальше…
Зачем новичкам, изначально культивировать не верную лживую информацию, ведь это будет усвоено и принято за истину, и дальше эта же ложь пойдет по другим людям — так не далеко и до плоской Земли, уж простите.
0
DmitriyDev ,  
Не заю.
С одной стороны, я думаю что неплохо сделать порог вхождения как-можно более низким.
С другой же стороны, я вижу ваш негативный опыт с похожим подходом и понимаю что люди не всегда хотят понимать как что-то на самом деле работает.
Т.е. я исходил из обучения в школе:
Сначала говорят что V = V1 + V2, через некоторое время добавляют какие-то странные вектора, а чуть позже говорят: -вы знаете, мы должны ввести в формулу ещё и скорость света, учите общую теорию относительности.
С другой же стороны школьники не набегают на форумы NASA и не рассказывают как правильно строить спутники (я надеюсь).
+1
vasimv ,  
Ну, про то как работает резисторный делитель — все-таки надо было рассказать. И про то как использовать закон Ома для расчета токоограничительного резистора для светодиода.
0
FGV ,  
А чтоб рассчитать нужное сопротивление надо воспользоваться законом Ома ...

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

+3
AntonSazonov ,  

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


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


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

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

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

количество переключений в секунду, именно тех самых битов
0
vilgeforce ,  
Если напряжением можно кодировать 4 различных состояния — как тогда быть? А если 16?
0
AntonSazonov ,  
количество переключений в секунду, именно тех самых битов
Откуда вы это взяли?
0
vasimv ,  
По-моему, вы оба немного правы и немного не правы. :)

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

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

А еще полезно знать о том, что битовый сдвиг так же делит числа на 2, и Вашу map функцию можно заменить на банальное i >> 2.
Серия статей продолжается…
0
vasimv ,  
Со сдвигом бит надо быть осторожнее. Лучше все-таки писать «x/2», компиляторы сами там разберутся — сдвигать или делить (по скорости, впрочем, на современных микроконтроллерах — одинаково).
0
avs24rus ,  
Желание нести в массы бред, выше здравого смысла.
0
REPISOT ,  
Тема расчета резистора для светодиода не раскрыта.
0
lenz1986 ,  
Не дай бог такое обучение куда пойдет дальше!!!
Не понимая ничего самому как можно объяснять что то людям?????????

Почитайте хоть вики про аналоговую технику про закон ома, про резисторы вообще… Вы очень сильно удивитесь когда узнаете что есть многооборотные, есть проволочные, есть пленочные, да каких только нет… НО ЭТО аналоговая техника, и объясняя я так вижу значит я так понимаю вы получите стадо баранов не способных применить этот самый резистор куда либо кроме единственной схемы в которой им рассказали что у резистора есть плюс минус и земля!!!

ВЫ например знали что резистор вдруг является регулятором громкости в большинстве аудиоаппаратуры, странно да как имея всего 3 контакта +5 GND OUT через него может проходить звук.

P.S. Честно сори за срыв но я лично не хочу чтобы мои дети росли читая такие вещи, и таких обучалок становится больше, в итоге получается не умеющий думать … я даже хз кто…
0
AlexanderS ,  
Потенциометр может принимать значения от 0 до 1023. А вот аналоговый вход/выход передаёт значения только в диапазоне от 0 до 255. Поэтому деление нам в данном случае просто необходимо.

Автор! Для новичка должно быть все просто, да, но это не должно быть в ущерб понятности же. Даже я мало что понял) Почему «вход потенциометра такой»? Почему входы/выходы аналоговые такие? А какой коэффициент будет, если у нас будет не потенциометр? А почему диапазон значений потенциометра выше, чем диапазон значений входа, к которому он подключен? Статья не дает понимание, а прививает привычку программировать не думая — это плохо, надо понимать что делаешь и думать как это сделать.

P.S.
Реакция сообщества вполне предсказуема, так как материал явно не для хабра)
0
AlexanderS ,  
P.S.2
Ошибочно считать, что новичек обязательно ленивый идиот) В моем понимании, статья для новичка должна как раз быть не в современном твиттероподобном виде, а подробная и наглядная и закрывать первичное понимание. Когда я решил написать цикл по созданию своего веб-сервера я именно из такого принципа исходил. Понятно, что не нужно усложнять, впихивая какой-нибудь матан в статью. Но и все упрощать до уровня пятого класса в корне неправильно.
0
lenz1986 ,  
Статья должна затронуть основы, если уж автор так хотел рассказать что то умное он мог рассказать в общих чертах про ацп-цапы и про то что резистор ограничивает ток проходящий через него, а устроен он так то… Ардуина идеальна тем что позволяет добиться 100% повторяемости у пользователей, в своих начинаниях. Но базовые понятия надо выдавать нормальные, а не отсебятину. Цель не сочинять а заинтересовать людей далее самим изучать