Светофор на Ардуино

В этой статье мы рассмотрим проект светофора с мигающими светодиодами на базе Arduino Uno и Nano. Светофор со светодиодами тремя цветов можно назвать проектом начального уровня. Но на его основе можно сделать интересные и полезные устройства, например, тренажеры для обучения детей правилам дорожного движения. Этот проект также позволит начинающим еще больше узнать о программировании в среде Ардуино, потренироваться в сборке схем и порадоваться новым интересным инженерным игрушкам.

Немного о светофорах

Светофор – лучший друга пешеходов и водителей, позволяющий организовать безопасное движение на дорогах. Первое такое устройство для городских дорог было установлено в 1868 году возле здания Британского парламента в Лондоне. Его внешний вид, конечно, сильно отличался от привычного нам сейчас устройств. Первый светофор представлял собой набор семафорных стрелок с подсветкой из газовых фонарей. Его создатель, инженер Джон Пик Найт, проектировал семафоры для железных дорог и первый додумался использовать идею для дорог, по которым в то время перемещались на лошадях.

История светофора
Первые светофоры

Первый электрический светофор появился в 1912 году в США. Инженер Лестер Вайр придумал устройство с двумя цветами – красным и зеленым. В 1914 году на перекрестке в Кливленде впервые были установлены сразу четыре светофора. Управлялись устройства вручную – полицейские переключали лампочки.

Создатель первого светофора William L Potts
Создатель первого светофора William L Potts

В 1920 году появились трехцветные светофоры – их поставили на улицах Нью-Йорка и Детройта. Первой же европейской страной с электрическими светофорами стала Франция. В Советском Союзе светофор появился в январе 1930 года в Ленинграде. Годом позже  первые устройства поставили и в Москве.

Памятник светофору в виде дерева
Памятник светофору

Сама идея установить четкую последовательность цветов связана с желанием помочь людям, не отличающим оттенки цветов. Они могут ориентироваться не на цвет, а на местоположение светящегося объекта. Именно поэтому у большинства светофоров в мире цвета выглядят именно так – красный, желтый и зеленый. Но есть и исключения – например, в Ирландии в свое время были вынуждены поменять местами красный и зеленый. Все дело в том, что местные жители не хотели видеть национальный цвет Ирландии (зеленый) в самом низу.

В некоторых странах вместо зеленого используют синий  сигнал светофора. Также сегодня часто можно встретить многосекционные светофоры со стрелками. В Берлине, например, есть светофор с  13 сигналами!

Если говорить об устройстве светофора, то за всю историю его существования менялись и сами источники света, и управляющие устройства. Сегодня светофоры используют светодиодные модули, которые гораздо экономичнее и надежнее используемых ранее ламповых. При выходе из строя одного светодиода конструкция в целом продолжает работать. Также на улицах сегодня легко встретить и целые светофорные комплексы, где на экранах отображается дополнительная информация: время до переключения, графические подсказки и другое.

Проект “Светофор на Ардуино”

Давайте и мы создадим свой почти настоящий светофор. В рамках этого проекта мы соберем схему и создадим скетч, с помощью которого светодиоды будут гореть и переключаться по правилам дорожного движения.

Если вы совсем новичок в Ардуино, крайне рекомендуем прочитать наши статьи для начинающих:

Сложность урока: для начинающих

Вам понадобится:

Схема подключения

Давайте начнем проект со сборки электрической цепи. Схема достаточно проста – соединяем три светодиода. Плюс к цифровому пину, минус – к земле. Обратите внимание, что мы объединили три контакта в один с помощью общей шины макетной платы. Красный свет светофора мы соединим с пином 11, желтый – с 10, зеленый – с 9.

 

Схема светофора - проект со светодиодами на Ардуино
Схема светофора со светодиодами на Ардуино

На этом вопрос со схемой можно считать решенным. Не забывайте про полярность, проверяйте правильность монтажа.

Модуль светофора

Есть еще один способ собрать проект – использовать уже готовые устройства в виде светофора со  светодиодами. Один из примеров – плата для Ардуино, продающаяся на Алиэкспрессе. На ней уже закреплены все резисторы, не нужно придумывать конструкцию – просто закрепляем похожий на светофор модуль на подставке и соединяем контакты с Ардуино.

Модуль светофора для Ардуино
Модуль светофора для Ардуино

