Урок №22. Роботизированные системы.
Встроенный компьютер робота использует электрические сигналы для управления моторами, лампочками, устройствами вывода звука и т. п. Данные из внешнего мира (от датчиков) он тоже получает в виде электрических сигналов. Поэтому у него должны быть контакты ввода и вывода для связи с внешним миром. На рисунке 1.4 показаны контакты ввода и вывода — пины на плате Arduino Uno.

Микроконтроллер может подать на любой контакт вывода электрический сигнал. Если мы подключим между этим контактом и контактом с сигналом «земля» («минусом») какую-нибудь лампочку, например светодиод, то при подаче сигнала она загорится, причём яркость лампочки будет зависеть от величины сигнала (точнее, от величины электрического напряжения между контактом и «землёй»). Светодиод имеет очень маленькое сопротивление, поэтому для того, чтобы ограничить силу тока, в цепь включают небольшой резистор (иначе светодиод может сгореть) — рис. 1.5

Используя дополнительные источники, выясните, почему на электрических схемах и платах «земля» обозначается буквами GND.
Часто используют не отдельные контакты, а многоконтактные разъёмы — порты. На рисунке 1.6 показан управляющий блок (система управления роботом) из набора LEGO Mindstorms EV3, имеющий четыре порта вывода (для управления моторами) и четыре порта ввода для приёма данных с датчиков.

Простейший управляющий элемент — кнопка, с помощью которой включается или выключается какой-то режим работы робота. Например, с помощью кнопки можно управлять светодиодом: при нажатии кнопки лампочка загорается, после отпускания кнопки — гаснет. Схема, которую можно собрать на плате Arduino, показана на рис. 1.7.

На один контакт кнопки подаётся питание, второй подсоединён к входному пину, с которого микроконтроллер может прочитать значение сигнала. При нажатии кнопки цепь замыкается, так что на входной пин подаётся сигнал высокого уровня (величиной 5 вольт, на рис. 1.7 он обозначен как +5V). А какой сигнал будет на этом пине, если кнопка не нажата? Оказывается, в этом случае он может «плавать», т. е. меняться случайным образом из-за электромагнитных шумов. Чтобы этого не происходило, ставят специальный «стягивающий» резистор, который связывает входной пин с сигналом нулевого уровня (см. рис. 1.7).
Перейдём к программированию. Нам нужно постоянно читать значение напряжения на пине. Если подан высокий уровень сигнала (кнопка нажата), нужно включить лампочку, т. е. подать сигнал высокого уровня (255) на выходной пин, с которым она связана. Если кнопка не нажата, на выходной пин подаём сигнал низкого уровня (0), лампочка выключается.
Будем считать, что лампочка управляется пином 11, а сигнал от кнопки приходит на пин 2. Команда прочитать читает значение на входном пине, номер которого записан в скобках. Это функция, она возвращает значение, которое можно записать в переменную.
цел х
нц
х:=прочитать(2)
если х=255 то
записать (11, 255)
иначе
записать (11, 0)
все
кц
Теперь перейдём к программированию движущихся роботов в лабиринте. Роботу нужно как-то ориентироваться — определить, куда можно ехать, а куда нельзя. Если человеку завязать глаза, то он всё равно сможет обнаружить стену — на ощупь. У роботов для этого служат датчики касания. Они подают на входной порт значение 0, если касания нет, и значение 255, если касание произошло. Если перед роботом есть стена, то для того, чтобы доехать до стены, нужно использовать цикл «пока не сработал датчик касания».
Будем считать, что у платы управления роботом есть порты ввода с номерами 0, 1, 2 и т. д, и датчик касания подключён к порту 0. Программу движения до стены можно записать так:
мотор[0]:=100
мотор[1]:=100
нц пока датчик[0]<>255
ждать(1)
кц
мотор [ 0] :=0
мотор[1]:=0
Мы дополнили язык программирования командой датчик[0]. Это функция, которая читает данные из порта 0, т. е. возвращает число, записанное датчиком в порт ввода 0. Команда ждать в теле цикла нужна для того, чтобы микроконтроллер смог при необходимости выполнить какие-то другие задачи, а не «зависал» во время выполнения цикла.
Чаще всего не нужно допускать столкновения робота с препятствием — робота лучше остановить заранее. Для решения этой задачи датчик касания уже не подходит — нужно определять расстояние до ближайшей стены. Для этого используют датчики расстояния, чаще всего ультразвуковые, — их ещё называют сонарами.
Используя дополнительные источники, выясните, откуда произошло слово «сонар». Что оно означает?
Ультразвуковые датчики расстояния состоят из излучателя и приёмника. Датчик излучает звуковую волну высокой частоты, она отражается от препятствия и возвращается обратно, где её «ловит» приёмник. Чем больше интервал между запуском волны и приёмом отражённого сигнала, тем больше расстояние.
Значение, поступающее на выходной порт с датчика расстояния, — это целое число от 0 до 255. Как же нам определить само расстояние, например в сантиметрах? Для этого нужно прочитать описание этого датчика и выяснить, как вычислить расстояние по коду. Например, если датчик измеряет расстояния от 0 до 10 м, то расстояние в сантиметрах можно получить так:

