Робототехника. Робототехника 9. 10. 12. 2021 Робототехника 9 класс (2курс)
Скачать 257.3 Kb.
|
10.12.2021 Робототехника 9 класс (2курс) Калиева А.Ж. Продолжаем уроки в которых мы используем 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); //гасим все светодиоды } } Copy Немного изменим данный пример и сделаем 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мсек } } Copy Объединив код первого и второго примера получим включение одного светодиода в прямом и обратном направлении. Во втором цикли ставим 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); //гасим все светодиоды } } Copy Сходящиеся огни. Тут все по аналогии. Добавим переменную в которой будим рассчитывать половину светодиодов. Поэтому количество светодиодов должно быть четным. Либо что-то делать с центральным светодиодом. Можно оставить его постоянно включенным или наоборот всегда включенным. 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); //гасим все светодиоды } } Copy И по аналогии делаем расходящиеся огни. 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); //гасим все светодиоды } } Copy Как видно без использования сдвигового регистра код получается намного проще и меньше строчек. Один минус количество ограничено. Максимум 20 светодиодов можно подключить к Arduino Uno и 22 к Arduino NANO. Думаете что я ошибся с цифрами. Подписывайтесь на канал. И в следующем уроке в данном блоке уроков я покажу как можно это реализовать. |