В этом уроке мы создадим своими руками систему светофоров, которая будет управляться микроконтроллером Arduino Uno.
Данный проект был создан пользователем JosiahP4 и назывался "Green Lights" для обучения студентов физическим вычислениям, что включало в себя настройку входов и выходов, изучение электричества, программирование с Arduino и немного знаний о системах управления движением. Перекресток изначально планировалось установить в классе, а студентов разделить на команды. Команды получат карточки для заметок с командами (например, lightOn('n', "green")
или sleep(2);
), которые будут объяснены в рамках урока. В целом, этот проект дает студентам возможность окунуться в мир электроники.
Шаг 1. Комплектующие
Переходим к важной подготовительной части, которая позволит нам сделать систему светофоров на основе Ардуино Уно. Но сперва небольшое отступление - в начале этого проекта была попытка использовать Raspberry Pi с PWM, но пришлось отказаться от идеи, потому что попытка найти драйверы заняла очень много времени.
Детали:
- Arduino Uno
- Небольшой лист пенопласта для размещения перекрестка
- Светофоры (можно сделать самому, можно купить отдельно)
- Провода
- Пенопласт для основания светофоров
Инструменты:
- Компьютер с установленной Arduino IDE
- Низкотемпературный горячий клеевой пистолет
- Powerbank, переносной блок питания (если вы хотите носить проект с собой для демонстрации)
- Различные штуки для украшения вашего перекрестка
Шаг 2. Собираем проект
Пожалуйста, используйте вступительные фотографии в качестве руководства:
- Начните с обрезки пенопласта до размера перекрестка, который вы хотите получить.
- Затем нарежьте четыре куска пенопласта под основание светофоров.
- Прикрепите горячим клеем основы светофоров на основание для перекрестка.
- Вырежьте прямоугольное отверстие перед основаниями светофоров под провода.
- Приклейте светофоры к каждому кусочку пенопласта на внутренней стороне перекрестка.
- С внутренней стороны просуньте провода (снизу вверх) и подключите их к светофорам (следите за цветами проводов, идущими на светофоры). Красный, желтый, зеленый пины. Обратите внимание на буквы на пинах - Зеленый, Желтый, Красный и Земля.
- Подключите провода к цифровым контактам 2 - 13 на Arduino
Соединения делаем таким образом:
eastLightG <-> 2;
eastLightY <-> 3;
eastLightR <-> 4;
northLightG <-> 5;
northLightY <-> 6;
northLightR <-> 7;
southLightG <-> 8;
southLightY <-> 9;
southLightR <-> 10;
westLightG <-> 11;
westLightY <-> 12;
westLightR <-> 13;
GND <-> GND (для всех).
Шаг 3. Код для системы светофоров Ардуино
Файл "testirovanie-svetofora.ino" представляет собой простой эскиз, который тестирует светофор. Файл "arduino-svetofor.ino" - это то, что можно использовать для обучения. Все, что нужно знать, прокомментировано в коде.
int nLightG = 0; int nLightY = 1; int nLightR = 2; void setup() { // поместите ваш код найстроек здесь, чтобы запустить один раз: pinMode(nLightG, OUTPUT); pinMode(nLightY, OUTPUT); pinMode(nLightR, OUTPUT); } void loop() { // поместите свой основной код здесь, чтобы запускать в цикле: digitalWrite(nLightG, HIGH); delay(2000); digitalWrite(nLightG, LOW); digitalWrite(nLightY, HIGH); delay(3000); digitalWrite(nLightY, LOW); digitalWrite(nLightR, HIGH); delay(5000); digitalWrite(nLightR, LOW); digitalWrite(nLightG, HIGH); }
// Переменные для каждого света в каждом светофоре. int eLightG = 2; int eLightY = 3; int eLightR = 4; int nLightG = 5; int nLightY = 6; int nLightR = 7; int sLightG = 8; int sLightY = 9; int sLightR = 10; int wLightG = 11; int wLightY = 12; int wLightR = 13; // Сброс света на LOW. void lightsOff() { for (int i = 0; i <= 13; i++) { digitalWrite(i, LOW); } } void setup() { // Устанавливает все светофоры на выходы. pinMode(nLightG, OUTPUT); pinMode(nLightY, OUTPUT); pinMode(nLightR, OUTPUT); pinMode(sLightG, OUTPUT); pinMode(sLightY, OUTPUT); pinMode(sLightR, OUTPUT); pinMode(eLightG, OUTPUT); pinMode(eLightY, OUTPUT); pinMode(eLightR, OUTPUT); pinMode(wLightG, OUTPUT); pinMode(wLightY, OUTPUT); pinMode(wLightR, OUTPUT); lightsOff(); // Запускает последовательный монитор на 9600 Serial.begin(9600); } // lightOn - это функция, которая включает определенные источники света в зависимости от заданного светофора (символа) и цвета (String) в нижнем регистре. void lightOn(char tLight, String color) { // Северный светофор if (tLight == 'n') { if (color == "red") { digitalWrite(nLightR, HIGH); } else if (color == "yellow") { digitalWrite(nLightY, HIGH); } else if (color == "green") { digitalWrite(nLightG, HIGH); } } // Южный светофор if (tLight == 's') { if (color == "red") { digitalWrite(sLightR, HIGH); } else if (color == "yellow") { digitalWrite(sLightY, HIGH); } else if (color == "green") { digitalWrite(sLightG, HIGH); } } // Восточный светофор if (tLight == 'e') { if (color == "red") { digitalWrite(eLightR, HIGH); } else if (color == "yellow") { digitalWrite(eLightY, HIGH); } else if (color == "green") { digitalWrite(eLightG, HIGH); } } // Западный светофор if (tLight == 'w') { if (color == "red") { digitalWrite(wLightR, HIGH); } else if (color == "yellow") { digitalWrite(wLightY, HIGH); } else if (color == "green") { digitalWrite(wLightG, HIGH); } } } // lightOff - это функция, которая отключает определенные огни в зависимости от заданного светофора (символа) и цвета (String) в нижнем регистре. void lightOff(char tLight, String color) { // Северный светофор if (tLight == 'n') { if (color == "red") { digitalWrite(nLightR, LOW); } else if (color == "yellow") { digitalWrite(nLightY, LOW); } else if (color == "green") { digitalWrite(nLightG, LOW); } } // Южный светофор if (tLight == 's') { if (color == "red") { digitalWrite(sLightR, LOW); } else if (color == "yellow") { digitalWrite(sLightY, LOW); } else if (color == "green") { digitalWrite(sLightG, LOW); } } // Восточный светофор if (tLight == 'e') { if (color == "red") { digitalWrite(eLightR, LOW); } else if (color == "yellow") { digitalWrite(eLightY, LOW); } else if (color == "green") { digitalWrite(eLightG, LOW); } } // Западный светофор if (tLight == 'w') { if (color == "red") { digitalWrite(wLightR, LOW); } else if (color == "yellow") { digitalWrite(wLightY, LOW); } else if (color == "green") { digitalWrite(wLightG, LOW); } } } // sleep - это функция, которая берет время в секундах и запускает в функции задержки, чтобы сделать функцию задержки более интуитивно понятной. void sleep(int sec){ delay(sec * 1000); } void loop() { // Удалите часть этого примера, если планируете научить студентов программированию // Печатает, какие огни меняются. Время быстрое. Serial.println("Светофоры N и S меняются!"); lightOff('n', "red"); lightOff('s', "red"); lightOn('n', "green"); lightOn('s', "green"); sleep(2); lightOff('n', "green"); lightOff('s', "green"); lightOn('n', "yellow"); lightOn('s', "yellow"); sleep(3); lightOff('n', "yellow"); lightOff('s', "yellow"); lightOn('n', "red"); lightOn('s', "red"); sleep(5); Serial.println("Светофоры E и W меняются!"); lightOff('e', "red"); lightOff('w', "red"); lightOn('e', "green"); lightOn('w', "green"); sleep(2); lightOff('e', "green"); lightOff('w', "green"); lightOn('e', "yellow"); lightOn('w', "yellow"); sleep(3); lightOff('e', "yellow"); lightOff('w', "yellow"); lightOn('e', "red"); lightOn('w', "red"); sleep(5); }
В этом проекте можно столкнуться с несколькими проблемами. Основной была проводка, которая шла со светофорами. Они прекрасно работают, но провода были не лучшие. Другой момент - не использовать цифровые контакты 1 и 0, потому что код, который используется, включает последовательную связь (требуется 0/1) для передачи сообщений обратно на компьютер. Последний момент - материалы, которые использовались в уроке были нужны для того, чтобы доказать концепцию системы светофоров на Ардуино.