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



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

Комментарии (41)


  1. Imbecile
    24.08.2017 03:50

    Дурацкий вопрос. А спаять свою плату выходит дешевле, чем купить аналог? Или просто нет аналогов с заявленными ТТХ?


    1. vasimv Автор
      24.08.2017 03:54
      +1

      Аналогов не видел. Находил только игрушечные для маломощных моторчиков и без множества необходимых вещей. Ну и тот же ardumower, у которого тоже многого нет. То есть либо самому, либо на всяких шилдах с arduino due, что будет выглядеть как большой кусок непонятно чего, обмотанного проводами с кучей дополнительных плат.


  1. x893
    24.08.2017 04:28

    Тут ключевая фраза — дали денег.
    Особенно с учетом стоимость Decawave меток.


    1. vasimv Автор
      24.08.2017 04:33
      +1

      26 долларов за модуль, вообще-то.


      1. Areso
        24.08.2017 06:50

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


        1. vasimv Автор
          24.08.2017 10:06

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


  1. Seven-ov
    24.08.2017 08:29
    +1

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


    1. vasimv Автор
      24.08.2017 10:28

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

      Разработка механической части — вещь ответственная, но не главная. Движки прикрепить к корпусу и к колесам присоединить легко. Тут больше вопрос наличия материалов под рукой.


  1. Indemsys
    24.08.2017 09:10

    Странный выбор микроконтроллера.
    ATSAM3X8E можно считать уже морально устаревшим, да и ресурсы у него жидковаты.
    Для современной исследовательской платформы стоило выбрать что-нибудь помощней.


    1. vasimv Автор
      24.08.2017 10:15

      Для низкоуровневого контроля — вполне достаточно, зато совместимость с ардуинкой есть, что сильно уменьшает хлопоты по разработке. С остальным справится и orange pi zero, который, собственно, и задуман как контроллер высокого уровня. В ардумовере, например, вообще atmega2560 применяется и ничего, ездит и сам стрижет, даже без внешнего компа.


  1. Indemsys
    24.08.2017 12:01

    orange pi соединен только через UART с микроконтроллером.
    А к микроконтроллеру присоединена куча датчиков, драйверов, CAN, USB…
    Чтобы всем этим управлять и отлаживать в реальном времени из orange придется ваять сложнейший протокол.
    Те же алгоритмы управления как вижу никак не диагносцируются и не отлаживаются.
    Датчики ориентации тоже должны быть на одной платформе с моторами, а их нет.
    Словом ничего не сделано для действительно удобной отладки и исследований.


    1. vasimv Автор
      24.08.2017 16:09

      Ну, никто не мешает USB orange pi соединить кабелем с разъемом на плате, они как раз друг над другом. :) Только я посчитал, что последовательного порта будет вполне достаточно. Над протоколом обмена думал пока только в общих чертах, но вариантов много — тот же modbus, например. Простой и достаточно надежный.

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


      1. Indemsys
        24.08.2017 16:43

        Для выносных плат у вас неправильно спроектирован вывод SPI шины.
        Надо было ставить дифференциальные драйверы.
        У вас же моторы, помехи.
        А так сможете расположить свои датчики не дальше пары сантиметров и на скорости не больше десятка килогерц.
        Словом отстрелялись вы себе по ногам.


        1. vasimv Автор
          24.08.2017 16:48

          Если честно, SPI я вообще никак не планировал использовать, тем более искать девайсы с его диффернциальной версией. I2C вполне нормально себя чувствует, как показывает практика. Напишу предупреждение про возможные проблемы со SPI в read.me потом.


  1. RafaelRS
    24.08.2017 12:38

    для 3д принтера тоже можно использовать?


    1. rstepanov
      24.08.2017 13:57
      +1

      для 3д принтера настолько огромный выбор готовых плат — вообще никакого смысла что то еще лепить


      1. RafaelRS
        24.08.2017 14:18

        На 32 битах огромный выбор плат? Не такой уж и огромный.


        1. rstepanov
          24.08.2017 14:32
          +1

          Навскидку, на Atmel:

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

          На STM32:

          MKS Robin/Lerdge/Biqu/Speedy

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

          Наверняка их больше, только то, что вспомнил…


    1. vasimv Автор
      24.08.2017 16:14

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


  1. Polarisru
    24.08.2017 15:57
    +1

    Как обычно, из пушки по воробьям, но с поддержкой Ардуино.


    1. vasimv Автор
      24.08.2017 16:26

      Ну, кому-то «из пушки по воробьям», а кому-то — «морально устарел, ресурсы жидковаты». Arduino IDE использовать необязательно, можно и в любой другой среде с поддержком cortex-m3 писать.


  1. MegaVaD
    24.08.2017 16:56

    Где e-stop? Электрический. Как планируете реализовать механику этого e-stop? (кнопки, шнур безопасности, итп)
    >потребляемый ток — контролируется микроконтроллером
    диагностика механики по обратной связи по току планируется в микроконтроллере?
    Странно начинается разработка.


    1. vasimv Автор
      24.08.2017 17:02

      Там есть кнопка аварийного отключения реле. Отрубит питание полностью.

      Контроль потребляемого тока моторами, разумеется, планируется. В дополнение к ограничениям по току самими драйверами моторов.


      1. MegaVaD
        24.08.2017 17:24

        Нашёл, да, упустил на схеме изначально я этот элемент, зациклившись на discharge :)Хочется подробнее про аварийный останов. По схеме не всё сходу ясно. Как таковой кнопки нет, только разъём под неё. Механика пока неизвестна? Например — сможет ли ребёнок дотянуться до неё. После её нажатия в какой режим перейдут моторы? Допустим, механизм находится на наклонной поверхности.


        1. vasimv Автор
          24.08.2017 17:29

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


          1. MegaVaD
            25.08.2017 01:20

            Расскажите о массе, размерах, коэффициенте редукции, типах двигателей в проекте.


            1. vasimv Автор
              25.08.2017 01:55

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

              Двигатели используется такие — Lynxmotion 12V 1:99.5 20RPM. Они тоже выбраны с большим запасом по мощности, надо будет найти что-то менее мощное и жрущее.


  1. pdkdrp
    24.08.2017 18:50

    Зачем там контроллер на плате распаян? Раз остальное идет в виде модулей так может стоило и контроллер в виде discovery/nucleo поставить? Там, заодно, и программатор встроенный, и стоят они дешевле деталей из которых спаяны.


    1. vasimv Автор
      24.08.2017 19:00

      Габариты сильно увеличивает, проблемы с контактами и, например, на arduino due не все выводы на гребенке выходят. Плюс может не оказаться, к примеру, кварца для RTC. Все равно из-за обилия проводников плата выходила четырехслойной — решил распаять контроллер на плате, надежнее так. Паять не так уж сложно, я в несколько раз дольше провозился с распайкой резисторных сборок и конденсаторов (выбрал мелкие совсем, еле очистил потом все «коротыши»). Программатор, в общем-то, не нужен — atsam3x8e имеет встроенный бутлоадер для serial и usb.

      Трудности проявились только в том, что был какой-то перебой с поставками контроллеров в корпусах QFP-144 (а BGA, по понятным причинам, не рассматривались), они у всех поставщиков в США закончились, еле нашел одну единственную штуку в полтора раза дороже. Но сейчас уже сток пополнен у крупных магазинов.


      1. pdkdrp
        24.08.2017 19:45

        еще момент… драйвера ДПТ:
        мне думается, что более перспективно для тележек Вашей размерности ориентироваться на колеса для гироскутеров (~3т.р. штука), тогда 3фазный мост под SPWM и вход от датчиков холла были бы более уместными.


        1. vasimv Автор
          24.08.2017 19:57

          Я вообще подумываю о шаговых моторах, с ними как-то все точнее получается. Но не определился с требованиями по мощности. Колеса от гироскутеров могут быть не очень применимы, слишком высокие обороты на оптимальной нагрузке (косилке нужно ползать со скоростью 20-40 сантиметров в секунду всего). Впрочем, никто не мешает подсоединить их контроллер к каким-нибудь свободным портам (PWM_?, например).

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


  1. pdkdrp
    24.08.2017 20:26

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

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

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

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

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


    1. vasimv Автор
      24.08.2017 20:29

      Все PWM_? — выходы как раз аппаратных таймеров. Правда, с каждого таймера — по одному выходу, не в курсе — будет ли этого достаточно для контроллеров колесомоторов? Будет время — изучу вопрос их возможного применения.


      1. pdkdrp
        25.08.2017 09:56

        1. vasimv Автор
          25.08.2017 10:43

          А, ну USART-ы (выведены на SERIAL-1/2/3 разъемы) в ATSAM3x8e могут работать на любой скорости и с поддержкой space/mark бита, так что можно контролировать колесо с таким контроллером легко. Хотя, конечно, хотелось бы более вменяемого контроллера с открытым протоколом и, желательно, на I2C.


  1. pdkdrp
    24.08.2017 21:09

    будет ли этого достаточно для контроллеров колесомоторов
    для шестишагового режима хватит


  1. Dark_Purple
    24.08.2017 21:33

    накидал все на один лист, для удобства

    Спорное удобство.


  1. qwertyhp
    27.08.2017 00:25

    Какие гироскопы используете? Если на MPU-6050 (типа GY-521) — то как решили проблему оси «Z» (которая вертикальная)?
    Вопрос «мелкий и корыстный» — я делаю проект с GY-521, с осями X и Y разобрался, да и примеров в Сети много, в т.ч. с использованием Фильтра Калмана — но вот с осью Z (случай поворота, разворота устройства) ничего не выходит.
    Может, кто-то поможет с/поделится кодом, если есть?


    1. vasimv Автор
      27.08.2017 01:21

      GY-80 используется (наследие ардумовера), но планируется в SDK добавить поддержку и других. Ориентация вокруг вертикальной оси определяется по компасу (с поправкой на наклон, полученный от акселерометра), немного геморройно (нужно компас часто калибровать и проблемы с намагничиванием железных деталей), но ничего более простого не придумывается.


      1. qwertyhp
        27.08.2017 03:07

        Надежда рухнула… :(
        :)


        1. vasimv Автор
          27.08.2017 03:45

          Ну, думаю, вполне возможно по данным акселерометра и гироскопа считать поворот от стартовой позиции с достаточной точностью, если принять меры по гашению вибраций и фильтрации. Я просто этим не занимался совсем, времени лезть в эти дебри нет.