02 мая 2013

Тележка телеприсутствия из подручных материалов


Началось всё с того, что однажды в новостях я увидел робота телеприсутствия от фирмы AnyBot (слева на картинке). Это был уже их второй робот, стоимость которого им удалось снизить аж в два раза, с 30 до 15 килодолларов. Эта сумма мне показалось несколько великоватой для «вебкамеры на колёсиках». Хотя я тут несколько лукавлю, у этого бота весьма неплохая основная камера с большим разрешением и оптическим зумом, плюс дополнительная «навигационная камера», всенаправленный и узконаправленный микрофоны и прочие прелести профессиональных устройств. Но, тем не менее, за те же деньги можно купить новенький автомобиль. Посему, из сугубо спортивного интереса, было решено сделать простейшее устройство телеприсутствия из подручных средств и с минимальными затратами. «Под руками» оказались папин ноутбук Toshiba Satellite с мёртвым аккумулятором и живым LPT портом, моторредуктор стеклоподъёмника его же Нивы и еще разная мелочёвка.
Что из этого получилось, можно узнать под катом.

Ноутбук:

Моторредуктор:



Механическая часть

Сначала необходимо решить проблему питания ноутбука. Для этого придётся взять на борт UPS с дополнительным аккумулятором, чтобы хватило дольше. Заодно, помимо 220В для ноутбука, отводим 12 вольт на питание двигателей. Таким образом, габариты тележки определяются размерами Тошибы и Иппона.



Колёсную схему выбираем самую простую: два основных колеса с раздельным приводом, плюс пара свободно вращающихся мебельных колёсиков. Для этого надо докупить второй моторредуктор с противоположной двери. С ведущими колёсами экспериментировать я не стал, купил «классику» отечественного роботостроения — китайские PR-1400. Они довольно удобны и уже идут с подшипниками.



Способы соединения двигателя с колесом каждый изобретает свои, но идею можно использовать и готовую, например «Техновижена». Там же можно и купить этот узел в сборе. Но мне этот вариант не подходит, так как один узел стоит больше чем весь бюджет тележки. Так что сделаем сами. Основная деталь узла легко варится из обрезков строительного уголка и 1/2 дюймовой водопроводной трубы, доработанной напильником до нужного диаметра. Конечно, лучше использовать токарный станок или найти более подходящую трубу, но я ни того ни другого по-близости не нашёл. В качестве приводного вала очень удобно использовать удлинитель головок торцевых ключей. Поводок на колёса сгибается из подходящей металлической пластины. В моём случае ей оказался разогнутый уголок для крепления полок. К сожалению, металл поводка оказался мягковатым и из-за него быстро образовался люфт, в то время как удлинитель головок сидел на подточенном валу двигателя как влитой.



Саму тележку собираем из алюминиевого уголка и квадрата 25мм и куска оцинковки на дно. Колёсные узлы прикручиваем к нижней раме, где они очень компактно размещаются.

Тележка в сборе:



Установленный колёсный узел:



Вот и вся основная механика готова, теперь приступим к голове. Можно, конечно, ограничиться вебкамерой, особенно если найти камеру с управлением наклоном как Logitech Quickcam Orbit AF Web camera, или воспользоваться охранной камерой с модулем видео захвата. Но ни на то ни на другое я не решился потратиться, поскольку некая безымянная камера у меня уже была, так что ей и воспользуемся. Один из недостатков обычных вебкамер с точки зрения навигации — слишком маленький угол обзора, который можно расширить специальными насадками, продающимися в интернет-магазинах. Я поступил проще — разрезал дверной глазок, вытащил из него рассеивающую линзу и приклеил к объективу камеры. Так же для навигации желательно иметь возможность опускать камеру и глядеть «под ноги». Итак, голову собираем из остатков уголка и оцинковки на шарнире из болта. Прикрепляем камеру и лазерную указку в качестве указательного пальца. Для привода наклона головы можно использовать сервомашинку для радиомоделей или любой двигатель с редуктором. В том же гараже я нашёл разбитое зеркало с электронным управлением наклона от «нашей» Шеви Нивы (кстати, оказывается, модуль привода зеркала изготовлен в США, а сам двигатель в Китае, вот такое почти кругосветное путешествие он совершил, прежде чем добрался до нашей тележки). Скорость выходного вала редуктора у этого двигателя очень низкая, примерно 1 оборот за 4 секунды, что очень удобно. Соединяем вал шарнирно с основанием «шеи» и привод наклона готов. Хотя для ограничения его перемещения стоит добавить концевые выключатели с параллельными диодами, что я и сделал. Таким образом, при подаче напряжения двигатель опускает «голову», доходит до концевого выключателя, останавливается. Чтобы поднять голову — надо поменять полярность. Крышку для головы делаем из папье-маше, хотя кто дружит со стеклопластиком или еще какими материалами, могут воспользоваться и ими.



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



