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

О чём это?

Ещё раз попытаюсь: пока Вы не выложите полную схему устройства (хотя-бы ручкой, от руки) и не опишете по- пунктам, как должно работать устройство, никто вам помочь не сможет.
Не только мне не понятно, вот и sadman41 пишет-

А уж он-то много чего знает…

Если что - в строке

Написано:
Присвоить переменной enc , значение переменной ST из диапазона 0…1600, переведённое в диапазон значений 0…600. После этого, уменьшить ST на 1.
Так и задумано?

Зачем это вообще, когда выше уже есть

  if(EncCur == 2)          //если текущее состояние 2,
        enc++;            //шаг вверх
      else                          //иначе
        enc--;            //шаг вниз
    }

Может надо так?

ST = map(enc, (диапазон enc),(диапазон ST));

Присвоить переменной enc , значение переменной ST это да а с картой я не разобрался .
1600 это шд. на оборот
600 это импульсы энкодера на оборот .
переменные я записал сюда
volatile long int enc , ST = enc/1.04;

я не знаю пока можно ли это под настроить или эта туфта
и импульс шд зависит только от STEP .
“”"
digitalWrite(STEP_PIN, HIGH);
// delayMicroseconds(1);
digitalWrite(STEP_PIN, LOW);
“”"
если от step без пересчета то это не верно .
но на маниторе видно что значения меняются

В прерывании вы получаете значение энкодера enc. Затем надо это значение масштабировать до ШД - ST.
Если это так - то см#123 и , главное , #122(схема, описание)))

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

где это посмотреть ? это номер строки в коде ? в каком ?

Мой пост выше #123

сейчас в фотошопе попытаюсь на скорую руку показать

Ну что ж, жалкое подобие схемы есть, и то хорошо. Теперь надо

К, примеру , вопрос: что управляет/крутит энкодером? Что вращает ШД?

что управляет/крутит энкодером
это на фото есть , ранее выложил но требует пояснения .

фото 1

Энкодером управляет вращения энкодер принтера , они на одном валу через муфту задействованы .

(Отмету напрашиваемый вопрос .
Почему не задействовать выводы от энкодера принтера напрямую ?
Все просто , там нужно найти encA и encB ,
Не подсказывайте как найти .
Нужно еще припаять . )
Будем считать что у меня энкодер принтера соединен encA и encB
через PIN2 ,PIN3 .
Так оно и есть.
ШД. Управляет драйвер A4988 с делителем 1/8 , 200 на 8=1600 шагов .
в коде импульсы дает STEP_PIN больше некому дать
других импульсов на шаг я не знаю .
“”"
digitalWrite(STEP_PIN, HIGH);
// delayMicroseconds(1);
digitalWrite(STEP_PIN, LOW);
“”"
я вчера это все подробно расписал .

нужно когда вращается энкодер , я через переменную смог подставить число от которого зависит количество оборотов кШД.
по отношению к энкодеру .
То есть число импульсов энкодера поделить на число импульсов ШД.
int ST = enc/3; // ST это число переменная отвечающая на подачу шага , 3 это мое подборочное число которое я впишу для совпадения нужной передачи .
“”"
digitalWrite(STEP_PIN, HIGH);
// delayMicroseconds(1);
digitalWrite(STEP_PIN, LOW);
“”"
Я не знаю как еще мне обьяснить как это работает .

Начинаю понимать вроде))
На соседнем столе стоит ещё один , обычный принтер.
Вы пытаетесь ОН-ЛАЙН, так сказать “перехватить”
его работу , но распечатать рисунок своими средствами.

