и до печати и после печати сам доходит .
кнопку на пк нажал а дальше в автомате доходит до концевиков .
В код прерывания где условие для счёта шагов энкодера, используя логическое “И”, добавьте флаг(и объявить его volatile), разрешающий счёт энкодера.
Этот флаг поднимайте, если концевики не нажаты, и, после отхода от концевика.
я как раз об этом читаю . не знаю разберусь нет
Или просто PCINT отключите, а после отхода включите
и этот вариант ранее смотрел но пока не знаю как отключить
хотел PCINT подкинуть не существующий pin но пока не пробовал
Прерывание включаете так, стр.29
PCICR=1<<PCIE2;
Отключить будет
PCICR &= ~(1<<PCIE2);
А в вашем случае, можно даже проще
PCICR = 0;
спасибо это работает . но как будет вести при печати завтра буду завтра то есть сегодня проверять у нас уже утро все спят
если не правильно сработает грохот будет все проснуться .
я сделал так вроде все отрабатывает .
if (!digitalRead(9)) { //pin коцевика
digitalWrite(6, HIGH);
PCICR &= ~(1<<PCIE2);
digitalWrite(ENABLE_PIN, LOW);
digitalWrite(DIR_PIN, LOW);
for (int i = 0; i < R360; i++) {
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(500); // скорость отьеда от limit
digitalWrite(STEP_PIN, LOW);
}
PCICR=1<<PCIE2;
}
короткое видео о работе принтера .
работа принтера
сейчас нет джойстика и концевики подстраиваются под логику принтера а не наоборот.
//Энкодер на пинах 2, 3. Используется внутренняя подтяжка.
// volatile int enc, motor_position;
int16_t enc, motorPos;
float Kmotor = 0.294; //ПОДБИРАЕМ СООТНОШЕНИЕ МОТОР/ЭНКОДЕР
#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);
for (int i = 0; (!digitalRead(9)) < 1; i++) {
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(500);
digitalWrite(STEP_PIN, LOW);
}
}
if (!digitalRead(12)) { // кнопка управляет вкл. откл датчик бумаги
}
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 концевика задний
digitalWrite(6, HIGH); // включим датчик бумаги
PCICR &= ~(1<<PCIE2); // запрет прерывания энкодера
//delay(2);
digitalWrite(ENABLE_PIN, LOW);
digitalWrite(DIR_PIN, LOW);
for (int i = 0; i < R360; i++) { //дистанция отьезда от коцевика
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(500); // скорость отьезда от limit
digitalWrite(STEP_PIN, LOW);
}
PCICR=1<<PCIE2; // разрешить прерывания энкодера
}
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; // разрешить прерывания энкодера
}
}
если вставлю код джойстика то стол начинает долбить концевики 3 раза в сек .
чем он помешал .
A = analogRead(A0); // pin joystick
if (A > 600) {
T = map(A, 600, 1123, 500, 0);
digitalWrite(7, 1);
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(T);
digitalWrite(STEP_PIN, LOW);
}
if (A < 500) {
T = map(A, 500, 0, 500, 0); // 500, 0); шкала перерасчета
digitalWrite(7, 0);
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(T);
digitalWrite(STEP_PIN, LOW);
}
отпечатал . размеры ушли . первый отпечаток совсем 1/3 отп4чатался
сделал обнулевку после прерывания стало лучше но вместо этолона 52мм стало 56мм и коэфициент не меняет размер
сейчас ставлю снпч . может что получится .
if (!digitalRead(9)) { //pin коцевика задий
digitalWrite(6, HIGH); // включим датчик бумаги
PCICR &= ~(1<<PCIE2); // запрет прерваия энкодера
//delay(2);
digitalWrite(ENABLE_PIN, LOW);
digitalWrite(DIR_PIN, LOW);
for (int i = 0; i < R360; i++) { //дистация отьезда от коцевика
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(500); // скорость отьеда от limit
digitalWrite(STEP_PIN, LOW);
}
PCICR=1<<PCIE2; // разрешить прерваия энкодера
enc =0 ;
motorPos = 0 ;
}
Пока ещё занят, видео не смотрел пока, если что, позже гляну. Может кто ещё подскажет.
- Надо отключить принтер, и, проверить, что джойстик устанавливается в 0 (т.е А >= 500 и А <= 600), если его не трогать.
- Отключать прерывание PCINT, если А > 600 и А < 500, и,
включать его, (else) если это не так
проверенно . его 0 на 562 . можно делать 580 и 540 но я оставляю запас.
об этом я не подумал . спасибо . может и сработать .сейчас попробую .
меня больше беспокоит работа с концевиками . я там поставил прерывания и теперь изображения не совпадают с этолоном
я ставил коэфициент 0.294 теперь оно особо не работает .
ругается на скобки . не знаю
A = analogRead(A0); // pin joystick
if (A > 600) {
{PCICR = 0;} else {PCICR=1<<PCIE2; }
T = map(A, 600, 1123, 500, 0);
digitalWrite(7, 1);
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(T);
digitalWrite(STEP_PIN, LOW);
}
сделал так . вроде не долбит стол концевики . но поведения странное .
тихо стал ездить . не всегда успевает доехать до места а принтер пишит нет бумаги .
поразбираюсь
A = analogRead(A0); // pin joystick
if (A > 600) {
{PCICR &= ~(1<<PCIE2);}
T = map(A, 600, 1123, 500, 0);
digitalWrite(7, 1);
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(T);
digitalWrite(STEP_PIN, LOW);
}
if (A < 500) {
{PCICR = 0;}
T = map(A, 500, 0, 500, 0);
digitalWrite(7, 0);
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(T);
digitalWrite(STEP_PIN, LOW);
}
if (A > 500 && A < 600) {
PCICR=1<<PCIE2;
}
нет . прерывания не помогли .
убрал с концевиков
enc =0 ;
motorPos = 0 ;
и стол снова бьется до упора
Воот…, а я говорил вам, что надо почитать что-нибудь по ардуино для начинающих. Скобки - основа основ, так сказать.
Спойлер
A = analogRead(A0); // pin joystick
if (A > 600) {
PCICR = 0;
T = map(A, 600, 1123, 500, 0);
digitalWrite(7, 1);
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(T);
digitalWrite(STEP_PIN, LOW);
}
else {
PCICR=1<<PCIE2;
}
И в другом условии так же
P.S. И там, кстати, 1023 вообще-то
Только прочитал #619. Норм. Только где-то надо >= и <= применить, иначе теряются 500 и 600.
Дело в том, что analogRead() довольно медленная функция, более 100мкс, а ещё map()…
Возможно, цикл loop() затягивается, и не успевает обновиться motorPos до нового шага энкодера.
Для проверки, вместо
A = analogRead(A0);
Присвойте А нулевое(для джойстика) значение
//A = analogRead(A0);
А = 560;
Слетела прошивка с ssd на ноуте.
Там на диске все.
Прошивку подходящую кмоему контролеру пока найти не удалось.
Как отремонтирую вернусь.
На крайний случай новый буду покупать.
Поставил снпч, теперь тесты стало комфортно проводить.
Выставил коэфициент 0.2945
Размеры на A4 вроде как на 100% соврадают.
Высоту головки не настраивал, не дошел еще, слишком высока пока поэтому наверное и зернистость.
Нужно мне разобраться с подачей чернил, выставить на уровень а то переливается и не всегда печатает а потом еще поиграться за слежкой за энкодером, что бы перемещением за строчками было без ошибок, может и сейчас без ошибок, понять смогу когда все будет отстроенно в плане железа.
Кирпич на пенопласте, маленькое разрешения
Здоровая пачка самец
В два прохода