На этом «железные» работы окончены, хотя для скрытия внутренностей я еще вставил между верхним и нижним ярусом куски пластиковых панелей.

Электронная часть

Теперь нужно соединить компьютер с двигателями и лазерной указкой. Наличие LPT порта здорово облегчает задачу, поскольку можно обойтись без внешнего контроллера. Конечно, на современных нетбуках LPT порт днём с огнём не сыщешь, но на неттопах и тонких клиентах на нано- или мини- ITX они обычно есть. Итак, нам нужен драйвер для управления двигателями с помощью маленького тока и напряжения порта с возможностью реверса. Поскольку я абсолютный нуб в радиоэлектронике, то схему драйвера я выбрал самую простую, на переключающих реле для реверса и полевом N-канальном транзисторе для регулирования скорости.



Скорость будем регулировать широтно-импульсной модуляцией (ШИМ-ом) то есть быстро включать-выключать питание и, в зависимости от соотношения времени включенного и выключенного состояния, будет меняться и скорость. Основные двигатели у нас потребляют не более 10 ампер. Исходя из этого и подбираем компоненты. Реле желательно найти с двумя группами переключателей и оно должно быть рассчитано на наш ток, или можно взять пару автомобильых 5-и контактных реле. Полевой транзистор я использовал без дополнительного драйвера. Это проще в плане схемотехники, но накладывает некоторые ограничения. Во-первых, нужен транзистор с низким напряжением открытия, например серии IRL, во-вторых, маленький ток LPT порта не сможет быстро перезаряжать затвор (точнее паразитную ёмкость между затвором и каналом транзистора), а значит частота ШИМ-а не может быть большой. Это не критично, но шуметь двигатель будет больше, чем при использовании ультразвуковых частот. Транзистор в корпусе TO-220AB без радиатора рассеивает около 1 ватта. Соответственно сопротивление канала в открытом состоянии должно быть менее 0.01 ом. Это вторая важная характеристика транзистора. Диоды на схеме нужны для того, чтобы реактивный ток индуктивной нагрузки мог идти даже при закрытом транзисторе и не приводил к его пробою. Да и двигатель в этом случае будет вращаться без торможения при отключенном питании, что важно для ШИМ-а. Диоды тоже должны держать ток в 10 ампер. Я таких не нашёл и включил два по 6 ампер параллельно. Таким образом, получаем два бита управления каждым двигателем: один — включает питание, второй — реверс.

Двигатель наклона головы у нас потребляет на порядок меньший ток, так что можно воспользоваться готовой микросхемой драйвера L293D. Это четырёх-канальный драйвер двигателей со встроенными диодами защиты от индуктивной нагрузки и возможностью питания до 0.6 ампер на канал. Такой микросхемой можно управлять четырьмя коллекторными двигателями без реверса, двумя коллекторными двигателями с реверсом и одним четырёхполюсным шаговым двигателем. Поскольку у нас в голове только один двигатель, я объединил пары каналов, тем самым увеличив возможный ток нагрузки до 1.2 ампера. Теперь разберёмся с управлением. Фактически у нас получается три бита управления: один включает микросхему (enable), второй подаёт напряжение на один канал двигателя, третий — на второй канал. Для ШИМ-а документация рекомендует включать-выключать всю микросхему (точнее половину если не спаивать их как сделал я) вместо одного из каналов, так как в этом случае двигатель не будет активно тормозить. Но три бита управления мне кажутся излишними, так что сократим их до двух, так как у нас всего четыре комбинации. Для этого добавим еще одну микросхему — логическое «ИЛИ», на вход подаём состояние каналов, выход подключаем на вход разрешения (enable) драйвера. Таким образом, двумя битами покрываем все возможные состояния двигателя: 00 — свободное вращение (для ШИМ-а), 01 — вращение в одну сторону, 10 — вращение в обратную сторону, 11 — торможение.

