Проект OMower — открытая универсальная колесная платформа (начало)

Хочу представить свой проект открытой универсальной платформы для домашних роботов (газонокосилки, пылесосы и тому подобное). Проект находится еще в стадии сборки и написания софта, надеюсь на полезные замечания и пожелания.



Недавно я познакомился с проектом 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.

Тизер:

Метки:
Поделиться публикацией
Комментарии 47
  • 0
    Дурацкий вопрос. А спаять свою плату выходит дешевле, чем купить аналог? Или просто нет аналогов с заявленными ТТХ?
    • +1
      Аналогов не видел. Находил только игрушечные для маломощных моторчиков и без множества необходимых вещей. Ну и тот же ardumower, у которого тоже многого нет. То есть либо самому, либо на всяких шилдах с arduino due, что будет выглядеть как большой кусок непонятно чего, обмотанного проводами с кучей дополнительных плат.
    • 0
      Тут ключевая фраза — дали денег.
      Особенно с учетом стоимость Decawave меток.
      • +1
        26 долларов за модуль, вообще-то.
        • 0

          А сколько их вообще?
          У меня есть проект (поскромнее), так там итоговая сумма, даже с учетом многократных переделок пока только под $100 подбирается.

          • 0
            Ну, если нужно позиционирование, то нужно минимум четыре штуки (три по углам стоят, одна на роботе). Стены и предметы создают серьезные препятствия для радиоволн, если требуется ориентировка в отдельных помещениях — нужно, естественно, больше.
      • +1

        Для универсальной платформы слишком сложная, замороченная и дорогая. Мне кажется проще под конкретный случай собирать более узкозаточеную плату, тем более в современных реалиях в роботизированной газонокосилке и подобных устройствах основная проблема — это надежно выполняющая свои функции механика, продуманная кинематика, красивый и удобный корпус, интерфейсы взаимодействия и логика работы. А сам контроллер оказывается наименьшей по трудозатратам частью.
        Хотя могу быть не прав, он это лично мой опыт...

        • 0
          Если разносить по отдельным платам, то сразу сталкиваемся с проблемой — либо толстые жгуты проводов между ними и потери контакта/наводки всякие, либо отдельные микроконтроллеры на каждой и многократно возросшая сложность разработки.

          Разработка механической части — вещь ответственная, но не главная. Движки прикрепить к корпусу и к колесам присоединить легко. Тут больше вопрос наличия материалов под рукой.
        • 0
          Странный выбор микроконтроллера.
          ATSAM3X8E можно считать уже морально устаревшим, да и ресурсы у него жидковаты.
          Для современной исследовательской платформы стоило выбрать что-нибудь помощней.
          • 0
            Для низкоуровневого контроля — вполне достаточно, зато совместимость с ардуинкой есть, что сильно уменьшает хлопоты по разработке. С остальным справится и orange pi zero, который, собственно, и задуман как контроллер высокого уровня. В ардумовере, например, вообще atmega2560 применяется и ничего, ездит и сам стрижет, даже без внешнего компа.
          • 0
            orange pi соединен только через UART с микроконтроллером.
            А к микроконтроллеру присоединена куча датчиков, драйверов, CAN, USB…
            Чтобы всем этим управлять и отлаживать в реальном времени из orange придется ваять сложнейший протокол.
            Те же алгоритмы управления как вижу никак не диагносцируются и не отлаживаются.
            Датчики ориентации тоже должны быть на одной платформе с моторами, а их нет.
            Словом ничего не сделано для действительно удобной отладки и исследований.
            • 0
              Ну, никто не мешает USB orange pi соединить кабелем с разъемом на плате, они как раз друг над другом. :) Только я посчитал, что последовательного порта будет вполне достаточно. Над протоколом обмена думал пока только в общих чертах, но вариантов много — тот же modbus, например. Простой и достаточно надежный.

              Плата гироскопа/акселерометра/компаса будет выносной, так как практика показала, что компасс очень чувствителен к большим массам железа в движках (из-за чего шасси делается исключительно из алюминия/дюралюминия), а выбор размещения для такой большой платы гораздо хуже, чем для маленькой отдельной. Да и акселерометру с гироскопом — нужна амортизирующая подвеска для гашения вибраций (которых в косилке очень много из-за косящего движка, махающего ножом со скоростью во много оборотов в секунду). Радиометку тоже на плату сажать не стоит, тесты показывают, что у нее и ориентация должна быть вполне определенной и антенна открыта.
              • 0
                Для выносных плат у вас неправильно спроектирован вывод SPI шины.
                Надо было ставить дифференциальные драйверы.
                У вас же моторы, помехи.
                А так сможете расположить свои датчики не дальше пары сантиметров и на скорости не больше десятка килогерц.
                Словом отстрелялись вы себе по ногам.
                • 0
                  Если честно, SPI я вообще никак не планировал использовать, тем более искать девайсы с его диффернциальной версией. I2C вполне нормально себя чувствует, как показывает практика. Напишу предупреждение про возможные проблемы со SPI в read.me потом.
            • 0
              для 3д принтера тоже можно использовать?
              • +1
                для 3д принтера настолько огромный выбор готовых плат — вообще никакого смысла что то еще лепить
                • 0
                  На 32 битах огромный выбор плат? Не такой уж и огромный.
                  • +1
                    Навскидку, на Atmel:

                    Smoothieboard/Duet/DuetNG/RAMPS-FD/RADDS/MKS SBase/Azsmz

                    На STM32:

                    MKS Robin/Lerdge/Biqu/Speedy

                    Отдельно стоит упомянуть STEVAL-3DP001V1

                    Наверняка их больше, только то, что вспомнил…
                • 0
                  Нет, не думаю. Всего один канал для управления шаговым мотором (два драйвера работают в параллель для двух моторов). Проще взять ту же arduino due и налепить на адаптированный RAMPS.
                • +1
                  Как обычно, из пушки по воробьям, но с поддержкой Ардуино.
                  • 0
                    Ну, кому-то «из пушки по воробьям», а кому-то — «морально устарел, ресурсы жидковаты». Arduino IDE использовать необязательно, можно и в любой другой среде с поддержком cortex-m3 писать.
                  • 0
                    Где e-stop? Электрический. Как планируете реализовать механику этого e-stop? (кнопки, шнур безопасности, итп)
                    >потребляемый ток — контролируется микроконтроллером
                    диагностика механики по обратной связи по току планируется в микроконтроллере?
                    Странно начинается разработка.
                    • 0
                      Там есть кнопка аварийного отключения реле. Отрубит питание полностью.

                      Контроль потребляемого тока моторами, разумеется, планируется. В дополнение к ограничениям по току самими драйверами моторов.
                      • 0
                        Нашёл, да, упустил на схеме изначально я этот элемент, зациклившись на discharge :)Хочется подробнее про аварийный останов. По схеме не всё сходу ясно. Как таковой кнопки нет, только разъём под неё. Механика пока неизвестна? Например — сможет ли ребёнок дотянуться до неё. После её нажатия в какой режим перейдут моторы? Допустим, механизм находится на наклонной поверхности.
                        • 0
                          Большая красная кнопка сверху робота (положение, правда, немного осложняется наличием солнечной батареи, которая будет прикрывать верх — возможно придется сделать несколько параллельных по бокам). Моторы, естественно, просто отключатся, но по наклонной плоскости оно навряд ли покатится — сопротивление редукторов высокое.
                          • 0
                            Расскажите о массе, размерах, коэффициенте редукции, типах двигателей в проекте.
                            • 0
                              Шасси заслуживает отдельной статьи, оно далеко не оптимально, но человек, который его сейчас делает — ваяет настоящий шедевр, причем из подручных материалов (которых в Доминикане не очень много, прямо говоря). Масса там получается весьма большой (как раз из-за использованных материалов — алюминиевые уголки, толстое оргстекло), как и габариты, но мы решили, что лучше иметь пространства побольше для отладочного прототипа. Позже планируется заказать более подходящие материалы и сделать легкое и более простое в изготовлении шасси.

                              Двигатели используется такие — Lynxmotion 12V 1:99.5 20RPM. Они тоже выбраны с большим запасом по мощности, надо будет найти что-то менее мощное и жрущее.
                    • 0
                      Зачем там контроллер на плате распаян? Раз остальное идет в виде модулей так может стоило и контроллер в виде discovery/nucleo поставить? Там, заодно, и программатор встроенный, и стоят они дешевле деталей из которых спаяны.
                      • 0
                        Габариты сильно увеличивает, проблемы с контактами и, например, на arduino due не все выводы на гребенке выходят. Плюс может не оказаться, к примеру, кварца для RTC. Все равно из-за обилия проводников плата выходила четырехслойной — решил распаять контроллер на плате, надежнее так. Паять не так уж сложно, я в несколько раз дольше провозился с распайкой резисторных сборок и конденсаторов (выбрал мелкие совсем, еле очистил потом все «коротыши»). Программатор, в общем-то, не нужен — atsam3x8e имеет встроенный бутлоадер для serial и usb.

                        Трудности проявились только в том, что был какой-то перебой с поставками контроллеров в корпусах QFP-144 (а BGA, по понятным причинам, не рассматривались), они у всех поставщиков в США закончились, еле нашел одну единственную штуку в полтора раза дороже. Но сейчас уже сток пополнен у крупных магазинов.
                        • 0
                          еще момент… драйвера ДПТ:
                          мне думается, что более перспективно для тележек Вашей размерности ориентироваться на колеса для гироскутеров (~3т.р. штука), тогда 3фазный мост под SPWM и вход от датчиков холла были бы более уместными.
                          • 0
                            Я вообще подумываю о шаговых моторах, с ними как-то все точнее получается. Но не определился с требованиями по мощности. Колеса от гироскутеров могут быть не очень применимы, слишком высокие обороты на оптимальной нагрузке (косилке нужно ползать со скоростью 20-40 сантиметров в секунду всего). Впрочем, никто не мешает подсоединить их контроллер к каким-нибудь свободным портам (PWM_?, например).

                            Входы одометров, собственно, для 5-вольтовых датчиков холла и предназначены.
                      • 0
                        Впрочем, никто не мешает подсоединить их контроллер к каким-нибудь свободным портам

                        лучше не к каким-нибудь цеплять, а на соответствующий аппаратный таймер, вряд ли там много вариантов

                        Колеса от гироскутеров могут быть не очень применимы, слишком высокие обороты на оптимальной нагрузке

                        не рекордные 80 кг / 15 градусов уже дают 20 кгс тяги, Вам точно для косилки больше надо?

                        Я вообще подумываю о шаговых моторах, с ними как-то все точнее получается.
                        для мобильной платформы, наверное, худший выбор
                        • 0
                          Все PWM_? — выходы как раз аппаратных таймеров. Правда, с каждого таймера — по одному выходу, не в курсе — будет ли этого достаточно для контроллеров колесомоторов? Будет время — изучу вопрос их возможного применения.
                            • 0
                              А, ну USART-ы (выведены на SERIAL-1/2/3 разъемы) в ATSAM3x8e могут работать на любой скорости и с поддержкой space/mark бита, так что можно контролировать колесо с таким контроллером легко. Хотя, конечно, хотелось бы более вменяемого контроллера с открытым протоколом и, желательно, на I2C.
                        • 0
                          будет ли этого достаточно для контроллеров колесомоторов
                          для шестишагового режима хватит
                          • 0
                            накидал все на один лист, для удобства

                            Спорное удобство.
                            • 0
                              Какие гироскопы используете? Если на MPU-6050 (типа GY-521) — то как решили проблему оси «Z» (которая вертикальная)?
                              Вопрос «мелкий и корыстный» — я делаю проект с GY-521, с осями X и Y разобрался, да и примеров в Сети много, в т.ч. с использованием Фильтра Калмана — но вот с осью Z (случай поворота, разворота устройства) ничего не выходит.
                              Может, кто-то поможет с/поделится кодом, если есть?
                              • 0
                                GY-80 используется (наследие ардумовера), но планируется в SDK добавить поддержку и других. Ориентация вокруг вертикальной оси определяется по компасу (с поправкой на наклон, полученный от акселерометра), немного геморройно (нужно компас часто калибровать и проблемы с намагничиванием железных деталей), но ничего более простого не придумывается.
                                • 0
                                  Надежда рухнула… :(
                                  :)
                                  • 0
                                    Ну, думаю, вполне возможно по данным акселерометра и гироскопа считать поворот от стартовой позиции с достаточной точностью, если принять меры по гашению вибраций и фильтрации. Я просто этим не занимался совсем, времени лезть в эти дебри нет.
                                    • 0
                                      Угол по оси Z постоянно дрейфует.
                                      Поскольку его не к чему привязать. По осям X и Y есть привязка к вектору притяжения земли акселерометром.
                                      Если MPU-6050 заменить на MPU-9250 то можно магнитометром корректировать угол по оси Z. Но магнитометр имеет большую амплитуду шума, поэтому сам угол по Z становится более нестабильным.
                                      Вот и вся дилема.
                                      Кардинального решения не имеет, кроме перехода на более дорогую технологию гироскопов или привлечение других источников привязки.
                              • 0
                                • 0
                                  А чего такое «скребёт» во время разворота?
                                  • 0
                                    Резина колес скребет по кафелю. Колеса слишком далеко от центра разнесены из-за больших размеров тестового шасси, поэтому при развороте их тянет вбок немного. В следующей версии шасси будет меньше и, возможно, вообще трехколесным (с поворотным колесом сзади), проблемы не будет.
                                    • 0
                                      Вопрос ещё по поводу двигателей. Щёточные — это крайне плохо. Редуктор — тоже не очень хорошо, он требует обслуги, меняется(обычно, для экономии времени) вместе с движком, износ начнётся с него (хотя я основываюсь на эксплуатации бесщёточных движков, в щёточных это будут щётки).
                                      Кстати, как гироскопы реагируют на такую тряску?
                                      Нет предела совершенству, а времени предел есть, так что просто имейте ввиду, но не поддавайтесь))
                                      • 0
                                        Не особо анализировал влияние на точность. Когда по участку ездит с травой — тряски при разворотах нет, там нет такого жесткого сцепления резины с поверхностью.

                                        Да, надежность коллекторных двигателей и редукторов немного беспокоит, но не стоит это дело переоценивать — практически все газонокосилки с такими ездят и выдерживают гарантийные сроки неплохо. На текущий момент — это самый простой и дешевый вариант. Вот косящий мотор я бесколлекторный outrunner буду использовать, Turnigy multistar 4014-320 — он хоть и жрет относительно много, зато косит идеально.

                                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.