Управление яркостью дхо с помощью шим arduino. Регулирование яркости светодиода. Скетч управления яркостью светодиодной ленты Arduino
Управление яркостью дхо с помощью шим arduino. Регулирование яркости светодиода. Скетч управления яркостью светодиодной ленты Arduino
И попробуем выполнить новую задачу. Думаю, что все видели новогодние витринные гирлянды, в которых плавно мигают светодиоды. Допустим, что мы хотим сделать нечто подобное.
Мы уже рассматривали функцию digitalWrite() и знаем, что значение, которое она записывает, может быть двух вариантов — высокий или низкий уровень. В данном случае нам поможет функция analogWrite(). «Формулировки» функций различаются только начальными приставками, поэтому их легко запомнить.
Функция analogWrite(), так же как и digitalWrite(), содержит в скобках два аргумента и работает по тому же словесному принципу: «куда, что». Главным различием является возможность записи широкого диапазона значений вместо привычного LOW или HIGH. Это и позволит нам регулировать яркость светодиода. Главное замечание, которое необходимо учитывать, это то, что данная функция работает только на определенных контактах. Эти контакты обозначены символом «
«. Этот символ означает, что это PWM-контакт. PWM (pulse-width modulation) звучит по-русски как ШИМ (широтно-импульсная модуляция). Принцип работы основан на изменении длительности импульса. Графически это можно изобразить так:
Давайте попробуем разобраться как это работает, рассмотрев простой пример. Для этого необходимо подключить светодиод к PWM-контакту через резистор номиналом 150 Ом и «зашить» в Arduino простенькую программу. Схема подключения и код скетча представлены ниже:
Думаю, что в целом код понятен, но необходимо уделить немного внимания циклу for(). Существует такое понятие как разрешение. Поскольку мы работаем с 8-битным разрешением (это будет рассмотрено несколько позднее), то минимальному значению будет соответствовать 0, а максимальному — 255. В конце каждой итерации мы установили временную задержку в 10мс.
Давайте вернемся к схеме из предыдущего урока и попробуем сделать аналогичную гирлянду с использованием функции analogWrite().
Пояснения к коду
С помощью директивы #define мы сказали компилятору заменять идентификатор POT_PIN на A0 — номер аналогового входа. Вы можете встретить код, где обращение к аналоговому порту будет по номеру без индекса A . Такой код будет работать, но во избежание путаницы с цифровыми портами используйте индекс.
Переменным принято давать названия, начинающиеся со строчной буквы.
Чтобы использовать переменную, необходимо ее объявить, что мы и делаем инструкцией:
Переменные одного типа можно объявить в одной инструкции, перечислив их через запятую, что мы и сделали
Функция analogRead(pinA) возвращает целочисленное значение в диапазоне от 0 до 1023, пропорциональное напряжению, поданному на аналоговый вход, номер которого мы передаем функции в качестве параметра pinA
Обратите внимание, как мы получили значение, возвращенное функцией analogRead() : мы просто поместили его в переменную rotation с помощью оператора присваивания = , который записывает то, что находится справа от него в ту переменную, которая стоит слева
Вопросы для проверки себя
Можем ли мы при сборке схемы подключить светодиод и потенциометр напрямую к разным входам GND микроконтроллера?
В какую сторону нужно крутить переменный резистор для увеличения яркости светодиода?
Что будет, если стереть из программы строчку pinMode(LED_PIN, OUTPUT) ? строчку pinMode(POT_PIN, INPUT) ?
Зачем мы делим значение, полученное с аналогового входа перед тем, как задать яркость светодиода? что будет, если этого не сделать?
Схема регулятора яркости светодиодной ленты на Arduino UNO
Этот регулятор предназначен для регулировки яркости светодиодной ленты белого свечения, используемой для освещения помещения. Обычно для регулировки яркости светодиодной ленты применяют регуляторы, работающие двумя кнопками, — на уменьшение и на увеличение яркости.
Но это не всегда удобно, потому что начинать нужно с какого-то минимального или максимального значения, и либо удерживать кнопку длительное время, пока яркость не будет такой, как нужно, или многократно нажимать регулировочную кнопку. Таких регуляторов описано в литературе очень много.
Этот же отличается тем, что работает как переключатель десяти фиксированных значений яркости, заданных при программировании, каждый из которых включается отдельной кнопкой. Это позволяет сразу включить освещение на нужную яркость, без каких-то регулировочных переходных процессов.
Для управления используется пульт дистанционного управления марки TOSHIBA SE-R0301 от неисправного DVD-плеера. Но, в принципе, можно использовать любой другой пульт, соответственно внеся изменения в программу. У выше указанного пульта есть одиннадцать цифровых кнопок, от «0» до «9» и кнопка «+10».
Было решено кнопку «0» использовать для выключения ленты, а кнопку «+10» для включения её на максимальную яркость Для остальных цифровых кнопок заданы промежуточные значения яркости, которые можно изменить «по вкусу» при программировании. Этот регулятор яркости сделан на основе микроконтроллерной платы ARDUINO UNO.
Использование недорогой готовой платы ARDUINO UNO интересно тем, что это готовый модуль, — небольшая печатная плата, на которой расположен микроконтроллер ATMEGA328, а так же вся его «обвязка», необходимая для его работы, включая USB-программатор и стабилизатор напряжения питания.
Принципиальная схема
Принципиальная схема показана на рисунке. Для приема команд пульта дистанционного управления используется фотоприемник F1 типа TSOP4838, но можно применить и любой другой аналогичный. Сигнал от него поступает на цифровой порт D2, который используется для работы на прием.
Рис. 1. Принципиальная схема регулятора яркости светодиодной ленты на Arduino UNO.
У платы ARDUINO UNO имеется 14 цифровых портов, от DO до D13. При этом шесть из них (D3, D5, D6, D9, D10, D11) могут работать как бы в аналоговом режиме, в котором на них присутствует не ноль или единица, а импульсы, широту которых можно задавать от 255-ю ступенями.
Это позволяет осуществлять качественную регулировку яркости осветительных приборов, либо при помощи интегрирующей цепи получать на выходе постоянное напряжение, пропорциональное скважности импульсов.
Данное устройство предназначено для регулировки яркости одной светодиодной ленты белого свечения. Для этого можно взять любой из выше перечисленных портов. В данном случае взят порт D5.
Импульсы с него подаются на затвор полевого транзистора VТ1, в стоковой цепи которого включена светодиодная лента HL1, яркость которой и нужно регулировать.
Программа
Программа для ARDUINO UNO приводится в таблице 1. Данная программа требует загрузки библиотеки IRremote.h которая нужна для распознавания команд пульта ДУ. Эта библиотека есть в стандартном наборе программного обеспечения для ARDUINO, у меня версия Arduino 1.6.11.
Далее идет назначение портов.
входным назначен порт D2. На него подается сигнал с выхода интегрального фотоприемника. А в строке:
выходным назначен порт D5.
Рис. 2. Исходный код программы для регулятора яркости светодиодной ленты на Arduino UNO.
В программе после «case 0х» записаны коды команд, которые формируется при нажатии соответствующей кнопки пульта дистанционного управления. Эти коды соответствуют пульту TOSHIBA SE-R0301 от неисправного DVD-плеера. Можно использовать и другой пульт, но тогда и коды будут другие. После поступления соответствующего кода указывается уровень скважности импульсов на нем. например, при нажатии кнопки «1» устанавливается на порту D5 20-й уровень широты импульсов :
analogWrite( 5, 20);
А при нажатии кнопки «10» устанавливается на порту D5 самый большой 255-й уровень широты импульсов, при котором лента светит на полную яркость :
analogWrite( 5, 255);
Для выключения ленты нужно нажать кнопку «0», при этом устанавливается на порту D5 нулевой уровень широты
определение кодов команд пульта
IRrecv irrecv(2); // фотоприемник на порту D2
Serial.begin(9600); // задание скорости порта COM
irrecv.enableIRIn(); // запуск приема команды
Serial.println(results.value, HEX); // вывод данных в COM
irrecv.resume(); // прием следующей команды
импульсов, при котором лента не светит вообще :
Таким образом, при нажатии кнопок от «0» до «10» происходит фактическое изменение скважности импульсов на порту D5, которые поступают на затвор полевого транзистора VT1 и питают через него светодиодную ленту, яркость которой зависит от скважности этих импульсов. В программе между нулевым и максимальным заданы уровни скважности 20, 30, 50, 70, 100, 130, 160, 180, 220.
При нажатии соответствующей кнопки свечение ленты изменяет скачком сразу до соответствующего значения, без регулировочных переходных процессов, требующих удержания кнопки нажатой длительное время или многократного нажатия.
Но об этом уже написано выше. Если заданные в программе уровни яркости по какой-то причине не устраивают, можно ввести какие угодно, и в любом порядке, важно чтобы это было целое число в пределах от 0 до 255.
Данным устройством, как сказано выше, можно управлять и другим пультом, другими кнопками, можно использовать больше кнопок для регулировки, задав больше фиксированных значений яркости (уровня скважности).
Но нужно будет предварительно разобраться, какие коды соответствуют выбранным кнопкам другого пульта. Для этого нужно сначала загрузить в ARDUINO UNO программу из таблицы 2, которая предназначена для определения кодов кнопок пульта.
После загрузки данной программы в микроконтроллер платы ARDUINO UNO, нужно открыть монитор COM-порта, для этого в окне программы Arduino 1.6.11 выбираем «Инструменты» и из выпадающего меню «Монитор порта». После того как откроется окошко Монитора порта, берем пульт ДУ и нажимаем интересные нам кнопки.
В окне монитора порта будет отображаться код, соответствующий каждой кнопке. Следует заметить, что может быть такое, что при нажатии каждой кнопки приходит две команды, — сначала код команды, а затем код FFFFFFF. Или даже несколько строк кода FFFFFFF.
Так вот, первое это код команды, который нужно занести в программу в таблице 1 после «case Ох», а вторая строка или строки букв «F» это просто указатель на то, как долго кнопка удержана нажатой, в одном случае. В другом случае может показывать, что кнопку отпустили Для нашего случая это несущественно, — важен только код самой команды.
Подключение и управление светодиодами с помощью Arduino
На данном уроке мы научимся подключать светодиоды к Arduino, используя макетную плату, программировать включение и выключение светодиодов.Реализуем мини проект светофор. В данном проекте у нас будет подключено два светодиода, один зеленый, другой красный, они поочередно должны зажигаться через определенный интервал времени. Чтобы подключить светодиоды, их нужно установить на макетную плату. Длинная ножка светодиода соответствует ”+” подключение в выбранный пин, короткая ножка светодиода соответствует “-” подключение к GND .
Соединяем плату Arduino с синей полоской макетной платы, теперь вся эта полоска будет GND.Чтобы светодиод не сгорел, необходимо последовательно включать с сопротивлением 220 ом. Все входы макетной платы на одной вертикальная линии соединены между собой. Поэтому для подключения резистора к длинной ножке, вставляем один конец резистора на общую полоску длинной ножки светодиода, другой конец втыкаем в любую другую полоску макетной платы. Для того чтобы мы могли управлять яркостью светодиодов, мы должны их подключить к пинам с тильдой “
”. Это ШИМ порты платы ардуино. Если в проекте не надо управлять ярокстью светодиода, их можно подключить к пинам без тильды.
1.В программе мы прописываем переменные, которые отвечают за пины:
int RED_PIN = 10; // пин отвечает за красный светодиод
int GREEN_PIN = 11;// пин отвечает за зеленый светодиод
2. В void setup () прописываем настройку пинов на OUTPUT:
pinMode (GREEN_PIN, OUTPUT);
pinMode(RED_PIN, OUTPUT);
3. Чтобы зажечь светодиод, в void loop() используются команда :
analogWrite (НОМЕР ПИНА, ЯРКОСТЬ);
Яркость меняется в диапазоне от 0 до 255
4. С помощью функции delay () можно управлять длительностью команды, в нашем случае длительностью горения светодиода. delay (1000) соответствует задержке на 1 Чтобы погасить светодиод, яркость, опускаем до нуля.
5. Если используется цифровой пин (без тильды), чтобы включить светодиод, нужно прописать:
digitalWrite (НОМЕРПИНА, HIGH);
Чтобы погасить светодиод используется
digitalWrite (НОМЕРПИНА, LOW);
Программа для проекта светофор на ардуино:
int RED_PIN = 10;
int GREEN_PIN = 11;
void setup ()
<
pinMode (GREEN_PIN, OUTPUT);
pinMode(RED_PIN, OUTPUT);
>
void loop ()
<
analogWrite(RED_PIN, 85);
delay(250);
analogWrite(RED_PIN, 0);
delay(250);
analogWrite(GREEN_PIN, 85);
delay(250);
analogWrite(GREEN_PIN, 0);
delay(250);
>
Вернуться к содержанию Перейти к теме Подключение и программирование датчиков
Ардуино как плавно включить светодиод кнопкой. Регулирование яркости светодиода
На этом примере Вы научитесь изменять яркость светодиода, используя резисторы с различным сопротивлением.
Для данного примера вам понадобятся
1 светодиод диаметром 5 мм
1 резистор на 270 Ом (красный, фиолетовый, коричневый)
1 резистор на 470 Ом (желтый, фиолетовый, коричневый)
1 резистор на 2.2 кОм (красный, красный, красный)
1 резистор на 10 кОм (коричневый, черный, оранжевый)
Светодиоды — общие сведения
Светодиоды отлично служат в устройствах для разного рода индикации. Они потребляют мало электричества и при этом долговечны.
В данном примере мы используем самые распространенные светодиды диаметром 5 мм. Также распространены светодиоды диаметром 3 миллиметра, ну и большие светодиоды диаметром 10 мм.
Подключать светодиод напрямую к батарейке или источнику напряжения не рекомендуется. Во-первых, надо сначала разобраться, где именно у светодиода отрицательная и положительная ноги. Ну а во вторых, необходимо использовать токоограничивающие резисторы, иначе светодиод очень быстро перегорит.
Если вы не будете использовать резистор со светодиодом, последний очень быстро выйдет из строя, так как через него будет проходить слишком большое количество тока. В результате светодиод нагреется и контакт, генерирующий свет, разрушится.
Различить позитивную и негативную ноги светодиода можно двумя способами.
Первый – позитивная нога длиннее.
Второй – при входе в корпус самого диода на коннекторе негативной ноги есть плоская кромка.
Если вам попался светодиод, на котором плоская кромка на более длинной ноге, длинная нога все равно является позитивной.
Резисторы — общие сведения
Resist – сопротивление (англ.)
Из названия можно догадаться, что резисторы сопротивляются потоку электричества. Чем больше номинал (Ом) резистора, тем больше сопротивление и тем меньше тока пройдет по цепи, в которой он установлен. Мы будем использовать это свойство резисторов для регулирования тока, который проходит через светодиод и, таким образом, его яркость.
Но сначала погорим немного о резисторах.
Единицы, в которых измеряется сопротивление – Ом, которые во многих источниках обозначаются греческой буквой Ω – Омега Так как Ом – маленькое значение сопротивления (практически незаметное в цепи), мы часто будем оперировать такими единицами как кОм — килоом (1000 Ом) и МОм мегаом (1000000 Ом).
В данном примере мы будем использовать резисторы с четырьмя различными номиналами: 270 Ω, 470 Ω, 2.2 кΩ и 10 кΩ. Размеры этих резисторов одинаковы. Цвет тоже. Единственное, что их различает – цветные полоски. Именно по этим полоскам визуально определяется номинал резисторов.
Для резисторов, у которых три цветные полоски и последняя золотистая, работают следующие соответствия:
Первые две полоски обозначают первые 2 числовых значения, так что красный, филетовый означает 2, 7. Следующая полоска – количество нулей, которые необходимо поставить после первых двух цифр. То есть, если третья полоска коричневая, как на фото выше, будет один нуль и номинал резистора равен 270 Ω.
Резистор с полосками коричневого, черного, оранжевого цветов: 10 и три нуля, так что 10000 Ω. То есть, 10 кΩ.
В отличии от светодиодов, у резисторов нет положительной и и отрицательной ног. Какой именно ногой подключать их к питанию/земле – неважно.
Схема подключения
Подключите в соответствии со схемой, приведенной ниже:
На Arduino есть пин на 5 В для питания периферийных устройств. Мы будем его использовать для питания светодиода и резистора. Больше вам от платы ничего не потребуется, только лишь подключить ее через USB к компьютеру.
С резистором на 270 Ω, светодиод должен гореть достаточно ярко. Если вы вместо резистора на 270 Ω установите резистор номиналом 470 Ω, светодиод будет гореть не так ярко. С резистором на 2.2 кΩ, светодиод должен еще немного затухнуть. В конце-концов, с резистором 10 кΩ, светодиод будет еле виден. Вполне вероятно, чтобы увидеть разницу на последнем этапе вам придется вытянуть красный переходник, использовав его в качестве переключателя. Тогда вы сможете увидеть разницу в яркости.
Кстати, можно провести этот опыт и при выключенном свете.
Разные варианты установки резистора
В момент, когда к одной ноге резистора подключено 5 В, вторая нога резистора подключается к позитивной ноге светодиода, а вторая нога светодиода подключена к земле. Если мы переместим резистор так, что он будет располагаться за светодиодом, как показано ниже, светодиод все равно будет гореть.
Мигание светодиодом
Мы можем подключить светодиод к выходу Arduino. Переместите красный провод от пина питания 5V к D13, как это показано ниже.
Теперь загрузите пример “Blink”, который мы рассматривали . Обратите внимание, что оба светодиода – встроенный и установленный вами внешний начали мигать.
Давайте попробуем использовать другой пин на Arduino. Скажем, D7. Переместите коннектор с пина D13 на пин D7 и измените следующую строку вашего кода:
Загрузите измененный скетч на Arduino. Светодиод продолжит мигать, но на этот раз, используя питание от пина D7.
Как рождаются программы
Это будет немного не обычная статья, в ней я попробую не просто показать готовый код, который что-то делает, а покажу как рождается устройство и прошивка для него. Мы рассмотрим логику работы программы и то как эту логику построить.
Сегодня мы с вами будем решать следующую задачу: есть 2 светодиода их надо подключить к Arduino и реализовать возможность регулировать яркость их горения.
Первым делом надо продумать как будет выглядеть наше устройство и что нам понадобится для его реализации, нам надо чем то регулировать яркость светодиодов и видеть в каком режиме сейчас работают светодиоды для этого отлично подходит lcd shield который мы рассматривали в прошлой статье .
Теперь нам осталось подключить светодиоды, для этого отлично подходит так называемый бредборд, это пластиковая штуковина (не знаю как ее по другому назвать) в которую без пайки можно подключить провода от Arduino и другие электронные компоненты, что очень удобно когда ты точно не знаешь как будет выглядеть готовое устройство или схема нужно всего на несколько запусков. Китайцы клепают огромное количество их разновидностей, я лично пользуюсь таким:
Для простоты понимания как он устроен внутри я приложу схему внутренних соединений:
Подключение светодиодов к Arduino
Многие сейчас скажут: что сложного в подключении светодиода, это же лампочка! И будут не правы, светодиод — это далеко не простая лампочка, а полупроводниковый световой прибор. Который питается не напряжением как обычная лампочка, а током и если ток превысит допустимые значения, то светодиод начнет деградировать, его яркость будет уменьшатся что станет заметно через некоторое время, зависящее от мощности протыкаемого тока или, вообще моментально сгорит.
Как избежать порчи светодиода из-за большого тока? Все очень просто: нужно использовать токоограничивающий резистор, который надо рассчитывать для каждого светодиода в зависимости от его характеристик. Расчет резисторов для светодиода — это тема для отдельной статьи и сегодня мы не будем углубляться в эту тему так как скорей всего вы не знаете характеристик светодиода, который вы где-то нашли. На этот случай я использую маленькое правило: если светодиод не яркий, то я запитываю его через резистор сопротивлением от 220 до 400 ом в зависимости от того какой резистор был под рукой. Главное запомнить правило – лучше больше чем меньше. При большем сопротивлении чем требуется светодиоду, он просто будет гореть тусклее нормы.
Теперь надо определится как регулировать яркость светодиода, для этого можно использовать переменные резисторы что в принципе исключит интерактивную регулировку и по этому мы не будем использовать данный способ в этой статье. Мы будем использовать ШИМ реализованный на плате Arduino.
Что такое ШИМ
ШИМ (широтно-импульсная модуляция) – это изменение скважности сигнала на определенном отрезке времени. Шим сигнал имеет следующий вид по сравнению с постоянным сигналом:
На этой картинке 100% рабочего цикла это отсутствие ШИМ как такового, сигнал идет без изменений, как будто вывод просто подключен к 5 вольтам.
0% рабочего цикла это отсутствие какого-либо сигнала, как будто провод никуда не подключен.
Остальные режимы работы — это быстрое переключение режимов работы что заставляет светодиод как бы моргать с большой скоростью не заметной глазу человека (100 раз в секунду) что и заставляет его гореть с не полной яркостью. Arduino в зависимости от версии используемого чипа имеет разное количество ШИМ выходов, на плате они помечены знаком
из прошлой статьи мы знаем что это 6 выходов 3, 5, 6, 9, 10, и 11 мы будем использовать 10 и 11 выводы.
Давайте наконец то подключим светодиоды к плате. Надеваем на Arduino наш lcd shield и собираем следующею схему для которой нам понадобится бредборд, 2 светодиода, 2 резистора на 250 ом, и 3-4 провода папа- папа. Схема будет иметь следующий вид:
И не забываем, что у светодиода есть полярность, длинная или кривая (как на схеме) ножка светодиода — это плюс который и подключается через резистор.
На этом я наверно закончу первую часть статьи, во второй части мы займемся именно проработкой логики работы и написанием кода программ. Всем добра!
Потенциометр — это переменный резистор, который при повороте ручки изменяет свое сопротивление.
Что требуется для проекта:
- Arduino UNO или любой другой аналог
- Макетная плата
- Потенциометр
- Светодиод
- Резистор 220 Ом
Схема подключения на макетной плате.
Для того, чтобы регулировать яркость светодиода, подключим его к разъему, который поддерживает ШИМ, в нашем случае это цифровой пин 3. Разъемы VCC и GND потенциометра подключаем к рельсе питания и земли макетной платы. Разъем A0 подключаем к аналоговому пину A0.
После удачной сборки схемы загружаем данный скетч:
Теперь попробуем написать код для этой же схемы, но на чистом СИ в среде AtmelStudio 7. Выглядеть это будет так.
Думаю, что в целом код понятен, но необходимо уделить немного внимания циклу for(). Существует такое понятие как разрешение. Поскольку мы работаем с 8-битным разрешением (это будет рассмотрено несколько позднее), то минимальному значению будет соответствовать 0, а максимальному — 255. В конце каждой итерации мы установили временную задержку в 10мс.
Давайте вернемся к схеме из предыдущего урока и попробуем сделать аналогичную гирлянду с использованием функции analogWrite().
int buttonPin = 2;
int pins = <3,5,6,9,10,11>;boolean lastButton = LOW;
boolean currentButton = LOW;
boolean enable = false;void setup()
<
pinMode(buttonPin, INPUT);
for(int mode = 0; mode = 0; brightness—)
<
analogWrite(pins[i], brightness);
delay(1);
>
delay(40);
>
>If(enable == false)
<
for(int i = 0; i СПИСОК ДЕТАЛЕЙ ДЛЯ ЭКСПЕРИМЕНТА