[recovery mode] OMower SDK для колесных роботов (open source, open hardware)
Наконец дошли руки до публикации обещанного SDK для проекта OMower (открытая программно-аппаратная платформа для колесных роботов на базе 32-битного контроллера ATSAM3×8E с поддержкой разработки в Arduino IDE). Уровень завершенности софта пока не очень хороший (например, отсутствуют классы для датчиков бамперов, дождя и травы, отладка некоторых функций не до конца завершена), но даже в текущем виде робот умеет ездить с высокой точностью по RTK GPS, поддерживает практически все что нужно для косилки — сонары, проводной периметр, навигацию по компасу и GPS, зарядку от зарядной станции или солнечной батареи.
Моя предыдущая статья о проекте OMower
Код SDK и Kicad-файлы со схемой и разводки платы лежит на гитхабе — https://github.com/vasimv/OMower
В настоящее время поддерживаются только две платформы — OMower board v3 с драйверами моторов Polulu dual MC33926 и связка из Arduino Due + драйвер моторов IHM12A1 (тестовая машинка на маленьком четырехколесном шасси). Возможно добавится поддержка ardumower на базе Arduino Due. Крайне желательно наличие платы IMU GY-80, без нее навигация не работает просто (хотя и можно сделать простого косильщика, который случайно ездит внутри проволочного периметра).
В новой, четвертой версии платы, планируется поставить на нее IMU MPU9250 и добавить FRAM-чип для сохранения пользовательских настроек не во внутреннем флэше контроллера (который обнуляется при перезаливке прошивки), ну и еще карты всякие в нем можно будет хранить. Также, наверное, увеличу размеры резисторных и конденсаторных сборок, паять 0402 «на коленке» феном было удовольствие ниже среднего, и места под разъемы увеличу, чтобы можно было ставить те, что с фиксаторами, не просто торчащие пины.
Код API написан в виде кучки классов (omower-*.h файлы), которые нужно включать в виде объектов в свой софт (причем, необязательно включать их все, можно брать только те что нужны, кроме базовых). Для упрощения понимания и тестирования, написан фирмварь OMower_Simple (https://github.com/vasimv/OMower_Simple), который выполняет довольно большой набор команд, выдаваемых через pfodApp с любого смартфона.
SDK берет на себя управление всеми низкоуровневыми функциями и работает, в основном, по прерываниям, что дает программисту конечного софта возможность писать независимый от конкретных деталей конкретного робота софт, причем в очень свободной манере (можно писать конечный автомат, а можно просто вызвать функцию начала езды и ждать когда робот доедет до нужной точки). На плечи программиста ложатся только процедуры вызова функций инициализации и контроля езды робота (указания куда, собственно, ехать и обработка срабатываний сонаров и других датчиков).
Для подключения дополнительных внешних устройств на плате (и поддержка в SDK, конечно) — имеются много внешних разъемов. Например, стандартных сервоприводов с PPM-входом можно подключить до четырех штук (или даже шесть, если отказаться от двух моторов). «Стандартных» для косилки сенсоров — имеется с большим избытком, тех же сонаров можно подключить аж шесть штук, а датчиков периметра — четыре. Разумеется, в большинстве случаев столько не нужно и часть их разъемов можно использовать для подключения каких-то других устройств (выведены практически все выводы микроконтроллера). Интеллектуальную часть (обработка RTK GPS, коннективити с wifi) выполняет Orange PI Zero, который устанавливается в специальный разъем.
Заранее извиняюсь за кривой и недоделанный местами код, приходилось отвелкаться и на другие проекты, да и выявилось множество всяких трудностей, с которыми едва справлялся. Зато узнал много нового, например, то что кривизна эллипса Земли в наших местах — почти 40 метров, а магнитные полюса Земли кочуют из года в год на десятки километров (без учета этого — робот ездил из точки в точку весьма кривыми линиями). Временами казалось, что космическую ракету в запускаю, а не газон кошу. :)
Ну и как бонус, выложил еще исходники моей прошивки для ардуинки с Decawave DW1000, которая организует мини-сеть из этих девайсов и позволяет роботу определять свое местонахождение внутри помещений или там, где RTK GPS просто не может определить свои координаты (с поддержкой практически бесконечного количества тэгов и разбиением на комнаты). Эта прошивка еще очень и очень сырая, но может кому-то пригодится. https://github.com/vasimv/MyRangeTag