Временные световые последовательности: постройте контроллер светофора с помощью Arduino MEGA
Узнайте, как имитировать светофор с помощью Arduino.
Светофоры - одна из тех вещей, которые для большинства людей, похоже, вписываются в ландшафт повседневной жизни. Там, где есть умеренное количество автомобилей, вероятно, будет одно из этих устройств. Современные светофоры довольно сложны внутри и имеют все виды датчиков, таймеров и даже систем мониторинга трафика, которые они используют, чтобы эффективно контролировать скорость движения.

Теперь мы не собираемся создавать реальный светофор, но мы уверены, что смоделируем его с помощью Arduino! Выполнение этого упражнения - отличный способ получить больше удовольствия от основных и наиболее часто используемых команд Arduino. Это также поможет логически решить проблему и спроектировать в соответствии с определенными критериями. В качестве бонуса этот проект помогает нам оценить, как работают светофоры, по крайней мере, на базовом функциональном уровне.
Этот проект будет реализовывать как свет в США, так и в Великобритании.
Билль о материалах
аппаратные средства
- светодиоды
- 2 красных
- 2 зеленых
- 2 желтых или желтых
- Резисторы
6 резисторов (вы можете придерживаться около 330 до 1 кОм для каждого цвета).
- Arduino
МЕГА (Действительно, любой вид будет, но мы используем MEGA здесь.)
- Паяльник + припой
- Проволочные резаки (для простой подгонки)
Программного обеспечения
Arduino IDE
теория
Идея базового светофора состоит в том, чтобы контролировать скорость движения. Как уже упоминалось ранее, современные светофоры могут отслеживать движение, менять циклы освещения для пешеходов, желающих пересечь, знать, когда менять таймер для увеличения потока движения и т. Д.
Для нашего проекта мы реализуем четырехстороннее пересечение на основе фиксированного интервала времени для каждого света. То есть свет не имеет обратной связи и просто будет работать независимо от объема трафика. Несмотря на то, что это не разумный свет, мы можем реализовать эту систему разумным образом. Возможно, даже сэкономить деньги!
Скажем, например, у нас есть четырехсторонний перекресток, улицами которого являются Busy Bunny Lane и Lazy Tortoise Ave (как односторонние улицы). Из истории движения города, проведенной местным полицейским муниципалитетом, мы обнаруживаем, что Busy Bunny Lane занят, чем Lazy Tortoise Ave (шокирует!). Так как мы знаем типичный поток трафика этого пересечения, то необходимо использовать простой таймер-контроль. Добавление любых других функций здесь было бы пустой тратой денег, которую город не может себе позволить.
Что нам нужно для нашего моделирования, это способ представления нашего светофора; для этого будут использоваться светодиоды. Остальная часть контроля и логики будет выполнена Arduino. Он будет служить нашим интеллектуальным контроллером и таймером. Это означает, что он включит и выключит каждый свет и посчитает время, в которое каждый должен быть включен.
Для дополнительного бонуса эта смоделированная настройка будет иметь возможность переключаться между огнями США и Великобритании, изменяя константу в коде. Вы можете использовать цифровой вход для переключения операции, но для этого потребуется провод, который не указан в спецификации материалов!
Последовательность цикла (стиль США)
Простой в США светофор состоит из красного, янтарного и зеленого света. Типичная последовательность выглядит следующим образом:
- Зеленый (безопасный для продолжения)
- Янтарный (скоро снижается, красный свет)
- Красный (стоп)
Это, однако, петля для одной улицы. Другое пересечение должно быть продумано. Чтобы это было проще проиллюстрировать, мы собираемся использовать таблицу синхронизации, чтобы помочь нам лучше визуализировать всю последовательность циклов.
Предположим, что у Busy Bunny Lane должен быть зеленый светофор на 12 секунд, а зеленый светофор Lazy Tortoise Ave - на 4 секунды. Для обеих улиц разрешено пропускать свет янтаря в течение 3 секунд. Для красных светофоров время зеленого и желтого циклов напрямую повлияет на это. Изучите таблицу времени ниже, чтобы понять, что это значит.

