Создаем систему светофоров на основе Arduino Uno

В этом уроке мы создадим своими руками систему светофоров, которая будет управляться микроконтроллером Arduino Uno.

Данный проект был создан пользователем JosiahP4 и назывался "Green Lights" для обучения студентов физическим вычислениям, что включало в себя настройку входов и выходов, изучение электричества, программирование с Arduino и немного знаний о системах управления движением. Перекресток изначально планировалось установить в классе, а студентов разделить на команды. Команды получат карточки для заметок с командами (например, lightOn('n', "green") или sleep(2);), которые будут объяснены в рамках урока. В целом, этот проект дает студентам возможность окунуться в мир электроники.

Шаг 1. Комплектующие

Переходим к важной подготовительной части, которая позволит нам сделать систему светофоров на основе Ардуино Уно. Но сперва небольшое отступление - в начале этого проекта была попытка использовать Raspberry Pi с PWM, но пришлось отказаться от идеи, потому что попытка найти драйверы заняла очень много времени.

Детали:

  • Arduino Uno
  • Небольшой лист пенопласта для размещения перекрестка
  • Светофоры (можно сделать самому, можно купить отдельно)
  • Провода
  • Пенопласт для основания светофоров

Инструменты:

  • Компьютер с установленной Arduino IDE
  • Низкотемпературный горячий клеевой пистолет
  • Powerbank, переносной блок питания (если вы хотите носить проект с собой для демонстрации)
  • Различные штуки для украшения вашего перекрестка

Шаг 2. Собираем проект

Пожалуйста, используйте вступительные фотографии в качестве руководства:

  1. Начните с обрезки пенопласта до размера перекрестка, который вы хотите получить.
  2. Затем нарежьте четыре куска пенопласта под основание светофоров.
  3. Прикрепите горячим клеем основы светофоров на основание для перекрестка.
  4. Вырежьте прямоугольное отверстие перед основаниями светофоров под провода.
  5. Приклейте светофоры к каждому кусочку пенопласта на внутренней стороне перекрестка.
  6. С внутренней стороны просуньте провода (снизу вверх) и подключите их к светофорам (следите за цветами проводов, идущими на светофоры). Красный, желтый, зеленый пины. Обратите внимание на буквы на пинах - Зеленый, Желтый, Красный и Земля.
  7. Подключите провода к цифровым контактам 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) для передачи сообщений обратно на компьютер. Последний момент - материалы, которые использовались в уроке были нужны для того, чтобы доказать концепцию системы светофоров на Ардуино.

04.02.2019 | Уроки | Теги статьи
Ардуино+