Исправил проблему с потерей линии. Теперь робот, съехав с линии, поворачивается на небольшую величину в заданную сторону и не найдя линии поворачивается в другую на чуть большую величину, и так далее.
Основное тело программы выглядит так:
Обратите внимание, что добавилась переменнаяvoid loop() { // Основное тело программы if(isLine()) { // если под нами линия digitalWrite(LED_PIN, LOW); // гасим индикаторный светодиод counter = 3; // сбрасываем счетчик Run(); // едем вперед } else { // иначе (нет под нами линии) digitalWrite(LED_PIN, HIGH); // включаем индикаторный светодиод Rotation(MIN_ROT); // поворачиваем на минимальную величину if(!isLine()) { // смотрим снова, если под нами нет линии (знак '!' - знак отрицания) isCW=!isCW; // меняем направление поворота Rotation(MIN_ROT * counter); // поворачиваем на несколько (зависит от количества попыток) минимальных величин counter= counter + 4; // увеличиваем счетчик попыток } } } // конец основной программы, начинаем все сначала
int counter;
Для проверки работоспособности собрал небольшую трассу с резкими поворотами и прямыми углами. Тест показал неплохую работоспособность, за исключением небольшого но: на очередном повороте робот потеряв линию проскочил ее снова и начал раскачиваться вокруг своей вертикальной оси. А все потому, что наличие линии определяется только в конечных точках. В общем нашел он ее только развернувшись в обратную сторону. Вот видео:Во тут то я и задумавшись о большой трассе придумал интересную штуку: ведь робот потеряв специально утонченную линию найдет другую, рядом стоящую, а это значит что для робота можно рисовать 'стрелки', т.е. развилки по которым он будет ездить в определенном направлении.void Rotation(int t){ // подпрограмма Поворот unsigned long prevMillis = millis(); unsigned long currentMillis; if (isCW) TurnRight(); // если переменная isCW правда (true) то поворачиваем направо, else TurnLeft(); // иначе налево do // ждем нужное время, но постоянно смотрим в пол { if(isLine()) return; currentMillis = millis(); } while (prevMillis + t >= currentMillis); }
Вот четыре штуки для примера:
стрелками показаны гарантированное направление движения робота |
А все потому, что светодиод и фотодиод расположены поперек движения робота и соответственно поле сканирования получилось излишне широким. Сделал новый датчик со светодиодами расположенными в линию:
Более подробно в заметке Паяем датчик линии на CleClo:Proto
С таким датчиком он стал более уверенно входить в повороты, поэтому немного подумав склепал трассу побольше, которую уже можно назвать "железной дорогой" из бумаги.Размер ее 6 на 4 блока. Как и предыдущие, блоки распечатаны на бумаге А4, вырезаны в квадраты и склеены в кучу скотчем. На видео первая проба, поэтому не догадался заранее приклеить трассу скотчем к палубе и когда робот заезжает на крайних блоках гусеницей на палубу, то трасса сползает. Пришлось придерживать рукой.
Видео отчет (чтобы не томить длительной ездой, часть видео воспроизводится в ускоренном виде):
Получил массу удовольствия - вспомнил детство.
Если наштамповать таких блоков побольше на картонках или на пластике, то можно с легкостью конструировать разные поля. Наверняка это будет увлекательным развлечением ребятне на разных робо-кружках.
Для интересующихся:
- архив с файлами блоков Line_Rider_Fields.zip
- скетч для робота Line_Rider_OneSensor-130928a.zip
Комментариев нет:
Отправить комментарий