среда, 25 сентября 2013 г.

Робот бегущий по линии, с одним датчиком - Line Rider 1

Отчитавшись о Boundary Rider, в тот же вечер сел думать о следующих шагах на пути к роботу ездящему по линии, а так как паять еще один датчик было лень, да и не из чего (нужно распаивать другой датчик), то решил поизгаляться и заделать такого робота с одним датчиком.
Дело за малым - за алгоритмом и его реализацией. С алгоритмом решил не усложнять и пошел по простому пути:
смотрим в пол
если линия есть, то едем дальше
иначе (линии нет):
поворачиваем чуток в заданную сторону
если снова линии нет:
то меняем направление поворота
поворачиваем в два раза больше чем чуток в другую сторону
начинаем все сначала
Программу написал на основе кода для Boundary Rider, только добавил подпрограмму оценки цвета пола [isLine()], и еще выбросил ненужную подпрограмму хода назад.
В принципе программа заработала сразу, только есть небольшой недостаток, если робот шибко далеко вылетает за пределы линии, например когда линия заворачивает слишком уж резко, то робот начинает пританцовывать на одном месте. Т.е. просто подвисает.  Решить эту проблему можно несколькими способами, например увеличить минимальный угол поворота, т.е. увеличить сектор обзора робота. Или можно увеличить угол поворота назад на линию не в два, а в три, а то и в четыре раза (строка 40).
Или еще можно поставить счетчик количества съездов с линии и обнулять его при движении прямо. А когда счетчик достигнет какой-то критической величины, то давать команду на поиск линии.

Код: Line_Rider_OneSensor-130920a.zip
Улучшенный вариант с поиском потерянной линии: Line_Rider_OneSensor-130925a.zip

Видео отчет: