Робот для сборки кубика Рубика

В этой статье я хочу рассказать о любопытном DIY проекте, что я недавно реализовал. И, заодно, эта статья послужит неплохим продолжением темы «3D печати для чайников», а именно вопроса «что бы такого мне еще распечатать» 😉 К сожалению, я не могу «похвастать» тем, что это моя оригинальная разработка; вся честь принадлежит прекрасному инженеру из Германии Фолькеру Хоххольцеру (вот ссылка на страницу проекта). Должен сказать, что Фолькер не только хороший инженер, но еще и очень отзывчивый человек, лёгкий на контакт и помощь – мне он помогал очень оперативно, за что ему еще раз большое спасибо!

Но, тем не менее, это не «перевод», а реальный, лично мною завершенный проект. Сложность данного DIY проекта я бы оценил как «среднюю» (medium) – не rocket science, но есть определенные нюансы. Эта статья рассчитана на более-менее подготовленного DIY читателя, имеющего минимальные навыки 3D печати, работы с электроникой вообще, и Raspberry Pi в частности. Если вы не знаете, как подключить push button к RPi (и не можете «прогуглить» это за минуту), то, вероятно, вам нужно заняться более простыми проектами.

Робот, разработанный Фолькером, отнюдь не рекордный (впрочем, создание рекордных роботов – задача весьма нетривиальная и довольно дорогостоящая). «Плюсы» этого проекта состоят в его простоте и дешевизне (ниже я приведу свой реальный BOM), а также в полной открытости исходного кода.

Вдобавок, «вдумчивая» работа робота по сборке кубика производит бо́льшее впечатление на неискушенных зрителей, нежели, чем видео скоростной сборки за 0.8 секунды (текущий официальный рекорд). Как писал когда-то гениальный Артур Кларк, «любая достаточно развитая технология неотличима от магии» 😉

3D печать этого проекта не требует каких-то особых комментариев: печатать можно практически любым пластиком (я печатал PLA) при infill 20%, но вот «шестерни» и «лапки-держалки» (детали xxx_gear_left_xxx, xxx_gear_right_xx, xxx_gripper_arm_left_xxx, xxx_gripper_arm_right_xxx) желательно печатать попрочнее, с infill 50-60%. Все детали печатаются без поддержки (там, где она требуется, Фолькер добавил поддержку прямо в модели), притом печатать можно достаточно быстро – я печатал на скорости 75 мм/сек, и все достаточно неплохо и быстро распечаталось.

В качестве «бортового компьютера» я использовал недавно вышедший Raspberry Pi Zero 2 W, купленный по случаю в Microcenter за $10, но, в принципе, практически любой RPi подойдет, даже самый медленный, первый RPi Zero (даже без буквы W: на время отладки можно подключить к нему Wi-Fi dongle, для SSH, а потом убрать, так как роботу интернет для работы не требуется, равно, как и высокая производительность).

А вот мой “bill of materials” (все детали, за исключением RPi и камеры, покупались на Amazon):

Суммарно все обошлось примерно в $75; думаю, что возможно собрать и дешевле (мне пришлось покупать набор M3 болтов и гаек, блок питания, сервомоторы). Еще потребуется три микропереключателя (push button или micro switch) для кнопок, и, желательно, прямоугольная полоска «монтажки», чтобы припаять кнопки и прикрепить дисплей (у меня все уже было «в хозяйстве»). Ну, и, естественно, нужны провода, паяльные принадлежности и «прямые» (хотя бы относительно) руки 😉

По использованию hardware есть несколько «хитростей». 30 сантиметровый кабель для RPi Zero будет работать (впритык), но более короткий – однозначно нет. Если используется любой другой тип RPi, то однозначно лучше брать 50 см кабель (для RPi Zero кабелей, длиннее 30 см, почему-то не делают). Power supply можно использовать и менее мощный (а можно так и вообще запускать на батарейках), поскольку сервомоторы работают последовательно, поэтому, думаю, даже 10 ватт за глаза хватит (хотя Фолькер использовал 50 ваттный блок в оригинальном проекте). Драйвер PCA8695 нужно использовать только для управляющих сигналов (хотя, впрочем, можно обойтись PWM-мом прямо с RPi). Да, на плате PCA8695 предусмотрено подключение внешнего питания, но… При малейшем «залипании» сервомотора (а вероятность этого в процессе отладки не исключена) плата попросту… выгорает. По совету Фолькера (он тоже, как и я, «спалил» одну платку в процессе отладки), я завел питание на сервомоторы напрямую, а от PCA8695 использовал лишь управляющие PWM сигналы. Дисплей можно использовать любой, лишь бы был совместим по размеру и I2C интерфейсу (подправить код, если что, весьма просто). Сервомоторы я брал самые дешевые; код Фолькера поддерживает, однако, не только 180° моторы, но и 270° — с ними получится небольшое убыстрение сборки.

