Планшетный принтер своими руками

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

На самом деле планшетный принтер может служить не только дополнением к станку с ЧПУ для прямой печати красочных изображений на готовой продукции. Он может выступать в качестве вполне самостоятельного средства производства! Например, для печати на футболках и ткани (текстильный принтер), печати на кафельной плитке и стекле (для студии дизайна интерьера), для изготовления печатных плат при производстве электроники, и многое-многое другое. Т.е. как мы видим, планшетный принтер — это отдельный бизнес, начать который под силу любому уже с первой зарплаты, просто изготовив планшетный принтер своими руками!

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

Для начала нужно понять, в чем заключается переделка струйного принтера. Обычный струйный принтер рассчитан на печать по бумаге, а мы хотим осуществлять прямую печать на твердой поверхности. Значит нам нужно просто переделать механизм подачи бумаги, вместо которого требуется установить подвижный столик с плоской поверхностью для расположения объекта, на котором будет производиться прямая печать (фанера, дерево, футболка, плитка, стекло, чехол от иТелефона, буханка хлеба с памятной надписью и т.д.).

Приводить в движение плоский столик можно все тем же двигателем от механизма протяжки бумаги, но при этом нужно понимать, что ничего тяжелее куска тряпки такой столик «протащить» под принтером не сможет. Да и сам столик должен быть из какого-то «воздушного» материала, например, оргстекла или пластика, и желательно с дырками для облегчения веса. А иногда для широкоформатных принтеров целесообразно двигать не столик под принтером, а сам принтер над столом! Эта задача штатному движочку уж точно не под силу!

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

Для управления шаговым двигателем нужен контроллер и драйвер. С драйвером шагового двигателя вопросов никаких нет — это может быть самый простой A4988 стоимостью в 180 рублей, который обеспечивает выходной ток на обмотку двигателя аж до 2 Ампер (с применением радиатора и внешнего охлаждения вентилятором). Этого более чем достаточно для управления шаговым двигателем средней мощности.

Энкодер принтераОсталось понять, для чего нужен контроллер и какие функции он будет выполнять. Если разобрать любой струйный принтер и обратить внимание на механизм подачи бумаги, то можно увидеть длинный вал с прорезиненными роликами, приводимый в движение небольшим моторчиком через зубчатую передачу. Там же на валу располагается прозрачный диск с маленькими черными делениями — это так называемый энкодер. Диск энкодера проходит через черненький такой оптический датчик, а эти деления на диске помогают электронике принтера понять, на сколько прокрутился вал подачи бумаги, иными словами — на сколько сдвинулся лист в принтере. Нашему контроллеру по большому счету нужно просто преобразовать «смещение бумаги» в «смещение стола». Для этого он тоже должен «читать» данные с энкодера (считать черные риски) и преобразовывать эти данные в шаги для шагового двигателя.

ArduinoВ качестве контроллера можно применить всеми любимую плату Arduino. Купить простейшую Arduino можно за 500 рублей. Кто-то скажет, что Arduino слишком медленная — это не совсем верно, а точнее, совсем не верно! Arduino — это просто удобная среда разработки на микроконтроллерах AVR фирмы Atmel. Никто не запрещает в среде Arduino использовать «родные» команды этого микроконтроллера вместо библиотечных функций среды Arduino, которые действительно медленные. С «родными» командами ваш микроконтроллер будет работать практически с частотой тактирования (а это как никак 16 МГц, стабилизированных кварцевым резонатором на плате). Для сравнения, сигнал с энкодера принтера может поступать с частотой не больше нескольких сотен герц или килогерц, т.е. наш микроконтроллер будет грубо говоря 1 такт работать, а остальные 1000 тактов отдыхать!

Оптический датчик энкодера принтера имеет два канала (условно — A и B). При вращении диска энкодера на выходе оптического датчика будут появляться прямоугольные импульсы. Направление вращения диска энкодера можно узнать, определив из какого канала импульс приходит первым. Если в канале A пришел импульс, а в канале B импульса еще нету, то диск крутится по часовой (к примеру); если в канале A пришел импульс, а в канале B импульс также уже есть, то вращение идет против часовой стрелки (опять же — к примеру). В реальной программе мы сможем потом легко сменить «-» на «+», если окажется, что мотор крутится не туда.

Подключение оптического датчика к Arduino происходит через цифровые входы D2 и D3 (на плате Arduino отмечены циферками «2″ и «3″ соответственно). Остается подключить к выходу Arduino контроллер шагового двигателя на базе модуля A4988. Он на вход принимает сигналы STEP (один шаг или микрошаг шагового двигателя) и DIR (направление вращения: 1 — в одну сторону, 0 — в другую). На Arduino для выходов STEP и DIR мы можем назначить любые понравившиеся нам пины, например — 12 и 13. На 13-ом выводе обычно сидит еще и светодиод прямо на плате Arduino, который даст нам еще и визуальное подтверждение передачи шагов STEP в драйвер шагового двигателя. Если хотите, можно DIR повесить на вывод 13, тогда светодиод будет гореть при вращении в одну строну и гаснуть, при вращении в другую — тоже наглядно.

