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

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

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

все это я делаю в loop . в отдельной функции это бессмысленно .
там как хочешь пиши и джойстик и печать все работает . только
кнопку 5 приходится держать для вызова этой функции void Step() и удержания ее . пока джойстиком пользуешься .

я поэтому и просил Arduman и писал и что бы он слежения не из loop сделал а в loop ничего не добавлял .
он переделал но в loop одна строка кода осталась . но я этот второй скейтч не смог запустить что то не работало .
и я пользуюсь его первым скейтчем.
если в loop попадает хоть что что намекает
я и вместо analogRead(A0) писал PCINT8 все работает но печать нет .

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

СЕЙЧАС #643

БЫЛО

Как это???

это не может работать . тут нет переменной .

так будет

void Step(){                           //  joystick
    int16_t A = analogRead(A0);//или какой там у вас пин
    //A = 550;                      
    if (A > 650) {
      T = map(A, 650, 1048, 100, 0);

и так будет

 void Step(){                           //  joystick
    int16_t A = analogRead(A0);//или какой там у вас пин
    A = 550;                      
    if (A > 650) {
      T = map(A, 650, 1048, 100, 0);

А глобальной объявить нельзя? Или дописать

Но так не надо

Задачка для детского садика. Объявить переменную, и присвоить ей значение.
Функцию analogRead() закоментировать.
Что тут сложного?

не работает

 //int16_t A = analogRead(A0);//или какой там у вас пин
    int16_t  A = 550;                       
    if (A0 > 650) {

работает но не печатает

 //int16_t A = analogRead(A0);//или какой там у вас пин
    int16_t  A = 550;                       
    if (analogRead(A0) > 650) {

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

//int16_t A = analogRead(A0);//или какой там у вас пин
    int16_t  A = 550;                       
    if (A0 > 650) {

Что не работает? Печать работает?

джойстик не двигается он же не знает что A = analogRead(A0)

//int16_t A = analogRead(A0);//или какой там у вас пин
    int16_t  A = 550;                       
    if (A0 > 650) {

а на втором я указал и написал analogRead(A0) и джой работает а печать нет.

Печать работает?

не пробовал . до этого сто раз пробовал .
если я пропишу одну строчку в loop A = analogRead(A0)
то печать не будет работать

Диммыч, ну у тебя и выдержка. Завидую. ))

2 лайка

попробовал . джой не работает а печать работает .
нужно подумать

Да, есть решение , но надо убедиться.
Эмоции пока отложил.

он давно на ремонтах серверных БП сидит )))

а ну все верно тут не прописа но же что analogRead(A0)
поэтому печать и работает .

//int16_t A = analogRead(A0);//или какой там у вас пин
    int16_t  A = 550;                       
    if (A > 650) {
      T = map(A0, 650, 1048, 100, 0);

СВЕРШИЛОСЬ!!!

Теперь стало ясно.
Пока могу предложить делать все расчёты в прерывании
см #576 самый нижний код. В loop() добавите своё, но чтоб без 4-х раз analogRead() подряд )))

Сейчас надо уходить

1 лайк

Лет 10 назад было дело немного))

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

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

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

//Энкодер на пинах 2, 3. Используется внутренняя подтяжка.
// volatile int enc, motor_position;
  
  float K = 0.2945; //ПОДБИРАЕМ СООТНОШЕНИЕ МОТОР/ЭНКОДЕР
  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;
  
#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 коцевика задий
      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);
      
      }  
    }


   if (!digitalRead(10)) {	                      //pin коцевика передий
      digitalWrite(6, LOW);                        // отключим датчик бумаги
       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);
      }
    }

    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);
    digitalWrite(DIR_PIN, HIGH);
    digitalWrite(STEP_PIN, HIGH);
    delayMicroseconds(50);
    digitalWrite(STEP_PIN, LOW);
   }

}

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

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

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

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

далее . убрал все с loop , запустил на печать . все тоже самое .
медленно но верно .

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