Делаем модуль расширения для Raspberry Pi с Arduino на борту

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

628b32a0158d4de0928d53c53a2289e0.JPG

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


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

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

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

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

42f981dbb44b44d6bdd6570913629bfa.jpg

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

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

61c10eb02727415e9f9c63334553031a.jpg

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

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

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

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

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

62a1cf4b6c5e40b8a8ba1e52c2f211ae.jpg

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

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

0b2a99c625bc40e48aa2892c758b4a62.jpg

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

3ee7d5b9391142108c75e8051131211a.jpg

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

8e36521a217a45c39c658741419920af.jpg

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

9b3cf3547666454b993430df7443f1b9.jpg

Остальные ноги 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, где старшая платформа занимается обработкой видеосигнала и интерфейсом пользователя, а вторая выполняет свои рутинные робозадачи.

a1c00ee3fdcb40c08bc56e05b958d511.jpg

Сейчас на роботе стоит веб-камера с аппаратной поддержкой 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. Скоро опубликуем отдельную статью на эту тему.

Что дальше?

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

© Geektimes