Світлофор на мікроконтролері

Управління світлодіодами через GPIO мікроконтролера

Задача: зібрати схему-прототип світлофора на світлодіодах, що керуються мікроконтролером через виводи GPIO.

Для прототипування схеми використаємо плату розробника - це дуже зручно бо подібні плати мають вже розпаяні виводи для встановлення на макетну плату, вбудований програматор і блок живлення що дозволяє програмувати і живити плату через USB комп'ютера. Будемо використовувати плату Arduino Nano на базі мікроконтролера ATmega328. Отже, встановимо плату на макетну плату:

Arduino Nano

Arduino Nano, як і інші плати розробки, має вбудовані світлодіоди: індикатор живлення, два індикатора передачі даних між платою та USB, і один діод, під'єднаний до одного з GPIO виводів. Спробуємо для початку покерувати останнім для перевірки роботи плати. Для цього відкриваємо середу розробки - я використовую Visual Studio Code з плагіном PlatformIO, але також можна використовувати Arduino IDE.

Отже, запускаємо Visual Studio Code, переходимо у вкладку PlatformIO і натискаємо "Створити Новий Проєкт". З'явиться вікно налаштування проєкту, де ми маємо вказати назву проєкту, вибрати плату що використовується (в моєму випадку це Arduino Nano ATmega328), далі вказуємо фреймворк - Arduino:

Вікно налаштування нового проєкту PlatformIO

Після натискання кнопки Finish необхідно почекати, поки проєкт створиться. Далі відкриваємо файл main.cpp який можна знайти в теці src теки проєкту:

В цьому файлі записано деякий код для прикладу - видаляємо весь текст і пишемо такий:

#include <Arduino.h>                //підключаємо бібліотеку Arduino

void setup() { //ця функція виконується 1 раз при запуску мікроконтролера
 pinMode(LED_BUILTIN, OUTPUT); //встановлюємо режим ВИХОДУ для виводу LED_BUILTIN
 }

void loop() { //ця функція запускається циклічно під час роботи
 digitalWrite(LED_BUILTIN, HIGH); //вказуємо високий рівень для виводу LED_BUILTIN
 delay(1000); //чекаємо 1000мс = 1 сек
 digitalWrite(LED_BUILTIN, LOW); //вказуємо низький рівень для виводу LED_BUILTIN
 delay(100); //чекаємо 100мс
}

В даному коді LED_BUILTIN - це константа з бібліотеки Arduino.h, в яку записано адресу порту GPIO до якого підключено вбудований в плату розробника світлодіод. Спочатку ми встановлюємо цей порт в режим виводу, потім циклічно вмикаємо-вимикаємо діод через зміну рівнів (1 або 0) на виході порту. Тепер ми компілюємо код, натиснув на кнопку Build:

Якщо помилок немає, код скомпілюється і в консоль виведе текст з відповідним повідомленням SUCCESS:

Тепер приєднаємо нашу плату до комп'ютера за допомогою USB кабелю і завантажимо програму на плату, натиснувши на кнопку Upload. Після успішного завантаження на плату, вона перезапуститься і почне працювати виконуючи код що ми скомпілювали:

Примітка: для підключення плати розробника до ПК потрібно встановити відповідні драйвери такі як, наприклад CH340 тощо. Драйвери можуть різнитись в залежності від плати, тому перед використанням плати дізнайтесь який драйвер вона потребує і встановіть на ПК.

Плата працює, середовище розробки налаштовано - продовжуємо! Для трьох світлодіодів, якими ми будемо керувати, знайдемо на платі три виводи GPIO. Для цього знайдемо в документації плати розпіновку виводів:

Розпіновка Arduino Nano Бачимо на зображенні виводи D2-D12. Це цифрові виводи, які нам потрібні. Деякі з них позначені як ~D6 - це PWM виводи, їх не будемо брати, а візьмемо D2, D4, D7 - те що нам треба:

Згідно з документацією Arduino Nano, кожен вивід має напругу високого рівня 3,3В - це дещо забагато для світлодіодів, тому на кожен поставимо обмежувальний резистор. 220 Ом, думаю, буде достатньо:

Встановимо світлодіоди анодами до резисторів, на D2 - зелений, D4 - жовтий, D7 - червоний відповідно:

Катоди всіх діодів підключаємо до загальної шини "-":

Загальна шина "-" підключається до виводу GND на платі (біля D2):

На цьому збірку схеми завершено. Перевіримо роботу світлодіодів і виводів GPIO (D2, D4, D7), для цього напишемо такий код в файл main.cpp:

#include <Arduino.h>

void setup() {
   pinMode(DD2, OUTPUT);
   pinMode(DD4, OUTPUT);
   pinMode(DD7, OUTPUT);
}

void loop() {
   digitalWrite(DD2, HIGH);
   digitalWrite(DD4, HIGH);
   digitalWrite(DD7, HIGH);
   delay(1000);
}

Як видно з коду, адреси необхідних нам виводів записані в константи DD2, DD4 і DD7. В цьому коді режим трьох пінів встановлено в режим виводу і в кожному циклі на виводи подано високий рівень, таким чином всі діоду будуть просто світитись. Так ми перевіримо роботу схеми, тож компілюємо код, завантажуємо на плату і дивимось результат:

Чудово, схема працює. Переписуємо код в main.cpp так:

#include <Arduino.h>

#define RED DD7 //визначимо значення RED замість DD7 для ясності коду
#define YELLOW DD4 //те саме для DD4 - YELLOW
#define GREEN DD2 //і GREEN

void lightTurnOn(uint8_t led); //об'явимо функцію для включення вказаного діода

void setup() {
  pinMode(RED, OUTPUT);
  pinMode(YELLOW, OUTPUT);
  pinMode(GREEN, OUTPUT);
}

void loop() {
//по черзі з затримкою вмикаємо діоди

  lightTurnOn(GREEN);
  delay(8000);
  lightTurnOn(YELLOW);
  delay(2000);
  lightTurnOn(RED);
  delay(8000);
}

void lightTurnOn(uint8_t led) { //функція включення світла вказаного кольору
//спочатку вимикаємо всі діоди

  digitalWrite(RED, LOW);
  digitalWrite(YELLOW, LOW);
  digitalWrite(GREEN, LOW);

//вмикаємо діод, переданий як аргумент
  digitalWrite(led, HIGH);
}

Компілюємо, завантажуємо на плату і дивимось на результат:

"Світлофор" працює як слід, а отже задачу виконано ;-)