собрал код для проверке без джойстика что бы проверить работоспособность и печать .
при нажатии на печать . стол едет очень тихо вперед и принтер говорит нет бумаги . так как что бы датчик бумаги был задействован нужно следить за энкодером .
как это должно быть .
стол едет вперед примерно до 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 тоже самое