Купить готовый модуль можно, например, по этим ссылкам:

Качественный модуль Светофора от надежного поставщика Модуль с тремя светодиодами для быстрого подключения к Ардуино

 

А вот ссылка на еще один интересный и совсем недорогой модуль. Он не предназначен для Ардуино, но имеет готовые к использованию корпус и провода, которые можно подключить по приведенной схеме.

Программирование светофора

Прежде чем писать программу, нужно составить общий алгоритм действий, описать задачу на привычном языке. Попробуйте это сделать самостоятельно, заодно и проверьте, так ли уж точно вы знаете алгоритм работы светофора?

Алгоритм работы

Вот этот алгоритм трехсекционного светофора для водителей, принятый за стандарт в России:

  • Начинается все с зеленого света. Включаем его.
  • Спустя определенное количество времени зеленый начинает мигать. Водители и пешеходы завершают движение (или, как это часто бывает, ускоряются).
  • Зеленый выключается и включается желтый.
  • Спустя какое-то время выключается и желтый – загорается красный.
  • Эпоха красного цвета заканчивается не миганием, как у зеленого, а параллельным включением красного и желтого.
  • Спустя какое-то время красный и желтый выключаются, включается зеленый и все начинается сначала.
Согласно ГОСТу Р52282-2004 с правилами применения дорожных знаков и светофоров, длительность сигнала “красный с желтым” не должна превышать 2 секунд, длительность желтого строго равна 3 секундам. Мигание зеленого цвета происходит с частотой 1миг/секунду В течение 3х секунд.

Если вы разобрались с алгоритмом, то написать скетч для Ардуино будет совсем не сложно. Надо лишь заменить каждое слово “включить” на digitalWrite с атрибутом HIGH,  “выключить” на digitalWrite с атрибутом LOW, а задержку сформировать с помощью delay. Вот, например, фрагмент программы, определяющий переход с красного на зеленый цвет.

// Отключаем желтый и красный
digitalWrite(11, LOW);   // Красный
digitalWrite(10, LOW);  // Желтый
 
// Включаем зеленый
digitalWrite(9, HIGH);           

// Ставим задержку 3 секунды
delay(3000);

Пример скетча

Для того, чтобы не привязываться в программе к конкретным номерам пинов можно и нужно создать константы, содержащие нужный номер пина. В коде мы будем использовать эти константы, а не номера. И если нам нужно будет поменять схему подключения, то менять номера в скетче нам придется только в одном месте. Не нужно будет делать глобальную замену по документу.

Вот так бы выглядел приведенный выше пример с использованием констант:

const int LED_RED = 11;              // Порт 11, красный светодиод
const int LED_YELLOW = 10;           // Порт 10, желтый светодиод
const int LED_GREEN = 9;             // Порт 9, зеленый светодиод

const int TIMEOUT_GREEN = 3000;

// Отключаем желтый и красный светодиоды.
digitalWrite(LED_YELLOW, LOW);    
digitalWrite(LED_RED, LOW);   

// Включаем зеленый светодиод на GrnTime
digitalWrite(LED_GREEN, HIGH);           
delay(TIMEOUT_GREEN);

Вот так можно заставить мигать зеленый свет. Точь в точь как обычная мигалка:

// Мигаем зеленым светодиодом
// Первый раз
digitalWrite(LED_GREEN, LOW);         
delay(TIMEOUT_FLASH_GREEN);                
digitalWrite(LED_GREEN, HIGH);        
delay(TIMEOUT_FLASH_GREEN);                

// Второй раз
digitalWrite(LED_GREEN, LOW);         
delay(TIMEOUT_FLASH_GREEN);                
digitalWrite(LED_GREEN, HIGH);        
delay(TIMEOUT_FLASH_GREEN);                

// Третий раз
digitalWrite(LED_GREEN, LOW);         
delay(TIMEOUT_FLASH_GREEN);                
digitalWrite(LED_GREEN, HIGH);        
delay(TIMEOUT_FLASH_GREEN);                

Второй и более правильный вариант мигания – использовать цикл FOR. Более подробно о нем написано в нашей отдельной статье про циклы.

for (int i=0; i<3; i++){
      digitalWrite(LED_GREEN, LOW);         
      delay(TIMEOUT_FLASH_GREEN);                
      digitalWrite(LED_GREEN, HIGH);        
      delay(TIMEOUT_FLASH_GREEN);                
}

