Светофор в тоннеле

Автор: | 25.06.2022

Как-то раз поступила нам от клиента необычная задача: нужно было сделать автоматический светофор перед въездом в тоннель. Дело в том, что в подземном паркинге есть тоннель, длиной метров пятнадцать. Движение по нему двухстороннее, но по ширине входит только одна машина. А сразу после выезда из тоннеля – поворот на 90 градусов (почти как на рисунке, фото взято из интернета). Преимущественным правом въезда в тоннель обладает тот, кот выезжает из-за этого поворота. Но тот кто въезжает в тоннель с другой стороны не может видеть, что из-за поворота кто-то приближается к тоннелю.

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

В качестве датчиков решено было использовать инфракрасные датчики Came DELTA-E, которые предназначены для крепления на стену. Для определения направления движения и для защиты от ложного срабатывания на пешеходов нужно две пары датчиков. Датчики должны быть установлены на расстоянии не менее метра, чтобы пешеход не перекрывал одновременно два датчика. Максимальное расстояние между парами датчиков не более трех метров, чтобы датчики одновременно перекрывались машиной.

Принцип действия таких датчиков довольно прост: один датчик из пары – это излучатель. Он формирует инфракрасный луч, который должен быть направлен в датчик-приемник. Когда между датчиками нет препятствий – луч от излучателя спокойно доходит до приемника. При появлении препятствия – в датчике-приемнике срабатывает реле, которое замыкает контакты.

Датчики питаются напряжением 12 Вольт или 24 Вольта (в зависимости от положения DIP-переключателей внутри датчиков – см инструкцию). Лучше всего взять блок питания на 12 Вольт, а для питания платы Arduino к этому блоку подключить отдельный преобразователь напряжения с 12 до 5 Вольт.

В датчике-приемнике есть контакты реле NO (нормально разомкнутый), С (общий) и NC (нормально замкнутый). Нужно контакты C обоих приемников соединить с GND, а контакты NO подключить к цифровым выходам D2 и D3 платы Arduino.

Для включения светофора нам понадобится реле, примерно такое как на картинке. Следует учесть, что некоторые реле срабатывают при наличии логической единицы (5 Вольт) на управляющем контакте, либо логического ноля (0 Вольт) на управляющем контакте. В зависимости от того, какой тип реле Вам попался – нужно сделать соответствующие изменения в скетче.

Модуль реле нужно запитать от преобразователя напряжения (как и плату Arduino). А управляющий контакт присоединить к выходу D12 платы Arduino.

Скетч довольно простой, хотя и использует для работы прерывания.

#define RED_LIGHT 12 //Контакт для управления реле
#define SENSOR_1 2  //NC-контакт первого инфракрасного датчика (приемника)
#define SENSOR_2 3  //NC-контакт второго инфракрасного датчика (приемника)

int redLightTime = 15000; //время горения красного сигнала (мс) = 15 сек.

bool rightDirection = false;

int interruptNum;

//функция проверки направления
void checkDirection() {
  if (!digitalRead(SENSOR_1) && digitalRead(SENSOR_2)) { // если в момент сработки второй сенсор не замкнут 
    rightDirection = true; //значит направление верное
  }
}

void setup() {
  pinMode(RED_LIGHT, OUTPUT);
  pinMode(SENSOR_1, INPUT_PULLUP);
  pinMode(SENSOR_2, INPUT_PULLUP);
  interruptNum = digitalPinToInterrupt(SENSOR_1); //определяем номер прерывания
  attachInterrupt(interruptNum, checkDirection, FALLING); //прерывание по спаду сигала
}

void loop() {
  if (rightDirection) {
    digitalWrite(RED_LIGHT, HIGH); //зажигаем красный сигнал светофора
    delay(redLightTime); //держим заданное время
    rightDirection = false;
  }
  digitalWrite(RED_LIGHT, LOW); //гасим красный сигнал светофора
}

Как же работает скетч? Все очень просто. На один из контактов, к которым подключены датчики (в нашем случае это D2) назначаем прерывание типа “FALLING”. Это значит, что когда напряжение на этом контакте изменится с 5 Вольт до 0 Вольт (реле замкнет его с GND) – сработает функция checkDirection(). Эта функция проверяет напряжения на контактах D2 и D3 и в зависимости от этого определяет направление движения. Например, если в момент прерывания D2 и D3 были в состоянии LOW, значит сначала замкнулся датчик №2, а потом уже датчик №1. А если в момент прерывания D3 был в состоянии HIGH, значит машина пересекла сначала датчик №1, а второй еще не успела пересечь и направление движения верное. В этом случае зажигаем красный встречным машинам.

На этом же принципе можно сделать подсчет въезжающих и выезжающих машин, но такой задачи нам пока не ставили.

Для упрощения обслуживания устройства можно добавить в схему потенциометр (переменный резистор) и сделать с его помощью регулировку времени горения красного сигнала. Например в пределах от 10 до 60 секунд. Потому что бывает так, что во время эксплуатации становится понятно, что 15 секунд не хватает для проезда машины и нужно увеличить время. Сейчас для этого необходимо изменить скетч и заново залить его в устройство. А с потенциометром изменения скетча не потребовалось бы.

Если что-то непонятно – задавайте вопросы в комментариях, или пишите замечания по коду.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *