Уроки Ардуино: Два светофора для перекрестка дороги на базе 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.

Рисунок 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. Работа двух светофора на макетной плате
Во второй части урока мы подключим второй светофор и оптимизируем программу, используя списки для хранения выводов светофора и их состояний, а также для компактности кода будем использовать подпрограммы.




Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.