Вот, в принципе,и все особенности. Давайте теперь соберем код вместе и напишем итоговую программу:

const int LED_RED = 13;             // Порт 13, красный светодиод
const int LED_YELLOW = 12;             // Порт 12, желтый светодиод
const int LED_GREEN = 11;             // Порт 11, зеленый светодиод

const int TIMEOUT_RED = 3000;          // Время горения красного сетодиода
const int TIMEOUT_YEL = 1690;          // Время горения желтого светодиода
const int TIMEOUT_GREEN = 2000;        // Время горения зеленого светодиода

const int TIMEOUT_FLASH_GREEN = 500;      // Время мигания зеленого светодиода

void setup()
{
  // Все порты светодиодов будут у нас установлены в режим "внешняя нагрузка", OUTPUT
  pinMode(LED_RED, OUTPUT);   
  pinMode(LED_YELLOW, OUTPUT);
  pinMode(LED_GREEN, OUTPUT);
  
  // Устанавливаем начальное значение светодиодов
  digitalWrite(LED_RED, LOW);
  digitalWrite(LED_YELLOW, LOW);
  digitalWrite(LED_GREEN, LOW);
}  

void loop()
{
  // Включаем зеленый цвет светофора
  digitalWrite(LED_GREEN, HIGH);    // Включаем светодиод       
  delay(TIMEOUT_GREEN);             // Ждем

  // Мигаем зеленым светодиодом 3 раза
  for (int i=0; i<3; i++)
    {
      digitalWrite(LED_GREEN, LOW);         
      delay(TIMEOUT_FLASH_GREEN);                
      digitalWrite(LED_GREEN, HIGH);        
      delay(TIMEOUT_FLASH_GREEN);                
    }  
  
  // Теперь отключаем зеленый и включаем желтый светодиод
  digitalWrite(LED_GREEN, LOW); 
  digitalWrite(LED_YELLOW, HIGH);           
  delay(TIMEOUT_YEL);            

  // Отключаем желтый светодиод.
  digitalWrite(LED_YELLOW, LOW); 
  // Теперь включаем красный цвет
  digitalWrite(LED_RED, HIGH);            
  delay(TIMEOUT_RED);                         
          
  // Включаем желтый светодиод,не выключая красный
  digitalWrite(LED_YELLOW, HIGH);           
  delay(TIMEOUT_YEL);                       
  
  // Отключаем желтый и красный светодиоды.
  digitalWrite(LED_YELLOW, LOW);    
  digitalWrite(LED_RED, LOW);   
  
}

Загрузите скетч в контроллер и убедитесь, что все работает правильно. Если что-то пойдет не так, обратитесь к статье, посвященной подключению светодиода к Ардуино – там описаны все типичные случаи неисправностей.

Улучшение проекта

После того, как вы написали скетч и помигали светодиодами на макетной плате можно подумать и о том, как сделать из проекта светофор нечто большее. Какие еще улучшения возможны:

  • Сделать настоящий макет светофора. Поместить светодиоды и контроллер вместе с макетной платой в корпус. Можно выбрать достаточно большую коробку, чтобы туда поместился источник питания. А можно взять небольшой футляр, например, тубус от туалетной бумаги и разместить там светодиоды. Одной только макетной платой тут не обойдешься, т.к. провода и платы не влезут в миниатюрный корпус.
  • Можно расширить проект, добавить светодиоды для пешеходов и написать программу для пешеходного светофора. Связать эти два светофора будет не сложно, в Arduino Uno без проблем найдется 5 пинов.
  • Сделать проект для перекрестка. Здесь вам понадобится уже больше пинов и другой контроллер – например, Arduino Mega.

Заключение

В этой статье мы узнали, как собрать вместе на одной макетной плате три светодиода  и подключить их к ардуино уно или нано. Разобрались с алгоритмом работы настоящего светофора и смогли написать свой скетч на языке C++. Мы еще раз убедились, что писать программы со светодиодами – это просто, нужно понять лишь несколько базовых принципов. Будем надеяться, что статья оказалась вам полезной и вы продолжите знакомство с платформой Ардуино с одним из следующих наших проектов.

ОСТАВЬТЕ ОТВЕТ

Please enter your comment!
Please enter your name here