2-018
УДК 004.3
В75
6+ (Для детей старше 6 лет. В соответствии с Федеральным законом от 29 декабря 2010 г. № 436-ФЗ.)
ББК 32.973.2-018
УДК 004.3
Все права защищены. Никакая часть данной книги не может быть воспроизведена в какой бы то ни было форме без
письменного разрешения владельцев авторских прав.
Издательство не несет ответственности за доступность материалов, ссылки на которые вы можете найти в этой
книге. На момент подготовки книги к изданию все ссылки на интернет-ресурсы были действующими.
International
Книга
gymnasium выпущена при поддержке
International
gymnasium
¤¤ процессор;
¤¤ оперативная и постоянная память;
¤¤ порты ввода/вывода;
¤¤ таймеры
¤¤ и многое другое.
8
Другие имеют бóльшую мощность и мо-
гут выполнять значительно больше операций.
Третьи имеют большую рабочую часто-
ту (скорость выполнения операций), но за
это приходится расплачиваться количеством
источников питания такого контроллера.
А вот контроллер SmartCar на базе про-
цессора XBee вообще позволяет организо-
вать управление не одним роботом, а целой
группой, в которой каждый робот общает-
ся со своим соседом. Как мы уже выяснили,
самая главная часть любого контроллера —
микропроцессор. Микропроцессоры могут
отличаться друг от друга по виду корпу-
са, количеству ножек и функциональных
возможностей.
Один и тот же процессор может быть за-
ключен в корпус, который нужно припаивать
к плате (SMD-корпус), а может просто встав-
ляться в специальный разъем на плате
(DIP-корпус). Процессор способен выполнять
различные задачи — н апример, управлять ос-
вещением у вас в комнате: по хлопку в ладо-
ши включать свет, а по свистку выключать;
или сам, в автоматическом режиме насыпать
корм и наполнять поилку вашему четверо-
ногому другу.
9
Подведем итог
Проектируем робота
Нарисуйте собственного робота или со- те, что он будет делать, предложите коман-
ставьте коллаж из разных вырезок и вклейте ды, которые он сможет выполнять.
его в рамку. Придумайте роботу имя, реши-
10
1.7. Отметьте устройства, которые могут считаться роботами:
11
Эпизод второй.
Они такие разные
Подведем итог
2.1. Д ля работы на конвейере автомо- но использовать роботов (выберите
бильного предприятия оптималь- один ответ):
шагающих; мобильных;
стационарных; телеприсутствия.
18
2.2. Д ля работы под водой оптимально Объясните свой выбор.
использовать роботов (выберите один 2.3. Первым космическим роботом можно
ответ): считать (выберите один ответ):
управляемых по программе Луноход-1;
(автономных); Венера-1;
управляемых дистанционно
Юпитер-1;
по Wi-Fi;
управляемых дистанционно Пионер-10;
через Bluetooth; Марс-1.
управляемых дистанционно
с помощью USB.
Давайте обсудим, чем отличается ма- Внутри такая платформа устроена просто:
шинка-робот от обычной радиоуправляемой четыре колеса с моторами управляются кон-
игрушки. Возьмем любую роботизирован- троллером, под платой с контроллером
ную платформу, собранную из специального расположен источник питания.
робоконструктора.
19
Первый способ управления подобной
платформой — вручную. Для этого на лю-
бой гаджет с операционной системой Android
(смартфон, планшет, телефон) нужно устано-
вить специальную программу 4joy1.
Устройство управления свяжется с платфор-
мой по протоколу Bluetooth. В этом режиме ею
можно управлять, как обычной радиоуправля-
емой машинкой — с помощью стрелок пульта.
Нажимаем стрелку вперед — машинка
едет вперед, назад — машинка едет назад.
Поэкспериментировав с выполнением ба-
зовых команд, поворотами и остановками,
можно задуматься, чем же это устройство
отличается от обычной радиоуправляемой
игрушки? Кажется, ничего принципиально
нового... А вот и нет!
Мы знаем, чем робот отличается от не-
робота: робот работает по программе, кото-
рую может хранить в своей памяти. Так что
попробуем научить и нашу умную машинку
Запустите
запоминать те команды, которые мы пода-
программу
ем с помощью смартфона.
Чтобы сохранить команды в памяти, на-
жмите на кнопку запоминания програм-
мы. Затем, управляя стрелками, добейтесь,
чтобы платформа проехала по хорошо по-
нятной траектории, например, по квадрату.
Повторное нажатие кнопки А остановит за-
пись команд.
1
Программу управления 4joy — Remote Joystick можно
бесплатно загрузить из Google Play Market.
20
Теперь, если нажать кнопку Старт, роботи-
зированная платформа будет повторять вве-
денные с пульта управления команды столько
раз, сколько вы нажмете кнопку Старт.
Таким образом, мы на практике прове-
рили самый главный принцип робототехни-
ки — принцип хранимой программы, основное
отличие робота от игрушки.
И хотя, на первый взгляд, наши действия
очень мало отличались от работы с обычной
радиоуправляемой игрушкой, именно воз-
Резюме: даже с помощью обычного
можность запомнить и воспроизвести в даль-
смартфона мы можем научиться
нейшем набор произвольно заданных команд
управлять роботом.
и превращают скромную игрушечную машин-
ку в настоящего робота.
Подведем итог
Если у вас есть любой робот, проведите ¤¤ Установите связь между устрой-
ряд экспериментов, подтверждающих прин- ством управления и роботизированной
цип хранимой программы. платформой.
Например, для умной машинки типа ро-
ботоплатформы SmartCar, вам понадобится ¤¤ Проведя несколько эксперименталь-
телефон с операционной системой Android, ных заездов, сохраните в памяти кон-
на котором установлена программа 4joy — троллера программу прохождения
Remote Joystick. траектории в виде квадрата.
21
¤¤ Подумайте, почему длина пути при ¤¤ Попробуйте добиться того, чтобы плат-
непосредственных нажатиях на стрел- форма запомнила алгоритм проезда
ку управления и при выполнении про- по несложному лабиринту. Запишите
граммы различаются. этот алгоритм и нарисуйте схему пути.
Если же у вас есть игрушечный робот, ред, два шага назад и разворот. Проверьте,
проверьте, может ли он запоминать подан- запомнил ли робот программу и сможет ли
ные ему команды. Например, такому робо- повторить ее нужное вам количество раз.
ту команды подаются нажатиями стрелок Если ваша игрушка сможет запомнить те
на рюкзачке. команды, которые вы ей передали, и повто-
Задайте своей игрушке несложную про- рить их, вам повезло быть хозяином настоя-
грамму, например: сделать два шага впе- щего, хоть и не очень сложного робота.
22
Эпизод четвертый.
Правила
устанавливаете вы!
Поговорим про алгоритмы
В этом эпизоде вы узнаете, что общего между былинами про богатырей, приготовле-
нием оладушек, сказочным «Сезам, откройся» и робототехникой. Понятия, которые мы
здесь рассмотрим, являются базовыми для кибернетики, информатики, математики и, ко-
нечно, для робототехники. А кроме сказок, мы поговорим еще о программировании на низ-
ком и высоком уровнях.
Как же добиться, чтобы роботы выполня- должны быть представлены команды, чтобы
ли именно те команды, которые мы счита- их поняли роботы?
ем нужными? Как вы думаете, в какой форме
4.1. А
лгоритм — он понятен
и вроде бы прост
Очень вероятно, что понятия, о которых автоматическими устройствами, ни о со-
мы расскажем в этом эпизоде, знакомы вам ставлении программ для роботов. Все эти
еще с начальной школы, но... понятия — базовые для кибернетики и робо-
Не имея представления о вещах, описан- тотехники. Так что повторить их лишний раз
ных ниже, нельзя говорить ни об управлении не помешает.
23
Итак, когда мы обсуждали, чем же робот мы составляем набор команд, понятных не
отличается от простого механического устрой- только роботу, но и человеку, можно сказать,
ства, мы пришли к выводу, что робот может что мы составляем алгоритм. Таким образом,
действовать по программе. программу образует алгоритм, записанный
А что же такое программа? Фактически на языке, который понимает робот.
мы задаем роботу набор команд, которые он И раз уж мы говорим о серьезных нау-
будет выполнять в точности, не внося ника- ках — кибернетике и робототехнике, то бу-
ких изменений, не придумывая никаких но- дем использовать определения — серьезные
вых шагов. объяснения, разъясняющие смысл объекта
Именно такой набор команд на языке, по- или процесса. Определение алгоритма мож-
нятном роботу, и будет программой. А если но сформулировать так.
24
Исполнитель алгоритма - это некоторая
техническая, биологическая или биотехно-
логическая система, способная выполнить
действия, предписываемые алгоритмом.
Это Среда, в которой действует исполни- для нашего исполнителя (мы можем сколь
тель: все-таки роботы для работы под во- угодно долго кричать машинке-роботу, что-
дой и в жерле вулкана должны обладать бы она ехала вперед, но она не сдвинется
разными качествами. И система команд с места, пока не получит команду на понят-
исполнителя — тот самый язык, понятный ном ей языке).
4.3. С
проси у логики совет
при составлении блок-схемы
Конечно, мы можем расписать все коман- Алгоритм изображают в виде так назы-
ды на обычном русском языке. Но вдруг вы ваемой блок-схемы с помощью специальных
придумаете очень удачную команду, а кто-то значков — блоков, каждый из которых озна-
ее просто не поймет, или при записи алго- чает то или иное действие.
ритма вы просто сделаете орфографическую Вдобавок алгоритмы могут иметь самую
ошибку. Гораздо удобнее может оказаться разную структуру.
просто нарисовать алгоритм! Уж тут оши-
биться куда сложнее!
25
Изображение Шаг алгоритма Блок-схема — графиче-
ское представление алгорит-
Начало или конец ма в виде набора геометриче-
ских фигур, в которых записаны
шаги алгоритма.
Ввод или вывод
Выбор из двух
вариантов
Выполнение
действия
4.4. У
пор присев — раз, упор лежа —
два... Линейный алгоритм
Например, для робота-пешехода мы Начало
с помощью блок-схем можем составить ал-
горитм, показанный на рисунке ниже. Как
видим, все команды здесь выстроились как Подойти
к переходу
по линейке. И структура такого алгоритма
называется линейной.
Дождаться
зеленого света
Конец
26
4.5. Если полить тротуары, то вырастают
зонты... Условный алгоритм
Но не так уж часто мы ходим по ли- де, разветвляется на несколько: «Направо
нейке. Как правило, перед нами на ка- пойдешь — богатым будешь, налево пой-
ждому ш агу возникает выбор: подошли дешь — славу найдешь!» По какой идти —
к перекрестку, а там горит красный или по правой или левой?
желтый свет — что делать? Дверь закрыта Вот и для нашего исполнителя мы долж-
— что делать? Или дорога перед нами, как ны описать, в каком случае выбрать один
перед богатырем в древнерусской леген- путь, а в каком — другой.
Начало
ДА Направо НЕТ
пойдешь
Конец
27
4.6. П
овторяюсь, повторяюсь,
все по кругу я хожу…
Циклический алгоритм
Если же в алгоритме можно выделить Например, представьте, что вы остались
последовательность действий, которая вы- дома одни и решили пообедать. Составим
полняется несколько раз, то такой алгоритм алгоритм приготовления вкусных оладушек:
принято называть циклическим.
Подготовить тесто
Разогреть сковороду
Вылить на сковороду
Немного подождать
Перевернуть оладушек
28
Подготовив тесто и разогрев сковороду, мы зачер-
Начало
пываем тесто ложкой, выливаем его на раскаленную
сковороду, затем, немного подождав, переворачиваем
и повторяем тот же самый набор действий, пока тесто Разогреть сковороду
не закончится.
Мы с вами вывели циклический алгоритм из вет- Добавить масло
вления (условного алгоритма). То, что у нас получи-
лось, называется циклом с условием. Аккуратно расколоть яйцо
Если же нам захочется не оладушек, а чего-то дру-
гого, мы можем составить, например, алгоритм приго- Вылить яйцо на сковороду
товления яичницы. Как видите, это линейный алгоритм
приготовления яичницы из одного яйца. Но разве
так наешься? Давайте-ка увеличим количество яиц Немного подождать
и, соответственно, изменим алгоритм.
Алгоритм приобретает следующий вид: Снять сковороду с огня
Конец
Начало
Наш линейный алгоритм превратился
Разогреть сковороду в циклический, где количество повторений опре-
деляется количеством яиц, которое мы хотим
Добавить масло съесть на обед. Как видите, мы легко можем
превратить яичницу из четырех яиц в яичницу
из десяти яиц — достаточно только
Аккуратно расколоть яйцо указать: повторить выбранные дей-
Повторить
4 раза ствия десять раз.
Вылить яйцо на сковороду Такой цикл получил название
цикла с параметром, где параметр —
Немного подождать количество повторений. И теперь мы можем
сформулировать, какой алгоритм будет назы-
ваться циклическим — алгоритм, в кото-
Снять сковороду с огня
ром присутствует повторение действий.
Конец 29
4.7. Программирование на низком
и высоком уровнях
30
Программа такого вида относится к про- Если для программ низкого уровня код
граммам высокого уровня: пишется и отлаживается непосредственно
на языке исполнения, то для программ вы-
сокого уровня необходим еще интерфейс —
способ связи человека с машиной. Это могут
быть разные кнопочки, поля для ввода па-
раметров, чекбоксы.
То есть когда мы программируем робо- быстрой стирки, то можно сказать, что через
та с помощью пульта управления — мы за- интерфейс программы стиральной машины
даем ему программу высокого уровня. И эта мы задали скрипт быстрой стирки. А про-
программа высокого уровня может ожидать грамма низкого уровня в контроллере на-
на входе набор команд (другими словами, шей стиральной машины, согласно нашему
скрипт действий), которые робот должен выбору, стала использовать ту часть своего
выполнить. кода, которая наливает меньше воды, чем
Например, если мы положили рубашку в обычном режиме, отжимает чуть быстрее,
в стиральную машину и выбрали программу в общем, экономит ресурсы.
31
В стиральных машинах, как вы знаете, бывают разные
режимы работы: «быстрый», «бережный», «льняные тка-
ни», «обычный». Использование каждого режима запуска-
ет отдельный скрипт для контроллера.
Как же так происходит, робот понимает слова человека
и выполняет их с высокой точностью? Подобный случай
впервые был описан в сказке «Али-Баба и сорок разбой-
ников». Али-Баба сказал: «Сезам откройся», и дверь в пе-
щеру отворилась. Пожалуй, это и был первый робот.
Подведем итог
4.1. Соедините линиями пары облаков, содержащие термин и его расшифровку.
33
b) Программа, переводящая исполнителя из точки 0 в точку 2:
b) И
сполнитель «Умная машинка» оказался на складе, обозначенном числом 12,
выполнив программу:
Вперед 5 Вперед 3 Вперед 2 Назад 4 Вперед 3 Назад 1 Вперед 2
Запишите уравнение для определения номера столбика, отмечающего исходную пози-
цию исполнителя перед выполнением этой программы.
34
Эпизод пятый.
Шаг за шагом по программе
Источник
ИК-диод
Приемник
Инфракрасный луч света
Датчик света
Линзы
Отражающая
36 поверхность
пазла
щую поверхность, то он хорошо отражается, Только отверстия нужно вырезать длинные,
а если попадает на прорезь, то рассеивается чтобы датчик точно не ошибся. Если отвер-
и не отражается. Таким образом при помощи стие есть — сигнал идет, отверстия нет — не
луча можно формировать команды управле- идет. И закодировать команды, получается,
ния. Только вот в каком виде их нужно за- совсем несложно: отверстие есть — едини-
дать, чтобы контроллер все понял? ца, нет — ноль. Контроллер понимает только
Давайте рассуждать логически: какими цифры 1 и 0, то есть в нашем случае ариф-
командами управляется платформа SmartCar? метико-логическое устройство контроллера
Команды вперед, назад, вправо, влево мож- работает с арифметикой, которая называ-
но назвать основными (конечно, есть еще ко- ется двоичной.
манды, изменяющие длину пути, и другие, Давайте внимательно рассмотрим коман-
но базовых всего четыре). Изобразить такие ды-пазлы, которые очень удобно сцеплять
команды просто: обозначим их стрелками, друг с другом — держатся прочно!
и все дела! А стрелки можно нарисовать на Пластинки с командами представляют
контрастном фоне или вообще вырезать на собой кусочки яркой, блестящей пластмассы
блестящей поверхности: куда стрелка направ-
лена, путь робот и едет.
Но вот засада! Мы-то с вами прекрасно Для
человека
понимаем, что куда стрелка показывает, туда
и надо ехать, а вот как это объяснить роботу?
Для
Что же понимает машина? машины
В предыдущем эпизоде мы говорили,
что команды, записанные на программном Вперед Назад
языке, переводятся в машинные коды, по- Конец
нятные контроллеру. Как же нам перевести пазла
наши команды-стрелки в код, который пой-
мет робот-машинка?
Давайте поступим так: если датчик уме- Начало
ет отличать свет от темноты, поверхность пазла
Вправо Влево
от пустоты, то можно просто прорезать
отверстия рядом со стрелкой и таким об-
разом закодировать направление движения.
37
с длинными прорезями, а точки показывают, Но как все-таки код передается контрол-
что на этом месте прорези нет — так удобней леру? Давайте внимательно рассмотрим
считать нолики. У каждого кусочка есть на- схему, представленную ниже: «Коды направ-
чало и конец. Стрелкой показано направле- ления движения по программе». Когда мы
ние, в котором поедет робоплатформа, когда выкладываем дорожку из пластинок и запус
считает команду. Каждый кусочек разде- каем машинку для считывания информации,
лен на две зоны: в одной команда обозначе- то она исследует своим оптическим датчиком
на стрелкой, чтобы было понятно человеку, каждый кусочек пазла, будто очень внима-
в другой — зашифрована машинным кодом тельный следопыт. При этом каждую прорезь
в виде длинных прорезей, чтобы было по- машинка воспринимает как импульс, и кон-
нятно роботу. троллер этот импульс преобразует в едини-
Пластинки собираются в цепочку друг за цу. А ровную поверхность, когда импульса
другом, и так получается программа управ- нет, — как нолик (на наших пластинках в этом
ления. Проезжая над цепочкой, машинка месте пустое пространство, отмеченное ма-
считывает значения кодов движения, зашиф- ленькой точкой).
рованные в командах. Например, програм-
Когда машинка наезжает на первую пла-
ма для движения платформы может иметь
стинку, то первый полученный импульс пре-
такой вид:
образует в единицу и сразу ожидает вторую
единицу. После двух обнаруженных единиц
происходит синхронизация (именно поэ-
тому начало у всех программных частей
пазла одинаковое — две прорези). Далее
контроллер ожидает информацию о сле-
дующих четырех двоичных цифрах. Если
машинка проезжает над прорезью, то в кон-
троллер поступает импульс, который тот
воспринимает как единицу. Если машинка
проезжает над сплошным участком, то им-
пульс не поступает, что контроллер воспри-
нимает как ноль.
38
На схеме зелеными цифрами показаны места, где должно быть отверстие или пустое
место. Красным цветом показано, как эти данные преобразуются в нули и единицы.
На представленном рисунке команды движения можно представить в виде следующе-
го двоичного кода:
НАЗАД 1, 1, 1, 1, 1, 0 Вот таким нехитрым способом и работает магия, с по
ВЛЕВО 1, 1, 0, 1, 1, 0 мощью которой контроллер считывает команды с пласти-
ВПРАВО 1, 1, 1, 0, 1, 0 нок, и спользуя датчик света.
ВПЕРЕД 1, 1, 0, 0, 1, 0
До этого момента мы Среднее время обо- Такая стрелка ука- При ис по ль з ов а-
не обращали внима- значено стрел- зывает, что время нии стрелки с выпу-
ния на форму стре- кой с прямой левой движения по данной клой стороной время
лок. На самом деле стороной. команде будет мень- движения — больше
время движения по ше среднего. среднего.
командам стре-
лок разных форм
отличается.
39
На рисунке пред-
ставлены все встре-
чающиеся в наборе
пластинки. Из них
можно составлять
различные програм-
мы движения наше- цикл
го робота. старт макс. средн. мин.
цикл
стоп
звук
свет
40
Подведем итог
5.1. Расставьте параметры, соответствующие командам исполнителя «Умная машин-
ка» (на какое расстояние перемещается робот по заданной команде). Запишите эти
команды в машинных кодах.
Вперед Назад
Вперед Назад
Вперед Назад
41
5.2. Составьте программу езды по сложной траектории, начертите эту траекторию
и запишите программу в машинных кодах.
Набор команд
Двоичный код
команд
Траектория
движения
З наете, что такое код? В этом эпизоде вы узнаете, как перевести понятные человеку
команды в коды, которые понимают роботы. Мы будем говорить о машинном языке
роботов, узнаем, как можно представить информацию в закодированном виде, научимся
переводить обычные слова в секретные коды.
Итак, чтобы роботы понимали команды, их необходимо закодировать. Мы уже узна-
ли, что можно закодировать команды двоичным кодом — в виде ноликов и единиц,
такой код называют еще машинным. А есть ли другие способы? Как их приме-
42 нять, и вообще: как переводить понятные нам команды в закодированный вид?
6.1. Какие бывают коды
Люди разговаривают на человеческом вертикали, так и по горизонтали. В то же вре-
языке — русском, английском, немецком... мя места они занимают значительно мень-
и программы тоже пишутся на языке, по- ше. Прочитать их можно и без специального
нятном людям. Но процессоры внутри кон- оборудования — например, используя каме-
троллеров не понимают человеческого языка, ру телефона. QR-код — это один из вариан-
они действуют согласно своей внутренней тов двумерного штрихкода.
логике. Одно из основных преимуществ QR-кодов —
Представить же в закодированном ви- простота распознавания зашифрованной в них
де можно любую информацию. Наверняка информации. Практически любое современ-
вы обращали внимание на черные полоски ное устройство способно выполнить роль
на запакованных товарах — штрихкод. Счи- дешифратора, а значит, такие коды можно
тывая информацию специальным сканером, использовать буквально повсюду. Чтобы на-
продавец узнает и отправляет в компью- учиться читать секретную информацию, до-
тер цену товара, его наименование и много статочно скачать специальную программу
других сведений. Информация закодирова- для чтения QR-кодов.
на в виде полосок различной толщины, рас- Попробуйте установить на свой смарт-
положенных в ряд: фон такую программу (например, бесплатный
Двумерные штрихкоды более сложны QR Scanner) и расшифруйте информацию, за-
и для кодирования, и для распознавания, так шифрованную в следующих QR-кодах.
как информация в них зашифрована как по
43
6.2. П
ереводчики с планеты Шелезяка.
Перевод десятичных чисел
в двоичную систему
Итак, роботы (а следовательно, и компью- То есть мы представили заданное число
теры) понимают только собственный язык — в виде суммы произведений его цифр на ос-
язык машинных кодов. Наиболее удобным нование в степени, которая соответствует
оказалось двоичное кодирование: то есть месту цифры в числе. Такая система счисле-
в системе счисления, используемой для управ- ния называется позиционной — «вес» цифры
ления роботом, всего две цифры — 0 и 1. Но в числе определяется ее местом, «позицией»
с их помощью можно записать любое, да- в этом числе.
же самое большое число, так же, как мы это Теперь перенесемся на фантастическую
обычно делаем с помощью всего десяти цифр. планету, где живут роботы.
Но выглядят числа в двоичной системе счис-
ления по-другому: они состоят из одних нулей
и единиц и отличаются от десятичных чисел
количеством разрядов (то есть цифр в числе).
Как же соотнести понятные нам числа
в десятичной системе с числами, которые
понимают роботы? Сначала проанализиру-
ем, как же строятся привычные нам числа.
Например, если у нас есть десятичное число
523, его можно представить так:
523 =
500 + 20 + 3 =
5 × 100 + 20 × 10 + 3 × 1 =
5 × 102 + 3 × 101 + 3 × 100
44
На барахолке планеты Шелезяка Старый мов — все по одной штуке. С помощью такого
Робот при торговле с людьми вместо элек- набора гирь Старый Робот ловко взвешивал
тронных весов пользовался экзотичными: любую порцию смазки, не превышающую
с двумя чашками и гирями. Гири были не- 250 граммов.
обычными: 1, 2, 4, 8, 16, 32, 64 и 128 грам-
Выберем гирьки:
128 64 32 16 8 4 2 1
75
Так как Робот был очень старый и частично неисправный, он не мог сразу пере-
водить человеческие числа в машинные коды. Поэтому после взвешивания он
внимательно рассматривал и считал выставленные гири: там, где гиря была, он
ставил единичку, где гири не было, ставил ноль).
128 64 32 16 8 4 2 1
75
0 1 0 0 1 0 1 1
45
Теперь, если выписать все единички и нолики из второй строки, мы полу-
чим: 01001011. Естественно, ноль, стоящий на первом месте, можно отбросить,
и наше число будет иметь вид: 1001011.
Так Старый Робот переводил десятичные числа в двоичные коды, которые по-
нимают роботы.
Кстати, обратите внимание: гири, которые использовал Робот, можно предста-
вить как 2 (основание системы счисления), возведенное в степень, значение
которой равно номеру места, занимаемого цифрой в числе (число 1 — всегда
нулевая степень).
1 2 4 8 16 32 64 128
20 21 22 23 24 25 26 27
Когда же требовалось перевести значения машинных кодов в десятичную
систему, Старый Робот поступал так же, как мы, когда расписывали десятич-
ное число 523: брал число и каждую цифру умножал на значение гири, около
которой стоит эта цифра. Например, Робот взял двоичное число 10011:
128 64 32 16 8 4 2 1
24 23 22 21 20
1 0 0 1 1
100112 =
1 × 24 +0 × 23 + 0 × 22 + 1 × 21 + 1 × 20 =
1 × 16 + 0 × 8 + 0 × 4 + 1 × 2 + 1 × 1 =
16 + 0 + 0 + 2 + 1 = 16 + 2 + 1 = 1910
46
6.3. А
как можно еще? Перевод
десятичных чисел в различные
системы счисления
Все не так уж сложно, правда? Но пере- десятичное число и делим его на два, остат-
вести число таким способом в какую-то дру- ки от деления (которые могут равняться 0
гую систему, например в троичную, уже не или 1) собираются в обратной последова-
получится. тельности, и из них строится двоичное число.
Рассмотрим еще один способ перевода Возьмем, например, десятичное число 11:
чисел из десятичной системы в двоичную, делим его на два — результат 5, остаток 1;
который мог бы применять робот, умеющий результат продолжаем делить на 2, получая
делить столбиком. Это метод деления: берем поочередно остаток 1 или 0.
результат
Затем все остатки выписываем в обрат- что мы можем сказать, что получили четрех-
ном порядке, начиная с последней единицы. битовое число. А двоичное число 1010 0101
Получается, что десятичное число 1110 в дво- будет уже восьмибитовое, потому что состоит
ичном виде имеет вид: 10112. из восьми двоичных цифр.
Мы получили четырехразрядное число — Соответственно, однобитовым будет та-
число, состоящее из четырех двоичных цифр. кое двоичное число, которое прини
В компьютерной технике принято называть мает значение только 0 или 1. Теперь,
каждый разряд двоичного числа битом. Так если в разговоре о робототехнике
47
кто-то упомянет однобитовый канал, вы может передаваться только одно одноби-
поймете, что это такой канал, по которому товое число.
результат
48
X10 X16 X2 X10 X16 X2
0 0 0 8 8 1000
1 1 0001 9 9 1001
2 2 0010 10 A 1010
3 3 0011 11 B 1011
4 4 0100 12 C 1100
5 5 0101 13 D 1101
6 6 0110 14 E 1110
7 7 0111 15 F 1111
Таблица соответствия чисел в различных системах счисления: десятичной, шест
надцатеричной и двоичной.
Подведем итог
6.1. Установите на смартфон программу чтения QR-кодов и расшифруйте информацию
на упаковке любого товара.
Прочитайте информацию, зашифрованную в следующих QR-кодах:
49
6.2. Соберите из гирь, которые использует Старый Робот, следующие порции смазки
(зачеркивая нужные квадратики).
128 г 64 г 32 г 16 г 8г 4г 2г 1г
75 г
7г
15 г
201 г
129 г
7. 1. Компиляторы, интерпретаторы,
процедурные языки
программирования
Программы пишутся на языках програм- в Arduino, то для вас не составит большо-
мирования. Языков программирования су- го труда понять программы, написанные на
ществует великое множество. Некоторые языке Си.
появляются, достигают своего расцвета по- Преимуществом Arduino перед други-
пулярности и потихоньку уходят в забвение. ми платформами является то, что для нее
Например, при программировании робо- написано огромное количество библиотек 2
тов класса Arduino1 используется язык, очень и готовых программ с примерами, и все они
похожий на язык Си. Если вы знакомы с язы- выложены в открытый доступ в сети интернет.
ком Си, то вам будет легко понять команды, Готовые разработки выкладываются
которые используются в Arduino. И наобо- в общее хранилище, которое называется ре-
рот, если вы научитесь писать программы позиторий. Один из самых самых крупных ре-
1
rduino — платформа, ориентированная на непро-
A 2
иблиотека — набор дополнительных команд,
Б
фессиональных пользователей. Представляет собой который позволяет записывать программу
набор готовых плат и позволяет создавать и про- в упрощенном формате.
граммировать роботов буквально «из коробки».
51
позиториев — github.com. В будущем, если вы Языки-интерпретаторы — это Basic, Ку-
научитесь писать такие программы, которые Мир, Java, Питон. Причем языки Java и Питон,
могут быть полезны другим людям, и захо- вдобавок к основным своим преимуществам,
тите, чтобы про вас узнали, вы сами сможе- еще и платформонезависмые. Это значит, что
те выкладывать туда своих трудов. код будет одинаково работать в любой опе-
Мы с вами разобрали способ выполне- рационной системе: MacOS, Linux, Windows,
ния программы с использованием компиля- Android...
тора. Языки-компиляторы — это Си, Паскаль Также бывают не алгоритмические, а про-
и другие. Но существует и альтернатива — цедурные языки, такие как Pl и SQL, которые
язык-интерпретатор. Когда программист используются не для управления техникой,
выбирает, на каком языке ему писать про- а для обработки больших объемов данных,
грамму, он не всегда задумывается, как она для анализа поведения разных машин.
будет исполняться, но для работы со встра- Несмотря на то что языков программи-
иваемой микроэлектроникой это быва- рования так много, самое главное для раз-
ет важно. работчика — предложить алгоритм, который
52
будет исполнять робот, реализуя поставлен- учиться со среды программирования, в ко-
ную задачу. Поэтому вполне можно начать торой команды задаются русскими словами.
После того как вы сохранили про- дит понятный человеку текст программы
грамму в виде файла, ее нужно прове- в машинные коды, которые понимает кон-
рить на синтаксические ошибки — для троллер, и создает исполняемый файл.
этого запускается специальная програм- Ура — победа! Теперь мы загружаем это
ма-транслятор. Если транслятор обнару- в контроллер, подаем питание и радостно
жит ошибки, то покажет, где они находятся. смотрим, как замигал светодиод, а на-
После того как программист исправит ша машинка поехала.
ошибки, программа-компилятор перево- Или, увы, не поехала...
53
Если контроллер ведет себя не так, как вы го века, когда в реле
от него ожидали, то, скорее всего, програм- «Марк-1», одного из
ма написана правильно с точки зрения син- первых компьюте-
таксиса, но с точки зрения логики действий ров в Гарварде, за-
что-то не так... Не присвоено нужное значение бра лось какое-то
какой-то переменной, или перепутан плюс насекомое. На во-
с минусом, или еще что-то. Вариантов, к со- прос нача льс тва,
жалению, много. Наступает самый увлека- чем это занимают-
тельный этап разработки программ — поиск ся программисты, они дружно ответили, что
логических ошибок. Это называется отлад- удаляют жучков, чтобы восстановить работо-
ка или по-английски — Debug, поиск жучков способность компьютера. Так и прижилось —
(программных ошибок). с тех пор багами (жучками) стали называть
Такой интересный термин возник на за- ошибки, которые не дают правильно рабо-
ре программирования, в середине прошло- тать программе.
Эпизод восьмой.
КуМир — все, что нужно
1
Мы будем рассматривать версию не ниже 2.1.0, вари-
ант КуМир для старшеклассников.
54
После загрузки среды КуМир на экра- две основные зоны: рабочую область (вверху)
не можно увидеть окно, которое разбито на и область ввода-вывода (внизу — 2).
Робот передвигается по клеткам поля об- вниз, влево или вправо. Также робот уме-
становки и закрашивает клетки. Если на поле ет исполнять команду закрасить. По этой
есть стены, через них Робот пройти не мо- команде закрашивается клетка, в кото-
жет, но может проверить, есть ли рядом с ним рой робот находится в момент получения
стена, и обойти ее. В Систему Команд Испол- команды.
нителя Робот входят четыре команды пере- Запустить на выполнение созданную про-
мещения: вверх, вниз, влево, вправо. грамму можно командами пункта меню Вы-
При выполнении любой из этих команд полнение либо соответствующими кнопками
Робот перемещается на одну клетку вверх, на панели кнопок.
56
Команда Выполнить непрерывно начина- Чтобы самостоятельно познакомиться
ет непрерывное выполнение программы без с основами программирования, в системе Ку-
остановок между шагами. Мир есть так называемые практикумы, где
Команда Шаг выполняет один шаг про- правильность составленных алгоритмов про-
граммы (исполняет одну команду алгоритма) веряется автоматически.
и переходит в режим паузы. Для выполнения При первой загрузке практикума либо
следующей команды необходимо дать следу- при первой автоматической проверке разра-
ющую команду Шаг. Такой пошаговый р ежим ботанной вами программы появится предло-
удобен для отладки программы, когда нуж- жение создать электронную рабочую тетрадь,
но найти ошибку. в которой будут сохраняться написанные ва-
ми программы и результаты автоматическо-
го тестирования каждой.
58
8.1 Линейный алгоритм
Синтаксис языка КуМир требует, чтобы
при написании программы были явно указа-
ны ее начало и конец (ключевые слова — нач,
кон), а вся программа располагалась между
этими «программными скобками».
Готовую программу нужно протестировать.
В случае прохождения всех тестов в рабочей
тетради напротив решаемой задачи отмеча-
ется и сохраняется оценка.
На рисунке изображена обстановка, в ко-
торой исполнителя Робот необходимо приве-
сти из точки А на Базу — в точку Б, обойдя
стену и закрасив клетки, отмеченные смай-
ликами. Расставив команды вправо, вниз,
закрасить, влево, в количествах, соответ-
ствующих количеству клеток, мы получим
заветную оценку 10, напротив решаемой
задачи.
Внимательно рассмотрев задания разде-
лов Знакомство и Линейные алгоритмы прак-
тикума, мы увидим, что в программах для
их решения реализуются те самые линейные
алгоритмы, про которые говорили в четвер-
том эпизоде — все команды выполняются од-
нократно, в заданном порядке.
59
8.2 Цикл n раз
Конечно, алгоритм обхода стены, кото- Вспомним такую алгоритмическую струк-
рый мы рассмотрели в предыдущем при- туру, как цикл с параметром: жестко опреде-
мере, составить очень просто (и он успешно ленное количество повторений одних и тех
пройдет тестирование в разделе «Линейные же действий.
алгоритмы»): достаточно быть внимательным У нас все время повторяются два дей-
при подсчете клеток и команд. Но наверняка ствия: «вправо, закрасить» — вот и вставим
нам стоит оптимизировать наше творчество — их в цикл. В КуМире такой алгоритм носит
по крайней мере, составленные алгоритмы название «Цикл n раз».
будут заметно короче. У любого цикла есть начало (ключевое
На первый взгляд, никаких проблем, про- слово — нц) и конец (ключевое слово — кц),
стейший алгоритм будет иметь вид: между которыми располагается тело цик-
ла — набор тех действий, которые будут
повторяться. Конкретно для этого вида цик-
ла оговаривается количество повторений.
В нашем случае действия «вправо, закра-
сить» будут повторяться шесть раз, посколь-
ку нам необходимо закрасить всего шесть
клеток.
60
И программа сразу ста-
новится в шесть раз короче
предыдущей и приобретает
элегантный вид:
8.3 Ветвления
А теперь рассмотрим такую задачу: Робот должен закрашивать поле сверху
или снизу и возвращаться на прежнее ме-
сто, но он не должен разрушаться, если вдруг
в одном из тестов сверху или снизу окажет-
ся стена.
Как должен поступить исполнитель? Сна-
чала проверить, есть ли сверху стена. Если ее
там нет, то сбегать наверх, закрасить клет-
ку и вернуться назад. Если же сверху сте-
на есть, то нужно проверить, есть ли стена
снизу. Е сли нет, спуститься на клетку вниз,
закрасить ее и вернуться назад.
61
И программа будет иметь следующий вид:
Обратите внимание на слова: если… то… Иногда для построения полного ветвле-
все — это ключевые слова, и ни одно из них ния используется еще одно ключевое сло-
нельзя забыть. В противном случае отладчик во — иначе.
выдаст синтаксическую ошибку и откажется
запускать программу на выполнение.
8.5. У
правление платформой SmartCar
на языке КуМир
Рассмотрим пульт управления роботи- платформа SmartCar при управлении с пуль-
зированной платформой, обратив внимание та, она может запомнить и повто-
на то, что все действия, которые выполняет рить уже без участия человека.
63
Для этого нажимаем кнопку Запись Если выбрать
и составляем последовательность команд. циклический ре-
По команде кнопки Поехали машинка повто- жим (поставив га-
рит все эти команды. лочку в чекбоксе
команды Цикл),
выполненный один
раз набор команд
будет повторяться
постоянно.
Теперь проверим, возможно ли программ-
ное управление такой платформой. По ко-
манде «Показать программу» в текстовом
редакторе откроется файл, содержащий про-
грамму на языке КуМир.
алг Drill-01
. дано | Робот на поле. Расстояние до Базы
| известно.
. надо | В отмеченных точках выполнить
| команду Бип
| и привести SmartCar на Базу.
| На базе выполнить команды
Бип и Свет нач
.
кон
алг Drill-02
. дано | Робот на поле. Точки на известном расстоянии
| от начала движения робота
. надо | В отмеченных точках выполнить команду Бип
| и привести SmartCar на Базу.
| На базе выполнить команды Бип и Свет
| Используйте цикл «N раз». Возможные обстановки:
нач
...
кон
66
Возможные обстановки: Возможные обстановки:
Эпизод девятый.
Электроника
в робототехнике
И так, мы с вами выяснили, что самая главная часть любого робота — это контроллер.
Но как же он устроен? И при чем тут наука физика?
68
Или воспользоваться солнечными Проще всего увидеть, вырабатывается
батареями: энергия или нет, подключив к маленькой
турбинке электрическую лампочку.
Давайте проверим, можно ли получить
электрическую энергию при помощи ручно-
го генератора.
Кнопка
Переключатель
Геркон (герметизированный
контакт)
70
Для того чтобы увидеть работу элек- агрузкой может стать мотор, лампочка,
Н
трического тока, нам необходима нагрузка. светодиод.
Электромотор
Лампочка
Светодиод
72
Теперь измените схему, использовав
вместо рычажкового переключателя кнопку.
Подумайте, как изменяется работа со-
бранной схемы при использовании различных
переключателей.
Затем попробуйте изменить схему, доба-
вив к лампочке электрический мотор.
Проанализируйте изменение работы
устройства. Как изменилась яркость свече-
ния лампочки? Подумайте, почему наблю-
дается такой эффект.
9.5. П
ревратим электрическую энергию
в движение
Как вы уже поняли, в качестве нагрузки ка не достигнет горизонтального положе-
в электрической цепи может использовать- ния. Чтобы движение продолжилось, нужно
ся не только источник света или звука, но добавить еще хотя бы одну рамку и пере-
и устройство, без которого никак не обой- ключить направление тока в рамке в нуж-
тись в робототехнике — электрический мо- ный момент.
тор. Нам ведь необходимо, чтобы наш робот
умел двигаться.
Электромотор — устройство, преобра-
зующее электрическую энергию в механи-
ческую. Принцип работы его достаточно
простой: если в магнитном поле вертикаль-
но расположить проволочную рамку и про-
пустить по ней ток, рамка проворачивается
и по инерции двигается какое-то время, по-
73
Современный двигатель постоянного тока щаться в обратную строну — против часовой
устроен по подобному принципу: при подклю- стрелки.
чении электрического тока начинается вра- Скорость вращения мотора зависит от на-
щение вала двигателя. пряжения источника питания: например, при
Мотор в электронных схемах обозначает- подключении двух батареек по 1,5 вольта мо-
ся следующим символом: тор с пропеллером будет просто вращаться,
а при подключении четырех батареек может
взлететь под потолок.
76
Примерный вид прибора должен быть
таким:
77
Например, если собрать такую схему, ди-
намик начнет издавать звук полицейской
сирены.
78
Эпизод десятый. Логика.
Ничего случайного
У вас наверняка назрел закономерный вопрос: ну, научились мы собирать фонарики,
запускать пропеллер, завывать как сирена, а причем же здесь роботы и контроллеры?
Вот тут-то и возникает очень интересная проблема: как же все-таки устроена и как
работает основа контролера — микропроцессор?
Это сейчас процессор такой маленький, Мы уже упоминали, что основная часть
что даже в керамическом корпусе по размеру контроллера — устройство, которое выполняет
сравним с гречневым зернышком, а ведь он арифметические и логические операции. Так
состоит из огромного количества электрон-
что же это за логические операции? Чтобы
ных компонентов.
разобраться, нам стоит для начала погово-
А раньше вычислительные машины, вы-
рить об очень интересной науке — логике...
полнявшие те же операции, занимали от-
дельное здание, но они так же состояли из Много лет назад древнегреческий уче-
отдельных электронных компонентов. ный Аристотель заложил основы логики как
Так какие же дейс твия выполняет философской науки о правильном мышлении.
контроллер?
79
Законы логики действуют во все време-
на, для всех народов, для всех профессий.
Об этом можно говорить очень подробно, но
нас пока будет интересовать только раздел,
относящийся к суждениям.
Суждение — форма мышления, в которой
утверждается или отрицается что-то о пред-
метах, их свойствах или отношениях. Суждение
выражается в форме повествовательного пред-
ложения. Суждения могут быть как истинны-
ми, так и ложными. Например: «Луна — спутник Казалось бы, какое отношение может
Земли» — истинное суждение, а «Птицы имеют иметь Древняя Греция к робототехнике? Да-
четыре лапы» — ложное. Попробуйте привести вайте углубимся в историю.
свои примеры истинных и ложных суждений. В девятнадцатом веке английский мате-
С суждениями можно проводить различ- матик Джордж Буль на основе классической
ные операции, для нас самой важной будет логики разработал абсолютно новый раздел
инверсия или отрицание. Отрицание строит- математики — математическую (формальную)
ся путем добавления к суждению частицы не; логику, без которой невозможно было бы про-
неверно, что — и тогда истинное суждение ектирование вычислительных машин, а зна-
становится ложным, а ложное — истинным. чит, и разработка процессоров и построение
Например, суждение «Большую часть роботов.
поверхности планеты Земля занимает во- Джордж Буль не стал задумываться, дей-
да» является истинным. Но если применить ствительно ли Земля имеет форму шара,
операцию инверсии, получится ложное вы- а решил, что раз любое суждение, незави-
сказывание: «Неверно, что большую часть по- симо от его содержания, всегда либо истин-
верхности планеты Земля занимает вода». но, либо ложно, его можно обозначить любой
И наоборот: высказывание «Все лето в Рос- буквой (например, а, b, c и так далее) и этой
сии лежат сугробы» — ложное, а высказыва- букве присвоить значение. Если утвержде-
ние «Неверно, что все лето в России лежат ние истинное, то присваивается значение 1,
сугробы» — истинное. если ложное — 0. К суждениям такого вида
Попробуйте сами поэкспериментировать уже можно применять логические операции.
с построением суждений и отрицаний Итак, логическая алгебра получила назва-
к ним. ние алгебры Буля.
80
10.1. Н
е белый, не пушистый, а черный
и ершистый. Операция НЕ (инверсия)
Давайте теперь попробуем применить
операцию отрицания к истинному суждению, A Ā
которое имеет значение 1 — суждение сразу
же примет значение 0. Суждение обозначим 0 1
буквой А, операция отрицания обозначается
чертой сверху. Полученный результат приня- 1 0
то называть «Таблицей истинности». Таблица истинности
Подумайте, как это удобно: суждением А
можно считать, например, утверждение «Есть
сигнал» или «Ток идет» и, если значение
А = 1, то ток в цепи есть, а если А = 0, ток
отсутствует. Для устройства, которое пере-
ворачивает сигнал, придумали специаль-
ную схему.
A B F=A&B
0 0 0
1 0 0
0 1 0
1 1 1
1. Для начала берем самую простую схе- 3. А что произойдет, если поставить
му электрического фонарика и добавим не два, а три выключателя, доба-
в нее еще один выключатель. То есть вив, например, геркон? Сформулируй-
нам нужны лампочка, источник питания, те операцию конъюнкции для трех
кнопка и рычажковый переключатель. элементов.
84
Логическое ИЛИ Логическое НЕ
Операция ИЛИ (дизъюнкция) истинна Операция НЕ превращает истинное вы-
(лампа загорается, звучит сигнал или на- сказывание в ложное, а ложное в истинное —
чинает крутиться пропеллер), если нажата «переворачивает», инвертирует значение
кнопка ИЛИ замкнут переключатель. высказывания.
Измените собранные вами схемы таким Вот над этой схемой, возможно, придет-
образом, чтобы устройство выполняло функ- ся поразмыслить. Нам нужны только лампоч-
ции дизъюнктора: работало, когда нажат ка, источник питания и выключатель: когда
хотя бы один из выключателей. Также проа- выключатель находится в положении ON —
нализируйте возможности подключения трех лампа не должна гореть, когда выключатель
выключателей одновременно. находится в положении OFF — лампа долж-
на гореть.
10.5. Ф
изические основы электроники.
Лирическое отступление
Проведем с помощью конструктора экспери- словами, происходит преобразование электри-
мент, иллюстрирующий закон физики, без по- ческой энергии в тепловую энергию и энергию
нимания которого невозможно использование света.
электронных компонентов в робототехнике, —
закон Ома.
Вспомним самую первую схему, с которой
мы начали знакомство с электроникой: бата-
рейка и лампочка.
Замкнем выключатель — лампочка засвети-
лась. По цепи протекает электрический ток, со-
вершая работу — нагревая спираль лампочки,
вследствие чего та начинает светиться. Другими
85
Рассмотрим еще один электронный ком- Если изменить схему, добавив в цепь ре-
понент — резистор. Он обладает таким свой- зистор (мы в наших экспериментах добавля-
ством как сопротивление, и необходим тогда, ли вместо резистора мотор), лампочка станет
когда мы опасаемся, что отдельные устрой- светиться более тускло.
ства цепи могут сгореть.
А ЗАКОН ОМА
I = U / R
U = I R
R = U / I
86
Эпизод одиннадцатый.
Датчики — органы чувств
робота
Е сли вас спросить, каким образом человек получает информацию, вы, естественно, от-
ветите, что с помощью органов чувств. Всякий раз, когда мы хотим понять, что про-
исходит вокруг нас, нам приходится обрабатывать данные, которые наш мозг получает
от внешних раздражителей через органы чувств: глаза, уши, нос, кожу и т. д.
Моделируем ситуации:
¤¤ Вы идете по дороге и видите яму: что нужно сделать? Сначала остановиться, затем
обойти ее.
¤¤ Друг издали окликает вас: оглянувшись на звук, вы приветливо машете рукой, затем
меняете направление и подходите к нему.
¤¤ Погожим весенним днем вам становится жарко, вы расстегиваете куртку и идете
нараспашку, радуясь теплому весеннему ветерку.
90
Затем получает результат
и обрабатывает его.
То есть нам вовсе не нужно бегать вершать указанные ему действия на протяже-
к устройству и вручную нажимать кнопку нии всего времени работы программы — лишь
снятия показаний датчика. Робот будет со- бы хватило энергии.
Эпизод двенадцатый.
Датчики своими руками
+ -
30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
AB C DE
AB C DE
F GH I J
F GH I J
28
27
26
25
24
23
22
21
20
19
18
17
16
15
14
13
12
11
10
29
30
9
8
7
6
5
4
3
2
1
+ -
+ -
Макетная плата — это поле с боль-
шим количеством отверстий, в ко-
торые вставляются электронные
компоненты.
92
Отверстия между синей и красной го- уровня. В качестве первого опыта подклю-
ризонтальными линиями соединены друг чим светодиод. Как вы помните, нам необхо-
с другом по горизонтали. Отверстия средней дим источник питания, дающий напряжение
части макетной платы связаны между собой 6 вольт, и светодиод.
вертикально.
Синяя и красная горизонтальные линии
служат магистралями для подключения пи-
тания: на красную подается плюс, а на си-
нюю — минус.
Компоненты в схеме удобнее всего соеди-
нять с помощью специальных проволочных
перемычек, но можно и просто отрезать и за-
чистить концы провода.
Начнем со схемы, которую мы уже пробо-
вали собирать из конструктора начального
R1 R2 R3
D1 D2 D3
6v
R1 R2 R3
6v
тите измененную схему.
R1 R2 R3
Подведем итог
+ -
30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
AB C DE
AB C DE
Научившись обра-
щаться с макетной пла-
той, можно попробовать
F GH I J
F GH I J
9
8
7
6
5
4
3
2
1
реагирует на изменение
+ -
+ -
внешних условий.
96
12.3. Да будет свет! Датчик света
Датчик света — устройство, включающее знаком и имеет три вывода: эмиттер, базу
или выключающее различные исполнитель- и коллектор.
ные механизмы в зависимости от освещен- Работа датчика света основана на свой-
ности окружающей среды. стве фоторезистора изменять величину сво-
Кроме компонентов электронного кон- его сопротивления в зависимости от степени
структора, которые мы уже использовали, освещенности. При отсутствии освещения
нам потребуются два новых: фоторезистор величина сопротивления фоторезистора со-
и транзистор. ставляет 10 кОм. А при освещении ярким
Фоторезистор — полупроводниковый при- солнечным светом или обычной лампочкой
бор, электрическое сопротивление которого сопротивление фоторезистора уменьшается
меняется в зависимости от интенсивности в 10-20 раз. Чтобы управлять током в элек-
падающего на него света. Чем интенсивней трической цепи при работе датчика, нам не-
свет, тем больше создается свободных носи- обходим транзистор.
телей зарядов и тем меньше становится со-
противление элемента. R1
R3
6v
D1
Q1
BC547
R2
Транзистор — радиоэлектронный ком-
понент из полупроводникового материала,
обычно с тремя выводами, позволяющий
с помощью входного сигнала управлять током Рассмотрим, как транзистор управляет
в электрической цепи. Обычно используется работой датчика света. Фоторезистор R1 —
для усиления, генерации и преобразования это непосредственный датчик света, рези-
электрических сигналов. На электрической стор R2 устанавливает режим работы
схеме обозначается следующим условным транзистора. Исполнительная часть
97
в ыполнена на транзисторе Q1. Сопротивление R3
резисторов R2 и R3 — 1 кОм. R1
6v
При этом напряжение на средней точке меж- D1
Алгоритм сборки
конструкции датчика света
98
Соединяем перемычкой эмиттер тран-
зистора (правая ножка) с минусом батареи
(синяя линия).
Подключаем питание
Подведем итог
Попробуйте проанализировать порог сра- различные номиналы, и запишите наблю-
батывания датчика света подбором рези- даемый результат.
стора R2: поменяйте резистор R2, задавая
R2=360 Ом
R2>360 Ом
R2<360 Ом
100
12.4. О
чень трудно оставаться детям
в темной комнате (датчик темноты)
Итак, датчик света мы собрали и настро- Порядок сборки этого датчика практически
или, но, наверное, более полезным в быту не отличается от порядка сборки датчика све-
оказался бы датчик темноты. Например, он та. Но при включении может оказаться, что
может автоматически включать освещение, светодиод не реагирует на наступление тем-
когда темнеет на улице. ноты. Порог включения датчика нужно на-
Датчик темноты отличается от датчика строить подбором резистора R1. Запишите
света инверсным1 (обратным) порядком ра- наблюдаемые результаты.
боты. То есть когда на датчик попадает свет,
R2 R3
светодиод не горит, если датчик затемнить —
светодиод включается.
Для этого на схеме, собранной для дат-
6v
D1
чика света, необходимо поменять местами
подключение фоторезистора и резистора,
отвечающего за режим работы транзистора. Q1
BC547
Для датчика темноты нам потребуются ре- R1
зисторы R1 — 33 кОм и R3 — 1 кОм.
R1=
R1=
1
Мы уже употребляли термин «инверсия», когда го-
ворили про операцию НЕ в логике. Мы инвертировали,
«переворачивали» значение переменной. 101
Как вы помните, с конструктором начального уровня мы проводили эксперименты, ими-
тируя различные звуки. Попробуем, используя наш конструктор, самим собрать подобное
устройство, подающее звуковые сигналы.
12.5. В
ой пронзительной сирены.
Генератор сигналов звуковой частоты
Генератор сигналов звуковой частоты — Чтобы не строить сложные схемы из ди-
это генератор сигналов, слышимых челове- одов и транзисторов, можно просто восполь-
ческим ухом. зоваться готовым устройством в DIP-корпусе.
Ниже приведена схема генератора, со Нумерация выводов микросхемы начи-
здающего сигнал с частотой примерно 1 кГц. нается от так называемого ключа. Ключ —
Фоторезистор позволяет менять частоту это расположенная на корпусе микросхемы
сигнала в зависимости от освещенности. Чем точка, от которой и отсчитываются выводы.
выше частота сигнала, тем более тонкий звук Еще нам потребуются электронные
мы слышим. Например, львиный рык имеет устройства — конденсаторы, способные на-
значительно более низкую частоту, нежели капливать электрический заряд. В зависи-
писк летучей мыши. мости от способа изготовления конденсаторы
Генератор собран на микросхеме NE555 могут быть полярными и неполярными.
(мы использовали микросхемы в преды-
дущих эпизодах, когда подавали звуковые
сигналы). Эта микросхема — интегральный
таймер с восемью ножками, внутри которого
скрываются транзисторы, диоды и резисто-
ры — то есть в маленьком корпусе собрана
очень сложная схема из множества транзи-
сторов и диодов.
102
А для подачи звуковых сигналов необхо-
дим динамик. С ним нам тоже доводилось
работать ранее.
103
стора и, соответственно, частота генерации. тональности, а если зайдем в темную ком-
То есть если мы поместим нашу конструкцию нату — то совсем другой.
на яркий солнечный свет, звук будет одной
Эпизод тринадцатый.
Протокол связи —
настоящее и будущее
Н аверняка каждый из вас слышал слова Wi-Fi и Bluetooth. Даже с машинками SmartCar мы
устанавливали связь по Bluetooth. Но знаете ли вы, что эти слова означают? Вдоба-
вок роботизированные платформы можно связать друг с другом не только по Bluetooth,
но и иначе. А каким именно способом? Какие способы обмена информацией между устрой-
ствами существуют? Давайте обсудим подробнее.
Для того чтобы устройства, изготовлен- Всего в модели ISO семь уровней: физи-
ные разными разработчиками, в рамках од- ческий, канальный, сетевой, транспортный,
ного протокола всегда могли связаться друг сеансовый, уровень представления и при-
с другом и понимать отправляемые команды, кладной. Мы рассмотрим только первые три.
необходимо разработать единый стандарт.
Когда вы со своего мобильного телефона На первом, физическом уровне данные пе-
подключаетесь к точке Wi-Fi, то совершено редаются в виде электрических сигналов, то
не задумываетесь, кто произвел этот кон- есть информация кодируется с помощью из-
кретный роутер. Чтобы решить проблему со- менения силы тока в проводнике.
вмещения и стыковок различных элементов На втором, канальном уровне микро-
сетей, разработчики договорились о единых схемы сетевой карты преобразуют эти дан-
стандартах, прописанных в модели взаимо- ные в цифровой поток, который уже можно
действия открытых систем (ISO). анализировать.
В модели ISO все функции сети разде- Представьте себе сеть из нескольких
лены на уровни таким образом, что вы- устройств, которые подключены проводом
шележащие уровни используют услуги по к одному компьютеру. Этот компьютер посы-
переносу информации, предоставляемые ни- лает пакет данных, например, устройству 007.
жележащими уровнями. Такая структура по- В нашем случае 007 — это некий адрес-иден-
зволяет модифицировать и даже заменять тификатор. Отправитель помечает, что этот
любой уровень, не затрагивая остальные. пакет предназначен для устройства 007,
Кроме того, деление на уровни дает возмож- а само устройство 007, получив пакет,
ность упростить реализацию каждого из них. начинает его обрабатывать. При этом
109
пакеты данных для других устройств игно- лером стандарта. Первые три знака адреса
рируются. Так обеспечивается адресная до- определяют производителя.
ставка данных. Мы говорили о том, что для MAC-адрес можно посмотреть на упаковке
связи и идентификации устройства в сети ис- сетевой карты или наклейке. Например, у но-
пользуется MAC-адрес — уникальный, серий- утбуков или маршрутизаторов (точек доступа
ный номер, назначаемый каждому сетевому и модемов) на дне обязательно есть наклейка,
устройству при его производстве. MAC-адрес содержащая MAC-адреса на все сетевые интер-
позволяет из множества электрических сиг- фейсы. С помощью этого идентификатора доступ
налов выделить именно те данные, которые к сети можно как разрешить, так и запретить.
адресованы конкретному устройству.
На третьем уровне, сетевом, MAC-адрес
уже необходим для адресации пакета данных
в большой сети. Появляется IP-адрес, кото-
рый указывает, куда доставлять пакет данных
для второго уровня, то есть появляется связ-
ка MAC-адрес — IP-адрес. Например, на один
IP-адрес маршрутизатора может быть заре-
гистрировано несколько устройств, и марш- Наклейку на компьютере искать не очень
рутизатор при обработке данных на третьем удобно, поэтому для определения MAC-адре-
уровне будет анализировать пакеты и отправ- са компьютера следует использовать коман-
лять их нужному устройству по MAC-адресу. ду ipconfig в меню «Пуск» компьютера. В поле
Каждая сетевая карта или сетевой ин- ввода команд (поле поиска) набираем cmd,
терфейс имеет уникальный MAC-адрес. Если команду перехода в консольный режим ко-
MAC-адреса не были бы уникальны, то не мандной строки.
существовало бы способа различить между
собой два устройства, и это привело бы к на-
рушению работоспособности сегмента сети.
Для обеспечения уникальности MAC-
адреса имеют длину 6 байт и обычно за-
писываются шестнадцатеричным числом
в формате 12-34-56-78-90-AB.
Каждый производитель сетевых
устройств использует определенный
110 диапазон MAC-адресов, который
был отведен только ему контрол-
В открывшемся окне консоли набираем команду ipconfig /all.
Физический адрес — это и есть MAC-адрес. команды тот, который относится к нужному
Если на устройство установлено несколь- вам адаптеру или подключению.
ко сетевых карт, то и MAC-адресов, соответ- Знание MAC-адреса устройства помо-
ственно, будет несколько, на каждую карту жет вам выбрать конкретное устрой-
свой. Выбирайте из выведенного результата ство в сети из нескольких.
111
Подведем итог
14.1. Определите MAC-адреса устройств связи, имеющихся в вашем распоряжении (план-
шет, телефон, смартфон), по инструкции пользователя или наклейке на гаджете.
Используя режим командной строки, определите MAC-адрес компьютера или ноутбука
14.2. В
озможно ли существование приборов с одинаковыми MAC-адресами? Выберите
правильный ответ.
Да.
Нет.
Возможно, если устройства используются в разных сетях.
Возможны одинаковые MAC-адреса только для групп устройств
одинакового типа (смартфонов, сотовых телефонов, ноутбуков
и т. п.).
14.3. Выберите правильный ответ: Кто назначает MAC-адрес устройству?
Системный администратор сети.
Любой пользователь сети.
Владелец устройства.
Производитель сетевых устройств.
Никто не назначает, он сам появляется.
112
Эпизод пятнадцатый.
Славная машина — Arduino
114
После загрузки в окне IDE появится текст программы для мигания светодиода.
Обратите внимание, что текст программы лы действуют только на одну строчку. Ком-
состоит из инструкций и комментариев к ним. ментарии к встроенным скетчам даны на
Комментарии не влияют на выполнение про- английском языке, но мы будем писать их
граммы процессором. С их помощью можно на русском, когда приступим к созданию соб-
более подробно описывать работу программы. ственных программ.
Многострочные комментарии выделяются Процедура setup() выполняется один раз
символами /* ……*/ Текст в таких скобках не в начале работы программы или при вклю-
является какой-либо командой и не влияет чении питания Arduino. Она должна присут-
на работу программы, поэтому в них можно ствовать в каждом скетче. Последовательно
писать любые комментарии. выполняется каждая команда, заключенная
Если написать любой текст после двух между фигурными скобками этой проце-
наклонных черточек (//…), он также не будет дуры. Каждая команда должна завер-
распознаваться программой. Но эти симво- шаться символом «;».
115
void setup() {
// initialize the digital pin as an output
(вывод 13 инициализирован как выход).
pinMode(13, OUTPUT);
}
void loop() {
digitalWrite(13, HIGH); // возвращает на светодиод высокий уровень напряжения
delay(1000); // ждем одну секунду
digitalWrite(13, LOW); //возвращает на светодиод низкий уровень напряжения
delay(1000); // ждем одну секунду
}
Внутри цикла функции размещена ко- править команду подачи напряжения 5 В, то
манда, которая переключает состояние пи- светодиод начнет светиться, так как через
на в одно из двух возможных: HIGH или LOW. него потечет электрический ток. Если пин 13
HIGH соответствует логической единице (она установить в состояние LOW (0 В) — отклю-
же, в свою очередь, соответствует напряже- чить подачу напряжения, то светодиод све-
нию питания микроконтроллера +5 В. Состо- титься не будет.
яние вывода LOW соответствует логическому
Следовательно, оператор digitalWrite(13,
нулю, это близко к 0 В.
HIGH) формирует +5В на выходе 13 и зажи-
Если пин 13 на плате Arduino гает, таким образом, светодиод L1.
установить в состояние HIGH — на-
116 delay(1000);
Команда заставляет микроконтроллер вится близким к нулю, и светодиод гаснет.
остановиться и ничего не делать целых Затем снова выполняется команда паузы
1000 миллисекунд (1000 мс = 1 секунда). на 1000 миллисекунд.
То есть на выходе 13 в течение 1000 мс б удет На этом выполнение цикла заканчи-
высокий уровень напряжения, и светодиод вается, но функция loop снова автома-
будет гореть. тически вызывается и запускает команду
digitalWrite(13, LOW); digitalWrite(13, HIGH). И так далее.
Команда переводит пин 13 в состо
яние LOW. Напряжение на выходе стано-
15.2. П
рактическая работа. Первый миг
(управление встроенным
светодиодом)
Цель работы: научиться подключать плату Arduino, запускать программы из библиоте-
ки, проверять работу программы, производить модификацию программы.
Оборудование и материалы: плата Arduino, компьютер, USB-кабель.
Порядок выполнения работы:
1. Подключите плату Arduino к компьютеру USB-кабелем.
2. Подготовьте плату к работе, выбрав в Arduino IDE нужный COM-порт.
3. Сохраните копию скетча из библиотеки. Для этого в меню Файл выберите опцию Со-
хранить как…. А затем сохраните скетч, присвоив ему имя, например, Blink1. Позже
можно будет просто открыть его командой Файл → Открыть.
4. Чтобы загрузить выбранный скетч в Arduino, нажмите на иконку «Загрузка»
(вторая слева иконка на панели инструментов).
В нижней части IDE выводит ряд сооб- программы в формат, понятный для
щений. Сначала появится сообщение о ком- процессора.
пиляции скетча, то есть о преобразовании
117
Далее статус процесса изменится на «За- на Arduino начнут мерцать, указывая, что
гружаем». В этот момент светодиоды TX и RX скетч загружается в плату.
118
ОБРАТИТЕ ВНИМАНИЕ! Если в окне появится надпись типа: «Последовательный
порт СОМ3 не найден», проверьте подключение платы к компьютеру и правиль-
ность настройки в программе COM-порта, а также загляните в «Шпаргалки» и удо-
стоверьтесь, что вы все сделали правильно. Затем еще раз загрузите скетч.
119
6. Загрузите измененный скетч в Arduino чаще требуется, чтобы контроллер управлял
Uno и проверьте, как изменился период различными электронными компонентами,
мерцания светодиода. подключенными к внешним контактам — нож-
Итак, мы научились управлять встроен- кам микрочипа.
ными элементами контроллера. Но гораздо
Внимание! Все подключения можно производить, только когда плата Arduino от-
ключена от компьютера.
D13
A0
D12
A1
D11
D1
A2 D10
GND
A3
GND
D9
A4 D8
Arduino Nano
A5 D7
A6 D6
A7 D5
+5V R1
+5V
120
Порядок выполнения работы: 4. Установите на макетную плату рези-
1. Соберите электрическую схему. стор, одну ножку которого подключите
2. Подключите минус (GND) питания Arduino к короткой ножке светодиода, а вторую
к минусовой шине макетной платы. Для ножку резистора установите в отверстие
этого установите один конец проволоч- вдоль синей линии.
ной перемычки на шилд GND платы K-6,
5. Проволочной перемычкой соедините
а второй конец перемычки — в отверстие
анод светодиода (длинную ножку) и кон-
вдоль синей линии макетной платы.
3. Установите светодиод на макетную пла- такт 13 платы Arduino.
ту. Для этого ножки светодиода вставь- 6. Проверьте правильность сборки и под-
те в отверстия по одной вертикальной ключите плату к компьютеру.
линии. 7. Запустите среду разработки Arduino IDE.
121
8. С копируйте текст приведенной ниже про- те в Arduino. Либо откройте скетч Blink1
граммы с комментариями на русском с комментариями на английском.
языке в среду разработки и загрузи-
/*Программа для мигающего светодиода
*/
// Светодиод подключаем к контакту 13 платы Arduino
// устанавливаем начальную команду, которая будет выполняться
// при включении питания
void setup() {
// определяем выбранный нами контакт платы Arduino, как выход
pinMode(13, OUTPUT);
}
// Теперь определяем, что и как будет выполнять наша программа пока
// подключено питание к плате Arduino:
void loop() {
digitalWrite(13, HIGH); // устанавливаем на контакте
13 высокий уровень (5 Вольт)
delay(1000); // ждем одну секунду
digitalWrite(13, LOW); // устанавливаем на нашем контакте 13 низкий
уровень (0 Вольт)
delay(1000); // ждем одну секунду
}
9. Испытайте работу программы. Опишите Чтобы поменять контакт подключения,
результат. необходимо внести изменения во все ча-
10. Измените в программе время задерж- сти программы, где встречается номер пина,
ки, аналогично тому, как вы это дела- и переключить светодиод на соответствую-
ли со встроенным светодиодом. Опиши- щий выход. Светодиод можно подключать
те результат. к любому выводу контроллера Arduino, но
Светодиод мы подключали к контакту 13. всякий раз будет необходимо вносить в про-
В программе это прописано следующим грамму серию однотипных изменений.
образом:
pinMode(13, OUTPUT);
digitalWrite(13, HIGH);
122 digitalWrite(13, LOW).
Попробуйте изменить программу управ- С одним светодиодом можно исправить
ления внешним светодиодом, подключив его, программу достаточно быстро, а если све-
например, к десятому контакту Arduino, затем тодиодов будет много? Давайте подумаем:
к любому другому. Но пока не будем исполь- как же оптимизировать процесс изменения
зовать для наших экспериментов контакты программы? Для этого нам потребуется еще
2, 3, 4, 5 — они нам понадобятся, когда мы одно понятие, связанное с программирова-
станем работать с моторами. Впрочем, если нием, — переменная.
контроллер Arduino установлен на плате K-6,
то и доступа к этим контактам с цифрового
разъема J13 нет.
123
Теперь скетч примет вид:
Int ledpin = 13;
void setup() {
pinMode(ledpin, OUTPUT);
}
void loop() {
digitalWrite(ledpin, HIGH); //Вольт)
delay(1000);
digitalWrite(ledpin, LOW);
delay(1000);
}
Теперь при изменении номера контакта Конечно, в такой короткой программе найти
больше не потребуется просматривать всю номер ножки выхода нетрудно, но ведь это
программу, выискивая, где записан номер наша первая программа, а следующие будут
пина: достаточно изменить его всего один значительно длиннее. Поэтому переменная —
раз в начале программы, в переменной ledpin. очень удобная вещь в программировании!
Подведем итог
124
15.3. Р
асположите в правильной последовательности действия, необходимые, чтобы
подключить плату Arduino IDE к компьютеру.
В меню Инструменты выбрать требуемый COM-порт.
Запустить программу Arduino IDE.
Убедиться, что требуемые параметры визуально отображаются
на интерфейсе программы.
В меню Инструменты выбрать необходимую плату.
Проверить на какой COM-порт подключена нужная плата.
125
Эпизод шестнадцатый.
Огоньки и кнопочки —
строим с Arduino
В этом эпизоде мы разберем ряд базовых примеров, на основе которых будет строить-
ся управление роботами в следующих эпизодах. Начиная с имитации елочной гирлян-
ды и заканчивая управлением моторами и датчиками расстояния, мы будем собирать
прикольные конструкции и всячески менять программный код, добиваясь интересных
эффектов.
В прошлом эпизоде мы познакомилось тересные модели. В этом эпизоде мы раз-
с простейшими конструкциями, реализован- берем ряд базовых примеров, на основе
ными на базе контроллера Arduino NANO. которых будет строиться наша дальнейшая
Теперь давайте попробуем создать более ин- работа.
D12 R12
D11 R11
D10 R10
D13
A0
D12 D9 R9
A1
D11
A2 D10
D8 R8
GND
A3
GND
D9
A4 D8
A5 Arduino Nano D7
D6
D7 R7
A6
A7 D5
D6 R6
+5V
+5V
В проекте «Одинокий светодиод» мы пер- захочется, чтобы они меняли цвет быстрее,
воначально использовали цифровой вывод или, наоборот, медленно и задумчиво... Что
13, но затем научились использовать циф- тогда делать?
ровые контакты с 8 до 12 (как вы помните, Мы уже знакомы с переменной. Достаточ-
контакты со второго по седьмой в наших экс- но один раз внести в нее информацию, чтобы
периментах мы пока не используем). время задержки изменилось во всей програм-
Аппаратная сторона проста — подключа- ме. Назовем эту переменную для хранения
ем провод от каждого цифрового контакта к времени задержки, например, del (естествен-
аноду светодиода, затем подключаем соеди- но, вы можете назвать ее так, как вам захо-
нительным проводом резистор 360 Ом и за- чется, только шрифт должен быть латинский).
земляем катод светодиода. Теперь наша задача — написать код!
Светодиоды мы заставим моргать в бес- Но сначала нам надо разработать ал-
конечном цикле последовательности 8-9- горитм работы. Например, для этого
10-11-12-13- ... с задержкой в одну секунду. эпизода он мог бы выглядеть при-
Должно получиться хорошо, но вдруг нам близительно так.
127
Алгоритм работы
¤¤ Устанавливаем, что все контакты мы будем использовать как выходы.
¤¤ Создаем переменную для хранения длительности задержки в миллисекундах.
¤¤ Начинаем бесконечно повторяемый цикл:
¤¤ включить контакт 6, ждать установленное время задержки, выключить его;
¤¤ включить контакт 7, ждать установленное время задержки, выключить его.
¤¤ Повторить эти операции для остальных выходов — с 8 до 13.
¤¤ Окончание бесконечного цикла.
Для начала давайте потренируемся на Ура! Заготовка для нашей новогод-
программе проще: попробуйте внести изме- ней гирлянды работает! Теперь можно по-
нения в программу, которая управляет всего думать, как использовать ее в новогоднем
двумя светодиодами на восьмой и девятой оформлении.
ножках Arduino. Соберите конструкцию и на- Чтобы закрепить изученное, попро-
пишите программу, преобразовав ее из про- буйте изменить скорость или порядок
граммы управления одиноким светодиодом, моргания светодиодов. Например, скор-
рассмотренной в предыдущем эпизоде. Если ректируйте программу так, чтобы све-
никак не получается, воспользуйтесь разде- тодиоды мигали в последовательности
лом «Шпаргалки». 6-7-8-9-10-11-12-13-12-11-10-9-8-7-6.
Добившись, чтобы два диода подми
гивали именно так, как вы запланировали,
измените конструкцию и откорректируй-
те программу, чтобы задействовать свето
диоды уже с восьмой по тринадцатую
ножку.
Наверняка у вас все получилось!
Если все же возникли проблемы, то
в «Шпаргалках» для проверки приведен код
для схемы из восьми светодиодов. Этот код
вы можете скопировать в IDE и загру-
зить в Arduino.
128
16.2. Многоцветное свечение
Конечно, мы сконструировали краси-
вую гирлянду, но вдруг у нас нет возмож-
ности развешивать множество светодиодов,
а праздника все-таки хочется. Попробуем
обойтись одним светодиодом, но не простым,
а особенным — трехцветным. Его еще называ-
ют RGB-светодиодом. Выглядит он так же, как Красный
Как вы помните,
при подк лючении
светодиодов обяза-
D13
R11 R12 R13 тельно используются
A0
A1
D12 резисторы (у нас на
D11
A2 D10 схеме это резисторы
GND
A3
R13, R12, R11 номи-
GND
D9
A4 D8
налом 360 Ом).
Arduino Nano
A5 D7
D6
D11 D12 D13
A6
A7 D5
+5V
+5V
129
Сборка устройства программы или при сбросе контроллера
¤¤ Устанавливаем светодиод в макетную Arduino.
плату так, чтобы все выводы светодиода ¤¤ В процедуре loop() мы установим
были помещены в отверстия, не соеди- для красного, зеленого и синего цветов
ненные друг с другом. различные значения, которые и будут
определять цвет каждого светодиода,
затем после паузы в одну секунду б удем
переходить к следующему цвету.
Приступаем к реализации алгоритма.
1. Итак, наш скетч мы начинаем с указа-
ния, какие контакты Arduino мы будем
использовать для каждого цвета: напри-
мер, контакт 13 для красного, 12 для зе-
леного, 11 для синего. Первым делом нам
¤¤ Затем устанавливаем резисторы и под- нужно объявить переменные. Имена пе-
ключаем их перемычками к контактам
Arduino D13, D12, D11. ременных можно придумать типа redPin,
greenPin (красный контакт, зеленый кон-
¤¤ Самый длинный вывод и для такого такт и т. д.).
светодиода — это катод. Его мы подклю-
2. Следующим шагом мы должны написать
чаем к минусу питания (GND).
процедуру setup(). Как мы знаем, эта функ-
ция работает только один раз при запуске
Задача эксперимента
программы или при сбросе контроллера
Заставить светодиод переливаться различ-
Arduino. В нашем случае мы определяем
ными цветами, научиться управлять скоро-
контакты контроллера как выходы. Поду-
стью изменения цвета и регулировать оттен-
майте, какой вид будут иметь команды
ки свечения.
процедуры void setup(), где вывод контрол-
лера, соответствующий каждому цвету, ис-
Алгоритм работы пользуется в режиме «выход».
¤¤ В о-первых, определим, какие кон- 3. Затем подготовим процедуру loop(), в ко-
такты Arduino каждого цвета будут торой установим для красного, зеле-
задействованы. ного и синего цветов различные зна-
¤¤ С ледующим шагом пишем чения — они и будут определять цвет
процедуру setup(), которая свечения каждого светодиода. Делаем
130 работает только один раз при паузу на одну секунду и переходим к дру-
запуске гому цвету.
void loop() setColor(255, 0, 0); // красный
{ delay(1000);
setColor(255, 0, 0); // красный setColor(0, 255, 0); // зеленый
delay(1000); delay(1000);
setColor(0, 255, 0); // зеленый setColor(0, 0, 255); // синий
delay(1000); delay(1000);
setColor(0, 0, 255); // синий setColor(255, 255, 0); // желтый
delay(1000); delay(1000);
setColor(255, 255, 0); // жёлтый setColor(80, 0, 80); // пурпурный
delay(1000); delay(1000);
setColor(80, 0, 80); // пурпурный setColor(0, 255, 255); // голубой
delay(1000); delay(1000);
setColor(0, 255, 255); // голубой }
delay(1000);
Подведем итог
Попробуйте самостоятельно изменить значения яркости светодиодов и проанализируй-
те результат изменений программы.
16.3. Ц
ветовая модель. Почему светодиод
светит разными цветами. Лирическое
отступление
В предыдущем эксперименте мы научи- зовых цветов: красного (R), зеленого (G)
лись задавать светодиоду определенный и синего (B).
цвет и даже заставили его переливаться
Допустим, мы подаем однобитовый сигнал
разными оттенками. Но как это у нас полу-
на к а ж д у ю
чилось, если электронное устройство одно?
область. Если
Как мы говорили, внутри пластиковой
подать по од-
колбы у нас установлены светодиоды трех
базовых цветов: красный (Red), зеленый ному биту на
(Green), синий (Blue), которые соответству- к а ж д ый из
ют цветовой модели, принятой в электро- базовых цве-
нике — RGB. тов — один
Цветовая модель RGB представ- на красный,
ляет собой комбинацию трех ба- один на зеле-
132
ный и один на синий, то, комбинируя их сочетания, можем получить восемь различных цветов —
от черного до белого (черный, красный, зеленый, синий, желтый, пурпурный, голубой, белый).
Задача эксперимента:
Научиться использовать кнопку для управления различными компонентами.
134
Алгоритм работы
Анализируем скетч.
// устанавливаем номера контактов:
const int buttonPin = 12; // задаем номер контакта, подключенный к кнопке
const int ledPin = 13; // задаем номер выхода светодиода
int buttonState = 0; // переменная для хранения состояния кнопки
void setup() {
// инициализируем контакт, подключенный к светодиоду как выход:
pinMode(ledPin, OUTPUT);
// инициализируем контакт, подключенный к кнопке как вход:
pinMode(buttonPin, INPUT);
}
void loop() {
// считываем значение с входа кнопки:
buttonState = digitalRead(buttonPin);
// проверяем, нажата ли кнопка,
// если нажата, состояние кнопки устанавливаем в положение HIGH:
if (buttonState == HIGH) {
// включение светодиода:
digitalWrite(ledPin, HIGH);
} else {
// выключение светодиода:
digitalWrite(ledPin, LOW);
}
}
Обратите внимание, что у нас появляется новая конструкция — условный оператор, состоящий
из двух ветвей:
if ( TRUE ) {
/* выполняется этот код, если условие истинно */
}
else {
/* выполняется этот код, если условие ложно */
} 135
Условие
Действие 1 Действие 2
136
Наверняка такая программа с двумя све- пок. Как вы понимаете, подключать мож-
тодиодами у вас не вызовет затруднений и но не только светодиод, но и любой другой
даже «Шпаргалка 6» вам не понадобится. элемент, который будет реагировать на на-
Таким образом, мы с вами научились жатие кнопки.
управлять светодиодами с помощью кно-
137
Одним из преимуществ Arduino является Итак, мы должны создать объект servo.
готовая к использованию библиотека подпро- Назовем его, например, myservo. В функции
грамм, позволяющая легко управлять серво- setup() мы указываем, что сервопривод под-
приводами. В данном эпизоде используется ключен к выводу 13 контроллера. Затем мы
библиотека для работы с сервоприводами Servo. можем посылать команды для управления
Выбрать ее можно командой Скетч → Подклю- сервоприводом. Угол поворота для вала серво-
чить библиотеку → Servo или прямо в програм- привода может составлять от 0 до 180 граду-
ме, командой #include <Servo.h>. сов, он регулируется в части программы loop().
#include <Servo.h> // подключение библиотеки
Servo myservo;
void setup() {
myservo.attach(13); // устанавливаем контакт 10 как вывод управления
}
void loop() {
myservo.write(0); // устанавливаем угол 0°
delay(2000);
myservo.write(90); // устанавливаем угол 90°
delay(2000);
myservo.write(180); // устанавливаем угол 180°
delay(2000);
}
Может оказаться, что при подаче питания скетч отправлен в Arduino, отсоедините пла-
от USB сервопривод жужжит, но не поворачи- ту K-6 от компьютера и кнопкой включения
вается. В этом случае необходим дополни- запустите программу на выполнение.
тельный источник питания: после того как
A3
GND
D9
A4 D8 R1
подключим красный провод);
Arduino Nano
A5 D7
A6 D6
(зеленый провод);
echo — выход сигнала измерения (белый
провод);
gnd — «земля», «минус» батареи питания
(синий провод).
139
Первые эксперименты проведем, разме-
стив ультразвуковой датчик на макетной
плате.
140
digitalWrite(Trig, HIGH);
/* Подаем импульс на вход trig дальномера */
delayMicroseconds(10); // равный 10 микросекундам
digitalWrite(Trig, LOW); // Отключаем
impulseTime=pulseIn(Echo, HIGH); // Замеряем длину импульса
distance_sm=impulseTime/58; // Пересчитываем в сантиметры
if (distance_sm<30) // Если расстояние менее 30 сантиметров
{
digitalWrite(ledPin, HIGH); // cветодиод горит
}
else
{
digitalWrite(ledPin, LOW); // иначе не горит
}
delay(100);
/* ждем 0.1 секунды, следующий импульс может быть излучен только после
исчезновения эха от предыдущего. Это время называется периодом
цикла (cycle period). Рекомендованный период между импульсами —
не менее 50 мс */
// Вывод информации на Монитор порта
Serial.print(impulseTime);
Serial.print(" pulses, us ");
Serial.print(distance_sm);
Serial.println(" cm");
Serial.println("--");
delay(300);
}
141
Serial.print(impulseTime);
Serial.print("pulses, us");
Serial.print(distance_sm);
Serial.println("cm");
Serial.println("--");
142
Подведем итог
Попробуйте изменить схему, добавив delayMicroseconds(50);
три светодиода разного цвета таким об- digitalWrite(trigPin, LOW);
разом, чтобы в зависимости от расстояния
до объекта зажигались разные комбинации duration = pulseIn(echoPin,
светодиодов. HIGH);
Программа может выглядеть следующим distance = (duration/2) / 29.1;
образом: digitalWrite(red, LOW);
digitalWrite(yellow,LOW);
digitalWrite(green, LOW);
#include <NewPing.h>
if (distance < 5)
#define trigPin 11
{
#define echoPin 12
digitalWrite(red, HIGH);
#define red 13
digitalWrite(yellow, HIGH);
#define yellow 7
}
#define green 6
else
void setup() {
if (distance < 10)
Serial.begin (9600);
{
pinMode(trigPin, OUTPUT);
digitalWrite(red, HIGH);
pinMode(echoPin, INPUT);
}
pinMode(red, OUTPUT);
else
pinMode(yellow, OUTPUT);
if (distance < 15)
pinMode(green, OUTPUT);
{
}
digitalWrite(yellow, HIGH);
void loop() {
}
long duration, distance;
else
digitalWrite(trigPin, LOW);
if (distance < 20)
delayMicroseconds(50);
digitalWrite(trigPin, HIGH); {
143
digitalWrite(yellow, HIGH); Обратите внимание, что здесь мы исполь-
digitalWrite(green, HIGH); зуем библиотеку NewPing, которую необхо-
} димо подключить: для этого воспользуйтесь
else командой Скетч → Подключить библиоте-
if (distance < 30) ку → Добавить.ZIP.библиотеку и выберите
{ библиотеку NewPing.zip. Принципиальную
digitalWrite(green, HIGH); схему подключения трех светодиодов со-
} ставьте, опираясь на материалы предыду-
else щих эпизодов.
{
digitalWrite(green, HIGH);
delay(25);
digitalWrite(green, LOW);
}
Serial.print(duration);
Serial.print("us,");
Serial.print(distance);
Serial.println("cm");
delay(300);
}
144
Эпизод семнадцатый.
И вместо сердца
пламенный мотор…
Одно из принципиальных назначений робо- Естественно, чтобы привести робота
тов — заменить человека в опасных условиях: в движение, необходимо к нему подключить
при пожаре, при разминировании, в зонах по- мотор. Однако подключить мотор напрямую к
вышенной радиации и т. п. Значит, робот дол- плате Arduino у вас вряд ли получится. В сем-
жен уметь по команде передвигаться в нужном надцатом эпизоде мы разберемся в этой про-
направлении. блеме и вдобавок узнаем много нового о
знакомом понятии — «драйвер».
1
Быстроходные торговые судна 19 века, предназна-
ченные для доставки чая (примеч. ред.).
148
вер» — обыкновенный коногон, в сельском —
погонщик скота, на молодежном «ту драйв
мэд» — «сводить с ума».
152
В третьей части пишется алгоритм рабо- // 3 разрешает драйверу
ты, то есть то, что робот должен выполнять. // вращать электромотор
void loop() digitalWrite (motorL1, HIGH);
{ digitalWrite (mLspeed, HIGH);
digitalWrite (motorR1, HIGH); delay(1000); // Вращаем 1 сек
// Команда digitalWrite устанав- digitalWrite (motorR1, HIGH);
// ливает на контакте 2 высокий digitalWrite (mRspeed, LOW);
// уровень // Низкий уровень запрещает
// Для драйвера моторов это // вращение моторов
// означает то, что мотор будет digitalWrite (motorL1, HIGH);
// вращаться вперед digitalWrite (mLspeed, LOW);
digitalWrite (mRspeed, HIGH); delay(1000); // остановка 1 сек.
// высокий уровень на контакте }
Подведем итог.
Управление движением
при использовании
двух моторов
153
motorR1 motorL1 mLspeed mRspeed Движение
платформы
1 1 1 1
1 1 1 0
1 1 0 1 1. Платформа
едет вперед.
1 1 0 0
2. Платформа
1 0 1 1 едет назад.
1 0 1 0 3. Платформа
1 0 0 1 поворачивает
направо.
1 0 0 0
4. Платформа
0 1 1 1 поворачивает
налево.
0 1 1 0
5. Платформа
0 1 0 1
стоит на месте.
0 1 0 0 6. Некорректные
0 0 1 1 условия.
0 0 1 0
0 0 0 1
0 0 0 0
17. 2. Загрузите текст программы для движения вперед при использовании двух мо-
торов в Arduino IDE (убедитесь, что комментарии в каждой строчке начинаются
с двух символов //), загрузите код в контроллер. Запустите робота и сделайте вы-
вод о соответствии его движения составленной программе.
17. 3. Измените программу, чтобы платформа начала движение назад. Для это-
го на левый и правый мотор подайте низкий уровень сигнала и дайте
154 разрешение на вращение мотора.
17.4. И
змените программу, чтобы платформа поворачивала направо. Для этого нужно
вращать вперед правое колесо, а левое не вращать, или вообще для левого коле-
са задать вращение в обратную сторону (откалибровать угол поворота можно, ме-
няя время задержки команды delay).
17.5. Задайте роботу программу: в течение одной секунды ехать вперед, затем на се-
кунду остановиться и двигаться назад одну секунду. Так как команда loop испол-
няется постоянно, то робот будет выполнять эти команды, пока включено питание.
17.6. Используя фрагменты полученных кодов, составьте программу движения по слож-
ной траектории. Траекторию задайте самостоятельно.
Эпизод восемнадцатый.
Скорости не сбрасывай
на виражах…
На предыдущем занятии мы научили на- Конечно же можно! Для этого нам нуж-
шего робота — «Умную машинку» самым про- но использовать другие сигналы. Подавая
стым движениям: SmartCar может ездить на вход сигнал с широтно-импульсной мо-
вперед-назад и поворачивать при поочеред- дуляцией, можно управлять скоростью вра-
ной смене сигналов, поступающих на правые щения моторов.
и левые колеса. Но пока машинка движет- Так что же такое эта широтно-
ся довольно неуклюже. Неужели нельзя до- импульсная модуляция и как ее
биться более плавного управления? использовать? 155
18.1. Ч
то такое ШИМ и зачем он нужен
в робототехнике
Вы, конечно, знаете, что нужно для того, винты устройства: за него эти рутинные вы-
чтобы автомобиль изменил скорость, напри- числения проводит бортовой контроллер.
мер, поехал бы быстрее: водитель должен Так как же регулируют скорость враще-
нажать педаль газа. При этом в двигатель ния электромоторов?
станет поступать больше топлива, мотор Как известно в электронике существуют
взревет и начнет бешено крутить колеса. три базовых понятия: напряжение, сила то-
Наши роботы работают без водителей, ка и сопротивление. Все эти три параметра
и «топливом» для их моторов служит электри- связаны между собой законом Ома: увели-
чество, поэтому, чтобы управлять скоростью ро- чение сопротивления цепи уменьшает силу
бота, нам нужно уметь легко изменять скорость тока при постоянном напряжении, увеличе-
вращения электродвигателей колес. Причем ние напряжения при постоянном сопротивле-
у робота может быть не один-два, а, например,
целых шесть моторов, и крутиться они должны
в разные стороны и каждый со своей скоростью.
Мы же не можем на каждый мотор поставить
по человеку, который высчитывал бы, с какой
силой нажать на педаль газа.
Так, например, летающий робот — коп-
тер — может иметь три, четыре или даже
шесть пропеллеров, каждый из которых на-
сажен на вал собственного электромотора
и вращается с такой скоростью, что лопасти
выглядят размытым диском.
Оператор, управляющий коптером, про-
сто нажимает рычажок на пульте — вверх или ЗАКОН ОМА
вправо, и летающий робот послушно дви- I = U / R
жется в указанном направлении. При
этом человек совершено не задумы- U = I R
156
вается, с какой скоростью и в каком R = U / I
направлении должны вращаться
нии ведет к увеличению силы тока. Об этом тел максимально быстро и высоко, на все
мы уже говорили в десятом эпизоде. его двигатели нужно подать максимальное
Как мы обсуждали ранее, каждый элек- напряжение, и двигатели станут крутиться
тромотор состоит из магнита и намотанного с максимальной скоростью. Но если просто
на сердечник медного провода, то есть обла- подать это максимальное напряжение на мо-
дает сопротивлением, которое мы изменить торы, то коптер, скорее всего, подскочит рез-
не можем. Чтобы мотор стал крутиться бы- ко вверх, перевернется и грохнется об землю
стрее, мы должны подать на него большее (хорошо, если при этом никого не поранит).
напряжение: чем больше напряжение, тем Поэтому, чтобы коптер плавно поднялся, на-
быстрее крутится мотор и тем больше он по- брал максимальную высоту и затем плавно
требляет тока. Автономный робот получает опустился, система управления должна по-
питание от батарей, который находятся у не- давать напряжение на моторы, плавно его
го на борту. Отсюда следует очевидный вы- изменяя.
вод: чем быстрее крутятся моторы робота, тем Как же достигнуть такого плавного изме-
быстрее расходуется заряд батарей питания. нения? Как раз для этого и была придумана
Бортовой контроллер летающего робо- система, которая получила название широт-
та-коптера сам по программе меняет напря- но-импульсная модуляция, сокращенно —
жение, которое подается на моторы, чтобы окИМ, или, по-английски — PWM (pulse-width
человек при управлении об этом не задумы- modulation). В робототехнике и электротехни-
вался. Принцип работы такой программы до- ке регулировка при помощи ШИМ-системы
статочно интересен: допустим, наши батареи получила широкое распространение, посколь-
имеют максимальное напряжение при пол- ку с ее помощью очень удобно плавно регу-
ном заряде — 12 вольт. Когда батареи пол- лировать скорость вращения электромоторов.
ностью будут разряжены, напряжение может Давайте разберем, как работает система
опуститься до 9 вольт. Чтобы коптер взле- широтно-импульсной модуляции.
158
Когда вы открываете клапан, в электриче- Если импульсы короткие, иначе говоря,
ской схеме идут сигналы, называемые импуль- узкие, то это значит, клапан, что приоткрыва-
сами, а то время, в течение которого открыт ется по чуть-чуть и ненадолго, тогда на мо-
импульс, называется шириной. Отсюда и на- тор поступает небольшое количество энергии
звание этой модуляции — широтно-импульсная. и вращается он не очень быстро.
Инженеры при настройке электрообору- Увеличение ширины импульсов означает,
дования используют прибор, который назы- что время частичного открытия клапана ста-
вается осциллограф: на нем очень хорошо новится чуть больше, следовательно, энер-
можно разглядеть по оси Х и У наборы та- гии к мотору поступает тоже больше и мотор
ких импульсов. вращается гораздо быстрее.
int motorR1=2; /
/ контакт 2 определяет направление вращения первого
// правого мотора
int motorR2=6; /
/ контакт 6 определяет направление вращения второго
// правого мотора
int motorL1=4; /
/ контакт 4 определяет направление вращения первого
// левого мотора
int motorL2=7; /
/ контакт 7 определяет направление вращения второго
// левого мотора
int mL_PWM=3; // контакт 3 управляет вращением левого мотора
int mR_PWM=5; // контакт 5 управляет вращением правого мотора
void setup() {
pinMode(mL_PWM, OUTPUT);
pinMode(mR_PWM, OUTPUT);
pinMode(motorR1, OUTPUT);
pinMode(motorR2, OUTPUT);
pinMode(motorL1, OUTPUT);
pinMode(motorL2, OUTPUT);
// Определяем все контакты как выход
}
162
void loop()
{
digitalWrite (motorR1, HIGH);
digitalWrite (motorR2, HIGH);
// Команда digitalWrite устанавливает на контакте высокий уровень
// Для драйвера моторов это означает, что мотор будет вращаться
назад
digitalWrite (motorL1, HIGH);
digitalWrite (motorL2, HIGH);
analogWrite (mR_PWM, 0);
analogWrite (mL_PWM, 0);
// Значение ШИМ равно 0, двигатель не вращается
delay(1000); // действие происходит 1 сек
digitalWrite (motorR1, HIGH);
digitalWrite (motorR2, HIGH);
digitalWrite (motorL1, HIGH);
digitalWrite (motorL2, HIGH);
analogWrite (mR_PWM, 70);
analogWrite (mL_PWM, 70);
// Значение ШИМ 70. Скорость низкая
delay(2000); //время работы 2 сек.
digitalWrite (motorR1, HIGH);
digitalWrite (motorR2, HIGH);
digitalWrite (motorL1, HIGH);
digitalWrite (motorL2, HIGH);
analogWrite (mR_PWM, 170);
analogWrite (mL_PWM, 170);
// Значение ШИМ 70. Скорость средняя
delay(2000); //время работы 2 сек.
digitalWrite (motorR1, HIGH);
digitalWrite (motorR2, HIGH);
digitalWrite (motorL1, HIGH);
digitalWrite (motorL2, HIGH);
analogWrite (mR_PWM, 255); 163
analogWrite (mL_PWM, 255);
// Значение ШИМ 70. Скорость максимальная
delay(2000); //время работы 2 сек.
digitalWrite (motorR1, HIGH);
digitalWrite (motorR2, HIGH);
digitalWrite (motorL1, HIGH);
digitalWrite (motorL2, HIGH);
analogWrite (mR_PWM, 170);
analogWrite (mL_PWM, 170);
// Значение ШИМ 70. Скорость средняя
delay(2000); //время работы 2 сек.
digitalWrite (motorR1, HIGH);
digitalWrite (motorR2, HIGH);
digitalWrite (motorL1, HIGH);
digitalWrite (motorL2, HIGH);
analogWrite (mR_PWM, 70);
analogWrite (mL_PWM, 70);
// Значение ШИМ 70. Скорость низкая
delay(2000); //время работы 2 сек.
}
Попробуйте загрузить эту программу в Arduino и проанализируйте результаты работы.
164
18.6. Езда «змейкой»
Попеременно устанавливая разное значение ШИМ для правого и левого колес, можно
заставить платформу двигаться змейкой за счет того, что колеса будут вращаться с раз-
ной скоростью.
void loop()
{
digitalWrite (motorR1, HIGH);
digitalWrite (motorR2, HIGH);
digitalWrite (motorL1, HIGH);
digitalWrite (motorL2, HIGH);
analogWrite (mR_PWM, 0);
analogWrite (mL_PWM, 0);
// Значение ШИМ равно 0, двигатель не вращается
delay(1000); // действие происходит 1 сек
digitalWrite (motorR1, HIGH);
digitalWrite (motorR2, HIGH);
digitalWrite (motorL1, HIGH);
digitalWrite (motorL2, HIGH);
analogWrite (mR_PWM, 100);
analogWrite (mL_PWM, 255);
delay(2000); //время работы 2 сек.
digitalWrite (motorR1, HIGH);
digitalWrite (motorR2, HIGH);
digitalWrite (motorL1, HIGH);
digitalWrite (motorL2, HIGH);
analogWrite (mR_PWM, 255);
analogWrite (mL_PWM, 100);
delay(2000); //время работы 2 сек.
}
165
Эпизод девятнадцатый.
Но это еще не конец…
166
Шпаргалки
Алгоритм
Описание последовательно-
сти действий, строгое исполне-
ние которых приводит к решению
поставленной задачи
за конечное число шагов.
167
Исполнитель
Система команд
Абстрактная или реаль- исполнителя
ная система, способная выпол-
нить действия, предписваемые Набор команд, которые может
алгоритмом. выполнить конкретный исполнитель.
Среда исполнителя
Программа
Обстановка,
в которой Алгоритм, составленный из ко-
функционирует манд, которые входят в систему команд
исполнитель. исполнителя.
168
Эпизод пятый. Шаг за шагом
по программе…
цикл
старт макс. средн. мин.
цикл
стоп
звук
свет
169
цикл
старт макс. средн. мин.
цикл
стоп
звук
свет
170
5.3. Один из возможных вариантов программы в машинных кодах:
111000 110111 111000 110111 111000 110111 111000 110111 111000 110111 111000
128 г 64 г 32 г 16 г 8г 4г 2г 1г
75 г
7г
15 г
201 г
129 г
171
6.3.
6.4.
172
Эпизод восьмой. КуМир — все, что нужно
Калибровка энкодеров
Если углы поворота платформы резко даем на правое и левое колесо, тем большее
отличаются от 90 градусов, нужно прове- расстояние проедет или на больший угол по-
сти калибровку энкодеров для более точ- вернется платформа при однократным нажа-
ной настройки поворота. Для этого в файле тии на кнопку управления.
настройки smart.ini в папке программы Таким образом, длина шага одной ко-
устройства SmartCar нужно поменять ко- манды вверх (вниз) и точность угла пово-
личество импульсов, поступающих на коле- рота определяются количеством импульсов,
со при однократном нажатии кнопки пульта подсчитываемым энкодером, и регулируют-
управления. Чем больше импульсов мы за- ся в файле smart.ini.
173
8.1.
174
Эпизод десятый. Логика. Ничего
случайного. Сборка логических схем
Логическое И
Устройства, выполняющие функции логического умножения — конъюнкции.
Третий элемент добавляется последова- вращаться, звучать, только когда все три вы-
тельно с двумя другими, и нагрузка также ключателя одновременно включены.
будет выполнять свои функции — светить,
Логическое ИЛИ
175
Логическая схема ИЛИ с тремя Логическое НЕ
выключателями: Когда выключатель находится в поло-
жении ON — лампа не горит, когда выклю-
чатель находится в положении OFF — лампа
горит.
Эпизод двенадцатый.
микросхема NE555
С3
8 VCC OUT
3
R1
7
5 динамик
R2 4
6
6v
2
GND
1
С1 С2
Эпизод тринадцатый.
Протокол связи — настоящее и будущее
13.2. Протокол Bluetooth — протокол, позво- мениваться данными между несколькими
ляющий связывать друг с другом не- устройствами, но обязательно использую-
сколько устройств на коротком (поряд- щий для этого точку доступа.
ка нескольких метров) расстоянии. Протокол ZigBee — протокол малого энер-
Протокол Wi-Fi — протокол, позво- гопотребления, позволяющий организовать
ляющий с большой скоростью об- роевое управление устройствами сети.
176
Эпизод четырнадцатый. MAC-адрес
не дом и не улица…
14.2. Нет.
14.3. Производитель сетевых устройств.
14.4. В форме шестнадцатеричных кодов.
177
Когда программа запустится, откро-
ется окно Arduino IDE.
Обратите внимание: вы еще не под-
ключали плату Arduino к компьютеру,
а в правом нижнем углу уже появилась
надпись «Arduino Leonardo on COM4». Так
Arduino IDE сообщает вам, что она настро-
ена на работу с платой Arduino Leonardo.
А когда вы подключите плату, Arduino IDE
будет искать Arduino Leonardo на порту
COM4. И для написания программы уже
заготовлен шаблон будущего скетча, со-
держащий команды, необходимые для
его работы.
Прежде чем приступать к програм
мированию, необходимо настроить среду
для работы с той версией устройства, кото- работать с другой платой семейства Arduino.
рая имеется у вас. Используя меню Инстру- Для этого выберем из списка контроллер,
менты → Плата, укажем программе, что будем который будет подключен к компьютеру.
178
После установки Arduino IDE и выбора к выполнению заданной по умолчанию про-
нужной платы можно подключить имеющееся изводителем программы.
у вас устройство к компьютеру и произвести Чтобы завершить настройку платы, не-
окончательные настройки. В операционной обходимо уточнить, какой номер COM-пор-
системе Windows компьютер опознает под- та присвоил компьютер Arduino Nano. Для
ключенное устройство как плату Arduino Nano этого на Панели управления нужно выбрать
и запускает его установку. пункт Диспетчер устройств Windows и рас-
Когда на плате загорается светоди- крыть вкладку Порты (COM и LPT).
од ON и начинают мигать светодиоды, это Это означает, что операционная систе-
означает, что на плату подано питание ма распознала плату Arduino как COM-порт,
и микроконтроллер Arduino Nano приступил подобрала для нее правильный драйвер
179
и назначила этому COM-порту номер 3. Если Теперь следует сообщить Arduino IDE, что
мы подключим к компьютеру другую плату плата, с которой ей предстоит общаться, на-
Arduino, то операционная система назначит ходится на COM-порту COM3. Для этого необ-
ей другой номер. Поэтому при работе одно- ходимо перейти в меню Инструменты → Порт
временно с несколькими платами очень важ- и выбирать порт COM3.
но внимательно соотносить их с номерами
COM-портов.
181
Елочка, гори! Мигаем восемью светодиодами в одну сторону
/*Программа «Бегущие огни только туда»
*/
int del=100;
// устанавливаем начальную команду, которая будет выполняться при
// включении питания
void setup() {
// определяем выбранный нами контакт платы Arduino как выход.
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
}
void loop() {
digitalWrite(6, HIGH); // устанавливаем на контакте 6 высокий
// уровень (5 Вольт)
delay(del); // ждем одну секунду
digitalWrite(6, LOW); // устанавливаем на контакте 6 низкий уровень
// (0 Вольт)
delay(del); // ждем одну секунду
digitalWrite(7, HIGH); // устанавливаем на контакте 7 высокий
// уровень (5 Вольт)
delay(del); // ждем одну секунду
digitalWrite(7, LOW); // устанавливаем на контакте 7 низкий уровень
// (0 Вольт)
delay(del); // ждем одну секунду
182
digitalWrite(8, HIGH); // включение светодиода на контакте 8
delay(del);
digitalWrite(8, LOW); // выключение светодиода
delay(del);
digitalWrite(9, HIGH); // включение светодиода на контакте 9
delay(del);
digitalWrite(9, LOW); // выключение светодиода
delay(del);
digitalWrite(10, HIGH); // включение светодиода на контакте 10
delay(del);
digitalWrite(10, LOW); // выключение светодиода
delay(del);
digitalWrite(11, HIGH); // включение светодиода на контакте 11
delay(del);
digitalWrite(11, LOW); // выключение светодиода
delay(del);
digitalWrite(12, HIGH); // включение светодиода на контакте 12
delay(del);
digitalWrite(12, LOW); // выключение светодиода
delay(del);
digitalWrite(13, HIGH); // включение светодиода на контакте 13
delay(del);
digitalWrite(13, LOW); // выключение светодиода
delay(del);
}
Елочка, гори! Мигаем восемью светодиодами туда и обратно
/*Программа «Бегущие огни туда-сюда»
*/
int del=100; // установка по умолчанию времени выполнения 100 мс
void setup()
{
// инициализация цифровых контактов как выхода:
void loop()
{
digitalWrite(6, HIGH); // включение светодиода на контакте 6
delay(del); // Ждем (время выполнения действия определяется
// параметром 'del')
digitalWrite(6, LOW); // выключение светодиода
digitalWrite(7, HIGH); // включение светодиода на контакте 7
delay(del);
digitalWrite(7, LOW); // выключение светодиода
digitalWrite(8, HIGH); // включение светодиода на контакте 8
delay(del);
digitalWrite(8, LOW); // выключение светодиода
digitalWrite(9, HIGH); // включение светодиода на контакте 9
delay(del);
digitalWrite(9, LOW); // выключение светодиода
digitalWrite(10, HIGH); // включение светодиода на контакте 10
delay(del);
digitalWrite(10, LOW); // выключение светодиода
digitalWrite(11, HIGH); // включение светодиода на контакте 11
delay(del);
184
digitalWrite(11, LOW); // выключение светодиода
digitalWrite(12, HIGH); // включение светодиода на контакте 12
delay(del);
digitalWrite(12, LOW); // выключение светодиода
digitalWrite(13, HIGH); // включение светодиода на контакте 13
delay(del);
digitalWrite(13, LOW); // выключение светодиода
digitalWrite(12, HIGH); // включение светодиода на контакте 12
delay(del);
digitalWrite(12, LOW); // выключение светодиода
digitalWrite(11, HIGH); // включение светодиода на контакте 11
delay(del);
digitalWrite(11, LOW); // выключение светодиода
digitalWrite(10, HIGH); // включение светодиода на контакте 10
delay(del);
digitalWrite(10, LOW); // выключение светодиода
digitalWrite(9, HIGH); // включение светодиода на контакте 9
delay(del);
digitalWrite(9, LOW); // выключение светодиода
digitalWrite(8, HIGH); // включение светодиода на контакте 8
delay(del);
digitalWrite(8, LOW); // выключение светодиода
digitalWrite(7, HIGH); // включение светодиода на контакте 7
delay(del);
digitalWrite(7, LOW); // выключение светодиода
}
Нажимаем кнопочку...
Две кнопки управляют светодиодами
D13
D13
A0 R12
D12
A1 10 кОм
D11
A2 D10
GND
A3
GND
D9
A4 D8
Arduino Nano
A5 D7 кнопка 1 R13
A6 D6 560 Ом
A7 D5
+5V
+5V
R10
кнопка 2 560 Ом
R11
10 кОм
D10
186
const int buttonPin1 = 12; // задаем номер входа, подключенный к кнопке 1
const int buttonPin2 = 11; // задаем номер входа, подключенный к кнопке 2
const int ledPin1 = 13; // задаем номер выхода светодиода 1
const int ledPin2 = 10; // задаем номер выхода светодиода 2
int buttonState1 = 0; // переменная для хранения состояния кнопки 1
int buttonState2 = 0; // переменная для хранения состояния кнопки 2
void setup() {
// инициализируем контакт, подключенный к светодиоду как выход:
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
// инициализируем контакт подключенный к светодиоду как вход:
pinMode(buttonPin1, INPUT);
pinMode(buttonPin2, INPUT);
}
void loop() {
// считываем значение входа кнопки:
buttonState1 = digitalRead(buttonPin);
buttonState2 = digitalRead(buttonPin);
// проверяем, нажата ли кнопка 1.
// если нажата, то состояние кнопки 1 устанавливаем в положение HIGH:
if (buttonState1 == HIGH) {
// включение светодиода:
digitalWrite(ledPin1, HIGH);
}
else {
// иначе выключение светодиода:
digitalWrite(ledPin1, LOW);
}
if (buttonState2 == HIGH) {
// включение светодиода:
digitalWrite(ledPin2, HIGH);
}
else {
// иначе выключение светодиода:
digitalWrite(ledPin2, LOW);
}
} 187
Эпизод семнадцатый. И вместо сердца
пламенный мотор… Управляем моторами
17.1. motorR1 motorL1 mLspeed mRspeed Движение платформы
1 1 1 1
1. Платформа едет вперед
1 1 1 0
3. Платформа поворачивает направо
1 1 0 1
4. Платформа поворачивает налево
1 1 0 0
5. Платформа стоит на месте
1 0 1 1
3. Платформа поворачивает направо 1. Платформа едет
вперед.
1 0 1 0
3. Платформа поворачивает направо 2. Платформа едет
назад.
1 0 0 1 3. Платформа пово-
3. Платформа поворачивает направо
рачивает направо.
1 0 0 0 4. Платформа пово-
5. Платформа стоит на месте
рачивает налево.
0 1 1 1 5. Платформа стоит
4. Платформа поворачивает налево
на месте.
0 1 1 0 6. Некорректные
3. Платформа поворачивает направо условия.
0 1 0 1
4. Платформа поворачивает налево
0 1 0 0
5. Платформа стоит на месте
0 0 1 1
2. Платформа едет назад
0 0 1 0
3. Платформа поворачивает направо
0 0 0 1
4. Платформа поворачивает налево
188
17.3. Фрагмент программы:
void loop()
{
digitalWrite (motorR1, LOW); // Команда digitalWrite устанавливает
// на контакте 2 низкий уровень
// Для драйвера моторов это означает, что мотор будет вращаться назад
digitalWrite (mRspeed, HIGH); // высокий уровень на контакте 3 разрешает
// драйверу вращать электромотор
digitalWrite (motorL1, LOW);
digitalWrite (mLspeed, HIGH);
delay(1000); // Вращаем 1 сек
digitalWrite (motorR1, LOW);
digitalWrite (mRspeed, LOW); // Низкий уровень запрещает вращение
// моторов
digitalWrite (motorL1, LOW);
digitalWrite (mLspeed, LOW);
delay(1000); //останов 1 сек.
}
17.4. Возможный вариант фрагмента программы:
void loop()
{
digitalWrite (motorR1, LOW); // Команда digitalWrite устанавливает
// на контакте 2 низкий уровень
// Для драйвера моторов это означает то, что мотор будет вращаться
назад
digitalWrite (mRspeed, HIGH); // высокий уровень на контакте 3
// разрешает драйверу вращать
// электромотор
digitalWrite (motorL1, HIGH); // Устанавливаем на контакте 4
// высокий уровень
digitalWrite (mLspeed, HIGH);
delay(1000); // Вращаем 1 сек
digitalWrite (motorR1, LOW);
digitalWrite (mRspeed, LOW); // Низкий уровень запрещает вращение
// моторов
digitalWrite (motorL1, LOW);
digitalWrite (mLspeed, LOW);
delay(1000); // останов 1 сек. 189
}
17.5. Фрагмент программы:
void loop()
{
digitalWrite (motorR1, HIGH); // Команда digitalWrite устанавливает
// на контакте 2 высокий уровень
// Для драйвера моторов это означает то, что мотор будет
// вращаться вперед
digitalWrite (mRspeed, HIGH); // высокий уровень на контакте 3
// разрешает драйверу вращать
// электромотор
digitalWrite (motorL1, HIGH);
digitalWrite (mLspeed, HIGH);
delay(1000); // Вращаем 1 сек
digitalWrite (motorR1, HIGH);
digitalWrite (mRspeed, LOW); // Низкий уровень запрещает вращение
// моторов
digitalWrite (motorL1, HIGH);
digitalWrite (mLspeed, LOW);
delay(1000); // останов 1 сек
digitalWrite (motorR1, LOW); // Устанавливаем на контакте 2 низкий
// уровень
// Для драйвера моторов это означает то, что мотор будет
// вращаться назад
digitalWrite (mRspeed, HIGH); // высокий уровень на контакте 3
// разрешает драйверу вращать
// электромотор
digitalWrite (motorL1, LOW);
digitalWrite (mLspeed, HIGH);
delay(1000); // Вращаем 1 сек
digitalWrite (motorR1, LOW);
digitalWrite (mRspeed, LOW); // Низкий уровень запрещает
// вращение моторов
digitalWrite (motorL1, LOW);
digitalWrite (mLspeed, LOW);
delay(1000); // останов 1 сек.
}
190
ОГЛАВЛЕНИЕ
Предисловие 3
Эпизод 1. Как роботы стали роботами 4
Эпизод 2. Они такие разные 12
Эпизод 3. Смартфон в руки, и поехали! Роботы и принцип хранимой программы 19
Эпизод 4. Правила устанавливаете вы! Поговорим про алгоритмы 23
Эпизод 5. Шаг за шагом по программе 35
Эпизод 6. Т-с-с… Подробнее о кодах 42
Эпизод 7. Что понимает машина? 51
Эпизод 8. КуМир — все, что нужно 54
Эпизод 9. Электроника в робототехнике 67
Эпизод 10. Логика. Ничего случайного 79
Эпизод 11. Датчики — органы чувств робота 87
Эпизод 12. Датчики своими руками 91
Эпизод 13. Протокол связи — настоящее и будущее 104
Эпизод 14. MAC-адрес не дом и не улица… 109
Эпизод 15. Славная машина — Arduino 113
Эпизод 16. Огоньки и кнопочки — строим с Arduino 126
Эпизод 17. И вместо сердца пламенный мотор… 145
Эпизод 18. Скорости не сбрасывай на виражах… 155
Эпизод 19. Но это еще не конец… 166
Шпаргалки 167
191
International International
gymnasium gymnasium