habrahabr

Плоттер на основе конструктора Makeblock

  • вторник, 6 января 2015 г. в 02:11:34
http://habrahabr.ru/post/247045/

Фотография плоттера с листом бумаги, на котором рисунок

О конструкторе Makeblock я узнал уже после того, как завершилась его кампания на кикстартере. А жаль, поскольку был шанс приобрести наборы конструктора по достаточно низкой цене. После удачной кампании авторы продолжили развивать свои идеи и создали набор для плоттера — XY-Plotter Robot Kit v2.0. Мне он обошелся в $300 с бесплатной доставкой через EMS в рамках акции «накупи на $500».

Плоттер заинтересовал меня по двум причинам: возможность рисовать ручкой Circuit Scribe с токопроводящими чернилами и возможность проапгрейдить плоттер лазерным резаком. В этой статье я расскажу о своих впечатлениях от плоттера в его оригинальной конфигурации.
 
 

Доставка


Подробности доставки
Плоттер продается в виде набора «собери сам». Вес посылки — несколько килограмм, поэтому доставка может обойтись дорого. Но я нашел китайский сервис Seeed, который при заказе на $500 высылает бесплатно через DHL / EMS. Кроме плоттера я взял у них лазерный резак, Raspberry Pi и несколько шилдов для Arduino, вписавшись в указанную сумму и убедив себя, что в будущем все это мне обязательно пригодится.

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

Разобранный Makeblock плоттер

Сборка


На сборку плоттера у меня ушло не меньше 10 часов. План сборки содержится в PDF документе, где шаг за шагом плоттер обретает свой вид. При всей подробности инструкции, иногда приходилось разбирать и заново собирать отдельные блоки когда приходило понимание их функции. Рекомендую при сборке забегать на несколько страниц вперед.

Проблемы сборки
Отверстия в алюминиевых частях конструктора смещены в пределах миллиметра от их задуманного положения, что приводило к проблемам в тех местах, в которых детали собирались впритык. Я нашел два таких места: прямо на первом шаге, когда винты, скрепляющие раму, уперлись друг в друга; и при креплении платы контроллера шагового двигателя, которая не смогла ужиться с ножкой плоттера. Все это удалось решить, но я бы на месте авторов конструктора не рассчитывал на такую точность формы своих деталей.

Один раз застрял винт во втулке. Дело в том, что втулки крепятся к оси маленькими установочными винтами без шляпки. На начальной стадии сборки не было указано, что потом эти втулки надо куда-то смещать и выравнивать, поэтому я их хорошо затянул. Позже обнаружилось, что винт застрял — отвертка буксует и не хочет отвинчивать. К слову, материал прилагаемых инструментов самый дешевый, метал мягкий. Я рассматривал несколько вариантов решения, от покупки новых деталек до вытаскивания винта методом накручивания еще меньшего винта с левой резьбой. Положения спасла отвертка из более твердой стали.

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

Принцип опускания и поднимания карандаша
Принцип опускания и поднимания карандаша я понял только под конец сборки:

Платформа с карандашем плоттера Makeblock

Карандаш жестко крепится к планке, а планка крепится на ось. Планка делится осью на два плеча — на одном карандаш, а на другом крепится резинка так, чтобы планка прижимала карандаш к бумаге. «Лопасть» сервопривода имеет два рабочих положения: вертикальное, в котором «лопасть» поднимает планку, не давая ей прижимать карандаш к бумаге, и горизонтальное, в котором «лопасть» не препятствует планке прижимать карандаш к бумаге.

Вдоль оси крепления планки существует люфт, который приводит к «дрожанию» линий. Мне удалось его убрать, добавив резинку, прижимающую планку к платформе.


Электроника


Электронные блоки и их соединение
Управляющим компонентом плоттера служит плата на базе Arduino Leonardo. Ее особенностью является встроенная поддержка для USB соединения с компьютером. Если обычно Arduino сбрасывается при налаживании нового последовательного соединения с компьютером, то Arduino Leonardo сохраняет свое текущее состояние, а значит с плоттером можно соединяться сколько угодно раз, сохраняя все настройки (прежде всего — нуля в XY).

В плате имеется 8 портов RJ25, через которые соединяются контроллеры двух шаговых двигателей, сервопривод и четыре выключателя на случай, когда платформа упирается в раму. Питание для шаговых двигателей подводится отдельно через поставляемый блок питания с американской вилкой.

Электронные компоненты плоттера Makeblock

Поиск оптимального микрошага двигателей
По время написания этой статьи я неожиданно обнаружил, что плоттер требует регулировки двух параметров контроллеров шаговых двигателей: количество микрошагов на один шаг и силу тока, определяющую крутящий момент. Подробнее об установке этих параметров здесь, но в инструкции об этом ни слова!

В теории увеличение количества микрошагов улучшает плавность линий и уменьшает шум, но и существенно понижает крутящий момент двигателей. Я попробовал сравнить качество получаемого изображения в зависимости от количества микрошагов:

Сравнение качества получаемого изображения от количества микрошагов в шаге

