Продолжаем уроки в которых мы используем Arduino, резисторы и светодиоды. Мы уже делали Светофор, полицейский стробоскоп, отправляли сигнал sos и пр. Сегодня мы будем делать бегущие огни. Бегущие огни уже были в другом блоке уроков на Arduino: Урок 2 — Подключаем сдвиговый регистр 74НС595 к Arduino. «Бегущие» огни При подключении к сдвиговому регистру всего при подключении по 3 проводам мы можем управлять 8 светодиодами. Но вот чтобы подключить 10 светодиодов, нужно подключать 2 сдвиговых регистра и использовать всего 2 выхода из 8 доступных в регистре. Это не очень логично. Иногда бывает проще подключить к плате Arduino нужное количество светодиодов. Что я и планирую сделать. В примере будет 5 самых простых режимов бегущих огней на Arduino.
Для урока нам понадобится:
Arduino UNO или Arduino Nano
Плата макетная беспаечная
Резисторы 220 ОМ
Соединительные провода папа-папа
Светодиоды 3 или 5 мм.
Подключим наши 10 светодиоды вот по такой схеме.
В живую будет выгладить так.
Вы наверное скажите что схема не правильная и к пинам 0 и1 подключать не желательно. Вот именно не желательно, но можно если не использовать Serial port. А для облегчения кода нам будет очень удобно использовать данные пины. При загрузки кода в Ардуину светодиоды подключенные к 0 и 1 выходам будут мигать. Также при работе нашего скетча. Вместе с данными светодиодами на плате Arduino UNO буду включаться светодиода RX и TX. Но как я говорил в данном случаи ни чего старшного в этом нет.
Описывать все режимы не буду. В видео немного поясняю. Немного корява и может не совсем понятно. Но я думаю по комментариям к коду можно разобраться.
Первый пример бегущих огней на Arduino, последовательное включение одного светодиода с 1 по 10. По пинам на ардуино будет с 0 по 9. Это нужно учитывать при написании кода.
int last_pin = 10; //Кол-во светодиодов
//блок для инициализации входов-выходов и других исходных данных
void setup() {
for (int i = 0; i < last_pin; i++) // цикл
pinMode(i, OUTPUT); // инициализируем пины как выходы
}
// Основной цикл
void loop() {
for (int j = 0; j < last_pin; j++) { //перебираем пины с 0 до last_pin
digitalWrite(j, HIGH); //зажигание следующего светодиода
delay(300); //задержка 300мсек
digitalWrite(j, LOW); //гасим все светодиоды
}
}
Немного изменим данный пример и сделаем 2 цикла. Получим включение всех светодиодов и выключение в обратном направлении.
int last_pin = 10; //Кол-во светодиодов
//блок для инициализации входов-выходов и других исходных данных
void setup() {
for (int i = 0; i < last_pin; i++) // цикл
pinMode(i, OUTPUT); // инициализируем пины как выходы
}
// Основной цикл
void loop() {
for (int j = 0; j < last_pin; j++) { //перебираем пины с 0 до last_pin
digitalWrite(j, HIGH); //зажигание следующего светодиода
delay(300); //задержка 300мсек
}
for (int j = last_pin-1; j >= 0; j--) { //перебираем пины с 0 до last_pin
digitalWrite(j, LOW); //гасим все светодиоды
delay(300); //задержка 300мсек
}
}
Объединив код первого и второго примера получим включение одного светодиода в прямом и обратном направлении. Во втором цикли ставим j-2, потому что у нас пины начинаются с 0, а число светодиодов с 1 до 10. Также чтобы 10 светодиод не включался 2 раза вычитаем еще 1.
int last_pin = 10; //Кол-во светодиодов
//блок для инициализации входов-выходов и других исходных данных
void setup() {
for (int i = 0; i < last_pin; i++) // цикл
pinMode(i, OUTPUT); // инициализируем пины как выходы
}
// Основной цикл
void loop() {
for (int j = 0; j < last_pin; j++) { //перебираем пины с 0 до last_pin
digitalWrite(j, HIGH); //зажигание следующего светодиода
delay(300); //задержка 300мсек
digitalWrite(j, LOW); //гасим все светодиоды
}
for (int j = last_pin-2; j > 0; j--) { //перебираем пины с 0 до last_pin
digitalWrite(j, HIGH); //зажигание следующего светодиода
delay(300); //задержка 300мсек
digitalWrite(j, LOW); //гасим все светодиоды
}
}
Сходящиеся огни. Тут все по аналогии. Добавим переменную в которой будим рассчитывать половину светодиодов. Поэтому количество светодиодов должно быть четным. Либо что-то делать с центральным светодиодом. Можно оставить его постоянно включенным или наоборот всегда включенным.
int last_pin = 10; //Кол-во светодиодов
//блок для инициализации входов-выходов и других исходных данных
void setup() {
for (int i = 0; i < last_pin; i++) // цикл
pinMode(i, OUTPUT); // инициализируем пины как выходы
}
// Основной цикл
void loop() {
int half = last_pin/2; //last_pin должгно быть четным числом
for (int j = 0; j < half; j++) { //перебираем пины с 0 до last_pin
int k = last_pin-j-1;
digitalWrite(j, HIGH); //зажигание следующего светодиода
digitalWrite(k, HIGH); //зажигание следующего светодиода
delay(300); //задержка 300мсек
digitalWrite(k, LOW); //гасим все светодиоды
digitalWrite(j, LOW); //гасим все светодиоды
}
}
И по аналогии делаем расходящиеся огни.
int last_pin = 10; //Кол-во светодиодов
//блок для инициализации входов-выходов и других исходных данных
void setup() {
for (int i = 0; i < last_pin; i++) // цикл
pinMode(i, OUTPUT); // инициализируем пины как выходы
}
// Основной цикл
void loop() {
int half = last_pin/2; //last_pin должгно быть четным числом
for (int j = half; j > 0; j--) { //перебираем пины с 0 до last_pin
int k = last_pin-j;
digitalWrite(j-1, HIGH); //зажигание следующего светодиода
digitalWrite(k, HIGH); //зажигание следующего светодиода
delay(500); //задержка 300мсек
digitalWrite(k, LOW); //гасим все светодиоды
digitalWrite(j-1, LOW); //гасим все светодиоды
}
}
Как видно без использования сдвигового регистра код получается намного проще и меньше строчек. Один минус количество ограничено. Максимум 20 светодиодов можно подключить к Arduino Uno и 22 к Arduino NANO. Думаете что я ошибся с цифрами. Подписывайтесь на канал. И в следующем уроке в данном блоке уроков я покажу как можно это реализовать.
Комментарии
Войдите или Зарегистрируйтесь И Вы сможете общаться на форуме и оставлять комментарии без капчи.