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

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

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

В цьому файлі записано деякий код для прикладу - видаляємо весь текст і пишемо такий:
#include <Arduino.h> //підключаємо бібліотеку Arduinovoid setup() { //ця функція виконується 1 раз при запуску мікроконтролераpinMode(LED_BUILTIN, OUTPUT); //встановлюємо режим ВИХОДУ для виводу LED_BUILTIN}void loop() { //ця функція запускається циклічно під час роботиdigitalWrite(LED_BUILTIN, HIGH); //вказуємо високий рівень для виводу LED_BUILTINdelay(1000); //чекаємо 1000мс = 1 секdigitalWrite(LED_BUILTIN, LOW); //вказуємо низький рівень для виводу LED_BUILTINdelay(100); //чекаємо 100мс}
В даному коді LED_BUILTIN - це константа з бібліотеки Arduino.h, в яку записано адресу порту GPIO до якого підключено вбудований в плату розробника світлодіод. Спочатку ми встановлюємо цей порт в режим виводу, потім циклічно вмикаємо-вимикаємо діод через зміну рівнів (1 або 0) на виході порту. Тепер ми компілюємо код, натиснув на кнопку Build:

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

Тепер приєднаємо нашу плату до комп'ютера за допомогою USB кабелю і завантажимо програму на плату, натиснувши на кнопку Upload. Після успішного завантаження на плату, вона перезапуститься і почне працювати виконуючи код що ми скомпілювали:
Примітка: для підключення плати розробника до ПК потрібно встановити відповідні драйвери такі як, наприклад CH340 тощо. Драйвери можуть різнитись в залежності від плати, тому перед використанням плати дізнайтесь який драйвер вона потребує і встановіть на ПК.
Плата працює, середовище розробки налаштовано - продовжуємо! Для трьох світлодіодів, якими ми будемо керувати, знайдемо на платі три виводи GPIO. Для цього знайдемо в документації плати розпіновку виводів:
Бачимо на зображенні виводи 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 //і GREENvoid 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);}
Компілюємо, завантажуємо на плату і дивимось на результат:
"Світлофор" працює як слід, а отже задачу виконано ;-)
