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