Сама «электро-механическая» сборка достаточно проста: все детали идеально подходят друг к другу, и прекрасно стягиваются M3 болтами и гайками. Также я использовал термоклей и двухсторонний монтажный скотч, для закрепления плат внутри базы. При сборке «клешней» обратите внимание на правильное положение, длинной стороной зажима вверх. Еще можно (а, скорее, даже нужно) наклеить на внутренние поверхности «держателей» губчатую резину или какой-то эластичный материал. Я использовал небольшие кусочки от ленты-утеплителя для дверей. Небольшой совет по сборке: чтобы надежно зафиксировать гайку в пластике, достаточно, установив ее в нужном месте, приложить к ней разогретый паяльник на несколько секунд. Гайка «вплавится» в пластик, и надежно зафиксируется. Главное, не переборщите с нагревом 😉

Драйвер PCA8695 подключается через интерфейс I2C (SDA и SCL, контакты RPi 3 и 5), питание 3.3V берем от контакта 1, а землю, GND от контакта 9 RPi, кнопки подключаем к контактам 11, 13 и 15. Дисплей, тоже работающий через I2C, подключаем через соответствующие «сквозные» пины платы PCA8695. Управляющие сигналы сервомоторов берем от драйвера  PCA8695, а питание и землю заводим отдельно, прямо от блока питания (я для этого распаял крохотную платку-“макетку” с пинами). Однако, собрав корпус со всей электроникой, не торопитесь наживлять «клешни» на шестерни сервомоторов, с этим чуть погодите.

Теперь коснемся программного обеспечения: сначала я установил последнюю версию Raspberry Pi OS, так называемую версию “Bullseye”, но оказалось, что «стандартная» (правда, дешевая китайская реплика) камера RPi с ней не работает – в этой версии разработчики сменили программный стек камеры на стандартный Linux-овый, но с ним есть проблемы, которые мне решить, к сожалению, не удалось. Впрочем, я решил эту проблему, просто установив предыдущий релиз Raspberry Pi OS, т.н. “Buster”, в котором камера работает, как говорится, «искаропки». Естественно, необходимо включить поддержку камеры через команду sudo raspi-config, равно, как и поддержку протокола I2C (используемого для дисплея и серво-драйвера PCA8695), а также протокола удаленного доступа SSH – несмотря на полную автономность робота (и независимость от интернет), удаленный доступ вам пригодится при отладке.

Далее клонируем код из GitHub репозитория и устанавливаем зависимости для Python программы (для Python 3 – а у меня установлена сейчас версия 3.7.3 – используем команду pip3):

git clone https://github.com/DrVoHo/Rubik_solver.git
wget https://www.dafont.com/vcr-osd-mono.font
pip3 install luma.oled
pip3 install Adafruit_PCA9685
pip3 install kociemba
cd Rubik_solver

(возможно, потребуется что-то еще — сейчас просто трудно проверить – но устанавливается все тем же самым путем).

Теперь все готово к запуску программы робота; чтобы каждый раз не набирать длинную команду, можно создать крохотный скрипт для запуска:

#!/bin/sh -e
python3 rubik_robot_en_PCA9685.py

Если все подключено правильно, скрипт запустится, сервомоторы встанут в «домашнее» положение, и вы увидите на дисплее надпись “Start” (впрочем, дисплей можно протестировать и отдельно, через примеры пакета luma). Вот сейчас настало время второго этапа механической сборки: теперь можно плотно насадить «зажимы» «клешней» на сервомоторы, таким образом, чтобы внутренние «упоры» находились рядом (см. на фото), но не обязательно, чтобы они касались друг друга.

Также можно насадить одну «клешню» на мотор поворота. А сейчас пришло время заглянуть в код Python программы Фолькера. Не хочу обсуждать стиль программирования (он вовсе не профессиональный программист, к слову), ясность и структурированность его кода; но у этого кода есть одно огромнейшее достоинство – он работает 😊 И этого вполне достаточно!

Сначала обращаем внимание на строку 66:

C180 = 1   # 1 = 180° Drehbewegung (mind. 270 ° Servo); else = 90° (standard)

Для моторов, выбранных мной, значение должно быть равно 0. Теперь смотрим на строку 70: TURN_MAX = 270 . Я установил значение 180 (но вы, понятно, должны использовать значения для ваших моторов).