Если это так, то задача не очень простая, т.к. может не хватить скорости вычислений проца.
Поэтому, я уже выше говорил, (#113) нужно, чтобы число шагов ШД было физически кратно числу шагов энкодера.
А в коде , на каждый шаг энкодера сразу прибавляем нужное количество шагов ШД.
Например, одному шагу энкодера соответствует 3 шага ШД.
Тогда вместо
enc++;//значение энкодера увеличилось на 1
сразу пишем(и сразу выполняем)
ST +=3;//значит делаем 3 шага ШД

Вроде этого (упрощённо):
while(ST–)
{
digitalWrite(STEP_PIN, HIGH);
// delayMicroseconds(1);
digitalWrite(STEP_PIN, LOW);
}

Тебе нужно посчитать коэффициент редукции механического редуктора, а потом посчитать с его учётом и дискретностью энкодера + дискретность двигателя, коэффициент электронного редуктора.
Зубья на шестернях считай и первый коэффициент рассчитывай. С электронным редуктором поможем.

В Гугле не забанили ? Найдешь как рассчитать коэффициент редукции ?

Делитель мне кажется немножко другое делает. Он аппаратный. Сигнал STEP на оборот должен выдать 200 импульсов. 1600 это уже драйвер выдаёт что бы шаговик крутился мягче?

nik182, ты заблуждаешься.
Делитель делит полный шаг на части.
Если с делителем 1, при одном импульсе двигателя с базовыми 200шагов/об, вал повернется на 1.8°, то с делителем 2 на 0.9°. Ну в общем на градус равный выражению 360°/(200шагов*делитель).
Там тупо происходит переключение обмоток, без делителя сразу меандр, с делителем через ШИМ на шаг дискретности. А дискретность задаётся делителем.

почитал коментарии , и сложилось мнения что вы начали понимать об устройстве но на половину а что я хочу на 20%
и наверное у меня остался один выход сделать видио где буду подробно как умею излагать . у меня обычно это плохо получается .

далее
у меня ранее передача была"“” ST = enc/1.04"“” и это вроде как печатало в размер а также ST = enc/2.4
смотря где эти строки встроены .
я оставлю передачу 1.04 .

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

ST 1367   enc 1313   ST 1368   enc 1314   ST 1368   enc 1314   ST 1368   enc 1314   ST 1368   enc 1314   ST 1369   enc 1314   ST 1369   enc 1314   ST 1369   enc 1314   ST 1369   enc 1314   ST 1370   enc 1315   ST 1370   enc 1315   ST 1370   enc 1315   ST 1370   enc 1315   ST 1371   enc 1316   ST 1371   enc 1316   ST 1371   enc 1316   ST 1371   enc 1316   ST 1371   enc 1316   ST 1371   enc 1316   ST 1371   enc 1316   ST 1372   enc 1317   ST 1372   enc 1317   ST 1372   enc 1317   ST 1373   enc 1318   ST 13

если взять два числа рядом
ST 1367 разделить на enc 1313 получим 1.04…

volatile long int enc , ST;

#define ENABLE_PIN  8
const int STEP_PIN = 4;
const int DIR_PIN = 7;
int L = 0;


void setup(){                
Serial.begin(115200);
pinMode(2,INPUT_PULLUP);
pinMode(3,INPUT_PULLUP);
pinMode(ENABLE_PIN , OUTPUT);
PCIFR=PCIF2; PCICR=1<<PCIE2; //разрешить прерывание
PCMSK2=1<<PCINT18 | 1<<PCINT19; //выбрать вход на котором сработает прерывание 
}


ISR(PCINT2_vect){
static char EncPrev=0;      //предыдущее состояние энкодера
static char EncPrevPrev=0;  //пред-предыдущее состояние энкодера
  char EncCur = 0;
  
  if(!(PIND & (1 << PD2))){EncCur  = 1;} //опрос фазы 1 энкодера
  if(!(PIND & (1 << PD3))){ EncCur |= 2;} //опрос фазы 2 энкодера
  if(EncCur != EncPrev)             //если состояние изменилось,
  {
    if(EncPrev == 3 &&        //если предыдущее состояние 3
       EncCur != EncPrevPrev )      //и текущее и пред-предыдущее не равны,
    {
      if(EncCur == 2)          //если текущее состояние 2,
        enc++;                   //шаг вверх       
      else                          //иначе
        enc--;                    //шаг вниз
        if (enc < 0) {            //так надо что  бы в обратку скидывал в 0 
       enc = 0;     
    }

if (enc > 0 & enc < 6000){ 

enc  =  map (ST ++, 0, 1600, 0, 1538);
digitalWrite(STEP_PIN, HIGH);
    // delayMicroseconds(1);
digitalWrite(STEP_PIN, LOW);
}
}  
    EncPrevPrev = EncPrev;          //сохранение пред-предыдущего состояния
    EncPrev = EncCur;               //сохранение предыдущего состояния
  }
  
    Serial.print("   ST ");
    Serial.print(ST);
    Serial.print("   enc ");
    Serial.print(enc);
 
}
void loop() {

}

enc = map (ST ++, 0, 1600, 0, 1538);
как видите если диапазон
1600/ 1.04 =1538
я его и вписал и это считается если
ST поставить в переменную , я установил сюда
volatile long int enc , ST;

но поломалось отчет
так работает
if (enc > 0 & enc < 6000){
так нет . доходит до 200 и заново считает а мне нужно отчет от 200 начинать что бы стол на месте стоял пока
enc < 200
далее ставлю
ST ++
энкодер при вращении в право считает и двигает стол а в лево тоже считает и в том же направлении
мне этого не нужно
если ставлю ST -- то получаю тоже самое в обратную сторону
карта сюда плохо применима
а вот мой старый кусок кода который выполняет все идеально
все требования соблюдены

if(EncCur == 2) 
    (enc++, digitalWrite(DIR_PIN, LOW), digitalWrite(ENABLE_PIN, LOW));
    else                          
     (enc-- , digitalWrite(ENABLE_PIN, HIGH));
     if (enc < 0) { enc = 0;};
    if (enc > 300 & enc < 6000)
     for (int i = 0; i < 1.04; i++) { 
     digitalWrite(STEP_PIN, HIGH);
     delayMicroseconds(1);
     digitalWrite(STEP_PIN, LOW);}}

но посчитать
enc to SP in 1.04
не может или я не могу это записать .

что делать ? работать и чинить map
или искать еще варианты .
нужно ли видео . у меня оно всегда ужасное .

К сожалению, я не знаю, как нормально сделать , если отношение шагов ШД и энкодера - дробное число.
Если бы программа на принтере - источнике делала паузы после выполнения каждой команды, тем самым давая время всё просчитать и выполнить на втором принтере, тогда ещё другое дело. Но вряд ли это так.
Я небольшой спец в этой теме. Выше отвечали люди, более моего понимающие в этом вопросе. Возможно они помогут.

принтер и энкодер один .
с паузами было бы веселее .

вроде решил , все считывается и точно 1.04

 }
  { 
  if(EncCur == 2) 
    
      (enc++, digitalWrite(DIR_PIN, LOW), digitalWrite(ENABLE_PIN, LOW));
      
      
      else                          
        (enc-- , digitalWrite(ENABLE_PIN, HIGH));
        if (enc < 0) {
      enc = 0;}
        
      }
    if (enc > 0 & enc < 3000) { 
     for (ST = enc++/1.04; enc++ < ST; ST ++) 
      (digitalWrite(DIR_PIN, LOW), digitalWrite(ENABLE_PIN, LOW));
     digitalWrite(STEP_PIN, HIGH);
     //delayMicroseconds(1);
     digitalWrite(STEP_PIN, LOW);
     
     }
     
     } 

но буду проверять .

Принтер-аватар?