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

Извините…

1 лайк

далее . поменял полюсы батарейки .

if(EncCur == 2) 
            enc--;
          else                          
            enc++; 

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

далее .
прикрутил джойстик . вроде не мешает печати .это работает.
что делать с концевиком .
раньше так же было . но я нашел метод все сгладить до очень хорошо . тут это не работает .
стол за 1. сек врезается раз 5-8.
он видимо считывает энкодер и ему по барабану что под програма флаг не подняла . а может прикрутить флаг?

Сейчас занят, глянул мельком.

Спойлер
void loop() {
    if (!digitalRead(9)) {	                      //pin коцевика задий
      digitalWrite(6, HIGH);                     // включим датчик бумаги
       digitalWrite(ENABLE_PIN, LOW);        
      digitalWrite(DIR_PIN, LOW);
	    for (int i = 0; i < 2600; i++) {           //дистация отьезда от коцевика        
      digitalWrite(STEP_PIN, HIGH);
      delayMicroseconds(70);                  // скорость отьеда от limit
      digitalWrite(STEP_PIN, LOW);
      
      }  

Ведь было уже что-то подобное.
Надо просто выключать PCINT

PCINT прерывания тогда не помогли
помогло тогда комплекс вместе с этим
i < 2800 и подгонка микросек .

enc =0 ;
      motoPos = 0 ;

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

//Энкодер на пинах 2, 3. Используется внутренняя подтяжка.
// volatile int enc, motor_position;
  byte flag =0;
  float K = 3; //ПОДБИРАЕМ СООТНОШЕНИЕ МОТОР/ЭНКОДЕР
  volatile int32_t enc = 0;
  volatile int32_t motoPos = 0;
  volatile int32_t motoPosPrev = 0;
  volatile float temp = 0.0;
  volatile float rem = 0.0;
  const int STEP_PIN = 4;
  const int DIR_PIN = 7;
  const int ENABLE_PIN = 8;
  const int R360 = 600;                         //limit шагов на полный оборот;
  int knopka=0;
  int T = 1;
  int A = 560;
  
#define limitPin1    9
#define limitPin    10
#define button1   12
#define button2     5
#define mosfet     6             // mosfet и датчик бумаги

void setup(){                
  pinMode(2,INPUT_PULLUP);
  pinMode(3,INPUT_PULLUP);
  pinMode(ENABLE_PIN , OUTPUT);
  pinMode(5, INPUT_PULLUP);
  pinMode(9, INPUT_PULLUP);
  pinMode(10, INPUT_PULLUP);
  pinMode(12, INPUT_PULLUP);
  pinMode(6, OUTPUT);
  pinMode(A0,INPUT_PULLUP);
  digitalWrite(ENABLE_PIN, 0); //пока включим драйвер на постоянку, чтобы не было пропусков

  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) 
            enc--;
          else                          
            enc++;      
      
//======================================
  temp = enc * K;//
   motoPos = temp;
   rem += temp - motoPos;
  if(rem >= 1.0)
   {
     motoPos++;
     rem -= 1.0;
   }
   
   if(motoPos > motoPosPrev)Step(true,(uint8_t)(motoPos - motoPosPrev));
   if(motoPos < motoPosPrev)Step(false,(uint8_t)(motoPosPrev - motoPos)); 
  motoPosPrev = motoPos; 

//======================================
      }
      EncPrevPrev = EncPrev;                           //сохранение пред-предыдущего состояния
      EncPrev = EncCur;                                //сохранение предыдущего состояния
    }
}
   

void Step(bool dir, uint8_t steps) //шаг в + или -, кол-во шагов
{
  digitalWrite(DIR_PIN,dir);
  while(steps--)
  {
  digitalWrite(STEP_PIN, HIGH);
  delayMicroseconds(2);
  digitalWrite(STEP_PIN, LOW);
  }
}