Как вы можете видеть, это делает ситуацию намного легче понять. Нет необходимости разбивать его на секунды, но для примера и иллюстрации это может быть проще переварить, если вы впервые пытаетесь сделать что-то подобное.
Если эта таблица все еще немного неясна для вас, тогда подумайте об этом следующим образом: когда система сначала включена, первая строка (временная шкала sec = 0) активна и будет продолжать действовать до следующей истекшей секунды (временная шкала сек = 1). Световая последовательность в секундах = 1 будет активна, если система находится на 1.20 секунд или 1.99 секунд работы. Эта концепция распространяется по всей таблице.
Все время цикла составляет 26 секунд, а это означает, что на обеих улицах появился поворот для отправки трафика через свой свет. Как только вы достигнете конца стола, все начинается снова и снова. Если вы посмотрите внимательно, есть два случая, когда оба индикатора красного цвета. Прежде чем начинать читать, попробуйте подумать о том, почему был сделан этот дизайн.
Если вы подумаете об этом осторожно, если вы хотите, чтобы одна улица загорелась, а другая сразу стала зеленой, у вас могли быть несчастные случаи. Это, конечно, зависит от размера улицы, ограничения скорости и других факторов. Но чтобы быть в безопасности, мы можем предположить, что, возможно, человек на янтаре для любой улицы может не остановиться вовремя и будет управлять янтарным светом, пока он краснеет. И если другая улица не обращает внимания, они могут столкнуться с этим человеком и вызвать ужасную аварию! Гораздо лучше, чтобы обе стороны стали красными, чтобы «успокоиться», а затем начать с более предсказуемого и стабильного состояния.
Последовательность цикла (стиль Великобритании)
Простой уличный свет в стиле Великобритании состоит из красного, янтарного и зеленого света, но немного отличается от стиля США. Типичная последовательность выглядит следующим образом:
- Зеленый (безопасный для продолжения)
- Янтарный (скоро снижается, красный свет)
- Красный (стоп)
- Красный / Янтарный (остановитесь, но просто сообщите, что свет скоро станет зеленым)
Таким образом, вы можете видеть, что это немного отличается от США. Вместо мгновенного зеленого цвета загорается желтый свет, чтобы предупредить водителя о том, что зеленый свет идет очень скоро, но, пожалуйста, остановитесь до тех пор. Ниже приведен график времени, чтобы проиллюстрировать это.

Проводят это вверх
Аппаратная часть этого проекта не так уж сложна и на самом деле не требует макета; даже ни одного провода!
Сначала мы начнем с прокладки первого светофора.
Возьмите положительную сторону красного светодиода и вставьте его в контакт 31. Положительная сторона обычно длиннее, но если они имеют одинаковую длину, плоская сторона наружного корпуса отрицательная.
Теперь возьмите резистор от 330 до 1 кОм и вставьте его в контакт 30.
Затем возьмите другой конец резистора и припаяйте к другому концу светодиода, который будет отрицательной стороной. Для лучшей подгонки может потребоваться некоторая обрезка. Обычно светодиод имеет один конец, подключенный к положительному или отрицательному источнику питания (наш корпус равен + 5 В), но для этого потребуется какой-то провод. Вместо этого мы будем использовать контакт 30 в качестве нашей площадки, когда мы установим его на низком уровне. Не совсем обычная практика, но для симуляции светофора это будет прекрасно! Повторите эти шаги еще раз и используйте приведенную ниже таблицу для сопоставления pin-to-LED.

И вот как я припаял свои светодиоды:

Наконец, все должно выглядеть примерно так:

И более формально, схема того, что вы смотрите:

