Программирование Arduino для начинающих: контроллер светофора

Светофор — это забавный маленький проект, который может быть завершен менее чем за час. Узнайте, как создать свой собственный — используя Arduino — и как изменить схему для продвинутой модели.

Не беспокойтесь, если вы никогда ранее не пользовались Arduino, у нас есть руководство для начинающих

,

Заметка: Это последняя из серии руководств для начинающих пользователей для Arduino, платформы для создания прототипов электроники с открытым исходным кодом. Вот список предыдущих статей в серии:

  • Что такое Arduino Что ты можешь сделать с этим
  • Что такое стартовый комплект Arduino? Что это содержит?
  • Более крутые компоненты для покупки с вашим стартовым комплектом
  • Начало работы с вашим Arduino Starter Kit — Установка драйверов Настройка платы порт
  • Пристальный взгляд на структуру приложения Arduino Пример программы Blink

Что вам нужно

Помимо базового Arduino вам понадобятся:

  • Красный, желтый и зеленый светодиоды.
  • Макет.
  • 6 х 220? резисторы.
  • Соединительные провода.
  • 1 х кнопочный переключатель.
  • 1 х 10к? резистор

Подойдет практически любой Arduino, если на нем достаточно штифтов. Обязательно прочитайте наше руководство по покупке

если вы не уверены, какая модель вам нужна. У вас, вероятно, есть эти детали в вашем стартовом наборе

уже.

Простой пример

Давайте начнем с малого. Базовый, единственный светофор — хорошее место для начала. Вот схема:

arduino_traffic_light

Подключите анод (длинную ветвь) каждого светодиода к цифровым контактам 8, 9 и 10 (через резистор 220 Ом). Подсоедините катоды (короткие ножки) к заземлению Arduino.

Я использовал Fritzing, чтобы нарисовать эти диаграммы. Он не только прост в использовании, но и бесплатен!

Код

Начните с определения переменных, чтобы мы могли обращаться к источникам света по имени, а не по номеру. Начните новый проект Arduino и начните с этих строк:

int red = 10;
int yellow = 9;
int green = 8;

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

void setup(){
pinMode(red, OUTPUT);
pinMode(yellow, OUTPUT);
pinMode(green, OUTPUT);
}

Это было просто. Теперь для сложной части — фактическая логика светофора. Создайте отдельную функцию для изменения освещения (вы узнаете почему позже).

Когда вы впервые начинаете программировать, сам код является очень элементарным — он вычисляет мелкие логические детали, которые представляют самую большую проблему. Ключом к тому, чтобы быть хорошим программистом, является умение смотреть на любой процесс и разбивать его на основные этапы. Вот остальная часть кода:

void loop(){
changeLights();
delay(15000);
}
void changeLights(){
// green off, yellow on for 3 seconds
digitalWrite(green, LOW);
digitalWrite(yellow, HIGH);
delay(3000);
// turn off yellow, then turn red on for 5 seconds
digitalWrite(yellow, LOW);
digitalWrite(red, HIGH);
delay(5000);
// red and yellow on for 2 seconds (red is already on though)
digitalWrite(yellow, HIGH);
delay(2000);
// turn off red and yellow, then turn on green
digitalWrite(yellow, LOW);
digitalWrite(red, LOW);
digitalWrite(green, HIGH);
delay(3000);
}

Готово! Теперь загрузите и запустите (не забудьте выбрать правильную плату и порт из инструменты > порт а также инструменты > доска меню). У вас должен быть рабочий светофор, который меняется каждые 15 секунд, вот так (ускорился):

single_traffic_light

Пешеходный переход

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

arduino_traffic_light_with_button

Обратите внимание, что светофор точно такой же, как в предыдущем примере. Подключите кнопку к цифровому контакту 12. Вы заметите, что коммутатор имеет высокоомное сопротивление 10 кОм? Резистор прикреплен к нему, и вы можете быть удивлены, почему. Это называется понижающим резистором. Поначалу это сложная концепция, но терпите меня.