void loop() {
    if (!digitalRead(9)&& flag==0) {	                      //pin коцевика задий
      digitalWrite(6, HIGH);                     // включим датчик бумаги
       digitalWrite(ENABLE_PIN, LOW);        
      digitalWrite(DIR_PIN, LOW);
	    for (int i = 0; i < 2600; i++) {           //дистация отьезда от коцевика        
      digitalWrite(STEP_PIN, HIGH);
      delayMicroseconds(50);                  // скорость отьеда от limit
      digitalWrite(STEP_PIN, LOW);
      
      }  
      enc =0 ;
      motoPos = 0 ;
      flag=1;
    }


   if (!digitalRead(10)&& flag==0) {	                      //pin коцевика передий
      digitalWrite(6, LOW);                        // отключим датчик бумаги
       digitalWrite(ENABLE_PIN, LOW);        
      digitalWrite(DIR_PIN, HIGH);
	    for (int i = 0; i < 1600; i++) {           //дистация отьезда от коцевика     
      digitalWrite(STEP_PIN, HIGH);
      delayMicroseconds(40);                  // скорость отьеда от limit
      digitalWrite(STEP_PIN, LOW);
      }
      enc =0 ;
      motoPos = 0 ;
      flag=1;
    }

    if(digitalRead(12)==LOW&&knopka==0){
      digitalWrite(ENABLE_PIN, HIGH);
       delay(50);
       knopka++;
       digitalWrite(6, !digitalRead(6));   // вкл. или откл  mosfet и датчик бумаги
       }
       if(digitalRead(12)==HIGH&&knopka==1){
       knopka=0;
     }

     if (!digitalRead(5)) {             //  ЕДЕМ ВЕРЕД 
    digitalWrite(ENABLE_PIN, LOW);
    enc =0 ;
      motoPos = 0 ;
   }

   A = analogRead(A0);                           //  pin joystick
    if (A > 650) {
      T = map(A, 650, 1123, 100, 0);
      digitalWrite(7, 1);
      digitalWrite(ENABLE_PIN, LOW);
      digitalWrite(STEP_PIN, HIGH);
      delayMicroseconds(T);
      digitalWrite(STEP_PIN, LOW);
    }


    if (A < 480) {
      T = map(A, 480, 0, 100, 0);                 // 500, 0); шкала перерасчета 
      digitalWrite(7, 0);
      digitalWrite(ENABLE_PIN, LOW);
      digitalWrite(STEP_PIN, HIGH);
       delayMicroseconds(T);
       digitalWrite(STEP_PIN, LOW);
    }


}

прерывания работают в купе с обнулением
теперь в концевик не бьется стол по несколько раз .

if (!digitalRead(9)) {	                      //pin коцевика задий
       PCICR=0;
      digitalWrite(6, HIGH);                     // включим датчик бумаги
       digitalWrite(ENABLE_PIN, LOW);        
      digitalWrite(DIR_PIN, LOW);
	    for (int i = 0; i < 2600; i++) {           //дистация отьезда от коцевика        
      digitalWrite(STEP_PIN, HIGH);
      delayMicroseconds(200);                  // скорость отьеда от limit
      digitalWrite(STEP_PIN, LOW);
      
      }
        
      enc =0 ;
      motoPos = 0 ;
      PCIFR=PCIF2; PCICR=1<<PCIE2;
    }

но далее отехав от концевика происходит заминка на 1сек истерика стола.
видимо temp досылает и стол не знает что дальше делать .
за 1 сек дернется несколько раз и на печать не попадает там где рисунок был запланирован
если в середине он его отпечатает вначале .
сегодня уже 4 ночи завтра продолжу .

Надо начать сначала. Взять чистый код из #576, без ничего.
Проверить все назначения пинов, может что в железе изменилось, и, пробовать печать. Без джойстика и др.
Датчик подачи бумаги как-то замкнуть , как вы делали раньше.
Если не заработает одна печать - нет смысла двигаться дальше.
Сам проверял этот код на симуляторе, работал нормально

в этом не было необходимости . когда видно что код рабочий то мы шаг за шагом идем за ним править его под себя .
так все и было это видно с последних трех постов я за часа четыре все поправил но уперся в что то что понять ни смог .
сегодня прочитав ваш крайний пост взглянув на принтер подумал рано тебя еще разбирать я с почты детали для принтера еще не забрал .
выписывал переходники шлейфы модули итд что бы до конца запихать все во внутрь .
как то не хотелось разбирать принтер .
рукой стол подергал норм .
прогнал его от начала и до конца хотел а еле смог .
в том месте где вчера он себя странно вел я еле рукой протащил .
заглянув в щель салазок а там кусок толстой ленты которой я к стенке провода клеил типа скоча .
кто знает штука хорошая и удобная вместо двухстороннего скоча.
гидроизоляция санузлов от николь .
одна из этих полосок держав связку проводов наполовину оторвалась . ее каретка видимо вырывала под ней эта связка проходила .
в общем поковырялся достал все . вроде как не разбирая . лень .
проверил дальше почти все норм .
сделав десяток отпечатков полоски подогнал коэфициент к размеру отпечатка float K = 3.39; полоска 200мм примерно соответствовала тем же 200мм длинны я с линейкой через лупу
проверил .
точнее будет результат когда фото отпечатаю и на большом экране буду рассматривать .
сейчас пока нет возможности так напечатать . снпч снова наверное краски налила и печать полосит .
я сделал процедуру как в тот раз бумаги туалетной положил под головку она хорошо лишнюю краску с воздухом вытягивает . нужно ждать пару часиков.
и еще когда принтер идет на печать всю дорогу идет звук от мотора что он чем то другим еще занят но это и раньше еще было до того скейча что стоял там тоже джойстик был а
в скейчи позавчерашнем звук этот нельзя было услышать там джойстик не давал печать реализовать .
еще . что я поменял в коде enc- enc+ как бы это не правильно хоть и работает . хочется вернуть на место enc а в коде dir сменить полярность .
пока все что заметил . дольше буду тестить . искать причину этого звука .

