Обход препятствий

11-11-2013, 18:55
Просмотров: 1573
Для выполнения этого маневра в помещении должно быть достаточно места на полу. Кроме того, она должна бать равномерно освещена. Освещение может быть достаточно ярким при условии, что оно не превзойдет интенсивность света, исходящего от двух передних светодиодов. Рассмотренная далее программа иллюстрирует метод обнаружения препятствий, основанный на анализе освещенности.
Обход препятствий

Данный метод использует АЦП микроконтроллер PIC для измерения интенсивности света, попадающего на передние фоторезисторы в то время, когда включены передние светодиоды. Эти замеры сравниваются с замерами, полученными с фоторезисторов, когда светодиоды были выключены.
Светодиоды смонтированы на корпусе и направлены на одну центральную точку, расположенную на расстоянии около 100 мм перед роботом.
Если в этой точке присутствует объект, то исходя из предположения, что этот объект достаточно большой и хорошо отражает свет, можно утверждать, что количество света, принятого фоторезистором, будет значительно больше, чем обычно. Робот распознает эту ситуацию и начнет выполнять действия, направленные на обход препятствия.
Робот отреагирует также тогда по мере приближения к стене или мебели, в силу чего он мог бы передвигаться по комнате неопределенно Долго, хотя в реальности может время от времени натыкаться на углы предметов, как бы "не видя" их. Можете попробовать разработать программу, которая позволила бы роботу избежать подобных "ловушек".
Программа дважды включает подпрограмму записи выходных данных АЦП в память EEPROM.
Она была введена для контроля за данных.
После запуска программы с целью тестирования поведения робота, микроконтроллер PIC был возвращен в программатор сохранения считываемых данных. Эти подпрограммы не являются обязательной частью конечной программы, поэтому их можно не вводить однако на стадии разработки они очень полезны.
Работа этой подпрограммы заключается в возврате значения, в переменной flags. Если впереди робота не обнаружено препятствия, то возвращаемое значение равно 1. В противном случае возвращается 0.
Подпрограмма начинается с обнуления переменной flags. Затем она включает передние светодиоды (D1 и D2).
Далее следует короткая временная задержка для стабилизации схемы АЦП, после чего микроконтроллер PIC переходит к выполнению подпрограммы adread, отвечающей за аналого-цифровое преобразование. Она устанавливает разряд регистра ADCON0 для начала процесса преобразования и ожидает в цикле момента обнуления разряда , что указывает на завершение преобразования.
После возврата управления к convertl результат преобразования переносится из рабочего регистра в регистр, помеченный как reflect.
Вся процедура затем повторяется при выключенных светодиодах. На этот раз микроконтроллер PIC возвращается из подпрограммы adread со значением в рабочем регистре, которое отображает уровень фоновой освещенности комнаты в данный момент времени. На основании двух замеров, соответствующих моментам включения и выключения передних светодиодов, микроконтроллер принимает решение о наличии перед роботом препятствия.
Первый шаг в обработке замеров заключается в вычитании фонового замера из отраженного. Если это вычитание дает отрицательный результат, то это значит, что во время измерений случилось нечто непредвиденное, и микроконтроллер PIC повторяет попытку.
Программа выясняет, является ли результат вычитания отрицательным, проверяя разряд переноса () регистра STATUS на его равенство 0. Если результат вычитания положителен или нулевой, то разряд переноса содержит 1. Названную проверку выполняет командная строка btfss status, О, посылая микроконтроллер обратно в начало или же переводя его на следующий этап обработки информации.
Между двумя замерами могут возникать случайные изменения освещенности, не обусловленные отражением света от объекта.
Их необходимо игнорировать. Мы устанавливаем некоторое минимальное значение, вычитаем его из переменной reflect и проверяем, остается ли значение reflect положительным. Если это так, то разряд flags устанавливается в 1. В противном случае разряд flags остается в состоянии 0.
На этом обработка данных завершена, и подпрограмма возвращает управление основному циклу при установленном или сброшенном разряде flags.
Величина, вычитаемая из reflect, управляет чувствительностью обработки данных. Если ее выбрать слишком большой, то робот будет объекты, если же - слишком малой, то робот будет реагировать на небольшие изменения уровня окружающей освещенности, не Связанные с наличием или отсутствием объекта перед ним. Если окажется, что вычитаемое значение для вашего робота некорректно, отредактируйте программу.
Для этого и предназначены подпрограммы, которые сохраняют данные в памяти EEPROM: они позволяют считывать значения, возвращаемые при двух замерах.
В данной программе мы не используем 10-разрядную точность, поэтому преобразователь был сконфигурирован на выравнивание результата по правому краю, при котором старшие восемь разрядов помещаются в регистр ADRESH. Это делает командная строка bsf eeconl,
7. После возврата из подпрограммы adread результат будет в регистре ADRESH, а два младших разряда - в регистре ADRES (они игнорируются).
Обработка аналоговых данных, доступная в микроконтроллере 16F690, - это еще не все, что может сделать робот "Скутер", если его оснастить дополнительными датчиками или исполнительными устройствами. Так, например, можно добавить звуковой датчик и запрограммировать его на срабатывание по щелчку пальцами. Или же можно установить спереди инфракрасный датчик, ориентировав его вниз, как в роботе "Искатель".
Затем его можно запрограммировать так, чтобы робот избегал пересечения черных линий. Его можно будет "поймать в западню", просто обведя вокруг него черную линию. Если реализовать смещение влево, то робот можно запрограммировать на слеживание линии или на проход лабиринта.
Более амбициозный проект - создать два робота "Скутер", могли бы общаться друг с другом через мигание светодиодов или до радиоканалу.
Совместное поведение двух роботов - интересный предмет для исследований.

Источник: delete-it.ru
Автор: ziko
Опубликовано пользователем: 81 (смотреть все)
Комментарии: