Недавно я познакомился с проектом Ardumower (Статья про него) и получил много интересного опыта. Но, к сожалению, у этого робота есть много разных ограничений, так что мой заказчик «умного дома» проспонсировал проект совершенно нового и гораздо более мощного робота, способного хорошо справляться как с кошением травы, так и с разными другими задачами (например, есть идея развозить по дому напитки для гостей :)). Проект разрабатывается в виде универсальной и расширяемой платформы, с открытыми схемой и SDK для написания своих вариантов программного обеспечения.
Основной элемент робота — плата с 32-битным процессором ATSAM3X8E, идентичным применяемому в Arduino Due, что позволяет использовать простую и привычную среду разработки, а также снимает много проблем с техническими вопросами за счет большого сообщества людей, пишущих программы для этой платформы. Благодаря большому количеству портов микроконтроллера — подключить к плате практически все что угодно. Характеристики платы:
Питание от 12 до 30 вольт, встроенный блок зарядки аккумуляторов с током до 5 ампер и даже бустер для зарядки от солнечной батареи в процессе работы.
Два посадочных места для широко распространенных контроллеров коллекторных моторов Polulu Dual MC33926, с возможностью управления до четырех моторов (в двух вариантах — два мотора на колесах, второй контроллер управляет косящим мотором; либо четыре мотора на колесах с отдельными каналами). Разъемы моторов имеют выводы для подключения одометров.
Посадочное место для контроллера шагового мотора (привод для изменения высоты кошения травы, например).
Разъем для установки Orange Pi Zero (для поддержки RTK GPS сантиметровой точностью и каких-то внешних сложных алгоритмов управления) с возможностью обновления прошивки через этот микрокомпьютер.
6 выходов сигнала PPM для управления бесколлекторными моторами и сервоприводами.
6 портов для сонаров HC-SR04, 2 порта для датчиков столкновения (ardumower bumper с его пневматическими датчиками, например), два емкостных датчика травы, 2 входа для инфракрасных аналоговых датчиков расстояния, четыре входа для датчиков проводного периметра, два разъема для термисторов, управляемые порты для вентилятора, бипера и трех светодиодов (20 и 70 мА). Разумеется, многие порты можно использовать для подключения других датчиков, с определенными ограничениями.
Также на разъемы выведены практически все внешние порты, поддерживаемые микроконтроллером:
3 разъема последовательных портов, две шины I2C c 9 разъемами (одна из которых буферизирована с разъемами как для пятивольтовых, так и для трехвольтовых устройств), 2 шины SPI, CAN (без физического трансивера), USB, два отдельных DAC (просто вывел на разъемы раз уж есть, музыку играть можно там или что-то в этом духе).
Дополнительный импульсный стабилизатор 5 вольт 2 ампера с шестью разъемами для внешних устройств. Ну и реле с фиксацией, для аварийного отключения аккумулятора, чтобы предотвратить его переразряд в случае, если не доехал до зарядной станции. Естественно, напряжение и потребляемый ток — контролируется микроконтроллером (частично — через встроенный многоканальный АЦП, частично — через дополнительный MAX11617EE).
В холостом режиме (драйверы моторов в неактивном состоянии) — потребление тока составляет 130-140 миллиампер.
Схема (накидал все на один лист, для удобства):
В процессе пайки платы столкнулся с тем, что некоторые элементы слишком мелкие для ручной пайки феном, а что-то может перегреться (типа диода в блоке зарядки), поэтому возможны какие-то мелкие изменения.
Разработка SDK для написания прошивок робота уже идет, с его помощью можно будет практически полностью абстрагироваться от управления «железом» на низком уровне, получив набор классов для всех периферийных устройств и датчиков. Например, кусок кода, который заставляет робота поворачивать на север, будет выглядеть так (эти примеры уже работают, хотя и без некоторых проверок на перегрузку и тому подобное):
course = 0.0; imuSens.setCourse(course); motWheel.rollCourse((navThing *) &imuSens, 9000);
А чтобы ехать по проводному периметру на станцию, подняв косящий мотор:
mow.setHeight(0); perSens.setTracking(true); motWheel.moveCourse((navThing *) &perSens, 120000);
К сожалению, сам SDK пока выложить не могу, многое еще не написано (типа кода для поддержки радиометок Decawave DW1000 и всяких вторичных датчиков). Но могу сказать, что все низкоуровневые функции работают и через небольшое время я смогу его выложить на github.
Источник