У нас в хакспейсе есть много разных Raspberry Pi, с помощью которых мы учим детей программировать на python, делать роботов и разные полезные гаджеты. Разумеется, все то же самое делаем и на Arduino. За три года жизни душа в душу с этими крайне отличающимися платформами, у нас появилось несколько идей о том, как правильнее сделать учебного робота, учитывая плюсы и минусы каждой железки. Все эти мысли материализовались в новом устройство, о котором речь и пойдет далее.



По сути, мы спроектировали Arduino-совместимый модуль расширения для RPi, который содержит драйвер двигателя и стабилизатор питания. Понятно, что этот модуль является самодостаточным контроллером для учебного робота, но именно сэндвич RPi+Arduino демонстрирует идеологически правильный подход к созданию роботов. Как эта штука выглядит, какими характеристиками обладает, и где её можно применить читаем далее.


Немного истории

Уже прошло 4 года с момента выпуска в серию Raspberry Pi Model B. В свое время, именно шумиха вокруг RPi отчасти сподвигла нас на создание нашего хакспейса. Ведь первое, что мы начали делать — учить детей робототехнике на RPi. Уже после первых уроков со старшеклассниками на базе Уральской компьютерной школы имени Н.Н.Красовского, мы задумались о своей мастерской-лаборатории, открытой для всех страждущих.

Наши уроки сложились в базовый курс, который в последствии был адаптирован к Arduino. Продолжением этого курса должны были стать конкретные проекты, в которых ребята смогли бы применить полученные знания о работе микроконтроллеров и разных полезных компонентов. Целый класс таких учебных проектов мы посвятили созданию мобильных роботов, как на базе Raspberry Pi, так и на Arduino.

Первый наш робот на базе RPi был создан именно как пособие для работы со школьниками. Это был двухколесный робот, на котором ребята отрабатывали работу с двигателями и разного рода датчиками, попутно готовясь к соревнованиям. В качестве шасси использовался мотор-редуктор фирмы tamiya. Драйвером двигателей служил drv8833 от TI. В варианте для робота LineFollower стояло два самодельных датчика отражения. На верхней палубе робота была установлена беспаечная макетная плата на 400 точек.



Робот показал себя отлично, так что с течением времени платформа примеряла разный обвес. Кроме LineFollower-а, который мы кстати называем следопытом на наш лад, робот носил оптические датчики отражения, ультразвуковые дальномеры, рисовал фломастером на ватмане, наконец, управлялся через wifi, передавая изображение с веб-камеры.

Со временем пришло понимание того, что мотор-редуктор был выбран не самый популярный, да еще и очень шумный. Корпус робота не вмещал всех хотелок, и не был совместим с распространенными конструкторами. А самое главное, появилась идея сделать модуль расширения для RPi, который бы избавил робота от лишних «рутинных» коммуникаций и устройств. Так начался проект колесного робота под кодовым названием MR-K-1, а вслед за ним и MR-K-2. С самого начала мы стали предусматривать посадочные отверстия под обе платформы, и ниже представлена модель робота с Arduino на борту.



Это модификация для битвы, на которой школьники управляя роботом по bluetooth стремятся лопнуть воздушные шарики, закрепленные на вражеской машине. Раму увеличили, мотор-редуктор заменили на распространенный китайский двигатель желтого цвета (а иногда белого). Корпус адаптировали под конструктор multiplo, так что теперь он покрылся квадратными отверстиями. Всё это заняло несколько недель. А вот работа над модулем расширения немного затянулась. И проблема была не столько в сложности реализации, сколько в нехватки времени, усугубленной перфекционизмом :)

Модуль расширения RPiDuino

Главным разработчиком модуля стал Александр Васильев, ведущий крайне полезный блог alex-exe.ru. Ко времени старта проекта у него уже был огромный опыт в разработке драйверов двигателей, стабилизаторов питания, и многих других интересных для роботостроения устройств. Плату было решено назвать RPiDuino, ибо она должна была обеспечить симбиоз Raspberry Pi и Arduino.

Итак, что мы решили разместить на плате.

Модуль должен был взять на себя прямое управление драйвером двигателя, сервоприводами и датчиками. Все это предполагает наличие микроконтроллера. А поскольку мы делаем учебного робота и контроллер этот должен легко прошиваться нашими школьниками, то выбор пал на всем известную atmega328 с arduino-загрузчиком на борту. Наличие atmega делает модуль самодостаточным контроллером для управления небольшими учебными роботами.