Так как у нас на плате появились логические микросхемы, для их питания нам нужно 5 вольт. Самый простой способ сделать 5 вольт из 12 — использовать линейный стабилизатор (LM)7805 (или отечественный аналог — КР142ЕН5). Для большого потребления он не особо годится, но для двух микросхемок стандартной логики его более чем достаточно.



Осталось подключить лазерную указку. Моя указка питалась от 4.5 вольта и пары десятков миллиампер. То есть её можно подключить напрямую к выходу LPT порта. Но тут выяснилось, что конкретно у моего ноутбука на LPT порту логическая единица далеко не дотягивает до 5 вольт и указка почти не светит. Так что пришлось воспользоваться микросхемой «ИЛИ» ещё раз в качестве усилителя.

Ну вот, со схемой и компонентами разобрались, теперь осталось всё спаять и развести. Лазерный утюг дома я не нашёл, так что воспользовался макетной платой, что оказалось достаточно удобно. Сбоку на плате оставил место под Ардуино Нано, чтобы можно было легко мигрировать на платформу без LPT порта.



Итак, всё железо собрано, осталось привести его в движение.

Программная часть

С программной точки зрения есть несколько вариантов реализации. Можно написать отдельные клиент-сервер, веб-сервис или не изобретать велосипед и воспользоваться Скайпом. У него уже реализованы двусторонняя передача аудио-видео потоков, чат и дополнительный канал, который можно использовать для управления. Что мы и выберем.

Сервер

Задачи сервера: принимать звонки со Скайпа, получать команды управления и двигать тележку.
Сначала научим его управлять нашим ботом. На ноутбуке у меня Windows, так что писать будем под него. К сожалению, Windows XP не позволяет работать с портами напрямую, но на просторах интернета была найдена библиотека inpout32.dll, которая позволяет обойти это ограничение. Теперь у нас есть возможность управлять каждым битом порта непосредственно. Для отсчёта промежутков времени я использовал мультимедийный таймер (функция timeSetEvent), который позволяет устанавливать интервалы от 1 мс. В обработчике для каждого двигателя считаем количество включенных и выключенных тиков и переключаем выходной бит включения двигателя в зависимости от текущей скорости. Таким образом, получается что полевой транзистор находится в каждом состоянии не менее 1 мс, что более чем достаточно для перезарядки паразитной ёмкости. Правда ШИМ получается не совсем обычный, меняется не только скважность импульсов, но и частота, что слышно при работе двигателей. Так же программно ограничиваем ускорение, чтобы тележка не была слишком дёрганой. Оформляем программный интерфейс управления тележкой в виде отдельного объекта и можно переходить к Скайпу.
Скайп предоставляет достаточно простой интерфейс взаимодействия с внешними приложениями. В каждой операционной системе он свой, но в основе лежит общий асинхронный текстовый протокол. Серверная часть у нас будет действовать следующим образом: отвечает на входящий звонок, включает видео, принимает команды от позвонившего пользователя. Для передачи команд можно использовать чат Скайпа, как это сделано в проекте Sparky, но захламлять чат не очень хорошо. Тем более, что Скайп предоставляет возможность непосредственной связи между приложениями, используя application to application commands (AP2AP). Вариантов передачи данных тут два: первый — напоминает обычные TCP сокеты с установкой соединения и подтверждением получения, второй — дейтаграммы UDP, то есть просто отсылка сообщения без установки соединения и подтверждения. На всякий случай на серверной стороне я реализовал получение команд через все три протокола: чат, сокеты и дейтаграммы. Таким образом, можно управлять ботом без клиентского плагина, через чат. В качестве пассивной защиты от задержек и обрыва связи сделал принудительную остановку бота через 300 мс после получения последней команды. За это время он проедет не более 20см на максимальной скорости.

