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

Біжуча доріжка на Arduino UNO

Тепер повернемося до нашої програми, яка показана нижче. Нам потрібно ввести 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 мс
}

Оригінал статті

Top