Раз на плате появилась атмега, понадобился и USB-UART мост, в качестве которого мы поставили CP2102. Еще одним признаком Arduino-совместимости стали привычные разъемы по бокам платы, позволяющие насаживать сверху модули расширения.

Модуль должен управлять двигателям, поэтому появился соответствующий драйвер. Современные драйверы стали совершенно микроскопических размеров, так что их можно легко уместить на плате без особого ущерба соседним компонентам. Выбрали DRV8833 от Pololu, так как с ними уже был какой-никакой опыт. Драйвер двухканальный, с рабочим током канала — 1А.



Наконец, на плате был просто необходим стабилизатор напряжения. Изначально предполагалось сделать раздельное питание для вычислительной части и для сервоприводов, но мы испытали небольшие проблемы с компоновкой. Так что остался только один стабилизатор LM2596, который питает RPi, микроконтроллер, логическую часть драйвера двигателей и датчики.



Также свое место на плате нашла кнопка коммутации питания и зуммер, с помощью последнего робот жалуется на свои проблемы.



RPiDuino вставляется а GPIO разъем Raspberry Pi, как и все подобные ему модули. Связь atmega328 и RPi осуществляется через UART.



Остальные ноги GPIO выведены насквозь, так что их можно использовать на свое усмотрение.

Таблица ключевых характеристик RPiDuino

Питание
Напряжение питания 7.5-24В (без драйвера двигателей)
7.5-10.5В (с драйвером двигателей)
Входной ток От 0,5 до 4А, зависти от нагрузки, напряжения питания, драйвера двигателей
Стабилизатор напряжения
Выходной напряжение
Выходной ток: рабочий/максимальный/пиковый 1.5А/2А/3А
Пульсации выходного напряжения 1%
Разъём питания 5.5х2.1мм и клеммник
Драйвер двигателя
Напряжение питания 2,7-10,5В
Ток на канал рабочий/пиковый 1А/2А
Частота ШИМ 50кГц
Габариты
Размеры 85х56х22мм
85х56х33мм (с разъёмом для RaspberryPi)
Вес 49г


Телеуправляемый робот на основе RPi+RPiDuino

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



Сейчас на роботе стоит веб-камера с аппаратной поддержкой mjpg сжатия, соединенная с Raspberry по USB. Робот цепляется к WiFi посредством USB-роутера TL-WN722N. Двигатели стоят усиленные, с отношением 1:120. Колеса большие с мягкой резиной, чтобы цепляться за линолеум у нас в хакспейсе. Энкодеры на двигателях помогают нивелировать разброс в тяге двигателей. Питается все это от двух LiIon аккумулятором типоразмера 18650.

Как все это работает

На RPiDuino крутится программа, которая слушает из UART-а команды на движение и отправляет обратно кое-какую телеметрию. В своих проектах я использую библиотеку SerialFlow, написанную еще для моего первого квадрокоптера. Код программы для RPiDuino также можно найти на github.

На стороне Raspberry Pi все устроено несколько сложнее. Во-первых, управление роботом осуществляется через web-интерфейс, так что пришлось поднять небольшой web-сервер на python. Экран управления имеет стрелки для задания направления движения, регулятор скорости, телеметрию, и окно для отображения потока с веб-камеры. Для трансляции видео я традиционно использую mjpg-streamer.

Если захочется повторить нечто подобное на своем роботе, алгоритм установки будет следующим.
1) Устанавливаем mjpg-streamer, и настраиваем передачу видеопотока в http.
2) Устанавливаем пакет pyserial.
3) Качаем и распаковываем архив с серверной частью управляющей программы.
4) Заливаем на RPIDuino скетч управления.
5) Настраиваем wifi на RPi.
6) Настраиваем автозапуск управляющей программы на RPi.



RPiDuino и ROS

Еще одна причина, по которой нам стал нужен этот модуль расширения — это возможность показать нашим ученикам правильную концепцию роботов. Сейчас это звучит примерно так: «Смотрите, ребята, у робота есть главный компьютер, который управляет сложными вычислениями. Он может распознавать изображения, строить карту с помощью лидара и SLAM. Все это отнимает у него много ресурсов, так что он больше не может чутко управлять колесами наземного робота, и не дай бог, стабилизацией квадрокоптера в полете. Для этих операций на уровне спинного мозга имеется другой компьютер, специализирующийся на конкретных простых задачах и не отвлекающийся ни на что другое. Эти два вычислителя связаны шиной данных, по которой они общаются друг с другом и прочими модулями.»

