Движение в лабиринте
Практическая работа № 3 «Использование датчиков»
Практическая работа № 4 «Движение робота по линии»
Теперь перейдём к программированию движущихся роботов в лабиринте. Роботу нужно как-то ориентироваться — определить, куда можно ехать, а куда нельзя. Если человеку завязать глаза, то он всё равно сможет обнаружить стену — на ощупь. У роботов для этого служат датчики касания. Они подают на входной порт значение 0, если касания нет, и значение 255, если касание произошло. Если перед роботом есть стена, то для того, чтобы доехать до стены, нужно использовать цикл «пока не сработал датчик касания».
Будем считать, что у платы управления роботом есть порты ввода с номерами 0, 1, 2 и т. д, и датчик касания подключён к порту 0. Программу движения до стены можно записать так:
мотор[0]:=100
мотор[1]:=100
нц пока датчик[0]<>255
ждать(1)
кц
мотор[0]:=0
мотор[1]:=0
Мы дополнили язык программирования командой датчик[0]. Это функция, которая читает данные из порта 0, т. е. возвращает число, записанное датчиком в порт ввода 0. Команда ждать в теле цикла нужна для того, чтобы микроконтроллер смог при необходимости выполнить какие-то другие задачи, а не «зависал» во время выполнения цикла.
Как вы думаете, можно ли сразу разворачивать робота влево или вправо, если сработал датчик касания? Проверьте ваш вывод на тренажёре 1) или при эксперименте с роботом.
1) Здесь и далее можно использовать тренажёры на сайте поддержки учебника:
http://kpolyakov.spb.ru/school/robotics/robotics.htm
http://kpolyakov.spb.ru/school/robotics/arduino.htm
Чаще всего не нужно допускать столкновения робота с препятствием — робота лучше остановить заранее. Для решения этой задачи датчик касания уже не подходит — нужно определять расстояние до ближайшей стены. Для этого используют датчики расстояния, чаще всего ультразвуковые, — их ещё называют сонарами.
Используя дополнительные источники, выясните, откуда произошло слово «сонар». Что оно означает?
Используя дополнительные источники, выясните, что такое ультразвук. Можно ли его услышать?
Ультразвуковые датчики расстояния состоят из излучателя и приёмника. Датчик излучает звуковую волну высокой частоты, она отражается от препятствия и возвращается обратно, где её «ловит» приёмник. Чем больше интервал между запуском волны и приёмом отражённого сигнала, тем больше расстояние.
Значение, поступающее на выходной порт с датчика расстояния 2) — это целое число от 0 до 255. Как же нам определить само расстояние, например в сантиметрах? Для этого нужно прочитать описание этого датчика и выяснить, как вычислить расстояние по коду. Например, если датчик измеряет расстояния от 0 до 10 м, то расстояние в сантиметрах можно получить так:
где d — числовое показание датчика. Обычно максимальное кодовое значение (в нашем случае — 255) означает, что препятствий не обнаружено.
2) Некоторые реальные датчики выдают цифровое значение в диапазоне от 0 до 1023.
Определите, какому расстоянию соответствует показание датчика 100.
Определите, какое показание датчика соответствует расстоянию 20 см.
Пусть нам нужно остановить робота на расстоянии 0,3 м от стены. Вычислив соответствующее значение d, получаем 7,65. Но показание датчика должно быть целым числом, поэтому округляем это значение до 8.
У любого датчика есть неизбежная ошибка измерения, вызванная неидеальностью деталей и электромагнитными помехами от систем самого робота и других устройств. Обычно допустимая ошибка составляет одну единицу, т. е. показание датчика вместо 8 может быть равно 7 или 9. Для d = 7 получаем расстояние 27,45 см, а для d 9 — расстояние 35,29 см. Это значит, что с помощью такого датчика мы определим расстояние с ошибкой ΔS = ± 5 см. Относительная ошибка в процентах составит
Как вы думаете, при увеличении измеряемого расстояния, скажем, до 1 м, относительная ошибка будет уменьшаться или увеличиваться? Проверьте своё предположение вычислениями.
Новая модификация робота использует датчик расстояния, который выдаёт значение от 0 до 1023. Определите относительную ошибку при решении той же задачи (остановить робота на расстоянии 0,3 м от стены). Сделайте выводы.
Будем считать, что датчик расстояния «смотрит» вперёд (по направлению движения) и подключён к порту ввода 0. Программа, согласно которой робот едет вперёд и останавливается, очень похожа на предыдущую:
мотор[0]:=100
мотор[1]:=100
нц пока датчик[0]>8
ждать(1)
кц
мотор[0]:=0
мотор[1]:=0
нц пока датчик[0]<>8
. . .
кц
Следующая страница Движение по линии