Пришло время рассказать об ещё одном моем подзатянувшемся проекте. Достаточно давно на свет появился проект ЧПУ-станка для раскрашивания яиц и других сферических объектов - Sphere-O-Bot.

Игрушка оказалась успешной в среде мейкеров, и породила множество производных и модификаций. Можно даже найти вариант, сконструированный для гравировки стаканов.

Во всех этих вариантах общим остаётся одно - конструкция состоит из двух шаговых двигателей, сервомашинки, блока управления (обычно вездесущая плата Arduino с CNC-shield) и компьютера, на котором запущен векторный редактор Inkscape с расширением для управления.
В целом, хоть данная штуковина меня и забавляла, повторять ее я не собирался. Смущало наличие деталей нарезанных из фанеры и резьбовые шпильки. Такие вещи требуют немного больше инструмента, чем у меня есть. Однако, судьба распорядилась иначе - на одной из московских Maker Faire я увидел вот такой вариант.

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

Основные детали также печатаются на 3D принтере, однако такая “органическая” форма намного жёстче, а хорошие моторы без люфтов обеспечивают отличную точность работы, достаточную для того, чтобы можно было заменять фломастер на другой не прерывая процесса рисования, что позволяет делать многоцветные рисунки.
Итак, для сборки Sphere-O-Bot нам понадобится:
- пружина от авторучки;
- пара шаговых двигателей NEMA17;
- блок питания 12\24В, ток от 2А;
- плата Arduino Uno;
- плата CNC shield v3;
- пара драйверов шаговых двигателей A4988;
- пара присосок 20мм диаметом (или побольше);
- сервомашинка SG90;
- россыпь винтов и гаек М3 с шайбами;
- напечатанные пластиковые детали (про них дальше);
- резьбовая шпилька М3 длинной сантиметров 10;
- пара подшипников 623.
- горсть разъемов типа Dupont.
Начать стоит с печатных деталей. Скачиваем с Thingiverse архив и печатаем следующие детали из списка:
- корпус - MAIN_FRAME_[V2.stl
- рука из двух деталей - vertical_ARM_v2.stl и pen_holder_[V4.stl
- насадка-барашек на гайку - M3_nut_Knob_replacement_for_the_wingnut.stl
- пара держателей подшипников - axis_support_[V2.stl
- шайба - spring_holder.stl
- держатель присоски - egg_support_[V2_for_MEDIUM_suction_cups.stl
Сразу оговорюсь - так как найти присоски как на картинке несколько проблематично, держатель присоски стоит отредактировать - и уменьшить диаметр отверстия под заднюю часть присоски. Я ограничился подматыванием изоленты.
Процесс механической сборки прекрасно показан на оригинальном сайте Sphere-o-Bot, и передирать картинки мне не очень хочется. Поэтому, просто оставлю ссылку. Отмечу лишь, что присоску прежде чем пытаться надеть на резьбовую шпильку, стоит аккуратно просверлить сверлом 2мм на пару миллиметров вглубь, но не до конца,чтобы не пробить.
Теперь самое сложное в данном устройстве - соединение электроники. Начать стоит с того, что нужно заставить шаговые двигатели работать в режиме микрошагов. Для этого на плате CNC Shield следует установить по три перемычки под драйверами двигателей X и Y (5 на схеме).

И после этого устанавливаем драйверы двигателей в разъемы X и Y.
Сервомашинку подключаем так:- оранжевый провод к выводу Z STEP, красный к 5V а коричневый к GND в группе выводов на схеме обозначенные как 2.
Двигатель поворота яйца подключаем к драйверу Х, а двигатель “руки” к драйверу Y. Следует иметь в виду, что цвета провоов от шаговых двигателей может отличаться. В моем случае порядок проводов сверху-вниз был такой: красный-зеленый-желтый-синий. В других случаях следует разбираться отдельно. Провода двигателей простаскиваем внутри корпуса и подключаем к CNC Shield, который вместе с Arduino должен быть закреплен на корпусе. Оталось лишь подключить провод от блока питания к клеммнику питания, присоединить кабель USB к компьютеру и можно переходить к программной части.

Для начала, нужно скачать и установить среду Arduino IDE. После установки подключаем плату, ставим необходимые драйвера и запускаем Arduino. В менювыбираем пункт Инструменты-Плата-Arduino AVR boards-Arduino Uno, а в Инструменты-Порт выбираем COM-порт, который появился в системе после подключения платы. Там же в меню нужно убедиться, что в пункте Инструменты-Программатор выбран “AVRISP mkII”. Далее необходимо скачать исходники управляющего ПО EggDuino, специально модифициованную версию оригинального ПО EggBot, поддерживающее платы Arduino с модулем CNC Shield. Скачиваем, открываем файл EggBot.ino. Теперь потребуется внести парочку изменений: Закомментировать BOARD_ZAGGO и раскомментировать BOARD_CNCSHIELD, чтобы получилось вот так:
//#define BOARD_ZAGGO
#define BOARD_CNCSHIELD
Таке меняем блок BOARD_CNCSHIELD следующим образом:
#ifdef BOARD_CNCSHIELD
//CNC Shield: http://blog.protoneer.co.nz/arduino-cnc-shield/
//Rotational Stepper: ("X")
#define step1 2
#define dir1 5
#define enableRotMotor 8
#define rotMicrostep 16 //MicrostepMode, only 1,2,4,8,16 allowed, because of Integer-Math in this Sketch
//Pen Stepper: ("Y")
#define step2 3
#define dir2 6
#define enablePenMotor 8
#define penMicrostep 16 //MicrostepMode, only 1,2,4,8,16 allowed, because of Integer-Math in this Sketch
//Servo
#define servoPin 4 // "SpnEn"
//#define engraverPin 13 // "SpnDir"
//Buttons
//#define prgButton A0 // PRG button ("Abort")
//#define penToggleButton A1 // pen up/down button ("Hold")
//#define motorsButton A2 // motors enable button ("Resume")
#endif
После этого нажимаем кнопку со стрелкой “Загрузка”. Ждем сообщения “Загрузка завершена” в нижней части окна Arduino IDE. На этом подготовка станочка завершена и можно переходить к управляющей программе для ПК.
Непосредственно управлять станочкем будем с помощью плагина для векторного редактора Inkscape. Нам понадобится версия 0.92.4. Ставим Inkscape и после этого идем за плагином EggBot. В нижней части страницы находим установшик EggBot_281_r1.exe, скачиваем его и устанавливаем. Теперь внесем еще пару правок, для этого идем в каталог, куда установился Inkscape и открываем там файл share\extensions\ebb_serial.py
Находим там функцию findPort и заменяем EiBotBoard на название COM-порта, который появляется при подключении Arduino к компу (смотрим в Диспетчере устройств). Получиться должно нечто такое:
def findPort():
# Find first available EiBotBoard by searching USB ports.
# Return serial port object.
try:
from serial.tools.list_ports import comports
except ImportError:
return None
if comports:
com_ports_list = list(comports())
ebb_port = None
for port in com_ports_list:
if port[1].startswith("USB-SERIAL CH340"):
ebb_port = port[0] # Success; EBB found by name match.
break # stop searching-- we are done.
if ebb_port is None:
for port in com_ports_list:
if port[2].startswith("USB VID:PID=1A86:7523"):
ebb_port = port[0] # Success; EBB found by VID/PID match.
break # stop searching-- we are done.
return ebb_port
После этого правим функцию testPort - и меняем timeout с 1.0 на 2.0:
def testPort(port_name):
"""
Open a given serial port, verify that it is an EiBotBoard,
and return a SerialPort object that we can reference later.
This routine only opens the port;
it will need to be closed as well, for example with closePort( port_name ).
You, who open the port, are responsible for closing it as well.
"""
if port_name is not None:
try:
serial_port = serial.Serial(port_name, timeout=2.0) # 1 second timeout!
serial_port.flushInput() # deprecated function name;
# use serial_port.reset_input_buffer()
# if we can be sure that we have pySerial 3+.
serial_port.write('v\r'.encode('ascii'))
str_version = serial_port.readline()
if str_version and str_version.startswith("EBB".encode('ascii')):
return serial_port
serial_port.write('v\r'.encode('ascii'))
str_version = serial_port.readline()
if str_version and str_version.startswith("EBB".encode('ascii')):
return serial_port
serial_port.close()
except serial.SerialException:
pass
return None
И на этом мы закончили. Далее осталось изменить настройки станка в Inkscape. Для этого запускаем программу, выбираем пункт меню Расширения-EggBot-EggBot Control. Переходим там на вкладку Setup и подбираем параметры верхнего и нижнего положения пера. У меняя это соответственно 17 и 25. Все управление станком происходит именно через этот плагин - после подготовки изображения на вкладке Plot нужно на кнопку Apply и станочек начнет рисовать картинку. Проверить работу же можно на вкладке Manual, выбирая различные действия и отправляя их на выполнение. Шаблон и примеры картинок можно добыть там же, где и плагин для управления, в архиве EggBotExamples_v281.zip.
Поэкспериментировав можно переходить к рисованию чего-то более осмысленного и покраске результата акрилом.
На этом всё! Проект закончен!