Ардуїно плавне включення RGB світлодіода від кнопки. Управління яскравістю світлодіода за допомогою потенціометра. Опис програми для Arduino

У цьому експерименті ми додаємо порцію яскравості світлодіоду однією кнопкою та зменшуємо іншою.

СПИСОК ДЕТАЛІВ ДЛЯ ЕКСПЕРИМЕНТУ

- 1 плата Arduino Uno;

- 1 безпайкова макетна плата;

- 2 тактові кнопки;

- 1 резистор номіналом 220 Ом;

- 1 світлодіод;

- 7 проводів "тато-тато".

ПРИНЦИПОВА СХЕМА

СХЕМА НА МАКЕТНІЙ ПЛАТІ

ЗВЕРНІТЬ УВАГУ

  • Якщо ви переробляєте схему із схеми попереднього експерименту, зверніть увагу, що цього разу нам потрібно підключити світлодіод до порту, що підтримує ШІМ.

СКЕТЧ

скачати для Arduino IDE
#define PLUS_BUTTON_PIN 2 #define MINUS_BUTTON_PIN 3 #define LED_PIN 9 int brightness = 100; boolean plusUp = true; boolean minusUp = true; void setup() ( pinMode(LED_PIN, OUTPUT); pinMode(PLUS_BUTTON_PIN, INPUT_PULLUP); pinMode(MINUS_BUTTON_PIN, INPUT_PULLUP); ) void loop() ( analogWrite(LED_PIN, brightness); plusUp = handleClick(PLUS_BUTTON_PIN, plusUp, +35); minusUp = handleClick(MINUS_BUTTON_PIN, minusUp, -35); градацією // Яскравості при натисканні на кнопку (delta). Функція повертає // (англ. return) назад нове, поточний стан кнопки boolean handleClick(int buttonPin, boolean wasUp, int delta) (boolean isUp = digitalRead(buttonPin); if (wasUp && !isUp) (delay(10); = digitalRead(buttonPin);// якщо був клік, змінюємо яскравість в межах від 0 до 255 if (!isUp) brightness = constrain(brightness + delta, 0, 255); ) return isUp; код)

ПОЯСНЕННЯ ДО КОДУ

  • Ми можемо користуватися не лише вбудованими функціями, а й створювати власні. Це обґрунтовано, коли нам потрібно повторювати ті самі дії в різних місцях коду або, наприклад, потрібно виконувати ті самі дії над різними даними, як у даному випадку: обробити сигнал із цифрових портів 2 і 3.
  • Визначити власні функції можна будь-де коду поза кодом інших функцій. У нашому прикладі ми визначили функцію після loop .
  • Щоб визначити власну функцію нам потрібно:
    • Оголосити, який тип даних вона повертатиме. У нашому випадку це boolean. Якщо функція лише виконує якісь дії та не повертає жодного значення, використовуйте ключове слово void
    • Призначити ім'я функції — ідентифікатор. Тут діють самі правила, що з іменуванні змінних і констант. Називати функції прийнято у тому ж стилі якЗмінні .
    • У круглих дужках перерахувати параметри, що передаються в функцію, вказавши тип кожного. Це оголошення змінних, видимих ​​всередині новостворюваної функції, і лише всередині неї. Наприклад, якщо в даному експерименті ми спробуємо звернутися до wasUpабо isUpз loop()отримаємо від компілятора повідомлення про помилку. Так само, змінні, оголошені в loop, іншим функціям не видно, але їх значення можна передати як параметри.
    • Між парою фігурних скобою написати код, що виконується функцією
    • Якщо функція має повернути якесь значення, за допомогою ключового слова returnуказати, яке значення повертати. Це значення має бути того типу, який ми оголосили
  • Звані глобальні змінні, тобто. Змінні, до яких можна звернутися з будь-якої функції, зазвичай оголошуються на початку програми. У нашому випадку це brightness .
  • Усередині створеної нами функції handleClickвідбувається все те саме, що в експерименті.
  • Оскільки при кроці приросту яскравості 35 не більше ніж через вісім натискань поспіль одну з кнопок значення виразу brightness + deltaвийде за межі інтервалу . За допомогою функції constrainми обмежуємо допустимі значення для змінної brightnessзазначеними межами інтервалу.
  • У виразі plusUp = handleClick(PLUS_BUTTON_ PIN , plusUp, +35)ми звертаємось до змінної plusUpдвічі. Оскільки = поміщає значення правого операнда в лівий, спочатку обчислюється, що поверне handleClick. Тому коли ми передаємо їй plusUpяк параметр вона має ще старе значення, обчислене при минулому виклику handleClick .
  • Усередині handleClickми обчислюємо нове значення яскравості світлодіода та записуємо його у глобальну змінну brightnessяка на кожній ітерації loopпросто передається в analogWrite .

