Нет , я его тогда вывел, что бы пока не путолся,
Нужно довести тестовую печать не до идеала но что бы я мог эксперементировать не отвлекаясь на чернила, железо итд. И вроде как уже нормально,
Далее вы там ранее писали что где то будут не точности, скорее всего они есть, и это вро де не головка, так как при повторении они примерно в одном и том же месте.
Если увеличить отпечаток на телевизоре видно в ередине в конце есть сбивка печати, полосы, вро де не головка, нужно будет внимательней присмотреться, и разобраться как float работает.
Далее логика, я не могу для себя понять, она меня на данный момент устраивает или нет, опыта мало.
Вроде кнопку нажал и все отпечаталось,
Повторяе ось 100%
Но как Цой пел, что то не так, а что я не могу пока сказать
Джойстик конечно помог бы в комфортной печати но вы сами сказали что дижиталрид и map
Медленные функции, я сегодня с кнопкой эксперементировал на нее садил функцию слежения за enc-- но были такие же глюки время от времени как с джойстиком и я устал с ней и тоже оставил как есть.
нет . никак не прокатывает.
пробовал по разному . и с прерываниями и без и …
если джойстик стоит и я его пошевелил то нажимая на печать стол тихонько едет на базу но доехать не успевает . принтер скажет нет бумаги .
//Энкодер на пинах 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;
int T = 0;
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); // включим датчик бумаги
PCICR = 0; // запрет прерваия энкодера
//delay(2);
digitalWrite(ENABLE_PIN, LOW);
digitalWrite(DIR_PIN, LOW);
for (int i = 0; i < 2400; i++) { //дистация отьезда от коцевика
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(140); // скорость отьеда от limit
digitalWrite(STEP_PIN, LOW);
}
PCICR=1<<PCIE2; // разрешить прерваия энкодера
enc =0 ;
motorPos = 0 ;
}
if (!digitalRead(10)) { //pin коцевика передий
digitalWrite(6, LOW); // отключим датчик бумаги
PCICR = 0; // запрет прерваия энкодера
//delay(2);
digitalWrite(ENABLE_PIN, LOW);
digitalWrite(DIR_PIN, HIGH);
for (int i = 0; i < 1200; i++) { //дистация отьезда от коцевика
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(200); // скорость отьеда от limit
digitalWrite(STEP_PIN, LOW);
}
PCICR=1<<PCIE2; // разрешить прерваия энкодера
enc =0 ;
motorPos = 0 ;
}
A = analogRead(A0); // pin joystick
if (A > 700) {
T = map(A, 700, 1123, 700, 0);
digitalWrite(7, 1);
digitalWrite(ENABLE_PIN, LOW);
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(T);
digitalWrite(STEP_PIN, LOW);
}
if (A < 520) {
T = map(A, 520, 0, 520, 0); // 500, 0); шкала перерасчета
digitalWrite(7, 0);
digitalWrite(ENABLE_PIN, LOW);
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(T);
digitalWrite(STEP_PIN, LOW);
}
if (A > 700 && A < 520) {
PCICR=1<<PCIE2;
enc =0 ;
motorPos = 0 ;
}
}
еще на концевики ставил по внешним прерываниям D9 и D10
так же хорошо работает как и с !digitalRead но так же и странно 1 в 1 или я что то не доделал .
//Энкодер на пинах 2, 3. Используется внутренняя подтяжка.
// volatile int enc, motor_position;
int16_t enc, motorPos;
float Kmotor = 0.2945; //ПОДБИРАЕМ СООТНОШЕНИЕ МОТОР/ЭНКОДЕР
#define ENABLE_PIN 8
#define limit1 9
#define limit2 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; //выбрать вход на котором сработает прерывание
PCMSK0=1<<PCINT1;
PCMSK0=1<<PCINT2;
}
volatile uint8_t state = 0;
const int STEP_PIN = 4;
const int DIR_PIN = 7;
const int R360 = 600; //limit шагов на полный оборот;
int knopka=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);
}
ISR (PCINT0_vect) { // Обработчик запросов прерывания от пинов D8..D13
static char statePrev=0; //предыдущее состояние энкодера
char stateCur = 0;
if(!(PINB & (1 << PB1))){stateCur = 1;} //опрос фазы 1 энкодера
}
void loop() {
// Мотор следит за энкодером:
int16_t deltaPos = enc-((int16_t) motorPos * Kmotor);
if(deltaPos>= 1) Step(1); // надо делать шаг +
if(deltaPos<= -1) Step(0); // надо делать шаг
if(!(PINB & (1 << PB1))) { // Limit D9
state = 1; // вкл. mosfet
digitalWrite(mosfet, state);
digitalWrite(ENABLE_PIN, LOW);
digitalWrite(DIR_PIN, LOW);
for (int i = 0; i < R360; i++) { //дистация отьезда от коцевика
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(70); // скорость отьеда от limit
digitalWrite(STEP_PIN, LOW);
}
}
if(!(PINB & (1 << PB2))) { // Limit D10
state = 0; // вкл. mosfet
digitalWrite(mosfet, state);
digitalWrite(ENABLE_PIN, LOW);
digitalWrite(DIR_PIN, HIGH);
for (int i = 0; i < R360; i++) { //дистация отьезда от коцевика
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(70); // скорость отьеда от limit
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(5)) { // ЕДЕМ ВЕРЕД
digitalWrite(ENABLE_PIN, LOW);
digitalWrite(DIR_PIN, HIGH);
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(50);
digitalWrite(STEP_PIN, LOW);
}
}
это вырезанная для наглядности .
только прерывания на port С на pin D8..D13
#define ENABLE_PIN 8
#define limit1 9 //
#define mosfet 6 // mosfet и датчик бумаги
void setup(){
Serial.begin(115200);
pinMode(ENABLE_PIN , OUTPUT);
pinMode(9, INPUT_PULLUP);
pinMode(6, OUTPUT);
PCIFR=PCIF2; PCICR=1<<PCIE2; //разрешить прерывание
PCMSK0=1<<PCINT1; // вход на котором сработает прерывание D9 limit
PCMSK0=1<<PCINT2; // вход на котором сработает прерывание D10
}
volatile uint8_t state = 0;
const int STEP_PIN = 4;
const int DIR_PIN = 7;
ISR(PCINT2_vect){}
ISR (PCINT0_vect) { // Обработчик запросов прерывания от пинов D8..D13
static char statePrev=0; //предыдущее состояние энкодера
static char statePrevPrev=0; //пред-предыдущее состояние энкодера
char stateCur = 0;
if(!(PINB & (1 << PB1))){stateCur = 1;} //опрос фазы 1 энкодера
}
void loop() {
if(!(PINB & (1 << PB1))) { // Изменился D9
state = 1; // вкл. mosfet
digitalWrite(mosfet, state);
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);
}
}
}
на печать уходит с макс. скоростью джойстика .
быстрее чем было и меня бы это устроило . если бы это работало
при подходе к головки . начинается печать и стол не останавливается . просто мимо проезжает к выходу .
я сейчас проверю работу в отдельной функции сделать .
void Joi()
это с любыми изменениями я так делаю в первую очередь.
но сделал все по пунктам .
без кода . печать норм .
с кодом не трогая джойстик нет печати . все стало медленно . выше про это писал
я примерно знаю вчем дело .
я писал об этом . месяц назад
причина в прерывании порта D
мой пор как то влияет на соседний так как в нем общие регистры для всех портов вроде 1
PCIFR=PCIF2; PCICR=1<<PCIE2;
джойстик можно вернуть вроде как добавить в каждый блок
motorPos++
тогда все ездило но джойстик превращается в кнопку вперед назад с одинаковой максимальной скоростью .
if (A < 520) {
T = map(A, 520, 0, 520, 0); // 500, 0); шкала перерасчета
digitalWrite(7, 0);
digitalWrite(ENABLE_PIN, LOW);
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(T);
digitalWrite(STEP_PIN, LOW);
motorPos++
}