Главная » Статьи » Arduino с нуля » Работа с Arduino |
Иногда, при конструировании устройства, нужно применять плавное увеличение яркости, или наоборот - плавное ее уменьшение. В данной серии уроков, мы поможем вам разобраться с этим вопросом. И подробно расскажем о всех тонкостях данного процесса.
Есть большое количество способов реализации подобной идеи. Мы расскажем вам о трех основных, это:
Все три пункта будут разделены на три части соответственно. В данном уроке мы разберем первый пункт - управление яркостью светодиода программным методом.
Суть метода хотелось бы пояснить на небольшом, но очень актуальном примере: Имеется кинотеатр. Во время всего сеанса, свет в зале выключен, и зрители смотрят фильм. Как только фильм заканчивается, по сути, должен включаться свет. Если он включится резко, то это очень негативно скажется на зрении зрителей. Поэтому в большинстве кинотеатров, такая ситуация предусмотрена. После сеанса, свет включается плавным нарастанием яркости. Вот чтобы достичь такого эффекта, с помощью Arduino, или других цифровых устройств, рациональнее будет использовать изменение яркости программным методом.
Конечно, данный пример не отображает всех аспектов и вариантов использования данного метода. Но для примера, я думаю, этого достаточно. Теперь давайте подробнее разберем данный способ.
В основе метода лежит широтно-импульсная модуляция, она же ШИМ. Если вы не сталкивались с этим понятием, или не понимаете его суть, то советую для начала прочитать эту статью. Для этого урока понадобятся следующие компоненты:
Подключаем светодиоды к Arduino по схеме представленной ниже: Та же самая схема, только в другом представлении: Вы можете использовать любой пин Arduino, в номере которого имеется знак тильды "~". Именно в этих пинах может использоваться ШИМ. Схема в сборе:
Теперь, когда схема собрана. Перейдем в программную часть. Суть метода состоит именно в том, что алгоритм изменения яркости светодиода будет заложена в программе, и в процессе выполнения, мы уже никак не сможем влиять на работу нашего устройства.
Открываем программу Arduino IDE и пишем следующий код: int led_1 = 3; //Номер пина первого светодиода void setup() { pinMode (led_1 , OUTPUT); //режим пина led_1 на выход } void loop() { analogWrite (led_1 , 20); //Выставляем значение уровня пина led_1 равный 20 delay (400); //Выжидаем паузу в 400мс analogWrite (led_1 , 50); //Выставляем значение уровня пина led_1 равный 50 delay (400); //Выжидаем паузу в 400мс analogWrite (led_1 , 110); //Выставляем значение уровня пина led_1 равный 110 delay (400); //Выжидаем паузу в 400мс analogWrite (led_1 , 170); //Выставляем значение уровня пина led_1 равный 170 delay(400); //Выжидаем паузу в 400мс analogWrite (led_1 , 230); //Выставляем значение уровня пина led_1 равный 230 delay(400); //Выжидаем паузу в 400мс analogWrite (led_1 , 255); //Выставляем значение уровня пина led_1 равный 255 delay(400); //Выжидаем паузу в 400мс } Как мы видим, появилась новая функция analogWrite(pin , value). Функция выдает аналоговую величину (value) на порт вход/выхода (pin).
Таким образом, с помощью данной функции, мы можем контролировать яркость нашего светодиода, подавая значения от 0 (минимум 0В) до 255 (максимум 5В). Если пробежаться по алгоритму, то мы видим, что в начале мы выставляем значение уровня нашего пина равное 20. analogWrite (led_1 , 20); Потом, через небольшую задержку (400мс), delay (400); мы изменяем уровень на 50, analogWrite (led_1 , 50); и потом через задержку до уровня 255. После того, как уровень стал равен 255 (соответствующее максимальному значению 5В), analogWrite (led_1 , 255); происходит задержка, после чего программа переходит в начало. И все повторяется снова.
Видео работы такого устройства:
Если посмотреть внимательно, то переходы с одного уровня на другой, сопровождаются небольшими скачками. Есть несколько способов, чтобы избавиться от такого эффекта.
Первый пункт, в связи с нерациональностью, мы использовать не будем. Перейдем сразу ко второму способу. Мы можем добавить в наш код еще несколько подобных строк:
analogWrite (led_1 , value);
delay (400);
с разными значениями уровня. Чем больше таких уровней, тем более плавный будет переход. Это все конечно же хорошо. Но сколько таких строк мы добавим? Пять? Десять? Этот способ нам не подходит, хотя бы потому, что большое количество таких строк, повлечет за собой трату памяти нашего контроллера. И не всегда эффект от такого способа будет хороший.
Поэтому делаем следующее: добавьте следующий код в новом проекте Arduino IDE (или измените старый):
int led_1 = 3; //Номер пина первого светодиода void setup() { pinMode (led_1 , OUTPUT); //режим пина led_1 на выход } void loop() { for (int i = 0; i <= 255 ; i++) { analogWrite(led_1 , i); delay (20); } }
Как вы видите, заместо старых строк, в программе, появилось несколько новых, значительно отличающихся по количеству: for (int i = 0; i <= 255 ; i++) { analogWrite(led_1 , i); delay (20); }
Давайте же разберемся что это за строки. for() - это цикл. Цикл - это многократное прохождение по одному и тому же коду программы. В общем виде цикл for записывается так: for (выражение 1; выражение 2; выражение 3) { один оператор или блок операторов }
Если рассмотреть цикл на примере нашего случая, то алгоритм действий будет таков:
И так далее. До тех пор, пока i не станет равно 256. Условие станет ложным (256 < =255) и цикл прервется. Получается, что последнюю операцию, которую выполнит программа, будет подача на pin led_1 значение уровня 255. И потом все повторится сначала - с уровня 0.
Давайте же посмотрим, как будет работать наше устройство с таким алгоритмом: Как мы видим, применение цикла привело к тому, что нарастание яркости стало очень плавным и приятным на взгляд. А также, уменьшило объем занимаемой памяти микроконтроллера (что в больших проектах очень важно).
Вы можете немного поэкспериментировать со значениями задержки, с шагом цикла, а также можете добавить несколько дополнительных светодиодов и создать свой алгоритм, с использованием данного метода.
Задание для самостоятельного выполнения: Задание к данному уроку будет только одно: постарайтесь сделать так, что при достижении максимального значения уровня яркости (255 5В), светодиод начал плавно затухать. Это можно реализовать добавлением еще одного такого цикла, только с другими параметрами.
Третий урок проекта "Arduino с нуля" подошел к концу. Надеюсь тема была для вас полезной, и вы узнали что-нибудь новое. Также надеюсь, что при выполнении задания у вас не возникнет вопросов и вы справитесь самостоятельно. Если же что-нибудь не будет получаться, или у вас появятся какие-либо вопросы, не стесняйтесь, и оставляйте их в комментариях или же на форуме.
Если Вам понравился наш урок, поделитесь им с друзьями.
←Предыдущий урок | Следующий урок→
| |
Просмотров: 7566 | Комментарии: 10 | |
Всего комментариев: 10 | |
| |