В этой статье я хочу рассказать о любопытном 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 дюйма или около того) кубиками Рубика 3x3, с глянцевыми или матовыми кубиками, любых оттенков и цветов - главное, чтобы они отличались друг от друга. Единственно, если на среднем кубике есть логотип компании (обычно на белом), то нужно его заклеить квадратиком изоленты соответствующего цвета, иначе алгоритм распознавания цветов не сработает (но при желании можно и «подшаманить» с кодом на 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-сертификаты, администрирование серверов и поддержка сайтов.

Комментарии (19)


  1. datacompboy
    18.02.2022 04:32
    +2

    Хм. Я так понимаю, должно и из лего получиться...


    1. usa_habro_user Автор
      18.02.2022 05:17

      Да, как я понимаю (хотя лично не пробовал), вполне таки получается, но намного дороже. И с Lego я не справлюсь (а вот дети запросто), разве, что с электроникой.


  1. alex_kag
    18.02.2022 07:12

    Всегда интересно было, а кубик подходит любой? Или спец заказ какой-то? Я про заедания...


    1. usa_habro_user Автор
      18.02.2022 08:10
      +2

      Никаких "спец-заказов", кубик самый обыкновенный. Я проверял только на своем, "классическом" от Hasbro, с "глянцевыми" наклейками. Фолькер проверял как на "классическом", так и на "новомодном", вот его видео:


      1. VolodjaT
        18.02.2022 20:21

        Ну ваш кубик судя по всему качественный - со скруглениями углов и пружинами: для скоросной сборки. Обычные с рынка таки клинят сильно


        1. usa_habro_user Автор
          18.02.2022 22:18

          Это не мой (мой - на видео в конце статьи), но и это - самый обычный дешевый кубик с Amazon-а. Не клинят от слова совсем при сборке.


          1. nochkin
            18.02.2022 22:25

            Линк на Amazon как раз и есть для скоростной сборки. Например, классический оригинальный кубик Рубика заедает время от времени если не до конца повернуть грань.


            1. usa_habro_user Автор
              18.02.2022 23:49

              За $5 вы не получите реальный speed cube; за $30 уже что-то можно пробовать (но только профи скоростной сборки сможет точно сказать).

              Но, тестируя этого робота, я использовал самый обычный, классический кубик от Hasbro, вот такой - ничего не заедает и не "клинит".


              1. nochkin
                19.02.2022 00:49

                Конечно, есть бюджетные варианты скоростных кубиков. Есть и за $5, есть за $10, за $15, $20 и так далее хоть до $100.

                Тот же MeiLong стоит порядка $3 и вполне подходит под категорию скоростных. Пожалуй, это самый бюджетный скоростной кубик и, при том, вполне неплохой. При желании можно даже магниты добавить. Или сразу купить с магнитами за $6-$7.

                Классический и не должен заедать при такой низкой скорости, поэтому в данном случае это совсем не критично. Заедания начинаются на немного других скоростях.


                1. usa_habro_user Автор
                  19.02.2022 01:01

                  Ну, "я не настоящий сварщик - просто каску нашел" - даже в лучшие времена, когда знал еще и "сокращенные" формулы (в дополнение к основным), я еле-еле "влезал" в минуту. А сейчас вот попробовал с роботом посоревноваться - уложился только в минуту 42 сек. (но робота победил, естественно :)

                  Просто читал когда-то, что для соревнований народ использует какие-то "навороченные" кубики, которые крутятся чуть-ли не "движением воздуха сами собой" (утрируя, понятно).


                  1. nochkin
                    19.02.2022 01:11

                    Потеря скорости -- это вопрос практики. Сейчас пятиклассники могут влезать в минуту без особых хлопот при достаточной практике.

                    "Навороченные" кубики -- это больше для результатов порядка 10 секунд и меньше. Немагнитным кубиков, пожалуй, такой результат просто значительнее сложнее получить.

                    Это как професиональные геймеры, которые покупают более "быстрые" мониторы и прочее железо ради экономии этих миллисекунд.

                    Другая аналогия -- это HFT. То есть, в плане цен всегда есть куда расти когда есть потребители на эту тему.


    1. nochkin
      18.02.2022 22:23

      Я так понимаю, что фишка тут только в размере (порядка 56-55мм). На другие размеры надо менять механику в проекте.

      Не уверен, что будет заедать если кубик исправный. Там на видео видно что скорости достаточно низкие.


  1. ITMatika
    18.02.2022 07:55

    Есть инструкция для Lego Boost для робота, который собирает кубик Рубика.
    Товарищи, поделитесь, пожалуйста, у кого есть такая.


    1. alpha_ds
      18.02.2022 20:24

      Для lego mindstorm есть уже очень давно.

      Я собирал лет шесть назад. Работало замечательно.

      Софт для решения в бинарнике для производительности, остальное на стандартной платформе.


  1. Vold2D
    18.02.2022 09:42

    Попробуйте сделать то же самое не для стандартного кубика 3x3x3, а, скажем, для 21x21x21.


    1. VolodjaT
      18.02.2022 15:19
      +1

      А вы не хотите попробовать? :D


    1. nochkin
      18.02.2022 22:26
      +1

      Конечно, попробуйте. Ждём статью. Особенно интересно как будет реализован поворон внутренних слоёв.


      1. VolodjaT
        18.02.2022 23:08

        да, для такого уже нужна механика уровня промышленных манипуляторов


        1. nochkin
          18.02.2022 23:14
          +1

          Что-то мне подсказывает, что@Vold2D сможет уложиться в четверть от этой суммы. Я в него верю.