//Энкодер на пинах 2, 3. Используется внутренняя подтяжка.
// volatile int enc, motor_position;
  byte flag =0;
  float K = 3.39; //ПОДБИРАЕМ СООТНОШЕНИЕ МОТОР/ЭНКОДЕР
  volatile int32_t enc = 0;
  volatile int32_t motoPos = 0;
  volatile int32_t motoPosPrev = 0;
  volatile float temp = 0.0;
  volatile float rem = 0.0;
  const int STEP_PIN = 4;
  const int DIR_PIN = 7;
  const int ENABLE_PIN = 8;
  const int R360 = 600;                         //limit шагов на полный оборот;
  int knopka=0;
  int T = 1;
  int A = 560;
  
#define limitPin1    9
#define limitPin    10
#define button1   12
#define button2     5
#define mosfet     6             // mosfet и датчик бумаги

void setup(){                
  pinMode(2,INPUT_PULLUP);
  pinMode(3,INPUT_PULLUP);
  pinMode(ENABLE_PIN , OUTPUT);
  pinMode(5, INPUT_PULLUP);
  pinMode(9, INPUT_PULLUP);
  pinMode(10, INPUT_PULLUP);
  pinMode(12, INPUT_PULLUP);
  pinMode(6, OUTPUT);
  pinMode(A0,INPUT_PULLUP);
  digitalWrite(ENABLE_PIN, 0); //пока включим драйвер на постоянку, чтобы не было пропусков

  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) 
            enc--;
          else                          
            enc++;      
      
//======================================
  temp = enc * K;//
   motoPos = temp;
   rem += temp - motoPos;
  if(rem >= 1.0)
   {
     motoPos++;
     rem -= 1.0;
   }
   
   if(motoPos > motoPosPrev)Step(true,(uint8_t)(motoPos - motoPosPrev));
   if(motoPos < motoPosPrev)Step(false,(uint8_t)(motoPosPrev - motoPos)); 
  motoPosPrev = motoPos; 

//======================================
      }
      EncPrevPrev = EncPrev;                           //сохранение пред-предыдущего состояния
      EncPrev = EncCur;                                //сохранение предыдущего состояния
    }
}
   

void Step(bool dir, uint8_t steps) //шаг в + или -, кол-во шагов
{
  digitalWrite(DIR_PIN,dir);
  while(steps--)
  {
  digitalWrite(STEP_PIN, HIGH);
  delayMicroseconds(2);
  digitalWrite(STEP_PIN, LOW);
  }
}