Переключатель либо пропускает ток, либо нет. Это кажется достаточно простым, но в логической схеме ток должен всегда течь либо в высоком, либо в низком состоянии (помните — 1 или 0, высокий или низкий). Можно предположить, что кнопочный переключатель, который фактически не нажимается, будет определен как находящийся в низком состоянии, но на самом деле он называется «плавающим», потому что ток вообще не подается.

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

Теперь, в циклической части кода, вместо того, чтобы менять свет каждые 15 секунд, мы собираемся вместо этого прочитать состояние кнопочного переключателя и менять свет только тогда, когда он активирован.

Код

Начните с добавления новой переменной в начало программы:

int button = 12; // switch is on pin 12

Теперь, в функции настройки, добавьте новую строку, чтобы объявить переключатель как вход. Я также добавил одну строку для включения светофора на зеленой сцене. Без этой начальной настройки они будут отключены, пока в первый раз не будет инициирован changeLights () с использованием функции.

pinMode(button, INPUT);
digitalWrite(green, HIGH);

Вместо этого измените всю функцию цикла следующим образом:

void loop() {
if (digitalRead(button) == HIGH){
delay(15); // software debounce
if (digitalRead(button) == HIGH) {
// if the switch is HIGH, ie. pushed down - change the lights!
changeLights();
delay(15000); // wait for 15 seconds
}
}
}

Это должно сделать это. Вы можете быть удивлены, почему кнопка проверена дважды (digitalRead (кнопка)), разделенных небольшой задержкой. Это называется разоблачением. Подобно тому, как для кнопки был необходим понижающий резистор, эта простая проверка останавливает код, обнаруживающий незначительные помехи при нажатии кнопки. Вам не нужно этого делать (и, вероятно, без него все будет работать нормально), но это хорошая практика.

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

Вот как это выглядит (ускорилось):

pelican_crossing

Junction

Давайте попробуем более продвинутую модель. Вместо пешеходного перехода измените схему на два светофора:

arduino_dual_traffic_light

Подключите второй светофор к цифровым контактам 11, 12 и 13.

Код

Во-первых, назначьте ваши новые контакты светофора переменным и настройте их как выходные данные, как в первом примере:

// light one
int red1 = 10;
int yellow1 = 9;
int green1 = 8;
// light two
int red2 = 13;
int yellow2 = 12;
int green2 = 11;
void setup(){
// light one
pinMode(red1, OUTPUT);
pinMode(yellow1, OUTPUT);
pinMode(green1, OUTPUT);
// light two
pinMode(red2, OUTPUT);
pinMode(yellow2, OUTPUT);
pinMode(green2, OUTPUT);
}

Теперь обновите ваш цикл, чтобы использовать код из первого примера (вместо пешеходного перехода):

void loop(){
changeLights();
delay(15000);
}

Еще раз, вся работа ведется в changeLights () функция. Вместо того, чтобы идти красный > красный желтый > зеленый, этот код будет чередоваться на светофоре. Когда один на зеленом, другой будет на красном. Вот код:

void changeLights(){
// turn both yellows on
digitalWrite(green1, LOW);
digitalWrite(yellow1, HIGH);
digitalWrite(yellow2, HIGH);
delay(5000);
// turn both yellows off, and opposite green and red
digitalWrite(yellow1, LOW);
digitalWrite(red1, HIGH);
digitalWrite(yellow2, LOW);
digitalWrite(red2, LOW);
digitalWrite(green2, HIGH);
delay(5000);
// both yellows on again
digitalWrite(yellow1, HIGH);
digitalWrite(yellow2, HIGH);
digitalWrite(green2, LOW);
delay(3000);
// turn both yellows off, and opposite green and red
digitalWrite(green1, HIGH);
digitalWrite(yellow1, LOW);
digitalWrite(red1, LOW);
digitalWrite(yellow2, LOW);
digitalWrite(red2, HIGH);
delay(5000);
}

Вот как это выглядит (ускорилось):

dual_traffic_light

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

И помните, что ваши коллеги по работе во время праздников или в день их рождения приходят с этими идеями о подарках только для фанатов Arduino.

:

Изображение предоставлено: androsvector через Shutterstock.com

Ссылка на основную публикацию
Adblock
detector