Уроки Ардуино: Два светофора для перекрестка дороги на базе Arduino. Часть 1.
Итак, Вы являетесь счастливым обладателем одного из конструкторов Arduino серии «Дерзай» («Базовый», «Изучаем Arduino» и «Умный дом»), Вы уже подключали плату и запускали в Arduino IDE первый пример — «Hello, World» для Arduino (мигание встроенным светодиодом). Это хорошо, Вы сделали первый шаг разработчика-художника проектов на основе Arduino. Сейчас мы вместе рассмотрим более сложный и более полезный проект – создание на базе Arduino двух светофоров для перекрестка дороги, по которой смогут передвигаться созданные Вами роботы.
Для сборки светофора Ардуино Вам понадобятся следующие детали, которые имеются в каждом из наборов Arduino :
- Arduino Uno;
- Кабель USB;
- Плата прототипирования;
- Провода «папа-папа» — 7 шт;
- Резисторы 220 Ом – 6 шт;
- Светодиоды красные – 2 шт;
- Светодиоды зеленые – 2 шт;
- Светодиоды желтые – 2 шт.
Светодиод — это полупроводниковый прибор, преобразующий электрический ток непосредственно в световое излучение. Цветовые характеристики светодиодов зависят от химического состава использованного в нем полупроводника. Светодиод излучает в узкой части спектра. В нашем проекте создания светофора Arduino мы будем использовать светодиоды трех цветов (зеленый, желтый, красный), соответствующие трем цветам светофора.
Светодиоды поляризованы, имеет значение в каком направлении подключать их. Положительный вывод светодиода (более длинный) называется анодом, отрицательный называется катодом. Как и все диоды, светодиоды позволяют току течь только в одном направлении – от анода к катоду. Поскольку ток протекает от положительного к отрицательному, анод светодиода должен быть подключен к цифровому сигналу 5В, а катод должен быть подключен к земле.
Мы будем подключать светодиоды первого светофора к цифровым выводам D7, D8, D9, а светодиоды второго светофора к цифровым выводам D10, D11, D12 платы Arduino. Светодиоды должны быть всегда соединены последовательно с резистором, который выступает в качестве ограничителя тока. Чем больше значение резистора, тем больше он ограничивает ток. В этом эксперименте мы используем резистор номиналом 220 Ом.
Собираем схему, представленную на рисунке 1.
Теперь приступим к написанию скетча. В первой части урока напишем скетч работы одного светофора.
Мы знаем, что светофор работает следующим образом: некоторое время «горит» зеленый свет (зеленый светодиод), затем мигает желтый при «горящем» зеленом , затем горит красный, затем мигает желтый при «горящем» красном и далее по кругу. Время (в миллисекундах) «горения» зеленого, желтого и красного светодиодов и частоту мигания желтого светодиода занесем в константы
#define TIME_GREEN 10000 #define TIME_RED 10000 #define TIME_YELLOW 3000 #define TIME_BLINK 300
Занесем в константы и выводы подключения светофора (в этом примере мы рассматриваем один светофор)
#define PIN_GREEN1 7 #define PIN _RED 9 #define PIN_YELLOW 8
Создадим и переменную blinkyellow (типа boolean), которую будем использовать для организации мигания желтого светодиода (blinkyellow=true – светодиод «горит», blinkyellow=false – светодиод «погашен»). Как Вы уже знаете, цифровые выводы Arduino могут работать как входы и как выходы. Режим работы цифрового вывода устанавливается командой pinMode(). В процедуре setup() настроим все выводы Arduino, к которым подключены светодиоды, как выводы, и подадим на них значение LOW (т.е. светодиоды выключим).
// настроить выводы Arduino как выходы pinMode(PIN_GREEN1, OUTPUT); pinMode(PIN_YELLOW1, OUTPUT); pinMode(PIN_RED1, OUTPUT); // и потушить все светодиоды digitalWrite(PIN_GREEN1, LOW); digitalWrite(PIN_YELLOW1, LOW); digitalWrite(PIN_RED1, LOW);
В процедуре loop() запустим работу светофора. Длительность горения красного и зеленого светодиодов и мигания желтого устанавливаем функцией delay().
Для мигания желтого светодиода будем использовать цикл for длительностью TIME_YELLOW с шагом TIME_BLINK. Командой blinkyellow= !blinkyellow мы будем изменять значение переменной blinkyellow на противоположное и изменять состояние желтого светодиода.
for(int i=0;i<TIME_YELLOW;i=i+TIME_BLINK) { if(blinkyellow==true) digitalWrite(PIN_YELLOW1, HIGH); // включить желтый else digitalWrite(PIN_YELLOW1, LOW); // выключить желтый delay(TIME_BLINK); blinkyellow=!blinkyellow; }
Создадим в Arduino IDE новый скетч, занесем в него код из листинга 1 и загрузим скетч на на плату Arduino. Напоминаем, что в настройках Arduino IDE необходимо выбрать тип платы (Arduino UNO) и порт подключения платы.
Листинг 1
// Выводы Arduino для подключения светодиодов #define PIN_GREEN1 7 #define PIN_YELLOW1 8 #define PIN_RED1 9 // время горения светодиодов в мсек // зеленый #define TIME_GREEN 5000 // красный #define TIME_RED 5000 // желтый #define TIME_YELLOW 3000 // период мигания желтого #define TIME_BLINK 300 // переменная blink для чередования мигания желтого boolean blinkyellow=true; void setup() { // настроить выводы Arduino как выходы pinMode(PIN_GREEN1, OUTPUT); pinMode(PIN_YELLOW1, OUTPUT); pinMode(PIN_RED1, OUTPUT); // и потушить все светодиоды digitalWrite(PIN_GREEN1, LOW); digitalWrite(PIN_YELLOW1, LOW); digitalWrite(PIN_RED1, LOW); } // the loop function runs over and over again forever void loop() { // зеленый digitalWrite(PIN_GREEN1, HIGH); delay(TIME_GREEN); blinkyellow=true; // желтый - мигание for(int i=0;i<TIME_YELLOW;i=i+TIME_BLINK) { if(blinkyellow==true) digitalWrite(PIN_YELLOW1, HIGH); // включить желтый else digitalWrite(PIN_YELLOW1, LOW); // выключить желтый delay(TIME_BLINK); blinkyellow=!blinkyellow; } digitalWrite(PIN_GREEN1,LOW); // выключить зеленый digitalWrite(PIN_YELLOW1, LOW); // выключить желтый // красный digitalWrite(PIN_RED1, HIGH); delay(TIME_GREEN); blinkyellow=true; // желтый - мигание for(int i=0;i<TIME_YELLOW;i=i+TIME_BLINK) { if(blinkyellow==true) digitalWrite(PIN_YELLOW1, HIGH); // включить желтый else digitalWrite(PIN_YELLOW1, LOW); // выключить желтый delay(TIME_BLINK); blinkyellow=!blinkyellow; } digitalWrite(PIN_RED1,LOW); // выключить красный digitalWrite(PIN_YELLOW1, LOW); // выключить желтый }
После загрузки наблюдаем работу нашего светофора (см. рисунок 2,3,4). Изменяя значения констант TIME_GREEN , TIME_RED , TIME_YELLOW мы изменяем время «горения» каждого светодиода, константой TIME_BLINK мы регулируем период мигания желтого светодиода.
Рисунок 2,3. Работа двух светофора на макетной плате
Во второй части урока мы подключим второй светофор и оптимизируем программу, используя списки для хранения выводов светофора и их состояний, а также для компактности кода будем использовать подпрограммы.
Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.