
В продолжение статьи '
Робот бегущий по линии, с одним датчиком - Line Rider 1'
Исправил проблему с потерей линии. Теперь робот, съехав с линии, поворачивается на небольшую величину в заданную сторону и не найдя линии поворачивается в другую на чуть большую величину, и так далее.
Основное тело программы выглядит так:
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;
Для проверки работоспособности собрал небольшую трассу с резкими поворотами и прямыми углами. Тест показал неплохую работоспособность, за исключением небольшого но: на очередном повороте робот потеряв линию проскочил ее снова и начал раскачиваться вокруг своей вертикальной оси. А все потому, что наличие линии определяется только в конечных точках. В общем нашел он ее только развернувшись в обратную сторону. Вот видео: