Целью этого проекта было превратить массажер головы в автоматизированное устройство, которое бы само делало мне массаж. Изначальной задумкой было просто использовать линейный привод или один шаговый двигатель с резьбовой шпилькой для реализации движения вверх/вниз. Однако меня понесло, и я решил сделать так, чтобы устройство могло осуществлять движение во всех направлениях, для чего и была выбрана платформа Гью-Стюарта, обеспечивающая 6 степеней свободы.
- Не слишком ли это мудрено? Да!
- Оказалось ли это дорого? Да!
- Я ненормальный? Да!
Все программные и аппаратные файлы доступны на GitHub
Примечание редакции блога: статья была предложена к переводу лично ее автором, который
▍ Общий замысел
Основная идея в том, чтобы взять имеющуюся чесалку головы, которую легко можно купить за 10£ или даже меньше, и превратить ее в автоматическое устройство, способное свободно двигаться в любом направлении.
▍ Источники вдохновения и примеры
Ниже приведен краткий список ресурсов, которые в этом проекте оказались наиболее полезны.
▍ Заметки по инверсной кинематике
На фото ниже показаны заметки и схемы, которые я сделал, чтобы понять основные принципы использования обратной кинематики для управления различными типами роботизированных платформ. Эти платформы реализуются уже не один десяток лет и используются во многих отраслях (промышленные роботы, аэрокосмические симуляторы, аттракционы парков развлечений и т.д.). Я решил не задействовать линейные двигатели для создания платформы Стюарта, поскольку в миниатюрном виде таких не существует. Вместо этого я пошел более тернистым путем использования двигателей для преобразования вращательного движения в линейное.
▍ Выбор двигателей
Изучив первые два примера, я тоже решил использовать серводвигатели компании Robotis с возможности индивидуальной адресации — Dynamixel AX-12A. Эти двигатели можно соединить последовательно и управлять всеми ими с микроконтроллера через всего три провода (данные, питание и земля). Кроме того, существует целый ряд библиотек, существенно облегчавших налаживание этого процесса.
▍ Все через UART
Двигатели AX-12A работают через UART, но на время разработки мне нужно было оставить отладочный порт открытым. В качестве решения я купил простой UART-адаптер, чтобы соединить ПК со свободными выводами UART на Mega2560, оснащенном четырьмя последовательными портами.
Каждому двигателю можно программно присвоить уникальный ID. Затем, когда они будут соединены последовательно, можно будет взаимодействовать с любым, используя всего один вывод UART — TX. Передаваемые пакеты данных представляют собой относительно небольшие фреймы, поэтому при высокой скорости передачи задержка будет минимальной, даже если взаимодействовать со всеми 6 двигателями через одну последовательную линию.
▍ Базовый дизайн
Схему для всех 6 серводвигателей я нарисовал в программе MS Visio. После нескольких вариантов я остановился на размерах, показанных в приложенном фото, где каждый двигатель использует плечо длиной 32мм, которое на изображении не показано. Эта версия позволила добиться относительно компактного форм-фактора при достаточном пространстве для реализации широкого диапазона движений.
▍ Расчеты
Чтобы определить верные значения, подставляемые в прямую задачу кинематики, необходимо узнать углы для каждого положения серворычага, а также провести общие измерения. На этой стадии используются еще ориентировочные значения из MS Visio, реальные будут измеряться уже на собранном устройстве. Хотя пока этого достаточно для создания рабочей модели и симулятора.
▍ Симулятор
Вооружившись программными средствами Processing и взяв за основу проект Radames Ajna & Thiago Hersan, я смог сгенерировать рабочую симуляцию для всех движущихся деталей и соединений.
В приложении Processing я также добавил последовательное соединение между моделью и микроконтроллером. Это позволило использовать симуляцию для управления реальной платформой — когда модель в симуляции движется, платформа вторит ее движениям.
Наконец, я добавил функциональные кнопки, запускающие платформу в различных режимах.
▍ Проектирование серворычагов
На фото представлен базовый дизайн, сделанный во Fusion 360 на основе простых измерений посадочной площадки сервопривода. Несколько отверстий М3 сделаны для экономии материала, а также дают возможность опробовать различные положения фиксации стержня.
Можно довольно быстро напечатать несколько таких штуковин.
▍ Проектирование основания – из CAD в реальность
Разобравшись с расчетами и базовым макетом, я решил перейти к проектированию в CAD.
К счастью, для всех двигателей Dynamixel компания Robotis предоставила готовые 3D-модели, доступные здесь.
Оставалось лишь импортировать эти модели, воссоздать первичную основу из MS Visio во Fusion 360 и смонтировать каждый двигатель согласно рассчитанным углам максимально удачным образом.
Хорошо, что все двигатели AX-12A оснащены собственными монтажными пластинами (FP04-03), которые я просто прикрутил к основанию. Файлы для этих пластин находятся в открытом доступе, так что их можно без проблем напечатать.
▍ Углы на реальных деталях
Чтобы запрограммировать алгоритм правильными значениями на основе уже готовых деталей, сначала нужно было найти центральную точку основания платформы.
Сделать это несложно с помощью линейки и карандаша.
Следующий шаг был также прост — нужно было с помощью транспортира определить точные углы между центральной точкой основания и центральной точкой оси вращения рычага каждого двигателя.
Поскольку оборудование располагается вручную, а не машинным путем, углы не будут идеально совпадать с изначальными теоретическими значениями, так что это очень важный этап для обеспечения точного управления.
▍ Соединение основания с платформой
Я добавил в механизм шатунные подшипники, которые обеспечили надежное соединение между основанием и платформой, связанными металлическими стержнями. Подшипники также придают механизму гибкость, позволяя платформе двигаться свободно. В крайней точке стержень отклоняется внутрь примерно на 40°.
▍ Базовая верхняя платформа
Для начала тестирования уже рабочего устройства я собрал верхнюю платформу, к которой подсоединяются стержни – очень простая конструкция, которая позволила сэкономить материал и в диаметре оказалась на ~33% меньше, чем основание. На ней есть специальные выступы для крепления подшипников. Здесь также важно отметить углы между центром и каждой точкой соединения.
▍ Базовая Veroboard
Для должного управления всеми двигателями микроконтроллеру необходимо преобразовывать свой UART-сигнал в полудуплекс. Для реализации правильной TTL-коммуникации я использовал схему, предложенную Robotis, которая объединяет в себе буферный элемент, обладающий тремя состояниями выхода, и некоторые пассивные компоненты.
▍ Рабочий прототип!
На этом этапе я собрал все воедино и прогнал некоторые мной же придуманные тестовые режимы.
На видео видно, что управление происходит из окна Processing, где выполняется симуляция. Команды передаются на Mega2560, который управляет 6 серводвигателями, повторяя движения с экрана.
Точность соответствия движений не идеальная, но при этом они остаются очень плавными.
▍ Питание
На изображении ниже показан самый сложный сценарий, который необходимо учитывать. Речь идет о движении Vertical SHM (вертикальное простое гармоническое движение) при максимальной скорости. В таком режиме у платформы возникает максимальный импульс в верхнем положении, в связи с чем двигатели работают на полную мощность, меняя каждый раз направление. В итоге во время каждого такого цикла вращения сила тока превышает 4А при RMS около 1.2А.
Второе изображение показывает уже более реалистичное потребление тока в стандартном случае. Начальное движение шести стационарных двигателей достигает пика в районе 2А, после чего устанавливается в районе 1А, когда тестовый цикл Vertical SHM прогоняется на более низкой скорости. Здесь RMS составляет 800мА, что очень даже хорошо.
▍ Аккумулятор
Мне хотелось не просто добиться автономии от настольного блока питания, но и обеспечить портативность устройства – поэтому вместо его запитывания от розетки я решил использовать аккумулятор.
Выбор пал на литиевый Sunpadow 11.1В, 2250мАч. Он способен обеспечить пиковый ток для нормальных режимов использования и при этом достаточно компактен, чтобы уместиться в текущем корпусе платформы.
Примечание: при полном заряде 11.1В этот аккумулятор в действительности будет выдавать 12.6В, что превышает допустимый диапазон напряжения, установленный Robotis для двигателей AX-12A. Тем не менее при более углубленном анализе, похоже, что их максимальное напряжение даже ближе к 16В, как показывают некоторые регистры, поэтому я не стал заморачиваться добавлением регуляторов.
▍ Кастомные платы
Как обычно, начальный тест проводился на макетке, после чего для большей части процесса разработки и тестирования я использовал уже показанную Veroboard. Хотя в последствии мне потребовалась более чистая плата, чтобы снизить шум и получить возможность подключить аккумулятор. С этой целью я решил собрать собственный шилд для Mega2560. Спроектировал я его в KiCAD и заказал на JLCPCB 5 таких плат, которые обошлись всего в 2$ (не считая доставки из Китая в Англию). На них все было довольно стандартно, за исключением того, что изготавливались они на заказ и включали в себя площадку под преобразователь DC-DC, который я хотел использовать.
Начальные зарисовки
Схема
Макет
3D-модель
Голая плата
Плата в сборе
▍ Ошибки
Я понимал, что зазор между разъемами USB/питания Mega2560 и расположенным сверху шилдом будет очень небольшим, поскольку как-раз над ними разместил разъем для аккумулятора, разъем для подключения двигателей и выключатель. Однако я понадеялся, что длины штырей гребенки хватит, чтобы обеспечить достаточно места, вот только проверить это не удосужился! Упс… В итоге некоторые контакты даже касались внешней части USB, так что это нужно было исправлять.
Подключение шилда через проставку
В попытке решить возникшую проблему я снял разъем питания, что видно на фото, и уже собирался снять разъем USB (чтобы подключить его к плате проводом), но в итоге поленился и просто добавил между платами проставку из гребенок. Пока сойдет.
▍ Кронштейн и отсек под электронику
Теперь, когда все основные компоненты были готовы, можно было переходить к дальнейшей доработке основания, а именно созданию отсека под электронные компоненты и кронштейна для всего готового прототипа.
Для этого нужно было:
- надстроить над основанием отсек под аккумулятор и платы;
- собрать выдвижной кронштейн, который можно будет легко соединять с основанием, прикручивать к любой стене, и который окажется достаточно прочным для удержания веса всей конструкции.
Цельный подвес в F360 (3 отдельных детали)
Синие и желтые элементы я напечатал со стандартным заполнением 20%, а красный с кубическим типом заполнения 60%, обеспечившим сочетание прочности и гибкости.
▍ Подключение двигателей
Я напечатал шесть новых крепежных пластин (FP04-F3), используя тот же цветной филамент, что и для подвеса, и прикрутил их винтами M2.
Два больших отверстия я сделал просто ради экономии материала, а верхнее служит для прокладки кабеля подключения платы к Motor_1
Затем повторно установил все двигатели на это новое основание – также прикрутив их к пластинам с помощью винтов M2. На этом этапе все уже надежно закреплено, и конструкция может работать в развернутом наоборот положении, будучи зафиксированной на кронштейне.
▍ Подключение электроники
На фото ниже кронштейн прикручен к 3мм МДФ с задвинутым в него основанием. Все подключено и готово к финальному тестированию.
Поскольку сборка оставалась на моем рабочем столе, я решил не тратить время на зарядку аккумулятора и снова подключил ее к настольному БП. Mega2560 при этом я, как и ранее, подключил к ПК для отладки.
▍ Самая важная деталь
Для массажера я спроектировал другую простенькую платформу, на этот раз добавив перекладины для его удержания. В центральном цилиндре также сделано небольшое отверстие для фиксации массажера винтом.
Делать такие платформы очень легко, и печатаются они быстро. Это я к тому, что можно придумывать разные версии для установки разных насадок.
При этом они также достаточно легкие и тонкие, что позволяет фиксировать их зажимами, не прибегая к постоянному откручиванию и вкручиванию винтов при смене насадок.
▍ Готовый прототип!
Устройство надежно установлено в сборе с массажной платформой. В тестировании мне любезно помогла моя чудесная ассистентка Baldy Barbra. С ее помощью я смог разработать и проверить различные режимы, убедившись в их комфортности и безопасности. Некоторые из этих режимов показаны ниже в виде анимаций.
Также есть небольшой видеоролик:
USB-кабель во время тестов по-прежнему был подключен для отладки
▍ Стоимость
Большинство компонентов обошлись дешево, но только не серводвигатели. С момента их покупки цена успела подскочить еще почти на 50%. Хорошо, что я изначально планировал использовать эти двигатели и в других проектах. Если соберетесь покупать, то я все же посоветовал бы подождать, пока цена на них не опустится.
Компонент | Цена | Количество | Ссылка | Общая стоимость |
Серводвигатель Dynamixel AX-12A | £43.60 | 6 | Ссылка | £261.60 |
Комплект шатунных подшипников | £3.91 | 2 | Ссылка | £7.82 |
Комплект стержней-толкателей | £21.06 | 1 | Ссылка | £21.06 |
Заказные платы с JLCPCB | £2 | 1 | Ссылка | £2 |
Компоненты плат | £20 | 1 | Ссылка | £20 |
PLA нить | £5 | 1 | £5 | |
Mega2560 | £15 | 1 | Ссылка | £15 |
Массажер головы | £7.99 | 1 | Ссылка | £7.99 |
Итого: | £340.47 |
Готово!
▍ Возможные доработки
Если я однажды соберусь довести устройство до ревизии 2.0, то реализую в нем вот что:
- Уменьшу форм-фактор. Двигатели можно расположить намного теснее и снабдить их более короткими рычагами. Это немного сократит диапазон движений, но также уменьшит размер и вес устройства.
- Возьму более компактный микроконтроллер. Я бы, пожалуй, перешел с Mega2560 на ESP32. Преимущества такого решения: меньший размер, более быстрый процессор, наличие WiFi (или Bluetooth), больше памяти, ниже стоимость.
- Реализую все вычисления на микроконтроллере. В текущем проекте все вычисления я выполнял на ПК, Mega2560 в этом процессе не задействован. В случае апгрейда я бы полностью исключил участие ПК, перенеся все вычисления на микроконтроллер. Замысел в том, чтобы также запустить на нем небольшой веб-сервер, который позволит управлять устройством с телефона, а не использовать UART.
- Использую другие двигатели. Последовательное подключение AX-12A оказалось очень хорошим решением и сэкономило уйму времени. Однако серводвигатели обычно довольно шумные, и AX-12A здесь не исключение. При этом они также дорогие и для конкретно этого проекта явно были перебором. В идеале я бы подыскал более дешевые альтернативы по цене более сложных HW & HW.
- Соберу полноценный корпус. Если использовать серводвигатели, то нужно приложить все усилия для уменьшения шума. Один из простых способов – придумать корпус, в котором разместятся двигатели, что также придаст устройству более аккуратный вид.
- Реализую подходящую схему питания. Схема, используемая на моих платах, реализована ленивым путем, и ей не помешает доработка, а именно добавление предохранителей и регуляторов.
- Добавлю функцию «поиск головы». Если рассматривать использование этого устройства в качестве стационарно закрепленного на стене, то ему будет впору функция определения правильного положения, исходя из роста человека. Реализовать это можно с помощью направляющих, шаговых двигателей и ультразвукового датчика.
- Протестирую девайс с другими прическами!
Примечание переводчика: статью для перевода предоставил сам ее автор, который нашел очень интересными комментарии к переводу предыдущей его публикации «Электромеханический 7-сегментный дисплей своими руками» и выразил свою признательность профессиональному сообществу Хабра.
▍ Acknoledgements
Thanks, David! We appreciate all the efforts you've put in these projects, and will be glad to follow your future publications. Your ideas are truly unique and interesting!
Мощные VPS на SSD со скидками до 53%. Панель ISPmanager в подарок*.
Автор: Дмитрий Брайт