DTG printer / принтер планшетный

Хотел ответить, но уже почти сплю)). Завтра ещё подумаю об этом
P.S. Вкратце мысль такая: головка рассчитывает, что напечатав строку, её передвинут , скажем, на 1мм. А её передвинут то на 0.8мм, то на 1.2мм

//я какого то хрена проснулся щас в 5 утра, думал я один не сплю ))

Да, но шаг-то 12микрон грубо. Мы же считаем ОБЩЕЕ соотношение шагов, а не на 1 шаг! В этом суть.
(Мы могли бы дождаться всех шагов энкодера, сразу посчитать сколько надо имп ШД и их все сразу выдать, условно. Но мы тогда просто не успеем. )
Поскольку считаются все импульсы энк и ШД то погрешность НЕ НАКАПЛИВАЕТСЯ.

да , я уже писал что я уже делал код , выше где то с выводами в монитор энкодера и мотора ,
если я задавал число 0.400 то погрешность колебалась в районе сотых в - и + самое большое было 0.417
но всегда вв среднем через 5- 15 имп возвращалась к 0.402 или 0.3998
я тогда понял что это как в математике , если четное число то делим на2 если не четное то прибавляем 1 и делим на 2 , и светилы исколи такое число чтобы оно не вернулась в 2 , но такое не нашли .

Вы вчера-сь в дурном расположении духа были? Я и не думал на вас наезжать.

Именно это я и пытался донести.

Вы опять про общее. Фиксировать тики энкодера от начала до конца печати правильно, лучшего алгоритма нет.
Но печатает то конкретный маленький участок, и на нем всегда присутствует ошибка позиционирования, в наихудшем случае равная длине протяжки за один шаг ШД (0.012мм).

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

надо попросить попробовать пробные страницы при разных разрешениях печати, вот и увидим что там @Arduman придумал что бы взять дробный шаг не кратный 1/32

Да все он правильно придумал, никаких не кратных там нет.

как другие разбираются в чужих кодах для меня очень большая загадка, видимо этим и отличается программист от не программиста )))

Сорри, видимо было непонимание.

1 лайк

Ок, добавим округление (+0.5ед) тогда ошибка будет в 2 раза меньше. Но 1сотка на бумаге вряд ли заметна, штатная протяжка вполне может иметь и большую погрешность.

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

0.012мм это более 2000dpi а принтер 1200dpi, всё должно быть идеально

Да. Можно убедится .
Вот результат выполнения кода из # 540
P.S. А это, как по мне , тот же код @Arduman , только я чуть по другому записал, для наглядности

Спойлер
float K = 0.297;//каждые 0.297 шагов enc   1 шаг ШД
                //Или на 1 шаг enc  3.368 шагов ШД
                // Или 3-4 шага)))


Как видим, ошибка 0.8 шага на 100 шагов

А на 1000 шагов всего 0.1 шага. Неплохо))

потому что это ошибка округления вниз. А она то туда то сюда то ноль, макс это 1 шаг. Как попадет.

К слову, округление посередине думаю не имеет смысла тк ТС всё равно будет подстраивать по реальному. Просто сместим зачем-то на 0.5, но шаг-то тот же остается.

1 лайк

Остаётся @vadim72 пожелать удачи в доработке сего чудо-устройства)))

Ну как же? При расчетном ХХ.9998 ошибка практически на шаг. А при округлении посредине ХХ. 4449 = ХХ, а ХХ.5000 = ХХ+1, т.е половина шага.

Думаю его надо постоянно заблокировать, сигнал “есть бумага” чтобы был всегда. Или он там участвует в логике процесса? что-то не соображу.

Чтобы добить автоматику надо:

  1. четко расписать что куда подключено:
  2. кнопки
  3. концевик, где он стоит
  4. Где Начальная позиция печати.
  5. Логику работы придумать

Чтобы столик не улетал за пределы надо добавить ограничение и в программе, как только motorPos > nn останавливать.

