Хотел ответить, но уже почти сплю)). Завтра ещё подумаю об этом
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
Да все он правильно придумал, никаких не кратных там нет.
как другие разбираются в чужих кодах для меня очень большая загадка, видимо этим и отличается программист от не программиста )))
Сорри, видимо было непонимание.
Ок, добавим округление (+0.5ед) тогда ошибка будет в 2 раза меньше. Но 1сотка на бумаге вряд ли заметна, штатная протяжка вполне может иметь и большую погрешность.
Это должно улучшить результат. Но думается, что на ткани и с прежним алгоритмом все будет неплохо. Тем более механика этой самоделки может вносить куда большие погрешности.
0.012мм это более 2000dpi а принтер 1200dpi, всё должно быть идеально
Да. Можно убедится .
Вот результат выполнения кода из # 540
P.S. А это, как по мне , тот же код @Arduman , только я чуть по другому записал, для наглядности
потому что это ошибка округления вниз. А она то туда то сюда то ноль, макс это 1 шаг. Как попадет.
К слову, округление посередине думаю не имеет смысла тк ТС всё равно будет подстраивать по реальному. Просто сместим зачем-то на 0.5, но шаг-то тот же остается.
Остаётся @vadim72 пожелать удачи в доработке сего чудо-устройства)))
Ну как же? При расчетном ХХ.9998 ошибка практически на шаг. А при округлении посредине ХХ. 4449 = ХХ, а ХХ.5000 = ХХ+1, т.е половина шага.
Думаю его надо постоянно заблокировать, сигнал “есть бумага” чтобы был всегда. Или он там участвует в логике процесса? что-то не соображу.
Чтобы добить автоматику надо:
- четко расписать что куда подключено:
- кнопки
- концевик, где он стоит
- Где Начальная позиция печати.
- Логику работы придумать
Чтобы столик не улетал за пределы надо добавить ограничение и в программе, как только motorPos > nn останавливать.
Предлагаю такую логику:
-
включение, сброс - сразу на начальную позицию, то есть:
А. идем не слишком быстро на концевик
Б. там обнуляем всё
В. уезжаем на начальную позицию. Привод откл, чтобы не грелся зря. -
Жмем кнопку Старт. Включается слежение.
-
Запускаем печать, с компа или как там.
-
по окончании печати жмем кнопку СТОП.
-
Привод едет опять на начальную позицию. Привод откл.
-
Мы готовы опять к печати.
Посмотрите, пойдет такая логика? Что добавить/изменить?
для начала я сниму коротенькое видио как сейчас работает принтер .
поставлю первую прошивку . хочется очень короткое видио но не знаю как все там разместить .
далее по пунктам отпишу .
А кто нибудь может мне объяснить, зачем считать шаги энкодера, если смещение всегда на одно и тоже расстояние и это расстояние известно ?
загружаются две части неудачного , как всегда видио .
ютуб пишет часа три нужно .
Теперь по первому пункту .
Все верно и это я реализовал в первую очередь . так оно и работало
в видео есть этот кусок .
я делал таким кодом . все лишнее для наглядности удалил
ребут был нужен для перезагрузки ардуино раньше а то из за джостика итд точность терялась . я не стал разбираться долго и поставил ребут библиотеку . здесь она не нужна будет. наверное .
#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 посмотрите печать может что и яснее будет .
видио как загрузится тут ссылки будут сразу как обычно .