Каждый из нас ежедневно по несколько раз переходит улицу. Или ездит на автомобиле. При этом мы обязательно руководствуемся сигналами светофоров. А кто и когда придумал эти полезные устройства, столь привычные нам сегодня, но без которых в современном городе сразу случился бы транспортный коллапс?
История светофора уходит своими корнями в глубь тысячелетий. Еще указ древневавилонского царя Хаммурапи (XVIII век до н.э.) запрещал колесницам загромождать проезд к дворцу. А специально обученные рабы-регулировщики ночью, когда плохо было видно всадников и повозки, чтобы управлять их потоками вешали на свои плечи коромысло с двумя тыквами на концах. Тыквы были наполнены смесью нефти и минеральных масел, в которую окунали фитили и поджигали. Благодаря добавкам одно пламя было красным, другое — зеленым. Поворачивая коромысло, они демонстрировали огонь разного цвета, разрешающий или запрещающий проезд.
Самый первый в истории светофор был установлен в декабре 1868 года в столице Великобритании недалеко от здания парламента. Его создателем был инженер Джон Пик Найт. Мы сегодня и не поняли бы, что это непонятное устройство — дедушка современного светофора. Он был с ручным управлением и представлял собой нехитрую конструкцию с двумя стрелками. Одна, расположенная горизонтально, означала остановку, а другая — приподнятая вверх под углом в 45 градусов — движение с осторожностью. В ночное время стрелки заменялись газовым фонарем двух цветов. Красный — стоп, а зеленый разрешал дальнейшее движение.
В начале XX века широкое распространение электричества внесло свои коррективы. Создателем первого электрического светофора стал американец Лестер Вайр, который в 1912 году разработал конструкцию с двумя лампами, цвета которых стали уже общепринятыми на дорогах: красным и зеленым. В 1914 году в Кливленде одна из компаний установила на перекрестке сразу четыре электрических светофора, придуманных Джеймсом Хогом.
Помимо световых сигналов, они издавали еще и громкие звуки. Управление системой осуществлялось полицейским, находящимся рядом в стеклянной будке. Первые же трехцветные светофоры появились в 1920 году на улицах Нью-Йорка и Детройта. Их создали Джон Ф. Харрис и Уильям Поттс. А первый светофор в СССР был установлен в Ленинграде 15 января 1930 года на пересечении Литейного и Невского проспектов, чуть позднее он появился и в Москве.
Современные светофоры неразрывно связаны с компьютерным регулированием. «Умные» устройства способны даже адаптироваться к дорожной ситуации и самостоятельно выбирать нужный режим в случае непредвиденной ситуации или в зависимости от интенсивности трафика. Для этого они оснащены датчиками и «мозгом», который в соответствии с заложенными в него алгоритмами может принимать то или иное решение без помощи человека. По сути, это самые настоящие роботы. Вот и давайте на нашем очередном занятии соберем макет светофора и «научим» его работать. Такая практика поможет познать основы программирования, на которых базируется вся робототехника, и без чего нельзя двигаться дальше.
КРАСНЫЙ, ЖЕЛТЫЙ, ЗЕЛЕНЫЙ!
Напомним, что на прошлом уроке (см. «М-К» № 4-2019) вы узнали, из чего состоит простейшая программа для платформы Arduino, как загрузить ее на плату и подключить к плате светодиод, который будет мигать в запрограммированном режиме. В этот раз у нас в разной очередности станут загораться и гаснуть три светодиода, а программа будет немного посложнее, так как в ней добавятся дополнительные функции, управляющие этими процессами. На схеме показано, как подключить светодиоды к плате, а ниже приведен готовый скетч:
int RED=13;
int YELLOW=6;
int GREEN=4;
void setupQ!
pinMode(RED,OUTPUT);
pinMode(YELLOW,OUTPUT);
pinMode(GREEN,OUTPUT);
}
void loop(){
digital\Vrite(GREEN,HIGH);
delay(5000);
for(int i=0; i<=4; i=i+1){
digital Write(GREEN,HIGH);
delay(1000);
digitaIWrite(GREEN,LOW);
delay(1000);
}
digitalWrite(YELLOW,HIGH);
delay(2000);
digitalWrite(YELLOW,LOW);
digitalWrite(RED,HIGH);
delay(5000);
digitalWrite(RED,LOW);
}
Даже на первый взгляд заметно, что в нем появилось много новых непонятных действий. Будем разбираться поэтапно, идя по программе сверху вниз.
Начнем с первых строчек:
int RED=13;
int YELLOW=6;
int GREEN=4;
Это объявление переменных. Переменные — это ячейки памяти, в которых можно хранить данные. Вы же, наверное, не забыли, что в микроконтроллере Arduino есть собственная память?
Переменные в данном случае нужны, чтобы не запоминать пины, к которым подключили различные светодиоды. Посмотрите внимательно: мы создали ячейку, назвали ее RED, и храним в ней номер пина, к которому подключен красный светодиод. Точно также поступили с желтым и зеленым (YELLOW и GREEN). Согласитесь, так намного удобнее, когда светодиодов несколько, а зажечь необходимо только один конкретный.
Переменные могут хранить данные разных типов, но чаще всего используется тип данных int — это целочисленный тип данных. То есть, переменные типа int хранят в себе только целые числа.
Переменные имеют ограничения по памяти так же, как и ячейки по объему. Об этом надо помнить. Вот некоторые правила по работе с переменными.
1. Переменные нужно обязательно объявить одним из способов:
типпеременной имя;
или
типпеременной имя=значение;
При этом имя можно указывать латинскими буквами, цифрами или но нельзя начинать с цифры. Нельзя, например, написать, — 1arduino
2. Тип присваивают один раз.
3. Во время инициализации нельзя производить иные действия.
4. Над переменными можно производить различные математические действия.
Итак, мы указали, с какими светодиодами будем работать. Далее с помощью функции pinMode() в процедуре setup() настраиваем порты, к которым они подключены.
Так как плата Arduino должна по команде выдавать напряжение на свои ножки, отсюда следует, что мы используем режим работы OUTPUT.
Собственно, на этом процесс настройки платы заканчивается и далее нам нужно определить алгоритм работы светофора. Выберем следующую последовательность: 1 — зеленый свет горит пять секунд; 2 — зеленый свет мигает четыре раза; 3 — желтый свет горит две секунды; 4 — красный свет горит пять секунд.
Именно такая очередность функционирования светодиодов и реализована в приведенной программе, а поскольку она вписана в loop, то будет выполняться вечно и по кругу. Эти процедуры мы уже разбирали на прошлом уроке, но на этот раз появилась какая-то непонятная конструкция for — что это?
For — это цикл со счетчиком. Цикл — это конструкция, проверяющая условие на верность, и выполняющая действия при истинности условия. Следовательно, for — это цикл, который имеет свой счетчик, и изменяет его значение при каждой итерации (повторении). Впрочем, цикл у нас уже тоже встречался, — это как раз тот самый loop, но он не проверяет условие на верность, заранее считая все истинным.
Счетчик же — это переменная, которая меняет свое значение при каждой итерации. Как уже указывалось выше, над переменными можно производить арифметические операции (прибавлять, вычитать значения и т.д.). В нашем скетче за счетчик выступает переменная целочисленного типа i, к которой мы при каждой итерации прибавляем 1.
(“=”оператор присваивания)
Вот так выглядит цикл for:
for(инициализация; условие; инкремент) {
}
А теперь подумайте, зачем был использован цикл for? Правильный ответ: чтобы программа стала короче. Наш цикл реализовал четырехкратное моргание светодиода, но мы не прописывали четыре раза его включение и выключение. При каждой итерации for сам выполнял эти действия, а счетчик следил за количеством повторений.
Остается настроить работу светодиодов других цветов — задаем нужное время их горения в соответствии с алгоритмом. Теперь подключаем Arduino к компьютеру, загружаем на плату программу и… простейший робот-светофор готов!
Антон ЛОМОНОСОВ,
Азизжон УЛЬМАСОВ,
Сергей МОТИН
ПОВТОРЕНИЕ ПРОЙДЕННОГО
В прошлом номере вам было предложено самостоятельно написать скетч для Arduino с двумя мигающими светодиодами. Правильное решение этого задания выглядит вот так:
void setup(){
pinMode(12, OUTPUT);
pinMode(8, OUTPUT);
}
void loop(){
digitalWrite(12, HIGH);
digitalWrite(8, LOW);
delay(1000);
digitalWrite(12, LOW);
digitalWrite(8, HIGH);
delay(1000);
}