Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Робоплатформа - движение и сенсоры.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
191.72 Кб
Скачать

Органы осязания робота

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

Давайте исправим это положение попробуем поработать с датчиками-сенсорами из комплекта.

Ой, стенка!

Самый простой датчик — это контактный. Он представляет собой микропереключатель с усиком и колесиком на его конце. При столкновении с препятствием происходит замыкание контакта, которое можно отследить из Scratch.

В комплекте вы можете найти два таких датчика (мы будем назвать их «фишками»).

Установите один из них в средний разъем. Нажав на контакт, найдите какой аналоговый выход соответствует этому разъму — его значени будет 100 (или близко к нему) и не будет плавать. Отожмите кнопку — значение должно стать равным нулю. Если это не произошло, достаньте и поставьте назад фишку датчика, проверив не загрязнены ли контакты на плате и магниты.

Важные вещи:

Запишите, какие разъемы соответствуют каким аналоговых входам. Это упростит дальнейшее программирование, так как нумерация постоянна для вашей модели платы Arduino

Предположим, что мы имеем установленный датчик касания посередине робота, за который отвечает аналоговый разъем 2.

Напишем программу, реализующую следующий алгоритм:

1. Программа запускается и ждет нажатия клавиши. 2. По нажатию клавиши «вверх» робот начинает непрерывно двигаться. 3. При возникновении препятствия перед роботом, он должен отъехать назад и остановиться.

Теперь давайте научим робота опеределять, с какой стороны находится препятствие. Для этого будем использовать два датчика касания - справа и слева.

Скорее всего (так как в зависимости от модели вашей платы Arduino датчики нумеруются по кругу) это будет Analog1 для левого (по ходу движения) сенсора и Analog3 для правого.

Алгоритм работы будет следующий:

1. По нажатию клавиши "стрелка вверх" мы начинаем движение вперед; 2. Если обнаруживаем касание левого датчика, то останавливаемся; 3. Проверяем, не сработал ли одновременнот правый датчик. Если нет, то откатываемся назад на шаг, и делаем поворот вправо; 4. Если сработал правый датчик, то откатываемся на шаг назад и делаем поворот в заданную сторону (обычно вправо); 5. Если сработал правый датчик, то действуем аналогично, только делаем поворот влево, а для двух датчиков копируем код.

Пример движения робота по данному алгоритму показан на следующем рисунке:

Теперь напишем код:

Файл:Roboplatforma cod5.png

Продолжение кода

Файл:Roboplatforma cod5.1.png

Вопрос: А что будет, если робот попадет в угол?

Задание: Измените алгоритм, избавившись от дублирования кода опроса двух датчиков и двойной проверки условия

Вопрос: Каким минимальным количеством условий ЕСЛИ можно обойтись при использовании операторов И, ИЛИ, НЕ?

[Править] На свет!

Теперь давайте научим робота видеть. Конечно же мощности и возможностей Робоплатформы не хватит на полноценное компьютерное зрение, но сделать глаза, реагирующие на уровень освещенности нам под силу.

Для этого используем датчики освещенности (сенсоры света) из комплекта поставки. Они выглядят вот так:

Файл:Roboplatforma svet1.png

Проверьте их работу. Для этого установите датчик в какой нибудь разъем и посмотрите соответствующий вывод аналогового входа. Значение сенсора должно лежать в пределах 40-60 единиц. Закройте его пальцем - значение должно упасть. Посветите фонариком или направьте на источник яркого света - значение должно увеличиться. Иначе проверьте контакты.

Мы напишем простейшую программу, когда наш робот будет ползти на свет. Алгоритм будет следующим:

1. При старте программы робот переходит в цикл ожидания и проверяет уровень освещенности; 2. Как только уровень освещенности превышает заданный порог, робот включает мотор и двигается вперед;

Код программы будет таким:

Файл:Roboplatforma cod6.png

Задание: Измените программный код, чтобы робот стал бояться света. То есть при освещении сенсора он должен пятиться назад в тень.

А теперь установим роботу два глаза в правый и левый разъемы (аналогично датчикам касания). Теперь сделаем так, чтобы робот двигался самостоятельно в сторону источника света, следя за ним.

Алгоритм в данном случае будет сложнее.

1. При нажатии стрелки вверх робот должен перейти в цикл ожидания источника света. 2. При появлении сигнала на одном из датчиков, робот должен определить направление своего движения. Для этого необходимо сравнить сигналы между собой. 3. Если левый датчик освещен больше, чем правый, то нужно повернутьсч на шаг влево. 4. Если правый датчик освещен больше, чем левый, то на шаг вправо. 5. Если освещение равномерное, то двигаться вперед.

Файл:Roboplatforma cod7.png

На самом деле в реальности мы столкнемся еще с одной проблемой: сигнал с датчиков, даже если источник света будет расположен посередине между ними, может быть различным и робот будет крутиться вправо-влево, но не двигаться.

Чтобы избежать этого, необходимо ввести порог разности сигналов, при которой будет считаться, что она существует. Обычно порог задают в пределах 3-5 единиц и определяют его как разницу сигналов с сенсоров.

Теперь код будет выглядеть так:

Файл:Roboplatforma cod8.png

Как видите, теперь к условию большего уровня освещения добавляется проверка на превышения порога разности. Если этого не происходит, то робот двигается вперед.

Обратите внимание, что если Analog1 показывает больше Analog3 на 7 единиц (величину легко определить, посветив на стоящего робота посередине), то порог разницы будет при Analog1 > Analog3 будет вычисляться как

Analog1 - (Analog3 + 7)

и

(Analog3 + 7) - Analog1

для учета данной погрешности.

Задание: Модернизируйте код, учитывая разницу показаний сенсоров света.

Задание: Сделайте так, чтобы робот останавливался, достигнув источника света.

Задание: Сделайте так, чтобы робот убегал от источника света в направлении, параллельном ему.