void loop() {
    if (!digitalRead(9)) {	                      //pin коцевика задий
       PCICR=0;
      digitalWrite(6, HIGH);                     // включим датчик бумаги
       digitalWrite(ENABLE_PIN, LOW);        
      digitalWrite(DIR_PIN, LOW);
	    for (int i = 0; i < 2200; i++) {           //дистация отьезда от коцевика        
      digitalWrite(STEP_PIN, HIGH);
      delayMicroseconds(100);                  // скорость отьеда от limit
      digitalWrite(STEP_PIN, LOW);
      
      }
        
      enc =0 ;
      motoPos = 0 ;
      PCIFR=PCIF2; PCICR=1<<PCIE2;
    }


   if (!digitalRead(10)&& flag==0) {	                      //pin коцевика передий
      PCICR=0;
      digitalWrite(6, LOW);                        // отключим датчик бумаги
       digitalWrite(ENABLE_PIN, LOW);        
      digitalWrite(DIR_PIN, HIGH);
	    for (int i = 0; i < 1000; i++) {           //дистация отьезда от коцевика     
      digitalWrite(STEP_PIN, HIGH);
      delayMicroseconds(200);                  // скорость отьеда от limit
      digitalWrite(STEP_PIN, LOW);
      }
      enc =0 ;
      motoPos = 0 ;
      PCIFR=PCIF2; PCICR=1<<PCIE2;
    }

    if(digitalRead(12)==LOW&&knopka==0){
      digitalWrite(ENABLE_PIN, HIGH);
       delay(50);
       knopka++;
       digitalWrite(6, !digitalRead(6));   // вкл. или откл  mosfet и датчик бумаги
       }
       if(digitalRead(12)==HIGH&&knopka==1){
       knopka=0;
     }

     if (!digitalRead(5)) {             //  ЕДЕМ ВЕРЕД 
    digitalWrite(ENABLE_PIN, LOW);
    enc =0 ;
      motoPos = 0 ;
   }

   A = analogRead(A0);                           //  pin joystick
    if (A > 650) {
      T = map(A, 650, 1123, 100, 0);
      digitalWrite(7, 1);
      digitalWrite(ENABLE_PIN, LOW);
      digitalWrite(STEP_PIN, HIGH);
      delayMicroseconds(T);
      digitalWrite(STEP_PIN, LOW);
    }


    if (A < 480) {
      T = map(A, 480, 0, 100, 0);                 // 500, 0); шкала перерасчета 
      digitalWrite(7, 0);
      digitalWrite(ENABLE_PIN, LOW);
      digitalWrite(STEP_PIN, HIGH);
       delayMicroseconds(T);
       digitalWrite(STEP_PIN, LOW);
    }


}

Чтобы сменить направление dir, надо поменять местами true и false:

БЫЛО

if(motoPos > motoPosPrev)Step(true,(uint8_t)(motoPos - motoPosPrev));
   if(motoPos < motoPosPrev)Step(false,(uint8_t)(motoPosPrev - motoPos)); 

СДЕЛАТЬ

 if(motoPos > motoPosPrev)Step(false,(uint8_t)(motoPos - motoPosPrev));
   if(motoPos < motoPosPrev)Step(true,(uint8_t)(motoPosPrev - motoPos));

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

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

       if(EncCur == 2) 
            enc--;
          else                          
            enc++;      
      
//======================================
  temp = enc * K;//
   motoPos = temp;
   rem += temp - motoPos;

temp = enc * K;// наверное должен начаться не в функции слежения и сравнения энкодера а здесь

}
      EncPrevPrev = EncPrev;                           //сохранение пред-предыдущего состояния
      EncPrev = EncCur;                                //сохранение предыдущего состояния
    }
}

//======================================
  temp = enc * K;//
   motoPos = temp;

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

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

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


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

}
      EncPrevPrev = EncPrev;                           //сохранение пред-предыдущего состояния
      EncPrev = EncCur;                                //сохранение предыдущего состояния
    }
}

Вряд ли. Там где изменяется значение enc, там и находится

Если обнулять, то уже полностью:

EncPrev , EncPrevPrev //придётся убрать из прерывания и сделать глобальными и volatile
а так же
motoPosPrev

обнуления стоят на концевиках .
поставил старый код все работает .ну кроме джойстика и звук удержания пропал

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

//Энкодер на пинах 2, 3. Используется внутренняя подтяжка.
// volatile int enc, motor_position;
  int16_t enc, motorPos; 
  float Kmotor = 0.2945; //ПОДБИРАЕМ СООТНОШЕНИЕ МОТОР/ЭНКОДЕР


#define ENABLE_PIN  8
#define limitPin1    9
#define limitPin    10
#define button1   12
#define button2     5
#define mosfet     6             // mosfet и датчик бумаги 


void setup(){                
  Serial.begin(115200);
  pinMode(2,INPUT_PULLUP);
  pinMode(3,INPUT_PULLUP);
  pinMode(ENABLE_PIN , OUTPUT);
  pinMode(5, INPUT_PULLUP);
  pinMode(9, INPUT_PULLUP);
  pinMode(10, INPUT_PULLUP);
  pinMode(12, INPUT_PULLUP);
  pinMode(6, OUTPUT);
  pinMode(A0,INPUT_PULLUP);
  digitalWrite(ENABLE_PIN, 0); //пока включим драйвер на постоянку, чтобы не было пропусков

  PCIFR=PCIF2; PCICR=1<<PCIE2;               //разрешить прерывание
  PCMSK2=1<<PCINT18 | 1<<PCINT19;            //выбрать вход на котором сработает прерывание 
}