Предлагаю такую логику:

  1. включение, сброс - сразу на начальную позицию, то есть:
    А. идем не слишком быстро на концевик
    Б. там обнуляем всё
    В. уезжаем на начальную позицию. Привод откл, чтобы не грелся зря.

  2. Жмем кнопку Старт. Включается слежение.

  3. Запускаем печать, с компа или как там.

  4. по окончании печати жмем кнопку СТОП.

  5. Привод едет опять на начальную позицию. Привод откл.

  6. Мы готовы опять к печати.

Посмотрите, пойдет такая логика? Что добавить/изменить?

для начала я сниму коротенькое видио как сейчас работает принтер .
поставлю первую прошивку . хочется очень короткое видио но не знаю как все там разместить .
далее по пунктам отпишу .

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

загружаются две части неудачного , как всегда видио .
ютуб пишет часа три нужно .

Теперь по первому пункту .

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

#include <avr/wdt.h> 
#define limitPin    9
#define ENABLE_PIN  8
#define button2     5

void setup(){                
Serial.begin(115200);
pinMode(5, INPUT_PULLUP);
pinMode(ENABLE_PIN , OUTPUT);
pinMode(9, INPUT_PULLUP);
 
}

uint32_t timer = 0;
void(* resetFunc) (void) = 0;
const int STEP_PIN = 4;
const int DIR_PIN = 7;
const int R360 = 200;                        


void reboot() {                                // функция  сторожевого таймера
  wdt_disable();
  wdt_enable(WDTO_15MS);
  while (1) {}
}
void loop() {
 

    if (!digitalRead(5)) {                         // кнока ухода в нулевое положеия 
      digitalWrite(ENABLE_PIN, LOW);   
	  digitalWrite(DIR_PIN, HIGH); 
      for (int i = 0; (!digitalRead(9)) < 1; i++) {                 
      digitalWrite(STEP_PIN, HIGH);
      delayMicroseconds(500);
      digitalWrite(STEP_PIN, LOW);
      }
	}

  

    
    if (!digitalRead(9)) {	                      //pin коцевика
       digitalWrite(ENABLE_PIN, LOW);        
      digitalWrite(DIR_PIN, LOW);
	    for (int i = 0; i < R360; i++) {                
      digitalWrite(STEP_PIN, HIGH);
      delayMicroseconds(1000);                  // скорость отьеда от limit
      digitalWrite(STEP_PIN, LOW);
      }
      { delay(1000);
      reboot();                                 // сброс таймера
      }
    }
}
 


Па второму пункту тоже согласен но лучше его реализовать без кнопки
в первой части , раз мы нажали кнопку 5 значит мы приготовились к печати
стол уезжает в нулевое положения . обнулился и включилось слежения и все это делает кнопка 5
а слежения дописать нужно вместо ребута в этом блоке .
if (!digitalRead(9)) {

Третий пункт самый важный . .
Запускаем печать, с компа . принтер готов идет на печать
принтер подготавливается к печати
что в этот момент происходит .
принтер начинает крутить энкодер назад и стол тоже едет назад ,
этот этап нужно заблокировать .
когда этот этап закончится int Y -
Y = (нужно выставить число шагов энкодера сколько пропускаем)
он перейдет к следующему этапу
начнет крутить вперед подведя бумагу к начвлу печати
и этот момент наверное блокируем int Y+ тоже выставить число имп. энкодера

далее он еще в этот момент продвинет головку к печати и тут нужно будет включить pin на который будет подвязана кнопка датчика бумаги .

Кнопка нажалась пошла печать . отчет пошел 300мм X ИМП,ENC
пункт 4
жать ничего не надо
по окончании печати inc стоп печать 300 мм X ИМП,ENC PIN датчика бумвги отключить
что произойдет .
печать сразу закончится
энкодер перестает крутиться а с ним и мотор все остановилось но он принтер следом выбросит стол вперет как бумагу но и этот момент нужно блокировать после отпускания pin датчика бумаги .
а можно и не блокировать если не далеко он стол прокрутит .
я тут не уверен . лучше джойстиком подтяну сколько надо .

5 и 6 пункт не нужен .

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