«ШКОЛА РОБОТОВ» УРОК № 2

«ШКОЛА РОБОТОВ» УРОК № 2

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

История светофора уходит своими корнями в глубь тысячелетий. Еще указ древневавилонского царя Хаммурапи (XVIII век до н.э.) запрещал колесницам загромождать проезд к дворцу. А специально обученные рабы-регулировщики ночью, когда плохо было видно всадников и повозки, чтобы управлять их потоками вешали на свои плечи коромысло с двумя тыквами на концах. Тыквы были наполнены смесью нефти и минеральных масел, в которую окунали фитили и поджигали. Благодаря добавкам одно пламя было красным, другое - зеленым. Поворачивая коромысло, они демонстрировали огонь разного цвета, разрешающий или запрещающий проезд.

«ШКОЛА РОБОТОВ» УРОК № 2
Самый первый в истории светофор

Самый первый в истории светофор был установлен в декабре 1868 года в столице Великобритании недалеко от здания парламента. Его создателем был инженер Джон Пик Найт. Мы сегодня и не поняли бы, что это непонятное устройство - дедушка современного светофора. Он был с ручным управлением и представлял собой нехитрую конструкцию с двумя стрелками. Одна, расположенная горизонтально, означала остановку, а другая - приподнятая вверх под углом в 45 градусов - движение с осторожностью. В ночное время стрелки заменялись газовым фонарем двух цветов. Красный - стоп, а зеленый разрешал дальнейшее движение.

В начале XX века широкое распространение электричества внесло свои коррективы. Создателем первого электрического светофора стал американец Лестер Вайр, который в 1912 году разработал конструкцию с двумя лампами, цвета которых стали уже общепринятыми на дорогах: красным и зеленым. В 1914 году в Кливленде одна из компаний установила на перекрестке сразу четыре электрических светофора, придуманных Джеймсом Хогом.

«ШКОЛА РОБОТОВ» УРОК № 2
Светофор Лестера Вайра

Помимо световых сигналов, они издавали еще и громкие звуки. Управление системой осуществлялось полицейским, находящимся рядом в стеклянной будке. Первые же трехцветные светофоры появились в 1920 году на улицах Нью-Йорка и Детройта. Их создали Джон Ф. Харрис и Уильям Поттс. А первый светофор в СССР был установлен в Ленинграде 15 января 1930 года на пересечении Литейного и Невского проспектов, чуть позднее он появился и в Москве.

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

КРАСНЫЙ, ЖЕЛТЫЙ, ЗЕЛЕНЫЙ!

«ШКОЛА РОБОТОВ» УРОК № 2
Схема подключения светодиодов к плате Arduino

Напомним, что на прошлом уроке (см. «М-К» № 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);

}