ПИТАННЯ ДЛЯ ПЕРЕВІРКИ СЕБЕ

  1. Що означає ключове слово void ?
  2. Як поводиться програма при згадці однієї змінної з різних боків від оператора присвоєння = ?

ЗАВДАННЯ ДЛЯ САМОСТІЙНОГО РІШЕННЯ

  1. Допрацюйте код таким чином, щоб крок зміни яскравості налаштовувався в одному місці.
  2. Створіть ще одну функцію і переробіть код так, щоб одна функція відповідала за відстеження натискань, а інша за обчислення яскравості світлодіода і повертала його в analogWrite .

Тепер розберемося з багатобарвним світлодіодом, який часто називають скорочено: RGB-світлодіод. RGB – це абревіатура, яка розшифровується як: Red – червоний, Green – зелений, Blue – синій. Тобто всередині цього пристрою розміщується одразу три окремі світлодіоди. Залежно від типу RGB-світлодіод може мати загальний катод або загальний анод.

1. Змішання квітів

Чим RGB-світлодіод, краще трьох звичайних? Вся річ у якості нашого зору змішувати світло від різних джерел, розміщених близько один до одного. Наприклад, якщо ми поставимо поруч синій та червоний світлодіоди, то на відстані кілька метрів їхнє свічення зіллється, і око побачить одну фіолетову точку. А якщо додамо ще й зелений, то крапка здасться нам білою. Саме так працюють монітори комп'ютерів, телевізори та вуличні екрани. Матриця телевізора складається з окремих точок різних кольорів. Якщо взяти лупу і подивитися через неї на монітор, то ці точки можна легко побачити. А ось на вуличному екрані точки розміщуються не дуже щільно, тому їх можна розрізнити неозброєним оком. Але з відстані кілька десятків метрів ці точки невиразні. Виходить, що чим щільніше один до одного стоять різнокольорові крапки, тим менша відстань потрібна оку, щоб змішувати ці кольори. Звідси висновок: на відміну від трьох окремих світлодіодів, змішання кольорів RGB-світлодіода помітно вже на відстані 30-70 см. До речі, ще краще себе показує RGB-світлодіод з матовою лінзою.

2. Підключення RGB-світлодіода до Ардуїно

Оскільки багатобарвний світлодіод складається з трьох звичайних, ми підключатимемо їх окремо. Кожен світлодіод з'єднується зі своїм висновком і має окремий резистор. В уроці ми використовуємо RGB-світлодіод із загальним катодом, так що провід до землі буде лише один. Принципова схема
Зовнішній вигляд макету

3. Програма для керування RGB-світлодіодом