const int STEP_PIN = 4;
const int DIR_PIN = 7;
const int R360 = 600;                         //шагов на полный оборот
int knopka=0;
byte flag =0;
int T = 1;
int A = 560;



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) 
            enc++; 
            
          else                          
            enc--;      
      }
   
      EncPrevPrev = EncPrev;                           //сохранение пред-предыдущего состояния
      EncPrev = EncCur;                                //сохранение предыдущего состояния
    }
    if (digitalRead(5)) {         
      MoveLoop(); 
      }
}



void Step(bool Dir) //шаг в + или -
{
  if(Dir) {digitalWrite(DIR_PIN,0); motorPos++; } else {digitalWrite(DIR_PIN,1); motorPos--; } //направление шага
  //делаем шаг:
  
  digitalWrite(STEP_PIN, HIGH);
  delayMicroseconds(1);
  digitalWrite(STEP_PIN, LOW);
}


  void MoveLoop(){
  int16_t deltaPos = enc-((int16_t) motorPos * Kmotor);
  if(deltaPos>=  1) Step(1); // надо делать шаг +
  if(deltaPos<= -1) Step(0); // надо делать шаг -
}




void loop() {

     


      
    if(digitalRead(12)==LOW&&knopka==0){
       delay(50);
       knopka++;
       digitalWrite(6, !digitalRead(6));   // вкл. или откл  mosfet и датчик бумаги
       }
       if(digitalRead(12)==HIGH&&knopka==1){
       knopka=0;
     }
    



   if (!digitalRead(9)) {	                      //pin коцевика задий
      PCICR=0;
      digitalWrite(6, HIGH);                     // включим датчик бумаги
       digitalWrite(ENABLE_PIN, LOW);        
      digitalWrite(DIR_PIN, LOW);
	    for (int i = 0; i < 2800; i++) {           //дистация отьезда от коцевика        
      digitalWrite(STEP_PIN, HIGH);
      delayMicroseconds(100);                  // скорость отьеда от limit
      digitalWrite(STEP_PIN, LOW);
      
      } 
       PCICR=1<<PCIE2;   
      enc =0 ;
      motorPos = 0 ;
    }


   if (!digitalRead(10)) {	                      //pin коцевика передий
      digitalWrite(6, LOW);                        // отключим датчик бумаги
        PCICR &= ~(1<<PCIE2);                     // запрет прерваия энкодера  
       //delay(2);
       digitalWrite(ENABLE_PIN, LOW);        
      digitalWrite(DIR_PIN, HIGH);
	    for (int i = 0; i < 1200; i++) {           //дистация отьезда от коцевика     
      digitalWrite(STEP_PIN, HIGH);
      delayMicroseconds(500);                  // скорость отьеда от limit
      digitalWrite(STEP_PIN, LOW);
      }
      PCICR=1<<PCIE2;                           // разрешить прерваия энкодера 
      enc =0 ;
      motorPos = 0 ;
    } 

   A = analogRead(A0);                //  pin joystick                      
    if (A > 650) {
      T = map(A, 650, 1123, 500, 0);
      digitalWrite(7, 1);
      digitalWrite(ENABLE_PIN, LOW);
      digitalWrite(STEP_PIN, HIGH);
      delayMicroseconds(T);
      digitalWrite(STEP_PIN, LOW);
    }
    if (A < 480) {
      T = map(A, 480, 0, 500, 0);                 // 500, 0); шкала перерасчета 
      digitalWrite(7, 0);
      digitalWrite(ENABLE_PIN, LOW);
      digitalWrite(STEP_PIN, HIGH);
       delayMicroseconds(T);
       digitalWrite(STEP_PIN, LOW);
    }
	
}

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


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

все работает но если та часть которую я убрал из LOOP и
положил в void MoveLoop() то не верно печатает ровна также с накладками как и в коде у Дим-мычъ
видимо из LOOP пока не возможно уйти .
жертвую джойстиком и ушел на этот я на нем много тестил и он работает правильно .

//Энкодер на пинах 2, 3. Используется внутренняя подтяжка.
// volatile int enc, motor_position;
  int16_t enc, motorPos; 
  float Kmotor = 0.2945; //ПОДБИРАЕМ СООТНОШЕНИЕ МОТОР/ЭНКОДЕР


#define ENABLE_PIN  8
#define limitPin1    9
#define limitPin    10
#define button1   12
#define button2     5
#define mosfet     6             // mosfet и датчик бумаги