Как видно из этой картинки, самое лучшее качество дает 1/8 и 1/4 шага. Далее оказалось, что при разрешении 1/8 шага один из двигателей начинает буксовать и «терять» микрошаги из-за нехватки крутящего момента. Увеличение силы тока до максимума только немного улучшило положение, поэтому победителем вышел режим 1/4 шага. Кстати, в режиме микрошагов двигатель шумит заметно меньше!

Сравнение качества получаемого изображения от количества микрошагов в шаге


Управление


В конце сборки необходимо запрограммировать управляющую плату плоттера. Программа реализует трансляцию так называемого G-кода, в котором комманды перемещения карандаша записаны в текстовом виде.

Для преобразования векторного изображения в G-код существует много редакторов, но авторы рекомендуют использовать кроссплатформенный и бесплатный редактор Inkscape с установленным плагином для генерации G-кода Gcodetools.

Чтобы выслать плоттеру G-код на исполнение, необходимо подключиться к его управляющей плате через USB кабель и открыть последовательное соединение. Для Windows это будет какой-нибудь COM3 или COM4 порт, для MacOS это что-нибудь вроде /dev/tty.usbmodem1421

Интерфейс пользователя
Интерфейс пользователя программы управлением плоттером Makeblock Авторы конструктора написали программу на Java, открывающую соединение с устройством и позволяющую управлять карандашом с помощью клавиш-стрелок, устанавливать нулевое положение, задавать разрешение по осям и высылать G-код, записанный в файле.

Программа изначально рассчитана на Windows, но после загрузки нужной библиотеки запускается и под MacOS.

Я обнаружил, что иногда соединение с плоттером зависает, поэтому написал на этот случай скрипт на Python, высылающий G-код напрямую через последовательное соединение. При этом Java-программу я использую, чтобы установить исходную точку, потом запускаю скрипт.


 
Скрипт на Python
###############################################################################

import serial, re, time
import sys, argparse

SERIAL = "/dev/tty.usbmodem1421"

parser = argparse.ArgumentParser(description = "G-code file sender")
parser.add_argument("--input",  help = "file to send", required = True)
args = vars(parser.parse_args())

###############################################################################

def send(stream, command):
    if command[-1] != "\n": command += "\n"
    sys.stdout.write("<= " + command)
    stream.write(command)
    while True:
        s = stream.readline()
        sys.stdout.write("=> " + s)
        if s[0] != "#": break

fin = open(args["input"])

stream = serial.Serial(SERIAL, 115200)

send(stream, "$1 X8 Y12 Z21")
send(stream, "$2 X11 Y13 Z9")
send(stream, "$3 X22 Y19 Z22")
send(stream, "$4 X23 Y18 Z23")
send(stream, "$6 X88.0 Y88.0 Z40.0") # set axis resolution
send(stream, "G90")
send(stream, "G21")

for s in fin:
    s = re.sub(r"\([^)]*\)", r"", s)
    if s.strip(): send(stream, s.strip())

fin.close()

###############################################################################

Модификация программы
Программа для управляющей платы плоттера воспринимает X, Y и Z как три оси, движение по которым задается в миллиметрах. Но дело в том, что ось Z на самом деле задается углом вращения сервопривода! В моем случае 90 градусов означает опущенный карандаш, 60 градусов — поднятый. В итоге поднятие и опускание карандаша занимает, с точки зрения программы, столько же времени, сколько рисование линии в (90 — 60) => 30 мм! Карандаш опускается и ждет, потом рисует линию, потом поднимается и ждет. Мало того, что изображение рисуется дольше (как будто к каждому непрерывному пути добавляется 30 мм), но простаивание маркера или линера на бумаге добавляет толстые точки в начале пути. Программу пришлось модифицировать, сжав расстояния по оси Z:

long calculate_feedrate_delay(float feedrate)
{
    //how long is our line length?
    float distance = sqrt(delta_units.x*delta_units.x + delta_units.y*delta_units.y + delta_units.z*delta_units.z / 100.f);
    ...
}


Результат


Когда я уже собирался запустить плоттер на отрисовку каких-нибудь наглядных картинок для этой статьи, обнаружилась серьезная неисправность: линии рисунка перестали сходиться друг с другом. Оказалось, что линейные подшипники процарапали борозды на направляющих осях и стали время от времени пробуксовывать. Я подозревал, что оси надо смазывать, но сомневался, поскольку в инструкции про это не было ни слова. Итак, плоттер теперь требует ремонта и смазки.

Выбор смазки и ремонт
Судя по этой статье, самой лучшей смазкой является взвешенный в масле тефлон. Ее производят в США под маркой Super Lube. На втором месте — синтетические трансмиссионные масла (автомобильные?). Пока не пришла тефлоновая смазка, я попробовал отечественное машинное масло, но оно не сильно помогло.

Подшипники на замену я заказал на eBay по $2.55 за штуку, всего шесть штук. Направляющие оси оказались гораздо дороже, поскольку они сделаны по специальному заказу, но я решил их не менять, а провернуть, чтобы сместить борозды с путей подшипников.

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

Заканчивая статью, я все же рискну и отрисую несколько рисунков в менее точном режиме 1/2 шага, не дожидаясь комплектующих и смазки. Изображения сделаны линером с шириной линии 0.3 мм

Сравнение рисунка плоттера с линейкой

Образец рисунка плоттера: приветствие

Образец рисунка плоттера: лабиринт