где d — числовое показание датчика. Обычно максимальное кодовое значение (в нашем случае — 255) означает, что препятствий не обнаружено.
Определите, какому расстоянию соответствует показание датчика 100.
Определите, какое показание датчика соответствует расстоянию 20 см.
Пусть нам нужно остановить робота на расстоянии 0,3 м от стены. Вычислив соответствующее значение d, получаем 7,65. Но показание датчика должно быть целым числом, поэтому округляем это значение до 8.
У любого датчика есть неизбежная ошибка измерения, вызванная неидеальностью деталей и электромагнитными помехами от систем самого робота и других устройств. Обычно допустимая ошибка составляет одну единицу, т. е. показание датчика вместо 8 может быть равно 7 или 9. Для d — 7 получаем расстояние 27,45 см, а для d = 9 — расстояние 35,29 см. Это значит, что с помощью такого датчика мы определим расстояние с ошибкой AS = ± 5 см. Относительная ошибка в процентах составит
![]()
Как вы думаете, при увеличении измеряемого расстояния, скажем, до 1 м, относительная ошибка будет уменьшаться или увеличиваться? Проверьте своё предположение вычислениями.
Новая модификация робота использует датчик расстояния, который выдаёт значение от 0 до 1023. Определите относительную ошибку при решении той же задачи (остановить робота на расстоянии 0,3 м от стены). Сделайте выводы.
Будем считать, что датчик расстояния «смотрит» вперёд (по направлению движения) и подключён к порту ввода 0. Программа, согласно которой робот едет вперёд и останавливается, очень похожа на предыдущую:
мотор[0]:=100
мотор[1]:=100
нц пока датчик[0]>8
ждать(1)
кц
мотор[0]:=0
мотор[1]:=0
Объясните, почему не стоит записывать условие работы цикла в виде
нц пока датчик[0]<>8
...
кц
В последние годы проводятся многочисленные соревнования роботов, в том числе Всемирные олимпиады. Классические задачи спортивной робототехники — движение робота по линии. Мы рассмотрим только одну задачу этого типа: робот должен ехать вдоль границы между чёрной и белой полосами. Движением робота управляет микроконтроллер, который выполняет программу, заранее записанную в его память. Такое управляющее устройство называется регулятором.
Регулятор — это автоматическое управляющее устройство, которое следит за состоянием робота и посылает ему управляющие сигналы.
Для того чтобы «увидеть» границу между чёрной и белой полосами, робот использует один или несколько датчиков освещённости (рис. 1.8).

Датчик освещает поверхность светодиодом и измеряет количество отражённого света. Чёрные предметы отражают меньше всего света, белые — больше всего.
Датчик освещённости выдаёт код в интервале от 0 до 255, где О означает полное отсутствие отражённого света, а 255 — полное отражение. Однако не существует идеально чёрных и идеально белых предметов. Даже полоса, которая кажется нам совсем чёрной, отражает немного света, поэтому датчик покажет на ней не 0, а, например, 10. Также и на белой полосе вместо 255 мы получим, например, 230. Среднее арифметическое между этими значениями называют «средним значением серого». Теоретически такой сигнал выдаёт датчик, когда он находится точно над границей чёрной и белой полос (рис. 1.9). К этому состоянию мы и будем стремиться.

Определение среднего значения серого в конкретных условиях называется калибровкой датчика.
Пусть требуется, чтобы слева от робота была белая полоса, а справа — чёрная (как на рис. 1.8). Для управления мы будем использовать очень простой принцип, который называют релейным регулированием. Показания датчика большие, чем 120 (среднее значение серого), означают, что робот зашёл на белую полосу и нужно повернуть его вправо. Если датчик показывает меньше, чем 120, поворачиваем влево.
Получается такая программа, работающая в бесконечном цикле:
нц
если датчик[0]>120 то
мотор[0]:=100
мотор[1]:=0
иначе
мотор[0]:=0
мотор[1]:=100
все
кц
Если запустить такую программу, мы увидим, что робот движется зигзагом, рывками. Дело в том, что мы задали ему такой алгоритм — резкое переключение между двумя состояниями. Это и есть релейное регулирование.
Для более плавного движения нужно создавать вращающий момент, который зависит от ошибки, т. е. от того, насколько робот отклонился от линии. Чем меньше ошибка, тем меньше вращающий момент. Если ошибки нет (датчик выдаёт значение, равное среднему значению серого), подаём одинаковую мощность на оба мотора, робот едет прямо.
Можно использовать, например, такой алгоритм управления:
вещ к=0.5
нц
и:=к*(120-датчик[0])
мотор[0]:=50-и
мотор[1]:=50+и
кц
Изучите программу и определите, какой сигнал подаётся на моторы, когда датчик выдаёт значение: а) 100; б) 120; в) 140.
Выражение 120-датчик [ 0 ] — это ошибка управления, т. е. отклонение значения, полученного с датчика, от заданного значения 120. Сигнал управления и, который изменяет мощность моторов, пропорционален ошибке, поэтому такой регулятор называется пропорциональным, или П-регулятором.
Коэффициент к — это коэффициент усиления П-регулятора. Правила выбора коэффициентов в законах управления изучает теория автоматического управления. Мы же будем выбирать коэффициенты экспериментально, не углубляясь в теорию.
Чем больше к, тем сильнее реакция робота на ошибку; чем меньше к, тем более плавно движется робот. Но при малых значениях к его реакция замедлена, и он может потерять линию на повороте.
Проведите эксперимент (на тренажёре или с реальным роботом) и выясните, при каком наименьшем коэффициенте к робот проходит всю трассу.
Проведите эксперимент и выясните, что происходит при выборе слишком большого значения к. При каком наибольшем коэффициенте к робот выполняет задание?
По результатам экспериментов выберите наилучшее, на ваш взгляд, значение к.