Робот на Ардуино и машинка на Bluetooth своими руками
Робот – машинка на Ардуино становятся одним из самым популярных инженерных проектов в школьной робототехнике. Именно с таких устройств, автономных или управляемых со смартфона и bluetooth, начинается путь в робототехнику “после Lego”. К счастью, сегодня можно без труда купить все необходимые компоненты и достаточно быстро создать своего первого робота для езды по линии или объезда препятствий. В этой статье вы найдете подробную видео инструкцию как сделать продвинутый автомобиль Arduino Car своими руками, с питанием, датчиками линии, расстояния и управлении через bluetooth.
Робот на ардуино своими руками
В отличие от других проектов, создание робота – автомобиля (Arduino Car) требует понимания и навыков работы сразу с несколькими важными компонентами, поэтому не стоит приступать к созданию машинок без получения базовых навыков работы с платформой Arduino. В любом случае, вам нужно будет но только подключить готовые модули, но и собрать конструкцию, шасси с двигателями, обеспечить правильное питание и управление. Все это потребует определенного терпения.
Робот машина на Ардуино
Вот список ключевых компонентов, которые обязательно встретятся в проекте.
Контроллер Ардуино
Куда уж без него, если мы говорим о проектах на этой платформе. Как правило, роботы машины делают на базе плат Arduino Uno и Nano. Mega будут слишком большие, Pro Mini сложнее подключать к компьютеру и соединять с остальными компонентами, а Leonardo требуют дополнительных навыков в программировании, они дороже и их основное преимущество (тесная интеграция с компьютером в качестве периферийного устройства) в данном случае не слишком востребована.
Есть еще вариант использования плат ESP8266 или ESP32, тогда в проекте появляется возможность управления машиной через WiFi. Но и сами платы и их программирование требует определенных навыков, в этой статье мы будем говорить преимущественно об Uno или Nano.
Конструкция, шасси и двигатели робота на Ардуино
Для того, чтобы что-то поехало или стало перемещаться, надо снабдить “это” колесами, гусеницами или манипуляторами-ногами. Вот тут выбор совершенно не ограничен, можно использовать совершенно любые комбинации и сочетания платформ. Как правило, в качестве начального варианта берутся уже готовые наборы платформ с Алиэкспресс.
Двигатель, шасси и колеса машинки на ардуино
Если работать со стандартными наборами вам не интересно, можно создать платформу своими руками. Например, разобрать игрушечные радиоуправляемые машинки или любые двигатели на 5-12 вольт, с редукторами или без. Колеса можно создать и самим, что тоже является интересной задачей.
Драйвер двигателей
Ардуино – достаточно ранимое устройство, не терпящее больших нагрузок по току. Соединяя его с “брутальными” мощными двигателями, не избежать беды. Поэтому для нормальной совместной работы нам нужно будет включить в схему робота компонент, отвечающий за управление двигателями – подающий и отключающий ток на их обмотки. Речь идет о микросхеме или готовом модуле, которые называют драйвером двигателя. На нашем сайте есть статьи, посвященные драйверам, построенным на схеме H-моста. Если вы покупаете готовые шасси, то обязательно предусмотрите возможность размещения на них подходящего драйвера.
Красивый корпус
Как правило, вся конструкция автомобиля строится вокруг его шасси. Если посмотреть примеры готовых проектов, то они часто выглядят как “провода на колесиках” – внешний вид их изобилует пучками соединительных проводов, ведущих от восседающего на троне контроллера Ардуино к драйверам, моторам и датчикам. Между тем, красивый и функциональный корпус не только вызывает правильные эстетические чувства и помогает выделить вашу модель от остальных. Хороший корпус может превратить игрушку в реальное устройство, помогает привить навыки конструирования и промышленного дизайна, что важно для инженеров любого возраста.
Питание робота
Обеспечение правильной схемы питания – это то, что очень часто оказывается на последнем месте в списке приоритетов начинающих ардуинщиков. Между тем, именно ошибки в схеме электропитания становятся основными причинами проблем, возникающих в процессе работы умных устройств на Ардуино. Создавая ардуино-машинку нужно предусмотреть питание контроллера, двигателей, драйвера и датчиков. У всех них есть свои ограничения и особенности работы, требуется создать оптимальное по весу и сложности решение, позволяющее учесть все эти ограничения.
Питание робота на Ардуино
Создавая по-настоящему автономное устройство робота, нужно побеспокоиться и о времени его работы, и о возможности быстрой подзарядки или смены батареек. Как правило, выбираются решения из следующих вариантов:
- Обычные батарейки AA. Тут нужно понимать, что платы Arduino Uno, Nano и большинство двигателей, используемых в Ардуино-робототехнике, требуют напряжения в диапазоне 6-9 вольт. Поэтому придется собрать вместе последовательно не менее 4 батареек на 1,5 В, причем сами батарейки должны быть хорошего качества и обеспечивать работу с достаточно большим током. Например, большинство солевых батареек этим критериям не удовлетворяют. Батарейки AAA при создании ардуино-машинок практически не используются из-за своей пониженной емкости (хотя могут использоваться в миниатюрных моделях, где размер имеет первостепенное значение).
- Аккумулятор AA. Здесь возникает еще большее ограничение по напряжению и току. Большинство аккумуляторов выдают напряжение 1,2 вольт, поэтому их требуется больше для “собирания” нужных нам 6-9 вольт. Несомненным плюсом является возможность перезарядки.
- Литиевые аккумуляторы 18650. Это уже “серьезная артиллерия”, позволяющая получить большое время автономной работы, возможность подзарядки и приемлемые характеристики по току и напряжению. Рабочее напряжение для таких элементов питания – 3,7 В, что позволяет собирать готовую схему питания всего из двух элементов.
- Другие источники питания. Сюда можно включить как более мощные и габаритные никель-металлгидридные, кадмиевые аккумуляторы, так и многочисленные литий-ионные “плоские” варианты, используемые в дронах, смартфонах или другой портативной цифровой технике.
Каким бы ни был источник питания, нужно обеспечить его надежное крепление, удобное расположение, защиту от воздействия недружелюбной окружающей среды. Если вы подключаете к одному источнику и контролер, и двигатели, и датчики, то нужно позаботиться о правильной схеме, включающей, например, надежную связь “по земле” всех устройств.
Где купить платформу и запчасти
Все, о чем говорится в этой статье, можно без проблем купить на всем известном сайте. К сожалению, подавляющее большинство предложений основываются на стандартной платформе 4WD автомобиля с двумя несущими планками, не очень надежными двигателями и колесами, любящими ездить в “развалочку”. Но эти варианты относительно не дороги и вполне подойдут для начала работы.
Arduino.ru
Arduino Robot 2WD помогите собрать с нуля
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
И так всем привет я новичек в этом деле помогите чем сможете.
Купил данный набор теперь не знаю как правильно собрать данную модель
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Проси инструкцию у продавца
Вот тебе схема сборки платформы
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Всю механику я собрал, платы накинул осталось подключить провода и запустить
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Всю механику я собрал, платы накинул осталось подключить провода и запустить
Кто или что мешает?
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Не знаю как правильно подключить провода и какой Скетч закачать на плату ардуино.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
я уверен в том, что Вы купили эту игрушку именно с целью собрать самостоятельно. Если бы это было не в кайф — купили бы готовую машинку и не парились бы, так же? Так и собирайте, ничего там сложного нет.
На платах (модулях) написаны их названия (их даже на катринке видно). По этим названиям гуглите и находите схемы включения — Вы же не думаете, что Вы первый, кто это собирает. Схем навалом — не найти невозможно.
Там же можете найти и скетчи, но это неинтересно. Весь смысл робота в том, чтобы его самому запрограммировать. Но, если не умеете, скетчи для каждого из Ваших модулей Вы легко найдёте (опять же названия модулей на них написаны). Пробуйте и не сдавайтесь и всё получится.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Недавно с детьми такой собирал. Там перемычек нехватает. Придётся заказывать или делать. Ссылка на скетч под такой же комплект — http://mysku.ru/blog/aliexpress/19132.html Ко мпилировал под Arduino IDE 1.0.5
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Сейчас буду разбиратся.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Кнопку я не подключал, забыл :-(, работает и без неё.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Кнопку я не подключал, забыл :-(, работает и без неё.
Я единственное не понял как определить в коде ПИНы подключения моторов через Arduino Sensor Shield V5.0
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
А они просто Ардуино перетащены, т.е. Сенсор шилд — просто разъёмы для датчиков, Жки иб.д. Можно обойтись и без неё. всё равно только Серво нормально подключается ( своим разъёмом), а всё остальное отдельными проводками.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Правильно ли написан код для моторов .
как правильно указать в коде подключение по моим параметрам в схеме на плате ?
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Нашел еще пару ошибок которые совершил при сборке платы, теперь поменял код на этот серво привод работает с сонаром отлично Но МОТОРЫ не едут в чем причина Помогите
При проверке выдает ошибку warning: case label value exceeds maximum value for type [enabled by default]
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
При проверке выдает ошибку warning: case label value exceeds maximum value for type [enabled by default]
А полностью сообщение привести религия не позволяет? Там номер строки был, а так мне приглось искать где это у Вас. Оно мне надо?
В одинарных кавычках пишется символ. Одиночный символ, а не три символа, как у Вас. Эта ошибка разбросана по всей программе, во могих местах.
В строке 149 с имеет тип char (т.е. как раз «одиночный символ»), а Вы рытаетесь сравнивать её со странноватой конструкцией ‘stp’.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
А питание на драйвер двигателей подвели? По фото видно что отсутствует.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Спасибо за ответ все поправил
Ну и остальной код естественно тоже подправил теперь не на что не ругается.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Подключение питания от платы Arduino Shield 5.0 к плате драйвера двигателей
Правильно ли я подключил питание .
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Может лучше от батарей на прямую ?
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
По сути индикатор питания 5v на плате драйвера горит, сигналы подаются, но они сами двигатели пищат и не более того.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Имелось в виду от батарей на драйвер двигателей. Когда собирал свой, добавил к отсеку на 4 батарейки ещё один на 2 шт. Итого 9в. Помнится мне что стабилизатор 7805 для нормальной работы требует не менее 7,5в. (в корпусе ТО-220, в смд может меньше — лень было искать и смотреть даташит)
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Попробуйте поднять напряжение питания, или посмотреть строки 133-141, там как раз ограничение параметров выхода на движки
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Ура заработало . Сейчас взял подпаял еще 2 провода от батарей и подключил их напрямую к драйверу двигателей и вуаля движки закрутились !
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Добавлю скеч едет он на нем корявенько конечно даже не знаю как его заставить ехать более точно
При этом скече он постоянно сканирует сонаром и еле едет, подозрение падает на сильную чуствительность самого сонара который не дает нормально ехать роботу
Подскажите что не так я написал в коде ?
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Посмотрел скетч, мелкие замечания:
1. Управление драйвером моторов: первым делом ВЫКЛЮЧАЕМ не нужный пин, делаем задержку в 2мкс. и только потом включаем тот, куда хотим вращать моторы. Этот порядок позволяет исключить сквозные токи через драйвер и улучшить время жизни батареек. Заодно драйвер будет меньше греться.
2. Строки 140,141: почему установка идет в 0, а не в MINPWM.
3. MAXPWM в районе 150 это 150/255 от реальной максимальной скорости моторов. Поиграйтесь с этим параметром.
4. Аналогично со значениями минимальной скорости. Моторы «заводятся» начиная с некоторого значения ШИМ и это далеко не 0. В среднем для хорошего мотора и редуктора с небольшими потерями это 10-20%, то есть в единицах 8-и битного ШИМ это примерно «от 50», да и сильно зависит от «материала трассы». У вас скорость выставляется в 127 .. это запросто может оказаться «ни о чем». Сделайте простой тестовый скетч: установка обоих моторов в некий ШИМ и проезд ровно 1 сек. и замерьте с какого значения ШИМ ваша конкретная тележка начинает движение хоть с какой-то скоростью, и сколько на каком значении ШИМ она проезжает за 1 сек. Такие «пробные» скетчи проще всего загонять в setup при пустом loop — однократное исполнение — гарантировано. У нас такой блок прошит прямо в setup() и просто комментарится, когда не нужен. При разной состоянии батареек — могут быть очень разные значения констант минимальной и максимальной скорости.
5. Ваш rotate() делает не «поворот», а «разворот на месте» за счет вращения колес в разные стороны. Попробуйте поворот на одном колесе или радийсные повороты за счет разной скорости колес в ОДНУ сторону. откроете для себя много интересного.
6. При обнаружении препятствия ваша тележка делает попытку крутить моторы «взад» 0.2сек .. при ваших параметрах, она реально должна успеть не только встать колом, но ещё и дернуться назад .. последующий разгон до небольшой скорости .. вот и вся причина. Время торможения — сильно зависит от материала трассы и текущей скорости движения. И такие АБС методы полезны на скользких трассах и реальных скоростях движения от 30см/сек при общем весе тележки в 500-600гр. По крайней мере по нашему опыту. В общем, это место — исключительно экспериментально.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Спасибо за исчерпывающий ответ, буду старатся исправить свой код.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Здравствуйте, tes66, внимательно следил за Вашими мытарствами, ожидая своих. вот и пришло время, посему прошу — опубликуйте ссылку на готовый скетч, пожалуйста.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Пост №24 — практически готовый скетч. На самом деле он у каждого свой, там нет ничего сложного или сверххитрого. Пробуйте самостоятельно по очереди: управление мотором, прием данных с датчиков, постепенно соединяя все в одно целое .. получите массу удовольствия, чем залить чужое и с удивлением создавать очередные посты тут «почему оно не работает».
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Здравствуйте Arhat109-2, дело в том, что с этим скетчем я знаком задолго до открытия данной темы в форуме. Мои дети (я в селе веду кружок на разные технические темы) собрали ардуино — машинку как данная, только 4 wd, и где то с октября именно с данным скетчем экспериментировали, я особенно не вникал, т.к. в основном работаем с NXT. Но решили попробовать заявить ее на краевую олимпиаду по робототехнике в номинации Лабиринт http://robot.uni-altai.ru/meropriyatiya/olimpiady/ochnye-olimpiady/vi-olimpiada/zadaniya-lego-mindstorms/zadanie-2 и тут появились проблемы с использованием данного скетча, т.к. другие из сети не годились, а самим написать еще пока невозможно. Это замечательно, что Вы откликнулись, и, думаю, что сможете нам как то помочь, может быть, у Вас уже есть готовая программа. Мы не ставим своей целью где то победить, просто хотели показать возможности ардуино и немного ее порекламировать, т.к. в радиусе 300 км этим в школах практически никто не занимается. Если у Вас есть возможность нам помочь, то сообщаю дополнительно о узлах конструкции: тележка 4 wd, драйвер моторов L298N HEX (красная плата), ультразвуковой датчик HC-SR04, arduino UNO, хотелось бы продемонстрировать плавное движение (мне дети в ютубе показывали) тележки в лабиринте или просто прохождение лабиринта. Спасибо, что выслушали меня. /Владимир/
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
А вас разве берут с Ардуино на лего соревнования? Нас — нет, несмотря на то, что наш проект «Ардуино как лего» — сама плата и все датчики оформлены в лего-стандарте и позволяют использовать обычные лего детали для сборки конструкций. Тут есть проект с фотками, периодически обновляюсь. Да, и для 4wd надо 2 драйвера .. или у вас вариант 2/4wd (2 мотора на 4 колеса по одному на сторону)?
В ваш комплект крайне желательно добавить серводвигатель (пойдет и SG90) и посадить на него датчик расстояний. Из нашей лабиринтовой тележки остались только куски к моей библиотеке arhat.h .. осилите? 🙂 Могу выложить код, который автономно и аппаратно крутит серву с датчиком и замеряет расстояния в массив, делая усреднения по 5 замеров. Можете поиграться, оно сильно облегчает работу с датчиком и расстояниями.
Код, да и библиотека заточена под Мегу, но может компилироваться и под УНО с соответствующими ограничениями (по аппаратной части: у Уны только 1 16-и битный таймер = только 2 аппаратных серводвигателя).
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
спасибо за ответ. Вот выдержка из положения наших соревнований:
- У микрокомпьютера EV3 можно использовать только три разъема для подключения двигателей (один разъем обязательно должен быть свободен). По решению жюри к участию в соревновании может быть допущена команда с роботом, собранным из деталей, отличных от Lego; т.е. в этом году организаторы решили расширить перечень конструкторов, ожидаются технолабовские, мы даже собрали 1 -го «Валли» из huna и хотим представить ардуино. Я по невниманию (пенсионер все таки) не написал про серводвигатель sg90 — он, как Вы и пишите, вращает радар; моторы запараллелены -правые передний и задний, левые передний и задний — так и подключены к драйверу моторов на 2 выхода. Я жду Вашего кода, только сможете расписать распиновку подключения драйвера моторов, УЗ датчика и серводвигателя под UNO? Спасибо.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Могу предложить такую раскладку пинов:
5,6 — ШИМ каналы 0-го таймера под сигналы EN ваших драйверов моторов для управления их скоростью. Занимаем один из входов компараторов и внешний счетный вход таймера 1, что в дальнейшем помешает подключить датчик цвета типа TSC3200 в режиме подсчета частоты, но зато можно будет использовать ICP1 для подсчета длины периода, что даже в среднем ускорит работу с ним. Использовать ШИМ от 2-го таймера, имхо хуже в перспективе, поскольку там сидит SPI интерфейс, а он может пригодиться, например для чтения с SD-карты, тех же программ или сохранения чего-либо «на лету» (дамп состояний для посметрной диагностики) .. так, «на будущее», раз у вас кружок;
9 — под управление серводвигателем радара. Он по сути один и остается, если резервировать 10..13 ноги под SPI. Для аппаратного управления серводвигателями удобнее пользовать 16-битный таймер, но можно приспособить и 2-й таймер тоже, с потерей точности. У меня под сервы использованы 16-битные, поэтому оставим 9 ногу;
Если резервировать остальное из таких же соображений совместимости датчиков и моторов, то под управляющие сигналы скорее всего придется отдать аналоговые входы 0..3. Остальное как-то жалко..
Ну и под радар можно использовать 4 и 7 пин, к примеру. Тут важно посмотреть какие датчики вы планируете далее использовать и в каком комплекте с моторами тележки для построения наиболее разнообразного количетсва вариантов .. кружок всеж-таки.
Вернусь, выложу скетч, точнее то что нашел от него с распиновкой под этот вариант.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Извиняюсь, с кодом будет задержка до выходных .. не добраться. 🙂
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
хорошо, не беспокойтесь
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Вырезал из своего кода блок взаимодействия конечных автоматов для узв. датчика и серводвигателя и поменял номера пинов для раскладки выше. Ловите:
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Комментарии не подправил .. остались от моего варианта с 4 моторами и энкодерами.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Здравствуйте, после ознакомления с Вашим кодом получил бесконечную зависть к автору и осознание своей полной «безграмотности». Вы молодец. я много видел кодов для такой машинки, но этот. (почти как в фильме «Классик») и если он еще у нас заработает.
с сервой и радаром, как с описанием, так и с подключением более-менее понятно
Пожалуйста, если можно, объясните строки с моторами (маршевые моторы — 6 строк) — мне не совсем понятно как связаны ардуино UNO с драйвером моторов:
драйвер ардуино UNO
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Пины моторов прописаны в строках с 6 по 15:
IN1 = m0f (motor0, forward) = 14 пин, он же Analog0 UNO
IN2 = m0b (motor0, back) = 15 пин, он же Analog1 UNO
ENA = m0s (motor0, speed) = 5 пин, он же PWM5
IN3 = m1f = 16 пин (Analog2), IN4 = m1b = 17 пин, он же Analog3, ENB = m1s = 6 пин, он же PWM6
В самом скетче нет управления моторами, только взаимодействие между серводвигателем и узв. датчиком в виде конечных автоматов:
В setup() серводвигатель запускается в крайнее левое положение (#321..324) и выставляется ему макс. пауза для «доезда».
По завершению движения сервы его автомат (#352) вызовет servoEnd(), которая отключает себя и разрешает КА датчика начать замер (#150).
Логика автомата датчика ( обрабатывается отдельно, в #354 каждый вызов loop) тупо проставит запуск отправки импульса для начала замера (функция startTrig4, #270), который излучает импульс и настраивает прерывание на подсчет длительности отклика. Само измерение производится в процедуре обработки прерывания и тут не видно (pcint.h, pcint.c библиотеки, там же есть подсчет энкодеров таким же способом, тут не используются). По завершению замера из прерывания будет изменен статус автомата датчика, что и будет обнаружено в его логике работы dohcsr04() строки #263..#288. В случае ошибки замера — производится перезапуск датчика через смену состояния автомата. В случае удачного замера — вызывается saveDistance() в #274, которая ведет учет замеров, занимается их усреднением и складывает результат в текущую ячейку массива расстояний по направлениям allDistances[] и переводит текущее направление, смотря куда вертится серводвигатель #251,252.
По завершению замеров в текущем направлении, усреднении результата и складыванию его в текущую ячейку массива расстояний, датчик запускает серводвигатель на поворот #254 и остается в режиме ожидания. Автомат серводвигателя (#352) вызовет srvSonic_next(), которая пытается установить новое направление для серводвигателя через вызов srvServo_move(). Последняя есть не что иное, как проверка выхода за допустимые значения и собственно установка значения PWM на ноге сервы. Функция srcSonic_next() в общем-то тупо переключает направления и указывает что следующим шагом автомата серводвигателя надо вызвать srv_end() — «серва доехала», которая останавливает серву и запускает замеры .. и так по кругу. 🙂
Чтобы далее управлять моторами можно в loop дописать код, анализирующий расстояния и соответственно принимающий решения какой мотор куда включать и куда смотреть далее. Если не вмешиваться в работу пары серва-датчик, то они так и будут замерять расстояния, вращяясь туда-сюда обратно.
Наш код я отсюда повырезал, ибо он во-первых, писан ребенком по большей части, а во вторых жутко искалечен последними переделками и недоработками и, разбираться что в нем верно а что не так — я не стал. У меня он даже не компилировался. Что-то там последний раз он недоделал похоже. Ну и в третьих, он содержал в себе достаточно много ерунды в виде «таблицы Брадиса» на заданные основные углы пересчетов направлений при пересчете в декартовы координаты «на лету» и поиску какой угол лабиринта мы сейчас объезжаем .. в общем: не полезно и не интересно ни разу и точно не поможет, а только больше запутает.