Теперь обратим внимание на строки 78-92, для себя я изменил их таким образом:

TURN_MAX_left_grip = 180 + C180*90
SERVO_PWM_left_grip = 2  # difference of servotiming in ms
SERVO_OFFSET_left_grip = 1 # lower servo position in ms TURN_MAX_left_turn = 180 + C180*90
SERVO_PWM_left_turn = 1.7 SERVO_OFFSET_left_turn = 1 TURN_MAX_right_grip = 180 + C180*90
SERVO_PWM_right_grip = 2   SERVO_OFFSET_right_grip = 1 TURN_MAX_right_turn = 180 + C180*90
SERVO_PWM_right_turn = 1.7   SERVO_OFFSET_right_turn = 0

Обратите внимание на значения констант SERVO_PWM_left_turn и SERVO_PWM_right_turn. Фолькер рекомендовал использовать значение 2, но для меня сработало 1.7. Эти константы используются для расчета тайминга PWM, поэтому могут различаться для сервомоторов разных производителей.

К сожалению, в коде Фолькера не предусмотрена процедура отладки, поэтому ваши значения придется проверять «в бою», а именно, запустив работу выбором «Start». На начальном этапе робот сканирует кубик Рубика, делая снимки всех 6 поверхностей. Меняя константу, вы должны добиться поворота «клешни» ровно на 90 градусов (ну, или с небольшой погрешностью). Для этого я и советую вам сначала прикрепить лишь одну «клешню», чтобы не зацепиться в процессе отладки за вторую 😊

После того, как вы определились с константами, и ваши сервомоторы работают, как должно, можно закончить сборку, надежно закрепив «клешни» на сервомоторах (как показано на картинке выше). Теперь, запустив программу, можно перейти к более тонкой настройке. Для этого жмем нашу кнопку (на фронтальной панели робота) «Вверх» и попадаем в «Setup» по нажатию «Enter». Программа сразу переходит в настройку силы захвата левой «клешни» – регулируем, чтобы кубик надежно удерживался; далее следует настройка поворота (выставляем ровно по горизонтали, как на картинке), то же самое для правой «клешни», настройка расстояния для загрузки, скорость работы etc. -–там все достаточно интуитивно, и безопасно «на поиграться».

Теперь, когда вся электромеханика настроена, можно попробовать собрать кубик Рубика, нажав «Start», но… тут есть вероятность получить ошибку «Scan error». К счастью, это можно достаточно просто «пофиксить». Алгоритм определения цветов, который использовал Фолькер, достаточно прост, но весьма эффективен. Но этот алгоритм «не любит» блики, а также очень яркое освещение (камера RPi не слишком хороша сама по себе), так, что тестировать работу желательно при мягком рассеянном освещении (кстати, в полумраке работает на удивление неплохо – по крайней мере, у меня). Если вы получили «Scan error», то я порекомендую заглянуть в папку “Cube” (на самом RPi, внутри папки проекта “Rubic_solver”), и рассмотреть полученные фото.

Собственно, точное соответствие именно этой фотографии неважно; важно, чтобы были видны все 9 «суб-кубиков», а также белая часть, служащая для коррекции «баланса белого» (в моем случае это белая «клешня»). Координаты опорных точек (в пикселах) задаются в строках 100-108. Установите значения для ваших фото, и проблема «Scan error» должна уйти. Если же у вас куб и «клешня» не помещаются в фокус (как это случилось у меня), то вот пара измененных моделей «держалки» камеры: https://senssoft.com/cam_holders.zip

Вот, собственно, и все – после наладки робот должен будет заработать, и решить/собрать кубик Рубика! Сборка занимает от 2 до 3-х минут (как я писал вначале, это отнюдь не «рекордный» робот), в зависимости от выбранных сервомоторов (180 или 270 градусов поворота), настроек (через меню “Setup”), и текущего состояния «запутанности» куба. Для решения используется имплементация на Python-е алгоритма Герберта Косиемба https://github.com/muodov/kociemba — это не самый быстрый или оптимальный алгоритм, но для данных целей он вполне достаточен.

Робот работает с любыми стандартными (т.е. размером 2 дюйма или около того) кубиками Рубика 3×3, с глянцевыми или матовыми кубиками, любых оттенков и цветов — главное, чтобы они отличались друг от друга. Единственно, если на среднем кубике есть логотип компании (обычно на белом), то нужно его заклеить квадратиком изоленты соответствующего цвета, иначе алгоритм распознавания цветов не сработает (но при желании можно и «подшаманить» с кодом на Python – ведь положение такого кубика нам известно).

