Робот из пылесоса

Проект придумывался для совместной работы с моими детьми: Николаем (12 лет) и Алексеем (8 лет). В попытке заинтересовать детей чем-то развивающим, купил для экспериментов платы Стрела (Arduino Leonardo) и RaspberryPi B+.

После некоторых мучений Стрелу удалось подружить с детской средой разработки Scratch. (Мучения заключались в модификации протокола связи в Scratch 1.4 (сделан на Squeak Smalltalk). На стороне Arduino просто С, так что всё намного проще.)

Мы сделали пару интересных проектов, например, радар из сервопривода и ультразвукового датчика расстояния. С младшим мы написали программу на Скретче для вращения сенсора в секторе 180 градусов, со старшим получали по сети на его компьютере данные о расстоянии до препятствия и текущий угол. Затем рисовали на круговой диаграмме. Делали на PascalABC.NET, они его в школе используют.

Scratch

Но, конечно, всё это стало не интересно когда дети увидели в Интернете многочисленных подвижных роботов на базе Arduino.

Пока я придумывал как-бы к этому подступиться без особых капитальных затрат, у нас сгорел пылесос 🙂 Ну, я его разобрал, там внутри какая-то ерунда (с). Накрылся двигатель, из которого он вообщем-то и состоит. После демонтажа двигателя остался отличный, переживший годы жестокой эксплуатации корпус, с двумя колёсами сзади и одним поворотным роликом впереди. Так мы получили платформу для нашего прототипа. И вот что вышло:

Robot

Управление

Я использовал обе платы. Стрела отвечает за базовые функции “реального времени”. Синхронное управление двигателями, реакция на датчики.

Raspberry отвечает за функции “высокого уровня”. Подключение по Wi-Fi в домашнюю сеть, сервер “Remote Sensors Protocol” для интеграции со Scratch по TCP/IP, небольшой WWW сервер для альтернативного канала управления, видео сервер. Между собой платы общаются по последовательному порту USB, с помощью простенького самодельного текстового протокола. Для Raspberry всё написано на Python’е, ну кроме видео сервера, он готовый.

Платформа

Все печатные платы прикручены к общей панели. Под ней расположена свинцовая аккумуляторная батарея на 12В от ИБП, и два серво мотора постоянного вращения.

_DSC0004 (Small)

Моторы закреплены с помощью изогнутых деталей от детского конструктора (вот где пригодился бы 3D принтер!). Вращение на колёса передаётся через пластиковые “звёздочки”, которые шли в комплекте с мотором. Для них в колёсах пылесоса были сделаны пропилы. Серво двигатели были выбраны из-за большого крутящего момента, тогда как большая скорость не нужна, диаметра колёс достаточно большой.

_DSC0005 (Small)

Питание

Напряжение от 12В батареи подаётся параллельно на три устройства. На плату Стрела, которая имеет собственный стабилизатор напряжения. На DC-DC конвертер для преобразования в 5В для питания Raspberry. И на DC-DC конвертер в 7В для подачи на двигатели. В принципе, двигатели и Raspberry можно было запитать от одного конвертера, но я опасался просадки напряжения при старте или из-за блокировки двигателей и, как следствие, перезагрузки Raspberry. Получилась схема, устойчивая к падению напряжения на батарее до 7В.

Кнопка включения питания взята от самого пылесоса. Замечательная вещь, проработала много лет, коммутируя килловатную нагрузку, и хоть бы что.

_DSC0003 (Small)

Дополнительные сенсоры

Стрела имеет множество цифровых и аналоговых вводов/выводов, а также четыре кнопки и четыре светодиода на борту. Так что потенциал для развития большой. Пока я только подключил ультразвуковой датчик к аналоговому входу. Он позволяет роботу останавливаться перед препятствием, не врезаясь в него.

_DSC0002 (Small)

RaspberryPi B+ имеет четыре порта USB. Кроме Стрелы и Wi-Fi адаптера, я подключил веб камеру и мышку.

Камеру использует стандартный пакет motion, благодаря нему изображение с камеры можно посмотреть в обыкновенном броузере с любого компьютера в квартире. К сожалению, присутствует приличная задержка и Raspberry этот сервис грузит примерно на 25%. Но всё равно дистанционно управлять роботом получая с него картинку реально круто 🙂

Мышка стала попыткой создать датчик движения. Оказалось что в Python’е достаточно просто считывать координаты с USB мышки, вращение колёсика и нажатия кнопок. План был составлять карту передвижений робота и рисовать её на удалённом компьютере.

_DSC0006 (Small)

К сожалению, не могу сказать, что ни одна мышь не пострадала в этом опыте. Но надпись Microsoft на мышке существенно облегчила мои моральные страдания при сверлении дырки и отламывании кнопок 🙂

В принципе идея работает, но обнаружились две проблемы:

  • для корректной работы сенсора мыши нужно, чтобы он был близко к поверхности. Перефокусировать сенсор на большее расстояние не вышло. Под рукой у меня нашлась всего пара линз, и они не подошли. В качестве временного решения я собрал узел для подвижного крепления мыши. Он позволяет мыши скользить по полу и подниматься вверх. Так что робот может наезжать на небольшие препятствия типа ковра или порожка.
  • для полного определения положения робота на плоскости нужно знать две точки (=мышки). С помощью одной, даже расположенной впереди, не получается точно построить траекторию. При повороте колёса пробуксовывают, и нельзя точно определить точку вокруг которой поворачивает корпус даже на ровном месте. Ну и геометрия тут уже получается сложновата для 6-го класса.

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.