Код Arduino
Код, найденный здесь, содержит массу комментариев и должен помочь вам вместе со статьей. Если бы вы просто загрузили это, он немедленно переключил световую последовательность. Чтобы изменить стиль США и Великобритании, ознакомьтесь с комментариями сверху, чтобы узнать! Как всегда, если вам нужна помощь с чем-либо, ниже будет комментарий или поездка на форумы.
Есть одна вещь, чтобы отметить код. При включении и выключении выходов для светодиодов есть короткий момент, когда некоторые светодиоды выключены и работают очень быстро. Как вы найдете в комментариях кода, я сделал это, чтобы было легче следовать вместе с таблицей времени раньше. Для нашего применения светодиод будет выглядеть так, как будто он вообще не выключается! Это связано с тем, что транзистор включен-выключен так быстро, что наши глаза не могут их забрать. В качестве предупреждения, однако, эта методика удобочитаемости кода вызывает проблемы в других проектах, таких как синхронизация триггера. Мы не можем его увидеть, но триггер наверняка узнает, что произошло транзистор! Но есть моменты, когда это используется, как при параллельном отображении 7 сегментов. Большинство, что вы видите, имеют каждую цифру, включающую по одному, но мы этого никогда не понимаем. В нашем случае для светофора это не помогает и не причиняет нам вреда, поэтому я просто позволю.
/ * ================================================================================================= ========================= … ……. Моделировать базовые светофоры в США и Великобритании. Авторизация ……… Joseph CorletoE-mail ……… Начато …….. 06/11 / 2016Изготовлено ……. 06/11 / 2016Обновлен …….. - / - / ---- ================== ================================================== ============ Примечания ============================================================================= ========================================== Пожалуйста, посетите сайт www.allaboutcircuits. com для поиска полной статьи! ============================================= ======================================================= Обновления ============ ================================================== ======================= ========================================================================= ================================================== = // Заголовочные файлы // ========================================== ==================================== // ============ ================================================== ======================== stants // =============================================================================================== ================================ const int TRAFFIC_LIGHT_STYLE = 1; // Используется для выбора стиля светофора const int GREEN_LIGHT = 12; // Время зеленого света в секундах const int AMBER_LIGHT = 3; // Янтарное время света в секундах const int DEAD_LIGHT = 2; // Время мертвого света в секундах const int RED_AMBER_LIGHT = 1; // Красное / Янтарное время света в секундах // Я знаю, что вы думаете, почему значения defaut «# 434f54»> // позже в коде. Я в основном вычисляю цикл Lazy Tortoise Ave из // времени цикла из значений Busy Bunny Lane. Продолжайте читать! // ===================================================================================== ================================== // Переменные // =========== ================================================== ================== // ============================== ================================================================================================== / Выводные сообщения // ============================================================================================== ======================================== Входы: // Вы можете включить переключатель, чтобы вернуться и вперед к режимам usa и uk, если // амбициозны! // Выходы: int greenBusyBunnyLane = 30; // Выход зеленого света: Занятый кролик-полоса int amberBusyBunnyLane = 32; // Янтарный свет: Busy Bunny Lane int redBusyBunnyLane = 34; // Выход красного света: Занят Банни Laneint greenBusyBunnyLaneGnd = 31; // Зеленая светлая земля: Занятая Банни Лейн int amberBusyBunnyLaneGnd = 33; // Янтарная светлая земля: Занят Банни Лейн int redBusyBunnyLaneGnd = 35; // Красный свет: Занятый зайчик Laneint greenLazyTortoiseAve = 48; // Выход зеленого света: Lazy Tortoise Ave int amberLazyTortoiseAve = 50; // Янтарный свет: Lazy Tortoise Ave int redLazyTortoiseAve = 52; // Выход красного света: ленивая черепаха Aveint greenLazyTortoiseAveGnd = 49; // Зеленая светлая земля: ленивая черепаха Ave int amberLazyTortoiseAveGnd = 51; // Янтарная светлая земля: ленивая черепаха Ave int redLazyTortoiseAveGnd = 53; // Красный свет: проспект Ленивой черепахи // ===================================================================================== ======================================= Инициализация // ===== ================================================== ============================================================================================================================================================================================================================================================================================================================================================= OUTPUT); pinMode (redBusyBunnyLane, OUTPUT); pinMode (greenBusyBunnyLaneGnd, OUTPUT); pinMode (amberBusyBunnyLaneGnd, OUTPUT); pinMode (redBusyBunnyLaneGnd, OUTPUT); // Устанавливаем соответствующие выходные световые выходы для Lazy Tortoise AvepinMode (greenLazyTortoiseAve, OUTPUT); pinMode (amberLazyTortoiseAve, OUTPUT); pinMode (redLazyTortoiseAve, OUTPUT); pinMode (greenLazyTortoiseAveGnd, OUTPUT); pinMode (amberLazyTortoiseAveGnd, OUTPUT); pinMode (redLazyTortoiseAveGnd, OUTPUT)); // Set initial statesdigitalWrite (greenBusyBunnyLane, LOW), digitalWrite (amberBusyBunnyLane, LOW), digitalWrite (redBusyBunnyLane, LOW), digitalWrite (greenBusyBunnyLaneGnd, LOW), digitalWrite (amberBusyBunnyLaneGnd, LOW), digitalWrite (redBusyBunnyLaneGnd, LOW); digitalWrite (greenLazyTortoiseAve, LOW); digitalWrite (amberLazyTortoiseAve, LOW); digitalWrite (redLazyTortoiseAve, LOW); digitalWrite (greenLazyTortoiseAveGnd, LOW); digitalWrite (amberLazyTortoiseAveGnd, LOW); digitalWrite (redLazyTortoiseAveGnd, LOW);} // ===== ================================================== ======================== // Главная // =========================================================== ================================================== ======== void loop () {// Программа должна знать, какой стиль светофора использовать. К счастью, // в верхней части этой программы, в разделе Constants мы зарезервировали TRAFFIC_LIGHT_STYLE // для этой цели. Теперь мы можем просто использовать приведенные ниже условные инструкции SWITCH-CASE, чтобы выбрать, какой из них выполнить для жизни этой // программы. Вы всегда можете добавить больше, если хотите! Switch (TRAFFIC_LIGHT_STYLE) {case 0: usaTrafficLight (); break; case 1: ukTrafficLight (); break; default: break;}} // ======= ================================================== ====================== // Функции // ============================================================= ================================================== ====== ///////////////////// // usaTrafficLight // ////////////////// /// void usaTrafficLight () {// Не забудьте проконсультироваться с allaboutcircuits.com для таблицы синхронизации! Это будет // очень полезно при определении того, почему код существует ниже. Теперь это // только один способ сделать весь этот цикл. Когда я код, мне нравится // сделать все максимально читаемым. И если мне не нужна дополнительная скорость вычислений, я буду повторно вводить инструкции ради запоминания // того, что было последним. Поэтому, если вы подумаете о себе «эй, он повернул // на красный свет, затем выключился, а потом!», Вы правы! Я просто хотел // облегчить чтение! // Сначала у Busy Bunny Lane есть зеленый свет. И по карте //, Lazy Tortoise Ave - красный. Я буду использовать FOR LOOP за одну секунду // приращения, так как это поможет поддерживать логическую непрерывность из таблицы time //. Не забудьте выключить свет после каждого цикла! Для (int seconds = 0; seconds <GREEN_LIGHT; seconds +) {digitalWrite (greenBusyBunnyLane, HIGH); digitalWrite (redLazyTortoiseAve, HIGH); delay (1000);} digitalWrite (greenBusyBunnyLane, LOW); digitalWrite (redLazyTortoiseAve, LOW); // Теперь, когда время ожидания зеленого света прошло для Busy Bunny Lane, мы можем // перемещаться по нашему янтарному свету time.for (int seconds = 0; seconds <AMBER_LIGHT; seconds +) { digitalWrite (amberBusyBunnyLane, HIGH); digitalWrite (redLazyTortoiseAve, HIGH); delay (1000);} digitalWrite (amberBusyBunnyLane, LOW); digitalWrite (redLazyTortoiseAve, LOW); // Мертвая зона впереди, чтобы предотвратить наши дорожно-транспортные происшествия.for (int seconds = 0; seconds <DEAD_LIGHT; секунды +) {digitalWrite (redBusyBunnyLane, HIGH); digitalWrite (redLazyTortoiseAve, HIGH); delay (1000);} digitalWrite (redBusyBunnyLane, LOW); digitalWrite (redLazyTortoiseAve, LOW); // Наконец, Lazy Tortoise Ave получает свою очередь за зеленый! For (int seconds = 0; seconds <(GREEN_LIGHT / 3); секунды +) {digitalWrite (redBusyBunnyLane, HIGH), digitalWrite (greenLazyTortoiseAve, HIGH), delay (1000);} digitalWrite (redBusyBunnyLane, LOW); digitalWrite (greenLazyTortoiseAve, LOW); // Lazy Tortoise Ave теперь переходит в янтарный свет.for (int seconds = 0; seconds <AMBER_LIGHT; секунды +) {digitalWrite (redBusyBunnyLane, HIGH), digitalWrite (amberLazyTortoiseAve, HIGH), задержка (1000);} digitalWrite (redBusyBunnyLane, LOW); digitalWrite (amberLazyTortoiseAve, LOW); // Еще раз, мертвая зона for (int seconds = 0; seconds <DEAD_LIGHT; секунды +) {digitalWrite (redBusyBunnyLane, HIGH), digitalWrite (redLazyTortoiseAve, HIGH), delay (1000);} digitalWrite (redBusyBunnyLane, LOW); digitalWrite (redLazyTortoiseAve, LOW); // Цикл закончен! } //////////////////// // ukTrafficLight // //////////////////// void ukTrafficLight () {// Это будет очень похоже на usaTrafficLight // Сначала у Busy Bunny Lane есть зеленый свет. И по карте //, Lazy Tortoise Ave - красный. Я буду использовать FOR LOOP за одну секунду // приращения, так как это поможет поддерживать логическую непрерывность из таблицы time //. Не забудьте выключить свет после каждого цикла! Для (int seconds = 0; seconds <GREEN_LIGHT; seconds +) {digitalWrite (greenBusyBunnyLane, HIGH); digitalWrite (redLazyTortoiseAve, HIGH); delay (1000);} digitalWrite (greenBusyBunnyLane, LOW); digitalWrite (redLazyTortoiseAve, LOW); // Теперь, когда время ожидания зеленого света прошло для Busy Bunny Lane, мы можем // перемещаться по нашему янтарному свету time.for (int seconds = 0; seconds <AMBER_LIGHT; seconds +) { digitalWrite (amberBusyBunnyLane, HIGH); digitalWrite (redLazyTortoiseAve, HIGH); delay (1000);} digitalWrite (amberBusyBunnyLane, LOW); digitalWrite (redLazyTortoiseAve, LOW); // Мертвая зона впереди, чтобы предотвратить наши дорожно-транспортные происшествия.for (int seconds = 0; seconds <DEAD_LIGHT; секунды +) {digitalWrite (redBusyBunnyLane, HIGH); digitalWrite (redLazyTortoiseAve, HIGH); delay (1000);} digitalWrite (redBusyBunnyLane, LOW); digitalWrite (redLazyTortoiseAve, LOW); // Вот где свет uk отличается! Для (int seconds = 0; seconds <RED_AMBER_LIGHT; seconds +) {digitalWrite (redBusyBunnyLane, HIGH); digitalWrite (redLazyTortoiseAve, HIGH); digitalWrite (amberLazyTortoiseAve, HIGH); delay (1000); } digitalWrite (redBusyBunnyLane, LOW); digitalWrite (redLazyTortoiseAve, LOW); digitalWrite (amberLazyTortoiseAve, LOW); // Наконец, Lazy Tortoise Ave получает свою очередь за зеленый! for (int seconds = 0; seconds <(GREEN_LIGHT / 3); секунды +) {digitalWrite (redBusyBunnyLane, HIGH), digitalWrite (greenLazyTortoiseAve, HIGH), задержка (1000);} digitalWrite (redBusyBunnyLane, LOW); digitalWrite (greenLazyTortoiseAve, LOW); // Lazy Tortoise Ave теперь переходит в янтарный свет.for (int seconds = 0; seconds <AMBER_LIGHT; секунды +) {digitalWrite (redBusyBunnyLane, HIGH), digitalWrite (amberLazyTortoiseAve, HIGH), задержка (1000);} digitalWrite (redBusyBunnyLane, LOW); digitalWrite (amberLazyTortoiseAve, LOW); // Еще раз, мертвая зона for (int seconds = 0; seconds <DEAD_LIGHT; секунды +) {digitalWrite (redBusyBunnyLane, HIGH), digitalWrite (redLazyTortoiseAve, HIGH), delay (1000);} digitalWrite (redBusyBunnyLane, LOW); digitalWrite (redLazyTortoiseAve, LOW); // Вот где свет uk отличается, снова! For (int seconds = 0; seconds <RED_AMBER_LIGHT; секунды +) {digitalWrite (redBusyBunnyLane, HIGH); digitalWrite (amberBusyBunnyLane, HIGH); digitalWrite (redLazyTortoiseAve, HIGH); delay (1000);} digitalWrite (redBusyBunnyLane, LOW); digitalWrite (amberBusyBunnyLane, LOW); digitalWrite (redLazyTortoiseAve, LOW); // Цикл закончен! }
Возможные следующие шаги
Если вы хотите расширить этот проект, вы можете захотеть купить реальный светофор и подключить его! Но, конечно, вам нужно будет комфортно работать с сетевым напряжением (например, ~ 120 В переменного тока в США). А если нет, не думай об этом! Вам понадобится что-то, называемое реле. Чтобы узнать о конструкции реле, я бы предложил начать здесь.
И где найти реальный светофор для игры? Лучшие источники, которые я видел, это продажа eBay, гараж / двор, блошиные рынки и антикварные магазины. Поэтому, если вам посчастливилось найти его для продажи по разумной цене (в зависимости от рыночного спроса, но для типичных пластиковых, от 25 до 100 долларов США), возьмите его, чтобы он работал с руководством этой статьи, а престо - отличный фрагмент для ваши гости!
Теперь, конечно, все эти усилия по изучению последовательности и времени света не должны останавливаться на светофоре. Вы можете так же легко использовать эту настройку во время рождественских огней или для простых эффектов освещения сцены. Вы все равно можете использовать таблицу синхронизации, чтобы помочь во всем процессе. Вы также можете использовать это как сырой таймер для включения и выключения вещей, которые имеют значительно более длительную задержку, например, фонарь внутреннего дворика или насос для бассейна. В принципе, что-то, что нужно для работы над определенным расписанием, но не точным. Надеюсь, это откроет ваше воображение другим вещам за светофорами.
Повеселись!
Попробуйте этот проект сами! Получить спецификацию.
Скачать код