Помимо обычного, «классического» решения кубика (то бишь сборки), в программе Фолькера предусмотрена дополнительная функциональность, как-то сборка различных затейливых комбинаций и «мозаик» («Змейка», «Пирамида» etc.), притом, при желании, вы сможете легко дополнить своими вариантами, а также функция «запутывания» кубика. Ну, и, поскольку это open source реализация, то возможности совершенствования весьма велики: можно улучшить распознавание цветов, добавив фильтрацию картинок, убыстрить алгоритм решения (правда, по времени это даст совершенно незначительное ускорение), или же «поиграться» с настройками так, чтобы «выйти», например, за 100 секунд (но это будет сложно, чисто из-за механической реализации – «speed-bots» работают совершенно по другому – они вращают сразу все грани куба через центральный кубик, сильно при этом его сжав).

Да, чтобы робот стал полностью автономным, добавьте запуск Python программы в файл /etc/rc.local: python3 /home/pi/Rubik_solver/rubik_robot_en_PCA9685.py &
(не забудьте про амперсанд в конце команды!) Теоретически, можно еще повозиться над убыстрением запуска (boot) RPi – например, загрузкой через initrd (RAM disk), но в моем случае, при «холодном» запуске (т.е. по включению питания) до появления надписи “Start” проходит порядка 8-9 секунд, что достаточно быстро, на мой взгляд.

Этот проект будет интересен для реализации как взрослым, так и детям (моим очень понравилось помогать собирать корпус и «клешни», крутить болтики ключами и все налаживать, а также тот факт, что этот робот выполняет «полезную функцию/работу», которую сами они осилить не могут (ну, или не хотят 😊); также этот робот весьма эффектен при демонстрации друзьям и знакомым.

Вроде, я более-менее подробно описал особенности и «тонкости» реализации; на основной странице проекта тоже есть описание, хотя и «страдающее» определенной лаконичностью. Если возникнут вопросы, то я буду рад помочь советом, в комментариях или «личке». Также можно обратиться и к Фолькеру через страницу комментариев на thingiverse.com – я думаю, он будет рад помочь.

Вот видео полного цикла «решения» (сборки) кубика Рубика описанным выше роботом. Прошу прощения за назойливую мелодию, но я до сих пор «неровно дышу» к музыкальной теме из доброго старого «Арканоида»

И, в заключение, хочу обратить ваше внимание на мои статьи для начинающих «3D печатников», а также на другой, достаточно любопытный, на мой вкус, домашний проект 3D печати.

Спасибо за внимание, и удачи в новых DIY проектах!

Дата-центр ITSOFT — размещение и аренда серверов и стоек в двух дата-центрах в Москве. За последние годы UPTIME 100%. Размещение GPU-ферм и ASIC-майнеров, аренда GPU-серверов, лицензии связи, SSL-сертификаты, администрирование серверов и поддержка сайтов.

Читайте так же:

  • Как запустить рекламу ВКонтакте и повысить ее эффективностьКак запустить рекламу ВКонтакте и повысить ее эффективность Описание Вебинар будет полезен всем. Кто изучает возможности рекламного кабинета ВКонтакте и хочет повысить эффективность этого канала. Программа вебинара: Рекламный кабинет во ВКонтакте: настройки рекламы в зависимости от вашей воронки продаж Какие таргетинги во ВКонтакте […]
  • Власти Москвы доработают систему распознавания лиц для отслеживания преступниковВласти Москвы доработают систему распознавания лиц для отслеживания преступников Власти Москвы вложат 130 млн рублей в доработку системы распознавания лиц, для нужд МВД. Новые функции позволят полицейским находить преступников, а также вычислять их маршруты передвижений и предполагаемых сообщников. Кроме того, система будет распознавать людей, которые часто приходят […]
  • Контент менеджмент сайта этоКонтент менеджмент сайта это Управление контентом (CM) - это набор процессов и технологий. Которые поддерживают сбор. Управление и публикацию информации в любой форме или на любом носителе. При хранении и доступе через компьютеры эта информация может быть более конкретно названа цифровым контентомили просто […]
  • В приложении Яндекс Go появились товары из Маркета с экспресс-доставкойВ приложении Яндекс Go появились товары из Маркета с экспресс-доставкой Яндекс добавил в приложение Яндекс Go возможность заказа товаров на Яндекс.Маркете с экспресс-доставкой. Найти их можно в разделе Маркет Express, где для заказа доступно 140 тысяч единиц самой разной продукции.  «Новая возможность в Яндекс Go – это логичное продолжение концепции […]