Налаштування яскравості світлодіода на arduino. Управління світлодіодною стрічкою за допомогою Arduino. Що вам знадобиться для проекту

03.11.2021

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

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

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

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

  • плата 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 і досягнемо належного результату.

Апаратне забезпечення:

- плата
- макетна плата
- світлодіод
- резистор 220 Ом

Електричний ланцюг:

З'єднайте анод (довгий висновок) вашого світлодіода із цифровим виведенням 9 Arduino через резистор 220 Ом. З'єднайте катод (короткий висновок) із землею (GND) Arduino.



Схема:


Код:

У функції setup() необхідно призначити висновок 9 виходом.
Функція analogWrite(), яку ви будете використовувати в основному циклі, має два аргументи: перший говорить функції, який висновок використовувати, в другий записують значення для ШІМ.
Для того щоб плавно збільшити яскравість світлодіода, а потім плавно зменшити вам потрібно спочатку збільшувати значення ШІМ від 0 (світлодіод вимкнено) до 255 (максимальна яскравість), а потім навпаки. У нашій програмі змінна, що відповідає за значення ШІМ, називатиметься brightness. У кожному циклі ця змінна зміниться на значення fadeAmount.
Як тільки освіта досягне значення 255 або 0 fadeAmount змінить свій знак. У такий спосіб ми зможемо змінити збільшення яскравості зниження і навпаки.
analogWrite() змінює значення ШІМ дуже швидко, тому потрібна затримка контролю швидкості зміни яскравості. Ви можете самі змінювати значення затримки та дивитися як це позначиться на роботі.

Повний текст програми:

/*

Цей приклад показує, як змінювати яскравість світлодіода на виведенні.

використовуючифункціюanalogWrite().

*/

int led = 9; // висновоксвітлодіода 9

int brightness = 0; // Змінна відповідальна за яскравість

int fadeAmount = 5; // Змінна, яка задає швидкість зміни яскравості за цикл

// налаштування:

void setup() {

// призначимо висновок 9 виходом:

pinMode (led, OUTPUT);

// основний цикл:

void loop () {

// Встановлюємо яскравість світлодіода на виводі 9:

analogWrite (led, brightness);

// Змінимо значення яскравості для наступного проходу циклу:

brightness = brightness + fadeAmount;

// поміняємо напрямок зміни яскравості :

if (brightness == 0 || brightness == 255) {

fadeAmount = -fadeAmount;

// Чекаємо 30 мілісекунд для спостереження ефекту димування:

delay (30);




- повний каталог плат

Список деталей для експерименту

Для додаткового завдання

    ще 1 світлодіод

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

    ще 2 дроти

Принципова схема

Схема на макетці

Зверніть увагу

    Ми підключили "землю" світлодіода та змінного резистора (потенціометра) до довгої рейки "-" макетної плати, і вже її з'єднали з входом GND мікроконтролера. Таким чином ми використовували менше входів і від макетки до контролера тягнеться менше дротів.

    Підписи «+» та «-» на макетці не зобов'язують вас використовувати їх строго для харчування, просто найчастіше вони використовуються саме так і маркування нам допомагає

    Не важливо, яка з крайніх ніжок потенціометра буде підключена до 5, а яка до GND, зміниться тільки напрям, в якому потрібно крутити ручку для збільшення напруги. Запам'ятайте, що сигнал ми зчитуємо із середньої ніжки

    Для зчитування аналогового сигналу, що приймає широкий спектр значень, а не просто 0 або 1, як цифровий, підходять тільки порти, позначені на платі як Analog In і пронумеровані з префіксом A . Для Arduino Uno – це A0-A5.

Скетч

p030_pot_light.ino // даємо розумні імена для пінів зі світлодіодом // і потенціометр (англ potentiometer або просто «pot»)#define LED_PIN 9 #define POT_PIN A0 void setup() ( // пін зі світлодіодом - вихід, як і раніше. pinMode(LED_PIN, OUTPUT); // ...а ось пін з потенціометром має бути входом // (англ. «input»): ми хочемо зчитувати напругу,// Видається їм pinMode(POT_PIN, INPUT); ) void loop() ( // заявляємо, що далі ми будемо використовувати 2 змінні з // іменами rotation і brightness, і що зберігатимемо в них будемо // Цілі числа (англ. "integer", скорочено просто "int") int rotation, brightness; // зчитуємо в rotation напругу з потенціометра: // мікроконтролер видасть число від 0 до 1023 // пропорційне куту повороту ручки rotation = analogRead(POT_PIN); // у brightness записуємо отримане раніше значення rotation // поділено на 4. Оскільки у змінних ми забажали зберігати // Цілі значення, частина від розподілу буде відкинута. // В результаті ми отримаємо ціле число від 0 до 255 brightness = rotation / 4; // Видаємо результат на світлодіод analogWrite(LED_PIN, brightness) ; )

Пояснення до коду

    За допомогою директиви #define ми сказали компілятор замінити ідентифікатор POT_PIN на A0 - номер аналогового входу. Ви можете зустріти код, де звернення до аналогового порту буде за номером без індексу A . Такий код буде працювати, але, щоб уникнути плутанини з цифровими портами, використовуйте індекс.

    Змінним прийнято давати назви, що починаються з малої літери.

    Щоб використовувати змінну, необхідно її оголосити, що ми робимо інструкцією:

int rotation, brightness;

    Змінні одного типу можна оголосити в одній інструкції, перерахувавши їх через кому, що ми і зробили

    Функція analogRead(pinA) повертає ціле значення в діапазоні від 0 до 1023, пропорційне напруги, поданому на аналоговий вхід, номер якого ми передаємо функції як параметр pinA

    Зверніть увагу, як ми отримали значення, повернене функцією analogRead() : ми просто помістили його в змінну rotation за допомогою оператора присвоєння = , який записує те, що знаходиться праворуч від нього ту змінну, яка стоїть зліва

Запитання для перевірки себе

    Чи можемо ми під час складання схеми підключити світлодіод та потенціометр безпосередньо до різних входів GND мікроконтролера?

    В який бік потрібно крутити змінний резистор збільшення яскравості світлодіода?

    Що буде, якщо стерти з програми рядок pinMode (LED_PIN, OUTPUT)? Рядок pinMode(POT_PIN, INPUT) ?

    Навіщо ми ділимо значення, отримане з аналогового входу перед тим, як встановити яскравість світлодіода? що буде, якщо цього зробити?

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

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

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.