R1 - Простейший робот основанный на Ардуино
Железо
- Гусеничное шасси с отсеком под 4 AA батарейки
- [2 двигателя] (http://amperka.ru/product/dc-motor-12mm)
- Конторллер Arduino UNO
- Плата расширения управления двигателями (Motor Shield)
- Плата расширения для дополнительного оборудования (TroykaShield)
- [Малая макетная плата] (http://amperka.ru/product/breadboard-mini)
- [Ультразвуковой дальномер (сонар)] (http://amperka.ru/product/hc-sr04-ultrasonic-sensor-distance-module)
- Компас
- 4 батарейки AA -- питание для двигателей
- 1 крона -- питание для "мозгов"
- Провода
Софт
Для улучшения структуры программы используется не голый Си, а C++. Таким образом, код представлен следующими классами:
- CompassDev -- класс обертка для работы с компасом
- SonarDev -- класс обертка для работы с ультразвуковым дальномером
- ChassisDev -- класс обертка для работы с шасси, т.е. с двумя двигателями
- Algorithm -- класс определяющий поведение робота
- Log -- класс обертка для последовательного порта (удобно при тестировании)
Поведение робота определяется методом Algorithm::run(), и заключается в следующем:
- Старт (нажимаем резет)
- Сон 15 сек -- этот шаг сделан для удобства, чтобы можно было успеть поставить робота в исходную позицию.
- Калибровка компаса -- робот при этом вращается и измеряет максимум и минимум магнитного поля по X и Y (в собственной системе координат). Это необходимо для того что бы учесть эффект от искажений вносимых магнитным полем собственных электродвигателей.
- Сканирование -- робот вращается и измеряет расстояния до препятствий внося данные в массив размером 12 (на момент написания). То есть 360 градусов поделены на 12 секторов (по 30 градусов каждый) и каждый сектор содержит усредненное расстояние до препятствия). Процесс сканирования, тем самым, снимает показания с компаса и сонара по мере вращения.
- Выбор направления движения -- состоит в поиске направления для которого расстояние до препятствия оказалось максимальным, на основе массива данных из предыдущего шага. Если выбранное направление менее критического (< 50 см), то переходим к шагу 2.
- Поворот -- робот вращается до тех пор пока не примет нужное положение соответствующее выбранному направлению.
- Движение вперёд -- робот движется до тех пор пока не сблизится с препятствием на расстояние менее 30 см.
- Переход на шаг 4.
Цели у робота как таковой нет кроме быть может той чтобы ездить в сторону самой длинной обнаруженной размерности при этом вовремя останвливаясь перед препятствием.
Ближайшие планы
- Выложить видео с роботом в действии.
- Выложить фотографии с деталями устройства робота.
- Немного усложнить алгоритм. 3.1. Например не выбирать после сканирования того направления откуда только что приехал робот. 3.2. Поворачивать не в одну сторону а в ту сторону в которую короче поворот.