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