Программа для микроконтроллера получается очень простой. Вот ее листинг:

// Пины для входа с энкодера

#define ENC_A_PIN 2

#define ENC_B_PIN 3

// Чтение значения с энкодера
#define ENC_A ((PIND & (1 << ENC_A_PIN)) > 0)
#define ENC_B ((PIND & (1 << ENC_B_PIN)) > 0)

// Пины STEP/DIR
#define STEP_PIN 13
#define DIR_PIN 12

// Отправка данных в порты STEP/DIR
#define STEP(V) (PORTB = V ? PORTB | (1 << (STEP_PIN-8)) : PORTB & (~(1<<(STEP_PIN-8))))
#define DIR(V) (PORTB = V ? PORTB | (1 << (DIR_PIN-8)) : PORTB & (~(1<<(DIR_PIN-8))))

void setup() {
intSetup();
driveSetup();
}

void driveSetup(){
pinMode(STEP_PIN, OUTPUT);
STEP(0);

pinMode(DIR_PIN, OUTPUT);
DIR(0);
}

volatile boolean A, B;

void intSetup(){
pinMode(ENC_A_PIN, INPUT);
A = ENC_A;
attachInterrupt(0, onEncoderChannelA, CHANGE);

pinMode(ENC_B_PIN, INPUT);
B = ENC_B;
attachInterrupt(1, onEncoderChannelB, CHANGE);
}

volatile unsigned long pulses = 0;
volatile boolean gotDir = false;
volatile boolean cw = false;

unsigned long pps = 2; // pulses per step

void loop() {

if(pulses >= pps){
pulses = 0;
STEP(1);
delayMicroseconds(10);
STEP(0);
}

if(gotDir){
DIR(!cw);
gotDir = false;
}
}

void onEncoderChannelA(){

A = ENC_A;

if((A && B) || (!A && !B)){
if(!cw) gotDir = true;
cw = true;
}else{
if(cw) gotDir = true;
cw = false;
}

pulses ++;
}

void onEncoderChannelB(){

B = ENC_B;

if((B && A) || (!B && !A)){
if(cw) gotDir = true;
cw = false;
}else{
if(!cw) gotDir = true;
cw = true;
}

pulses ++;
}

Немного пояснений по коду. В attachInterrupt() мы вешаем функцию-обработчик на внешнее прерывание, которое у нас срабатывает по изменению состояния канала оптического датчика энкодера. Любое изменение с 0 на 1 и с 1 на 0 отслеживается функцией onEncoderChannelA и onEncoderChannelB для канала A и B соответственно. Ну а дальше мы просто подсчитываем количество импульсов с энкодера и выдаем шаговому двигателю команды STEP и DIR. Как видите — ничего сложного!

Потом, в зависимости от конструкции стола и механизма передачи нужно будет подобрать коэффициент преобразования импульсов с энкодера в шаги двигателя. У меня в программе это значение задается в переменной pps (pulses per step — импульсов на шаг).

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