Тут-то и выплывает понятие ROS. В данном случае ядро системы крутится на RPi, а RPiDuino — есть узел ROS. Мы, кстати, уже сделали небольшой пакет для управления RPIDuino через ROS. Скоро опубликуем отдельную статью на эту тему.

Что дальше?

Бета версия модуля показала себя достойно. Сейчас небольшое количество плат можно добыть в нашем хакспейсе, пишите в личку кому интересно. Мы же планируем создать следующую версию, с новыми драйверами двигателей, с дополнительной индикацией и еще какими-нибудь плюшками. Исходники платы будут непременно опубликованы. Будем рады любой критике и участию!
Поделиться с друзьями
-->

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


  1. t2n
    16.06.2016 13:37

    Хороший проект. Есть несколько вопросов:
    Планируется ли добавить поддержку Raspberry Pi Model b+ и выше, ведь вычислительные ресурсы лишними не бывают да и внешний вид / размеры сейчас практически одинаковые у этих плат.
    Есть ли возможность с этим бутербродом использовать разъем камеры на самой плате, это позволило бы разгрузить usb.
    И кстати разработчик DRV8833 это Texas Instruments, а Pololu лишь производит модули с этим драйвером.


    1. Vertebral
      16.06.2016 13:37
      +2

      Спасибо! Поправил про pololu.

      Насчет Rpi разных версий, то модуль и в текущем виде на них нормально цепляется. Немного смещается вдоль оси x, но не критично. В следующей версии будем уже конечно под Rpi 2,3 делать.

      Слот камеры сверху действительно визуально прикрыт, но шлейф можно пустить как угодно сбоку, благо он тонкий.


  1. al_sh
    16.06.2016 13:40
    +1

    Родная малинокамера позволит Вам значительно экономить ресурсы CPU.


    1. Vertebral
      16.06.2016 13:42

      Согласен на все 100%. Но это был только пример, к тому же вебки есть у всех, а Rpi камера далеко нет.


      1. r00tGER
        16.06.2016 14:41

        Многие «наигрались» малинами, переодически попадаются продающиеся БУ камеры за символическую цену.


        1. al_sh
          16.06.2016 16:21

          Новая малинркамера стоит дешевле аналогичной вебки. Буквально на днях покупал и ту и другую, для домашнего видеонаблюдения.


  1. katangawise
    16.06.2016 22:49

    Хорошая идея!
    Есть вопрос: я вижу, что пины Ардуины идут сразу на пины Малинки… Но пины Распберри работают с напряжением 3.3Вольта, а Ардуины 5Вольт. Никаких логических преоброзователей я не увидел… Если Ардуино даст еденицу на пин Распберри, Малинка не погибнет?


    1. Vertebral
      16.06.2016 22:53
      +1

      Ардуина соединяется с RPi только по UART. По напряжению стоит преобразование на транзисторах, так что все ок!


      1. Costic
        17.06.2016 14:52

        Мне очень нравится ваш проект и увидев картинку сразу захотелось купить. Однако прочитав статью понял, что не хватает тут некоторых важных вещей. 1) Необходимо соединить интерфейсы SPI и I2C (учитывая 5V Arduino и 3.3V RPi). UART это минимум. 2) 13 вывод Arduino обычно под светодиод выведен, и много скетчей на это рассчитывают. Наверное надо повесить зуммер на другой вывод. А ещё лучше чтобы это был пассивный динамик с возможностью использования tone(). 3) Цветные гребёнки — можно уменьшить в 2 раза — место для логического преобразователя появится. Все (почти) выводы RPi согласовать с Arduino.
        Цену бы до 1000р. :-)


  1. Alex_EXE
    18.06.2016 19:45
    +1

    Плата и так вышла солянкой. Дополнительное накручивание функционала будет требовать дополнительных компонентов и точек пайки, а следовательно будет подниматься цена.
    Пищалку можно отключить, 13 вывод освободиться, куда можно будет подключить светодиод. К сожалению, про светодиод, во время разработки забыли.
    Цветные гребенки предназначены для подключения готовых модулей датчиков (к примеру ИК дальномеры, датчики линии) и актуаторов (сервомашинок), такие модули часто имеют 3-х проводной интерфейс с распиновкой GND, VDD, DATA или VDD, GND, DATA. Для удобства большая часть выводов ардуины выведена на подобные гребенки.
    Это первая опытная партия с ограниченным тиражом, при увеличении производства цена будет снижаться.

    Так же будем рады и другим пожеланиям и советам.


    1. Costic
      20.06.2016 14:52

      Желаю вам выйти со своим товаром на AliExpress! (с конкурентной ценой). Я закажу :-)