Arduino UNO урок 4 - Біжучий вогонь
У цьому уроці ми продовжимо роботу зі світлодіодами, але кількість світлодіодів збільшимо до 5. І зробимо ефект біжучого вогню. Для управління світлодіодами будемо використовувати маніпуляції з портами Arduino. Ми будемо безпосередньо записувати дані в порти Arduino. Це краще, ніж працювати з конкретними входами/виходами контролера. Це дозволить встановити значення для світлодіодів за допомогою однієї лише операції.
У Arduino UNO є 3 порти:
B (цифрові входи/виходи з 8 по 13)
C (аналогові входи)
D (цифрові входи/виходи з 0 по 7)
Кожен порт управляється 3 реєстрами. Реєстр DDR визначає, чим буде ніжка (pin) входом чи виходом. За допомогою реєстра PORT можна встановити pin у стан HIGH або LOW. За допомогою реєстра PIN можна прочитати стан ніжок Arduino, коли вони працюють на вхід.
Ми будемо використовувати порт B. Спочатку, ми повинні встановити всі ніжки порту B як цифрові виходи. У порту B є лише 6 ніжок. Біти реєстра для В-порту DDRB повинні бути встановлені в 1, якщо ніжка буде використовуватися як вихід (OUTPUT), і в 0, якщо ніжка буде використовуватися як вхід (INPUT). Біти портів нумеруються з 0 по 7, але не завжди містять всі 8 ніжок. Приклад:
DDRB = B00111110; // встановити ніжки порту В з 1 по 5 як виходи, а 0 як вхід.
Зверніть увагу, що в мікроконтролерах фірми Microchip все навпаки. 0 біт - ніжка працює як вихід, а 1 - як вхід.
В нашому проекті біжучого вогню ми будемо використовувати 5 виходів:
DDRB = B00011111; // встановити ніжки порту В з 0 по 4 як виходи
Для запису значень у порт В необхідно використовувати реєстр PORTB. Запалити перший світлодіод можна командою:
PORTB = B00000001;
перший і четвертий:
PORTB = B00001001;
Тепер ви бачите, як легко ми можемо вмикати і вимикати світлодіоди. Тепер розповімо вам про оператори зсуву
Є 2 оператори двійкового зсуву: оператор зсуву вліво << і оператор зсуву вправо >>. Оператор зсуву вліво << змушує всі біти зсуватися вліво, відповідно оператор зсуву вправо >> зсуває біти вправо.
Приклад:
varA = 1; // 00000001
varA = 1 << 0; // 00000001
varA = 1 << 1; // 00000010
varA = 1 << 2; // 00000100
Тепер повернемося до нашої програми, яка показана нижче. Нам потрібно ввести 2 змінні: перша upDown буде містити значення куди рухатися - вгору чи вниз, а друга cylon які світлодіоди запалювати.
У функції setup() ми визначаємо, які ніжки повинні працювати як виходи.
У головному циклі програми loop(), світлодіоди по черзі запалюються вгору шляхом збільшення змінної cylon, а коли доходить до самого верхнього, то змінній upDown присвоюється 0 і світлодіоди запалюються вниз по черзі.
/* Біжучий вогонь. 5 світлодіодів */ unsigned char upDown=1; // починаємо з руху вгору unsigned char cylon=0; // визначає черговість LED void setup() { DDRB = B00011111; // встановлюємо порт B з 0 по 4 як виходи } void loop() { if(upDown==1){ // якщо йдемо вгору, то cylon++; if(cylon>=4) upDown=0; // коли досягнуто найбільший номер LED, то в сл. циклі йдемо вниз } else { cylon--; if(cylon==0) upDown=1; // коли досягнуто найменший номер LED, то в сл. циклі йдемо вгору } PORTB = 1 << cylon; //зсув delay(200); // пауза 200 мс }