Клиент

Клиент достаточно пассивен. После запуска его можно сразу свернуть. Что он делает: подключается к Скайпу, ждёт инициации звонка, после звонка пытается установить с пользователем, которому звонят AP2AP соединение, если это удаётся, начинает отслеживать клавиатуру и мышь и посылать команды по установленному соединению. Управление захватывается в любом окне при нажатии Ctrl+Alt. Таким образом, можно управлять ботом непосредственно из окна видеочата.
Исходный код обеих программ можно сачать здесь.

Результаты

Бот в полный рост:





Все возможности одним списком:
управление через Скайп (клиент пока только для Windows, но через чат можно управлять хоть с телефона);
подключение к сети через WiFi;
2 степени свободы тележки (перемещение вперед-назад, поворот, в том числе на месте);
наклоняемая голова;
угол обзора ~80 градусов по горизонтали;
лазерная указка, совмещённая с центром изображения на камере;
изменяемая высота головы;
низкий центр тяжести (случайно опрокинуть тележку довольно сложно);

Затраты

Затраты сложно определить полностью, поскольку большая часть компонентов была найдена в «закромах родины». Но примерно оценить можно:
основные колёса (PR-1400): 2 * 465 = 930р;
двигатели от стеклоподъёмников (на деле я покупал лишь один): 2 * 550 = 1.100р;
конструкционные элементы (профиль, удлинители головок, мебельные колёсики, болты, гайки, шайбы, заклёпки): ~500р;
электронные компоненты (макетная плата, реле, транзисторы, диоды, микросхемы, разъёмы,...): ~500р.

Итого: ~3.000р.

К этому еще нужно добавить:
компьютер (планшетный компьютер, нетбук, неттоп, тонкий клиент, или самостоятельно изготовленный из Nano-, Mini- ITX...): 5.000~25.000р;
камеру, если не устраивает или отсутствует встроенная (веб-камера, аналоговая камера наблюдения + плата видеозахвата, IP камера): 200~30.000р;
аккумуляторы и зарядное устройство (UPS или по-отдельности, свинцовые или литиевые): 1.000~10.000р;
контроллер (в случае если нет LPT порта, или его не достаточно): ~1000р;
двигатель для наклона головы: 200~500р.

Таким образом, можно уложиться в 10.000р, используя самые дешёвые компоненты, и в 2.500$, используя одни из самых дорогих.

TODO

Понятно, что это самая базовая реализация робота телеприсутствия, по-этому я его по ходу статьи так и не называл. Что ему не хватает для полноценной работы? Попробуем перечислить:
более надёжные двигатели (моторедукторы стеклоподъёмников не рассчитаны на долгую работу);
ультразвуковой драйвер двигателей;
энкодеры для контроля скорости (двигатели работают немного по-разному, и прямую линию тележка не держит);
внешний контроллер для двигателей;
ультразвуковые, инфракрасные или лазерные сенсоры для предотвращения столкновения;
более качественный микрофон (лучше два — все направленный и узконаправленный);
более качественная камера (лучше две — рыбий глаз для навигации и обычная с оптическим зумом);
база для зарядки;
некоторая степень автономности для упрощения управления (обход препятствий, следование за целью, возврат на базу);
приличный корпус;

То есть, проще переделать всё с нуля.

Конечно, если всё это реализовать, стоимость, увеличится еще раза в 1.5-2 по отношению к самой высокой оценке из предыдущего раздела и достигнет 3.500~5.000$. Плюс работа, налоги, аренда помещения, разработка программной части. Так что, штучное изготовление качественных роботов телеприсутствия не такое уж и дешёвое удовольствие, как казалось по-началу, но для собственных нужд можно сделать очень не дорого.


+1

Комментарии 0

Регистрация в один клик!


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