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

самое главное: плавный коэф работает именно плавно и дробно?
2. Не проскакивает энкодер-ШД связка?

Будет, если с делеями написан. Можно через millis(), смотреть надо.
Небольшие задержки допустимы временные, по-идее шагами потом догонит.

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

Так, например:

void MoveLoop()
{
 //в идеале запрет прерываний тут добавить..
  enc = motorPos =0; // сбросим в начале движения
 //разрешение прерываний добавить..

  while(digitalRead(button2)) // пока не нажали эту кнопку, следим-крутим:
  {
  // Мотор следит за энкодером:
    int16_t deltaPos = enc-((int16_t) motorPos * Kmotor);
    if(deltaPos>=  1) Step(1); // надо делать шаг +
    if(deltaPos<= -1) Step(0); // надо делать шаг -
  }
}


void loop() {
 if(!digitaRead(KeyStart)) 
    MoveLoop();// по какой-то кнопке запускаем слежение
  //здесь можно отключить сам привод, чтобы не грелся

 //... здесь добавляем что там ещё надо 
}

все работает вроде плавно дробно но еще тесты проведу.
энкодер-ШД связка не проскакивает , я не заметил хотя наблюдал за этим .
подготовил к тестам на печать .

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

даже на профессиональных KIP-3000(5000,7000) на большой длине есть разбег

здесь он интересен только в пределах строки, насколько я понял.

…пока не забыл: надо прикинуть, хватит ли на весь лист счетчика импульсов мотора в int16_t, это 2\15 степени, это 32000грубо.

Поменять на int32_t для верности можно если что. Прикинул: это 40 оборотов энкодера, как-то маловат запас на-глаз.

посмотрим на счетчик .
не могу пока запустить
if(!digitalRead(KeyStart)) // кнопку вписать ?

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

пока ни какой реакции что то не так

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

#include <avr/wdt.h>                    // Библиотека часть компилятора avr-gcc
#define ENABLE_PIN  8
#define limitPin1    9
#define limitPin    10
#define button2     5
#define button1     6



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(6, INPUT_PULLUP);

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

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





// uint32_t timer = 0;
// void(* resetFunc) (void) = 0;
const int STEP_PIN = 4;
const int DIR_PIN = 7;
// const int R360 = 200;                         //шагов на полный оборот
// 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 MoveLoop()
{
 //в идеале запрет прерываний тут добавить..
  enc = motorPos =0; // сбросим в начале движения
 //разрешение прерываний добавить..

  while(digitalRead(button1)) // пока не нажали эту кнопку, следим-крутим:
  {
  // Мотор следит за энкодером:
    int16_t deltaPos = enc-((int16_t) motorPos * Kmotor);
    if(deltaPos>=  1) Step(1); // надо делать шаг +
    if(deltaPos<= -1) Step(0); // надо делать шаг -
  }
}

void loop() {
 if(!digitalRead(button1)) 
    MoveLoop();// по какой-то кнопке запускаем слежение
  //здесь можно отключить сам привод, чтобы не грелся

 //... здесь добавляем что там ещё надо 
}

Да, свои кнопки вписать конечно. Они у тебя при нажатии в 0 уходят? я на это писал.
Одна - старт, другая - стоп слежения.

Лучше для начала прежний скетч использовать, который точно работает - проверить реальную печать, подобрать Коэф.

А потом уже мелкие добавки, кнопки и тп.

здесь надо button2 поставить, ей останавливать.
(иначе только стартанули сразу отключаем, тк кнопка та же)

Добавил к твоему скетчу вкл-откл привода и кнопки разные на Старт и Стоп:

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

#include <avr/wdt.h>                    // Библиотека часть компилятора avr-gcc
#define ENABLE_PIN  8
#define limitPin1    9
#define limitPin    10
#define button2     5
#define button1     6



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(6, INPUT_PULLUP);

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

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





// uint32_t timer = 0;
// void(* resetFunc) (void) = 0;
const int STEP_PIN = 4;
const int DIR_PIN = 7;
// const int R360 = 200;                         //шагов на полный оборот
// 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 MoveLoop()
{
 //в идеале запрет прерываний тут добавить..
  enc = motorPos =0; // сбросим в начале движения
 //разрешение прерываний добавить..

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

  while(digitalRead(button2)) // пока не нажали эту кнопку, следим-крутим:
  {
  // Мотор следит за энкодером:
    int16_t deltaPos = enc-((int16_t) motorPos * Kmotor);
    if(deltaPos>=  1) Step(1); // надо делать шаг +
    if(deltaPos<= -1) Step(0); // надо делать шаг -
  }

  digitalWrite(ENABLE_PIN, 1); // отключим драйвер
}

void loop() {
 if(!digitalRead(button1)) 
    MoveLoop();// по какой-то кнопке запускаем слежение

 //... здесь добавляем что там ещё надо 
}

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

1 лайк

Супер сейчас несколько сделаю



Коэфициент подгоню немного.
Главное правильно работает.

спасибо .
останавливать не надо он сам останавливается .
как у принтера выкидывает напечатанный лист а тут стол вперед выкидывает . правда с бешенной скоростью как и лист
сейчас прикручу кнопки и буду коэфициент ловить

вообще ни какой реакции энкодер мотор не крутит

Делай пока что работает, мелочевку потом.

enc = motorPos =0; // сбросим в начале движения
без этого вроде все заработало . я ее пока закоментировал

а без enc = motorPos =0
кипишь.
попробую встроить

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

Поздравляю. Как говорится: искусство не пропьёшь))

1 лайк

float Kmotor = 0.294; лучше всего и в размер совпадает, 293 пока не буду пробовать пока не распечатаю
A4.
Печатал на первом скече от того я стресс получил
Здесь печатаю так.
Печать началась, вклбчаю если успеваю ардуино, иначе стресс.

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