void setup(){                
  Serial.begin(115200);
  pinMode(2,INPUT_PULLUP);
  pinMode(3,INPUT_PULLUP);
  pinMode(ENABLE_PIN , OUTPUT);
  pinMode(5, INPUT_PULLUP);
  pinMode(9, INPUT_PULLUP);
  pinMode(10, INPUT_PULLUP);
  pinMode(12, INPUT_PULLUP);
  pinMode(6, OUTPUT);

  digitalWrite(ENABLE_PIN, 0); //пока включим драйвер на постоянку, чтобы не было пропусков

  PCIFR=PCIF2; PCICR=1<<PCIE2;               //разрешить прерывание
  PCMSK2=1<<PCINT18 | 1<<PCINT19;            //выбрать вход на котором сработает прерывание 
}






const int STEP_PIN = 4;
const int DIR_PIN = 7;
const int R360 = 600;                         //шагов на полный оборот
int knopka=0;
int T = 10;
int A = 0;



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) 
            enc++;
            
          else                          
            enc--;      
      }
   
      EncPrevPrev = EncPrev;                           //сохранение пред-предыдущего состояния
      EncPrev = EncCur;                                //сохранение предыдущего состояния
    }
}



void Step(bool Dir) //шаг в + или -
{
  if(Dir) {digitalWrite(DIR_PIN,0); motorPos++; } else {digitalWrite(DIR_PIN,1); motorPos--; } //направление шага
  //делаем шаг:
  
  digitalWrite(STEP_PIN, HIGH);
  delayMicroseconds(1);
  digitalWrite(STEP_PIN, LOW);
}

void loop() {
  // Мотор следит за энкодером:
  int16_t deltaPos = enc-((int16_t) motorPos * Kmotor);
  if(deltaPos>=  1) Step(1); // надо делать шаг +
  if(deltaPos<= -1) Step(0); // надо делать шаг -

       if (!digitalRead(5)) {         
    
               
      digitalWrite(ENABLE_PIN, LOW);
      digitalWrite(DIR_PIN, HIGH);
      digitalWrite(STEP_PIN, HIGH);
      delayMicroseconds(50);
      digitalWrite(STEP_PIN, LOW);

      
	}


       if (!digitalRead(12)) {         // кнока управяет вкл. откл датчик бумаги 
         enc =0 ;
      motorPos = 0 ;         
      
      }
    if(digitalRead(12)==LOW&&knopka==0){
    delay(50);
    knopka++;
    digitalWrite(ENABLE_PIN, HIGH);
    digitalWrite(6, !digitalRead(6));   // вкл. или откл  mosfet и датчик бумаги
  }
  if(digitalRead(12)==HIGH&&knopka==1){
  knopka=0;
  }
    



   if (!digitalRead(9)) {	                      //pin коцевика задий
      digitalWrite(6, HIGH);                     // включим датчик бумаги
       digitalWrite(ENABLE_PIN, LOW);        
      digitalWrite(DIR_PIN, LOW);
	    for (int i = 0; i < 2600; i++) {           //дистация отьезда от коцевика        
      digitalWrite(STEP_PIN, HIGH);
      delayMicroseconds(70);                  // скорость отьеда от limit
      digitalWrite(STEP_PIN, LOW);
      
      }     
      enc =0 ;
      motorPos = 0 ;
    }


   if (!digitalRead(10)) {	                      //pin коцевика передий
      digitalWrite(6, LOW);                        // отключим датчик бумаги
        PCICR &= ~(1<<PCIE2);                     // запрет прерваия энкодера  
       //delay(2);
       digitalWrite(ENABLE_PIN, LOW);        
      digitalWrite(DIR_PIN, HIGH);
	    for (int i = 0; i < 1200; i++) {           //дистация отьезда от коцевика     
      digitalWrite(STEP_PIN, HIGH);
      delayMicroseconds(500);                  // скорость отьеда от limit
      digitalWrite(STEP_PIN, LOW);
      }
      PCICR=1<<PCIE2;                           // разрешить прерваия энкодера 
      enc =0 ;
      motorPos = 0 ;
    }
    
    
}

Попробовал печатать на старой мятой тряпки

1 лайк

скоро Дим-Димычу маечку сделанную в единственном экземпляре презентуешь видимо )))

с удовольствием но это не скоро .
нужно доделать этот прототип . далее сделать по этой же схеме нормальный принтер но уже с текстильными чернилами по ткани
A3 .

@Arduman решил вопрос