В самом простом случае для коррекции траектории движения модели вдоль линии используется релейный регулятор. Проще всего запрограммировать двухпозиционный релейный регулятор, но использование многопозиционного варианта даст ощутимые преимущества..
Релейный регулятор изменяет управляемое воздействие на систему скачком при прохождении регулируемой величины через пороговые значения. Релейный регулятор нашёл применение, например, в электрическом утюге. В терморегуляторе утюга используется биметаллическая пластина, которая обладает свойством изгибаться в одном направлении под действием повышенной температуры. В условиях нормальной температуры пластина находится в недеформированном ровном состоянии, при котором электрические контакты замкнуты. В процессе нагревания пластина начинает изгибаться, а при достижении температуры порогового значения величина изгиба становится такой, что приводит к размыканию электрической цепи. Через некоторое время биметаллическая пластина остывает и электрическая цепь вновь замыкается, что приводит к нагреву. Благодаря этому температура утюга поддерживается на определённом уровне, заданном при помощи поворотного колёсика.
Преимуществом релейного регулятора является простота его реализации, недостаток - управляющее воздействие не учитывает величину отклонения измеряемого значения от порогового.
В нашем случае при движении тележки по линии датчик света измеряет интенсивность отраженного от поверхности света. Диапазон значений датчика света от 0 (чёрное) до 100 (белое). Если нарисовать чёрную линию на белом фоне, то кажется, что края линии имеют черный цвет, но для датчика света она представляет собой градиент из оттенков серого цвета, интенсивность отражения которых лежит между 0 и 100. При использовании двухпозиционного релейного регулятора в качестве границы серого выбирают среднее значение диапазона после калибровки. Если текущее значение датчика света больше значения границы серого, то нужно тележку повернуть в одну сторону (в сторону линии), если меньше - в другую (в сторону от линии). Благодаря этому движение тележки вдоль линии будет представлять собой чередование поворотов.
Траектория движения датчика света лежит вдоль одной из границ линии - нижней или верхней. Вся линия не используется по причине сложности определения положения датчика относительно центра линии. При определённых условиях можно для движения использовать всю ширину линии, но это приведёт к весьма сложной программе и потере простоты реализации, что является основным преимуществом релейных регуляторов.
Ниже показана базовая программа двухпозиционного релейного регулятора.
В переменной grey задаётся значение яркости границы, которое затем в цикле сравнивается с текущим значением датчика света, подключенного к порту A1 на панели настройки сенсоров. При помощи переменной side задаётся сторона линии, вдоль которой будет происходить перемещение датчика.
Создайте на поле имитации линию максимально возможной толщины и установите тележку так, чтобы датчик располагался над линией. После запуска программы датчик будет ориентироваться по верхней границе линии. После изменения значение переменной side = 1 датчик света будет перемещаться вдоль верхней границы линии. Значение переменно side удобно привязать к кнопкам контроллера. Тогда не придётся изменять программу для выбора стороны движения согласно условиям соревнования.
Величина задержки таймера определяет скорость опроса датчика света. Слишком большая задержка может привести к потере линии. Тележка на белом поле всегда поворачивается в одну сторону, и этот поворот будет происходить в сторону линии только при положении датчика с определённой стороны линии.
Изменение величины скорости v2 влияет как на плавность поворотов, так и на надёжность движения тележки по линии. Чем больше значение этой скорости, тем более резкие повороты будет совершать тележка. Для увеличения скорости тележки значение v2 нужно уменьшить, но на резких поворотах трассы может произойти потеря линии.
Диаграммы имеют свойство быстро усложняться и вскоре в мешанине стрелок и пиктограмм будет непросто разобраться. Ниже показан пример подпрограммы с переменными для блока моторов.
Изначально датчик света стоит на тележке по центру. При движении вдоль нижней границы линии сдвиньте датчик вниз до линии прямолинейного движения правого колеса. Тележка станет двигаться ровнее, но пройдёт большее расстояние. Сдвиньте датчик на линию движения левого колеса для сравнения результатов.
Для увеличения скорости на прямолинейных участках в программу нужно ввести ещё одно граничное условие, которое позволит использовать прямолинейное движение тележки. Для определения границ полосы, в пределах которой будет осуществляться это движение, произведём нормализацию значений освещенности. Датчик света выдаёт значения от 0 до 100 единиц, но на практике диапазон освещённости меньше, особенно в случае использования цветной линии. Для надёжного обнаружения поля и линии следует расширить полученный диапазон до диапазона от 0 до 100 по формуле:
x2 = (x1 - нижняя граница1)*100/(верхняя граница1 - нижняя граница1)
Предположим, при калибровке для нижней границы диапазона было получено значение 20, а для верхней - 70, тогда значение x1 = 30 в диапазоне от 0 до 100 будет равно 20 = (30-20)*100/(70-20). Выберем для прямолинейного движения интервал значений яркости от 50 до 80. Алгоритм движения тележки в этом случае будет таким:
Если sensor > 80 повернуть к линии Иначе если sensor > 50 двигаться прямо Иначе повернуть от линии
Это алгоритм трёхпозиционного релейного регулятора. В целях упрощения программы в ней не используется смена стороны лини, калибровка и нормализация. Если вам потребуется нормализация, то вместо переменной sensorA1 нужно задать формулу (sensorA1 - min)*100/(max-min). Значения переменных min и max можно получить в процессе калибровки так: сначала установите датчик света тележки на центр линии и при нажатии на кнопку запишите значение в переменную min, затем установите датчик света над белым фоном и при нажатии на другую кнопку запишите значение в переменную max.
Чем шире диапазон освещённости для прямолинейного движения, тем большее количество времени тележка будет двигаться прямолинейно, но вместе с этим увеличивается вероятность потери линии на крутых участках.
Скорость второго мотора при прямолинейном движении указана v-10 для моделирования ситуации увода устройства с линии.
Значения всех параметров, влияющих на движение устройства по линии, на практике подбираются опытным путём. Для получения лучших результатов они подбираются под конкретную трассу соревнований в ходе предварительных заездов, как это происходит на чемпионатах "Формулы-1". Для более точной настройки параметров в режиме отладки можно посмотреть график изменения контролируемой величины - значения датчика света, энкодеров и др.
Определить время прохождения трассы в ручную достаточно сложно. Но при помощи перекрёстка можно этот процесс автоматизировать, если старт производить от стартовой линии, а таймер выключать при пересечении модели финишного перекрёстка.
Для обнаружения перекрёстков обычно используют два и больше датчиков света, но четырёхсторонние пересечения можно обнаружить и с использование одного датчика. Алгоритм простой: если датчик обнаружит область темнее заданной границы чёрного, то это перекрёсток.
Для предотвращения повторных срабатываний используется защёлка flag. Подсчёт и вывод количества перекрёстков на дисплей контроллера происходит только при flag=false. Использование защёлки является альтернативой временному контролю, для которого может потребоваться создание дополнительного потока.
При прохождении перекрёстка датчик света заезжает на него. Попробуйте это объяснить.
Можно ли при помощи одного датчика реализовать проезд штрих-кода и инверсии? Теоретически это возможно при определённых условиях, но сложность программы ставит под вопрос практической целесообразности. Холодильник можно переместить на одноколёсной тачке, но это потребует использования дополнительные приспособлений и рациональнее сразу использовать четырёхколёсную тележку.
Потеря линии является весьма актуальным вопросом при использовании одного датчика света и этому вопросу стоит уделить отдельное внимание.