Складемо просту програму, яка буде по черзі запалювати кожен із трьох кольорів. const byte rPin = 3; const byte gPin = 5; const byte bPin = 6; void setup() ( pinMode(rPin, OUTPUT); pinMode(gPin, OUTPUT); pinMode(bPin, OUTPUT); ) void loop() ( // гасимо синій, запалюємо червоний digitalWrite(bPin, LOW); digitalWrite(rPin, HIGH), delay (500); // гасимо червоний, запалюємо зелений digitalWrite (rPin, LOW); digitalWrite (gPin, HIGH); bPin, HIGH);delay(500);) Завантажуємо програму на Ардуїно і спостерігаємо результат. Your browser does not support the video tag. Трохи оптимізуємо програму: замість змінних rPin, gPin та bPin застосуємо масив. Це нам допоможе у наступних завданнях. const byte rgbPins = (3,5,6); void setup () ( for (byte i = 0; i<3; i++) pinMode(rgbPins[i], OUTPUT); } void loop() { digitalWrite(rgbPins, LOW); digitalWrite(rgbPins, HIGH); delay(500); digitalWrite(rgbPins, LOW); digitalWrite(rgbPins, HIGH); delay(500); digitalWrite(rgbPins, LOW); digitalWrite(rgbPins, HIGH); delay(500); }

4. Сім кольорів веселки

Тепер спробуємо запалювати одночасно по два кольори. Запрограмуємо таку послідовність кольорів:
  • червоний
  • червоний + зелений = жовтий
  • зелений
  • зелений + синій = блакитний
  • синій
  • синій + червоний = фіолетовий
Помаранчевий колір ми спрощення опустили. Так що, вийшло шість кольорів веселки 🙂 const byte rgbPins = (3,5,6); const byte rainbow = ((1,0,0), // червоний (1,1,0), // жовтий (0,1,0), // зелений (0,1,1), // блакитний ( 0,0,1), // синій (1,0,1), // фіолетовий); void setup () ( for (byte i = 0; i<3; i++) pinMode(rgbPins[i], OUTPUT); } void loop() { // перебираем все шесть цветов for(int i=0; i<6; i++){ // перебираем три компоненты каждого из шести цветов for(int k=0; k<3; k++){ digitalWrite(rgbPins[k], rainbow[i][k]); } delay(1000); } } В результате работы программы получается: Your browser does not support the video tag.

5. Плавна зміна кольору

Ми не дарма підключили RGB-світлодіод до висновків 3, 5 і 6. Як відомо, ці висновки дозволяють генерувати ШІМ сигнал різної шпаруватості. Іншими словами, ми можемо не просто вмикати або вимикати світлодіод, а керувати рівнем напруги на ньому. Робиться це за допомогою функції analogWrite. Зробимо так, що наш світлодіод переходитиме між кольорами веселки не стрибкоподібно, а плавно. const byte rgbPins = (3,5,6); int dim = 1; void setup () ( for (byte i = 0; i<3; i++){ pinMode(rgbPins[i], OUTPUT); } // начальное состояние - горит красный цвет analogWrite(rgbPins, 255); analogWrite(rgbPins, 0); analogWrite(rgbPins, 0); } void loop() { // гасим красный, параллельно разжигаем зеленый for(int i=255; i>=0; i--)( analogWrite(rgbPins, i/dim); analogWrite(rgbPins, (255-i)/dim); delay(10); ) // гасимо зелений, паралельно розпалюємо синій for(int i=255; i> =0; i--)( analogWrite(rgbPins, i/dim); analogWrite(rgbPins, (255-i)/dim); delay(10); ) // гасимо синій, паралельно розпалюємо червоний for(int i=255 i>=0; i--)( analogWrite(rgbPins, i/dim); analogWrite(rgbPins, (255-i)/dim); delay(10); ) ) Змінна dim визначає яскравість свічення. При dim=1 маємо максимальну яскравість. Завантажуємо програму на Ардуїно. Ваш браузер не підтримує відео tag.

Завдання

  1. Індикатор температури. Додамо до схеми термістор і підключимо його до аналогового входу. Світлодіод повинен змінювати свій колір, залежно від температури термістора. Чим нижча температура, тим синіший колір, а чим вище, тим червоніший.
  2. RGB лампи з регулятором. Додамо до схеми три змінних резистора і підключимо їх до аналогових входів. Програма повинна безперервно зчитувати значення резисторів та змінювати колір відповідної компоненти RGB-світлодіода.

На цьому прикладі ви навчитеся змінювати яскравість світлодіода, використовуючи резистори з різним опором.

Для цього прикладу вам знадобляться

1 світлодіод діаметром 5 мм

1 резистор на 270 Ом (червоний, фіолетовий, коричневий)

1 резистор на 470 Ом (жовтий, фіолетовий, коричневий)

1 резистор на 2.2 кОм (червоний, червоний, червоний)

1 резистор на 10 ком (коричневий, чорний, помаранчевий)

Світлодіоди - загальні відомості

Світлодіоди відмінно служать у пристроях для різного роду індикації. Вони споживають мало електрики і при цьому довговічні.

У цьому прикладі ми використовуємо найпоширеніші світлодіди діаметром 5 мм. Також поширені світлодіоди діаметром 3 міліметри, та й великі світлодіоди діаметром 10 мм.

Підключати світлодіод безпосередньо до батареї або джерела напруги не рекомендується. По-перше, треба спочатку розібратися, де саме у світлодіода негативна та позитивна ноги. Ну а по-друге, необхідно використовувати струмообмежуючі резистори, інакше світлодіод дуже швидко перегорить.

Якщо ви не використовуватимете резистор зі світлодіодом, останній дуже швидко вийде з ладу, тому що через нього проходитиме занадто велика кількість струму. В результаті світлодіод нагріється і контакт, що генерує світло, зруйнується.

Розрізнити позитивну та негативну ноги світлодіода можна двома способами.

Перший – позитивна нога довша.

Другий - при вході в корпус самого діода на конектор негативної ноги є плоска кромка.

Якщо вам потрапив світлодіод, на якому плоска кромка на довшій нозі, довга нога все одно є позитивною.

Резистори - загальні відомості

Resist – опір (англ.)

З назви можна здогадатися, що резистори опираються потоку електрики. Чим більший номінал (Ом) резистора, тим більший опір і тим менше струму пройде ланцюгом, в якому він встановлений. Ми будемо використовувати цю властивість резисторів регулювання струму, який проходить через світлодіод і, таким чином, його яскравість.

Але спочатку погоримо трохи про резистори.

Одиниці, в яких вимірюється опір - Ом, які в багатьох джерелах позначаються грецькою буквою Ω - Омега Так як Ом - маленьке значення опору (практично непомітне в ланцюзі), ми часто будемо оперувати такими одиницями як ком - кілом (1000 Ом) та МОм мегаом (1000000 Ом).

У цьому прикладі ми будемо використовувати резистори з чотирма різними номіналами: 270 Ω, 470 Ω, 2.2 кΩ та 10 кΩ. Розміри цих резисторів однакові. Колір також. Єдине, що їх розрізняє кольорові смужки. Саме з цих смужок візуально визначається номінал резисторів.

Для резисторів, у яких три кольорові смужки та остання золотиста, працюють наступні відповідності:

Коричневий 1

Червоний 2

Помаранчевий 3

Зелений 5

Фіолетовий 7

Перші дві смужки позначають перші 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.

На попередніх уроках ми познайомилися з найпростішими схемами — збиранням та . Сьогодні збираємо модель з потенціометром (змінним резистором) та світлодіодом. Така модель може використовуватися для керування роботом.

Потенціометр- Це змінний резистор із регульованим опором.Потенціометри використовують у робототехніці як регулятори різних параметрів — гучності звуку, потужності, напруги тощо. У нашій моделівід повороту ручки потенціометрабуде залежати яскравість світлодіода. Це також одна із базових схем.

Відео-інструкція складання моделі:

Для складання моделі нам знадобиться:

  • плата Arduino (або аналоги);
  • Breadboard;
  • 6 проводів та/або перемичок “тато-тато”;
  • світлодіод;
  • потенціометр (змінний резистор);
  • резистор на 220 Ом;
  • середовище Arduino IDE, яке можна завантажити з сайту Arduino.

Що знадобиться для підключення потенціометра та світлодіода на Arduino?

Схема підключення моделі Arduino з потенціометром та світлодіодом:

Схема підключення моделі Arduino з потенціометром та світлодіодом

Для роботи цієї моделі підійде наступна програма (програму ви можете просто скопіювати в Arduino IDE):

// даємо імена пінів зі світлодіодом
// і потенціометром
#define led 9
#define pot A0
void setup()
{
// пін зі світлодіодом - вихід
pinMode(led, OUTPUT);
// пін із потенціометром - вхід
pinMode(pot, INPUT);
}
void loop()
{
// Оголошуємо змінну x
int x;
// зчитуємо напругу з потенціометра:
// буде отримано число від 0 до 1023
// ділимо його на 4, вийде число в діапазоні
// 0-255 (дрібна частина буде відкинута)
x = analogRead(pot)/4;
// Видаємо результат на світлодіод
analogWrite(led, x);
}

Так виглядає зібрана модель Arduino потенціометра зі світлодіодом:

Модель Arduino з потенціометром та світлодіодом у зібраному вигляді

На цьому третій урок Arduino для початківців закінчено. Далі буде!

Пости з уроків:

  1. Перший урок: .
  2. Другий урок: .
  3. Третій урок: .
  4. Четвертий урок: .
  5. П'ятий урок: .
  6. Шостий урок: .
  7. Сьомий урок: .
  8. Восьмий урок: .
  9. Дев'ятий урок:

І спробуємо виконати нове завдання. Думаю, що всі бачили новорічні вітринні гірлянди, у яких плавно блимають світлодіоди. Допустимо, що ми хочемо зробити щось подібне.
Ми вже розглядали функцію digitalWrite() і знаємо, що значення, яке вона записує, може бути двох варіантів – високий чи низький рівень. В цьому випадку нам допоможе функція analogWrite(). "Формулювання" функцій відрізняються лише початковими приставками, тому їх легко запам'ятати.

Функція analogWrite(), так само як і digitalWrite(), містить у дужках два аргументи і працює за тим самим словесним принципом: "куди, що". Головною відмінністю є можливість запису широкого діапазону значень замість звичного LOW чи HIGH. Це дозволить нам регулювати яскравість світлодіода. Головне зауваження, яке необхідно враховувати, те, що ця функція працює тільки на певних контактах. Ці контакти позначені символом "~". Цей символ означає, що це PWM-контакт. PWM (pulse-width modulation) звучить російською мовою ШІМ (широтно-імпульсна модуляція). Принцип роботи ґрунтується на зміні тривалості імпульсу. Графічно це можна зобразити так:

Спробуймо розібратися як це працює, розглянувши простий приклад. Для цього необхідно підключити світлодіод до PWM-контакту через резистор номіналом 150 Ом та "зашити" в Arduino просту програму. Схема підключення та код скетчу представлені нижче:


void setup()
{
pinMode(led,OUTPUT);
}

void loop()
{
for(int i=0; i<=255; i++)
{
analogWrite(led,i);
delay(10);
}
for(int i=255; i>=0; i--)
{
analogWrite(led,i);
delay(10);
}
}


Думаю, що загалом код зрозумілий, але необхідно приділити трохи уваги циклу 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<= 5; mode++) pinMode(pins, OUTPUT);
}

boolean debounce(boolean last)
{
boolean current = digitalRead(buttonPin);
if(last != current)
{
delay(5);
current = digitalRead(buttonPin);
}
return current;
}

void loop()
{
currentButton = debounce(lastButton);
if(lastButton == LOW && currentButton == HIGH)
{
enable = ! enable;
}

If(enable == true)
{
for (int i=0; i<=5; i++)
{
for (int brightness = 0; brightness<= 255; brightness++)
{
delay(1);
}
delay(40);
}
for (int i=0; i<=5; i++)
{
for (int brightness = 255; brightness >= 0; brightness--)
{
analogWrite(pins[i], brightness);
delay(1);
}
delay(40);
}
}

If(enable == false)
{
for(int i = 0; i<= 5; i++) digitalWrite(pins[i], LOW);
}

LastButton = currentButton;
}


Візуально скетч став дещо складнішим. Насправді тут все просто і давайте розберемося в цьому. Нам необхідно ідентифікувати всі підключені світлодіоди, але замість звичного int led ми використовуємо масив, кожен елемент якого є PWM-контактом Arduino. У тілі функції void setup() ми теж вчинили хитрим чином. "Перелічувати" всі контакти ми довірили циклу for(), з кожною ітерацією якого здійснюється конфігурація відповідного контакту на OUTPUT. Переходимо до функції void loop(). Функція debounce() та початкова умова if() залишається без змін. У нас, як і раніше, відбувається перевірка рівнів двох змінних: попереднє значення (спочатку LOW) та поточний стан кнопки. За виконання цих умов значення змінної enable інвертується. З огляду на це ми додали ще дві прості умови if(). Якщо enable = true, то гірлянда включається, плавністю перетікання якої керує цикл for(). Якщо ж enable = false, всі світлодіоди вимкнені. Після закінчення умов змінна lastButton приймає поточний стан кнопки.
Тестуючи нашу програму, ми помітили, що все працює неправильно. Пам'ятаєте, минулого уроці ми зробили поправку, що при великому значенні тимчасової затримки кнопка спрацьовує після її закінчення? У минулому прикладі, при включеній гірлянді сумарна затримка в тілі функції void loop() становила 85мс. Це давало нам можливість встигнути "потрапити" у певний відрізок часу. У цьому скетчі, за тієї ж умови, затримка відрізняється у кілька разів. Можливо, за бажання вимкнути гірлянду напрошується слово "перервати". Це і буде рішенням цієї задачі!

Сподіваюся, що ця стаття була для Вас корисною. У наступному уроці ми розглянемо переривання в Arduino і досягнемо належного результату.




Top