четверг, 24 октября 2013 г.

Line Rider Railway - Железная дорога из бумаги для робота

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


А значит пришлось переписать подпрограмму поворота, теперь во время поворота постоянно опрашивается датчик:
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, вырезаны в квадраты и склеены в кучу скотчем. На видео первая проба, поэтому не догадался заранее приклеить трассу скотчем к палубе и когда робот заезжает на крайних блоках гусеницей на палубу, то трасса сползает. Пришлось придерживать рукой.
Видео отчет (чтобы не томить длительной ездой, часть видео воспроизводится в ускоренном виде):

Получил массу удовольствия - вспомнил детство. 
Если наштамповать таких блоков побольше на картонках или на пластике, то можно с легкостью конструировать разные поля. Наверняка это будет увлекательным развлечением ребятне на разных робо-кружках.

Для интересующихся: