| ||||
Arduino UNO урок 4 - Бегущий огонь
| ||||
|
В этом уроке мы продолжим работу со светодиодами, но количество светодиодов увеличим до 5. И сделаем эффект бегущего огня. Для управления светодиодами будем использовать манипуляции с портами Arduino. Мы будем напрямую записывать данные в порты Arduino. Это лучше, чем работать с конкретными входами/выходами контроллера. Это позволит установить значения для светодиодов при помощи одной лишь операции.
У Arduino UNO имеется 3 порта:
Мы будем использовать порт B. Сначала, мы должны установить все ножки порта B как цифровые выхода. У порта B имеется только 6 ножек. Биты регистра для В-порта DDRB должны быть установлены в 1, если нога будет использоваться как выход (OUTPUT), и в 0, если нога будет использовать как вход (INPUT). Биты портов нумеруются с 0 по 7, но не всегда содержат все 8 ног. Пример: Обратите внимание, что в микроконтроллерах фирмы Microchip все наоборот. 0 бит - нога работает как выход, а 1 - как вход. В нашем проекте бегущего огня мы будем использовать 5 выходов: Для записи значений в порт В необходимо использовать регистр PORTB. Зажечь первый светодиод можно командой: Теперь вы видите, как легко мы можем включать и выключать светодиоды. Теперь расскажем вам об операторах сдвига Есть 2 оператора двоичного сдвига: оператор сдвига влево << и оператор сдвига вправо >>. Оператор сдвига влево << заставляет все биты сдвигаться влево, соответственно оператор сдвига вправо >> сдвигает биты вправо. Пример: Теперь вернемся к нашей программе, которая показана ниже. Нам нужно ввести 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 мс } Оригинал статьи на английском языке (перевод Колтыков А.В.)
Добавил: Павел (Admin) Автор: Неизвестно Вас может заинтересовать:
|
|||
| ||||
|