После успешного макетирования перейдем теперь к реальной переделке струйного принтера Epson Stylus Photo 1500W с СНПЧ (системой непрерывной подачи чернил) в принтер прямой печати. Чтобы не плодить портянок, создам для этого новую статью «Принтер прямой печати«.

  • АНАТОЛИЙ

    ДОБРЫЙ ДЕНЬ. Ваш блог супер интересен для меня , я уже полгода бьюсь над планшетником и ни как толку нет добьюсь , привод стола трением работает кое как , и быть уверенным в том, что заготовку не испортишь не получается, я давно думал о том как повторить движение вала протяжки бумаги , даже пытался задействовать поворотный энкодер от магнитолы. Бумага при печати в режиме наилучшее фото протягивается на 3.2 миллиметра , если учесть что диаметр основного вала протяжки бумаги 8 мм , то тогда длина окружности 25.4 мм приблизительно , тогда пропорция 25.4 — 3.2 360 градусов — х градусов, Получается, что вал поворачивается на 45 градусов. Ручной энкодер с такой задачей справится , но если учесть дребизг контактов энкодера приводит к (неустойчивому положению вала шаговика) и плюс первая полосочка печати идет без вращения энкодера в режиме рулонной печати , но этот режим имеют не все принтера , вот и возникли вопросы успеет ли шаговик повернуться на нужный угол и в нужное место с ручного энкодером ведь всего 48 устойчивых положений у энкодера ,ошибка всего на одно положение приведет к ошибке в перемещении стола 8 градусов в ту или иную сторону. Может накапливаться ошибка с разным знаком и получится то пропуск печати то печать на уже напечатанное место. Ваша программа и идея подходит как нельзя лучше для планшетного принтера. Вопрос для работы драйвера шаговика требуется еще один сигнал или команда как хотите назовите еneble ГДЕ Я МОГУ его ВЗЯТЬ или как его запрограммировать в ардуино используя сигнал энкодера, Сигнал должен появляться с началом появления первого фронта импульса энкодера и зчезать после остановки энкодера вот пока не могу сообразить канала вращения почасовой стрелке или против. Спасибо за Ваш сайт и Вашу открытость, на других сайтах этот код держат в секрете , хотя его реализовать можно по разному. Попробуйте сделать вариант на другой ардуине без загрущика через прошивку программатором контроллера , думаю многие купили бы готовое решение для текстильного принтера или хотя бы документацию с чертежом платы за разумные деньги. Ведь смысл бизнеса не урвать сейчас, а много продавать и хорошо зарабатывать.

    • http://tech.dimanjy.com/ Dimanjy

      Анатолий, а в вашем принтере разве нету родного энкодера на протяжке бумаги? Зачем какой-то сторонний энкодер задействовать?

      Энкодер с контактами ни в коем случае нельзя использовать. Как вы сами правильно заметили — дребезг контактов все испортит. Энкодер должен быть обязательно оптический! Можно разломать любой старый струйник — там он есть. Также энкодер можно распечатать самому на лазернике на пленке Lomond.

      Шаговик успеет провернуться — не переживайте!

      В драйвере шаговика ENABLE просто сажается на + (т.е. всегда включен). Ну или с Arduino возьмите еще один контакт и управляйте в программе тогда, когда нужно (а нужно почти всегда, т.к. вал шаговика тоже должен быть в режиме удержания, и обмотки должны быть под током). ENABLE должен появляться не с первым импульсом, а просто сразу после включения принтера за исключением того случая, когда хотите стол подвигать руками (отключив шаговик).

      • Анатолий.

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

  • Виталий

    Спасибо за помощь… тоже собираю сеЙ аппарат… заказал… буду пробовать…

  • Виталий

    А каким образом происходит передвижение стола ?

    • http://tech.dimanjy.com/ Dimanjy

      Энкодер подает на контроллер данные о положении. Контроллер преобразует эти данные в необходимое число шагов для шагового двигателя. Шаговый двигатель вращается, перемещая стол на заданное (откалиброванное) кол-во миллиметров при помощи зубчатого ремня или винтовой передачи (кому что больше нравится).

      • Виталий

        Спасибо за быстрый ответ, но я имел в виду … как стол передвигать в обычном режиме без печати ? рукой ? или это также в коде прописано ?, существует ли возможность управлять столом кнопками через андруино одним нажатием чтоб стол двигался до концевика, а потом останавливался ?

        • http://tech.dimanjy.com/ Dimanjy

          В Ардуино можно сделать все, что угодно! И холостые перемещения и регулировка по высоте и память на тыщщу положений. Все зависит от фантазии.

  • Jack The Ripper

    Вот…. Вот такое описание я и искал. Всё чётко и по полочкам разложил. Отдельное спасибо автору за листинг. Теперь знаю, от чего отталкиваться в постройке планшетника. А то все жадные, только за деньги предлагают свои контроллеры с уже вшитой программой.
    P.S. С нетерпением жду видео.

  • Леонид

    Чувак Ты супер, я пол года голову ломал что бы зделать такое

  • Ann Svinchuk-Kovalenko

    Спасибо за статью! Все сделала как описано но увы не работает. может не то, что то сделала? на прямую движок крутит энкодером и через mega 2560 с тестовыми скетчами работает, а загружаю Ваш скетч — тишина!
    Подскажете, что не так делаю?
    Спасибо

    • http://tech.dimanjy.com/ Dimanjy

      Я для ATmega-8/168/328 скетч писал. Для Меги 2560 порты будут совсем другие. Смотрите в даташите, на что нужно заменить PORTB и PIND, чтобы читало и писало в нужные ножки.

  • Виталий

    Привет… спасибо еще раз за твой труд… установил… подключил… все работает…
    Есть вопрос… по управлению…… помоги пожалуйста со с кодом… для управления стола… Я сам в программирование ноль..((, хотелось бы чтоб :
    дополнить код тремя кнопками … вперед , назад, и стоп. например чтоб когда я нажал один раз на кнопку не держа ее ШД двигался в одну сторону до концевика и останавливался, и так же в другую… а кнопка СТОП бы тормозила процесс…
    Очень нужна твоя помощь…

    • http://tech.dimanjy.com/ Dimanjy

      Привет, Виталий. Я сейчас как раз пишу примерно тоже самое для себя. Как будут успехи — попробую поделиться с подписчиками. Возможно, в виде отдельной статьи оформлю.
      А пока я буду шаманить, рекомендую тебе все-таки почитать по программированию для Arduino. Там все очень просто — «если так, то делаем это, иначе — делаем то». А в будущем пригодится, потому как с этим принтером возни еще много предстоит :)

    • http://tech.dimanjy.com/ Dimanjy

      Виталий, расскажи-ка мне, пожалуйста, у тебя какой шаговик и какой драйвер к нему? Какое питание? Удалось тебе выставить нормальный ток для шаговика?
      В 3D-принтере у меня нормально работали A4988 и выдавали ток в полтора ампера минимум на шаговик, а тут я никак не могу нормально стол запитать — все шаги пропускает :(

      • Виталий

        Шд у меня на 1,7 А. драйвер А4988, все работает через Андруино УНО… драйвер запитал 19 v 2,1 А, андруино запитал 12 V 2А, по началу на драйвер 5V подключал с андруино… но так не работало.. подключил отдельно 5V у них общая земля со всей схемой… пять вольт которые с енкодера идут с принтера почему то по схеме не работают… надо еще разбираться… И по коду… вот еще что… при прокрутке энкодера… на полный оборот …Шд делай поворот всего на 75 %, у Вас в коде настройка…задается в переменной pps (pulses per step) где минимальное значение.. 1… тоесть меньше уже нельзя сделать… получается значение не точное… Думаю для кода нужно изменить значение в сотые или тысячные… для точной настройки… так как … думаю.. это избавит от лишнего геморроя с подбором шкива для ШД и ремня…

        • http://tech.dimanjy.com/ Dimanjy

          Вот по прошивке у меня тоже вышло в итоге, что нужны десятые доли из-за несовпадения механических параметров принтера и стола. Только у меня pps при разрешении 1440×720 DPI получился 2.77 (для этого в прошивке надо заменить тип переменной на float или на double, т.е. double pps = 2.77).
          Если у тебя выходит меньше 1, то с механикой нужно что-то делать — слишком маленький вал где-то стоит. Более высокое разрешение у принтера вообще тогда не получится использовать.
          Я для стола использовал шкив и зубчатый ремень от 3D-принтера стандартный (Т2.5, кажется). Там размер этого шкива примерно совпадает с диаметром колесиков от листопротяга.

          • Виталий

            А можно точнее узнать куда переменную вставить в код ? я выставил вместо… unsigned long pps = 2; значение (double pps = 0.5), но работает так же… оборот на 75 %…

          • http://tech.dimanjy.com/ Dimanjy

            Вот ссылка на мой рабочий репозиторий с исходниками контроллера:
            https://bitbucket.org/Dimanjy/print-mod

          • Виталий

            В общем… установил все на принтер… (у меня ШД на 1,7А
            драйвер А4988) ШД не тянет стол… слабый… если рукой помогать .. все печатает…Теперь надо что то по мощнее брать…

          • http://tech.dimanjy.com/ Dimanjy

            Вот и у меня тоже сперва не пошло на Nema17 1.7А. Заменил его на Nema23 с таким же током и все поперло! Тут надо смотреть именно на крутящий момент двига, а не на его ток, потому как при том же токе Nema23 гораздо тяговитее, чем Nema17.

  • Сергей

    Добрый день! У меня возникла проблема с подключением энкодера к ардуино.
    В общем если взять энкодер, не включая шлейф от принтера, взять питание в ардуины, то при ручном вращении диска все работает, стол двигается.
    Как только подключаем шлейф, идут помехи, ШД хаотично двигается, пробовал и витую пару и с экраном, ничего не меняется(

    • http://tech.dimanjy.com/ Dimanjy

      Между Arduino и принтером должна быть общая земля. Я вообще питаю Arduino от принтера. Там как раз на плате датчиков очень удобно можно подпаяться: и земля и +5V есть.

      • Сергей

        Спасибо за быстрый ответ! Убежал паять)

      • Сергей

        Все заработало, спасибо! Делаю на базе 1410. Контроллер Ардуино Уно, сейчас в прошивке только чтение сигналов с энкодера и управление драйвером ШД, но в ближайших планах эмуляция датчика бумаги, ручное передвижение стола, автоматическая настройка высоты и пр.

        • http://tech.dimanjy.com/ Dimanjy

          Я уже писал симуляцию датчика и ручное перемещение. Гляньте мой репозиторий, может пригодится…
          https://bitbucket.org/Dimanjy/print-mod/src