Извините…
далее . поменял полюсы батарейки .
if(EncCur == 2)
enc--;
else
enc++;
это не правильно но это сработало . принтер отправился на печать в верную сторону . обдолбил концевик доехал до печати .
как бы отпечатался . и поехал другой концевик долбить что бы принтер понял что стол как бумага закончилась .
нужно разбираться снова с концевиками .
нужно вернуть батарейку полюсы на место и что то в коде поменять .
нужно заного настроить float K =
и проверить джойстик .
далее .
прикрутил джойстик . вроде не мешает печати .это работает.
что делать с концевиком .
раньше так же было . но я нашел метод все сгладить до очень хорошо . тут это не работает .
стол за 1. сек врезается раз 5-8.
он видимо считывает энкодер и ему по барабану что под програма флаг не подняла . а может прикрутить флаг?
Сейчас занят, глянул мельком.
Спойлер
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);
}
Ведь было уже что-то подобное.
Надо просто выключать PCINT
PCINT прерывания тогда не помогли
помогло тогда комплекс вместе с этим
i < 2800 и подгонка микросек .
enc =0 ;
motoPos = 0 ;
вчера выкладывал в коде . здесь это не помогло .
флаг поставил . как буд то и нет его .
это происходит за 1 сек это очень быстро как рожок из узи выплюнуть .
//Энкодер на пинах 2, 3. Используется внутренняя подтяжка.
// volatile int enc, motor_position;
byte flag =0;
float K = 3; //ПОДБИРАЕМ СООТНОШЕНИЕ МОТОР/ЭНКОДЕР
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;
int T = 1;
int A = 560;
#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)&& flag==0) { //pin коцевика задий
digitalWrite(6, HIGH); // включим датчик бумаги
digitalWrite(ENABLE_PIN, LOW);
digitalWrite(DIR_PIN, LOW);
for (int i = 0; i < 2600; i++) { //дистация отьезда от коцевика
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(50); // скорость отьеда от limit
digitalWrite(STEP_PIN, LOW);
}
enc =0 ;
motoPos = 0 ;
flag=1;
}
if (!digitalRead(10)&& flag==0) { //pin коцевика передий
digitalWrite(6, LOW); // отключим датчик бумаги
digitalWrite(ENABLE_PIN, LOW);
digitalWrite(DIR_PIN, HIGH);
for (int i = 0; i < 1600; i++) { //дистация отьезда от коцевика
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(40); // скорость отьеда от limit
digitalWrite(STEP_PIN, LOW);
}
enc =0 ;
motoPos = 0 ;
flag=1;
}
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);
enc =0 ;
motoPos = 0 ;
}
A = analogRead(A0); // pin joystick
if (A > 650) {
T = map(A, 650, 1123, 100, 0);
digitalWrite(7, 1);
digitalWrite(ENABLE_PIN, LOW);
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(T);
digitalWrite(STEP_PIN, LOW);
}
if (A < 480) {
T = map(A, 480, 0, 100, 0); // 500, 0); шкала перерасчета
digitalWrite(7, 0);
digitalWrite(ENABLE_PIN, LOW);
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(T);
digitalWrite(STEP_PIN, LOW);
}
}
прерывания работают в купе с обнулением
теперь в концевик не бьется стол по несколько раз .
if (!digitalRead(9)) { //pin коцевика задий
PCICR=0;
digitalWrite(6, HIGH); // включим датчик бумаги
digitalWrite(ENABLE_PIN, LOW);
digitalWrite(DIR_PIN, LOW);
for (int i = 0; i < 2600; i++) { //дистация отьезда от коцевика
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(200); // скорость отьеда от limit
digitalWrite(STEP_PIN, LOW);
}
enc =0 ;
motoPos = 0 ;
PCIFR=PCIF2; PCICR=1<<PCIE2;
}
но далее отехав от концевика происходит заминка на 1сек истерика стола.
видимо temp досылает и стол не знает что дальше делать .
за 1 сек дернется несколько раз и на печать не попадает там где рисунок был запланирован
если в середине он его отпечатает вначале .
сегодня уже 4 ночи завтра продолжу .
Надо начать сначала. Взять чистый код из #576, без ничего.
Проверить все назначения пинов, может что в железе изменилось, и, пробовать печать. Без джойстика и др.
Датчик подачи бумаги как-то замкнуть , как вы делали раньше.
Если не заработает одна печать - нет смысла двигаться дальше.
Сам проверял этот код на симуляторе, работал нормально
в этом не было необходимости . когда видно что код рабочий то мы шаг за шагом идем за ним править его под себя .
так все и было это видно с последних трех постов я за часа четыре все поправил но уперся в что то что понять ни смог .
сегодня прочитав ваш крайний пост взглянув на принтер подумал рано тебя еще разбирать я с почты детали для принтера еще не забрал .
выписывал переходники шлейфы модули итд что бы до конца запихать все во внутрь .
как то не хотелось разбирать принтер .
рукой стол подергал норм .
прогнал его от начала и до конца хотел а еле смог .
в том месте где вчера он себя странно вел я еле рукой протащил .
заглянув в щель салазок а там кусок толстой ленты которой я к стенке провода клеил типа скоча .
кто знает штука хорошая и удобная вместо двухстороннего скоча.
гидроизоляция санузлов от николь .
одна из этих полосок держав связку проводов наполовину оторвалась . ее каретка видимо вырывала под ней эта связка проходила .
в общем поковырялся достал все . вроде как не разбирая . лень .
проверил дальше почти все норм .
сделав десяток отпечатков полоски подогнал коэфициент к размеру отпечатка float K = 3.39;
полоска 200мм примерно соответствовала тем же 200мм длинны я с линейкой через лупу
проверил .
точнее будет результат когда фото отпечатаю и на большом экране буду рассматривать .
сейчас пока нет возможности так напечатать . снпч снова наверное краски налила и печать полосит .
я сделал процедуру как в тот раз бумаги туалетной положил под головку она хорошо лишнюю краску с воздухом вытягивает . нужно ждать пару часиков.
и еще когда принтер идет на печать всю дорогу идет звук от мотора что он чем то другим еще занят но это и раньше еще было до того скейча что стоял там тоже джойстик был а
в скейчи позавчерашнем звук этот нельзя было услышать там джойстик не давал печать реализовать .
еще . что я поменял в коде enc- enc+ как бы это не правильно хоть и работает . хочется вернуть на место enc а в коде dir сменить полярность .
пока все что заметил . дольше буду тестить . искать причину этого звука .
//Энкодер на пинах 2, 3. Используется внутренняя подтяжка.
// volatile int enc, motor_position;
byte flag =0;
float K = 3.39; //ПОДБИРАЕМ СООТНОШЕНИЕ МОТОР/ЭНКОДЕР
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;
int T = 1;
int A = 560;
#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 коцевика задий
PCICR=0;
digitalWrite(6, HIGH); // включим датчик бумаги
digitalWrite(ENABLE_PIN, LOW);
digitalWrite(DIR_PIN, LOW);
for (int i = 0; i < 2200; i++) { //дистация отьезда от коцевика
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(100); // скорость отьеда от limit
digitalWrite(STEP_PIN, LOW);
}
enc =0 ;
motoPos = 0 ;
PCIFR=PCIF2; PCICR=1<<PCIE2;
}
if (!digitalRead(10)&& flag==0) { //pin коцевика передий
PCICR=0;
digitalWrite(6, LOW); // отключим датчик бумаги
digitalWrite(ENABLE_PIN, LOW);
digitalWrite(DIR_PIN, HIGH);
for (int i = 0; i < 1000; i++) { //дистация отьезда от коцевика
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(200); // скорость отьеда от limit
digitalWrite(STEP_PIN, LOW);
}
enc =0 ;
motoPos = 0 ;
PCIFR=PCIF2; PCICR=1<<PCIE2;
}
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);
enc =0 ;
motoPos = 0 ;
}
A = analogRead(A0); // pin joystick
if (A > 650) {
T = map(A, 650, 1123, 100, 0);
digitalWrite(7, 1);
digitalWrite(ENABLE_PIN, LOW);
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(T);
digitalWrite(STEP_PIN, LOW);
}
if (A < 480) {
T = map(A, 480, 0, 100, 0); // 500, 0); шкала перерасчета
digitalWrite(7, 0);
digitalWrite(ENABLE_PIN, LOW);
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(T);
digitalWrite(STEP_PIN, LOW);
}
}
Чтобы сменить направление dir, надо поменять местами true и false:
БЫЛО
if(motoPos > motoPosPrev)Step(true,(uint8_t)(motoPos - motoPosPrev));
if(motoPos < motoPosPrev)Step(false,(uint8_t)(motoPosPrev - motoPos));
СДЕЛАТЬ
if(motoPos > motoPosPrev)Step(false,(uint8_t)(motoPos - motoPosPrev));
if(motoPos < motoPosPrev)Step(true,(uint8_t)(motoPosPrev - motoPos));
потестил хоть и еще катриджи не востановились .
тестил и без джойстика . он не влияет скрипт идет .
код что вы выше написали пока не менял . только что увидел
1 есть проблема и она глобальная .
принтер не следит за энкодером глобально и если было прерывания он видимо подстроиться . это хорошо но это все сломало .
главное
с разных програм принтер печатает по коэфициенту что тестировал на первой .
запускаю тест принтера он урезал сжал в 2-3 раза печать
второе
нет повторяемости . он может один и тот же рисунок напечатать
хоть в начале хоть в конце
привожу пример фото с наложением девушек
напечатал одну . я добавил фото еще раз под ней а получается наложения
я тестил с кубиками итд
я примерно понимаю что может быть этому причина .
if(EncCur == 2)
enc--;
else
enc++;
//======================================
temp = enc * K;//
motoPos = temp;
rem += temp - motoPos;
temp = enc * K;//
наверное должен начаться не в функции слежения и сравнения энкодера а здесь
}
EncPrevPrev = EncPrev; //сохранение пред-предыдущего состояния
EncPrev = EncCur; //сохранение предыдущего состояния
}
}
//======================================
temp = enc * K;//
motoPos = temp;
я вчера не зная о проблеме смотрел на код и пытался все это вынести из под энкодера и мне это не удалось и я бросил но уже были сомнения .
есть еще проблемы кроме того что что то шд. держит .
принтер иногда редко едит не в ту сторону но это все скорее с тем же что и выше про код написал .
в одной и той же програме он делает повторяемость размера на 100% но только в той где его тренировали .
в других условиях он теряется .
выше код что вы написали я подправлю но думаю глобально это не изменит
Возможно, дело в том, что мотор , перед началом печати, находится в разных позициях. Программа печати “думает”, что начинает с нулевой позиции, а , начинает, как придётся.
Т.е. посмотреть, как это раньше было, возможно, надо концевики настроить.
}
EncPrevPrev = EncPrev; //сохранение пред-предыдущего состояния
EncPrev = EncCur; //сохранение предыдущего состояния
}
}
Вряд ли. Там где изменяется значение enc, там и находится
Если обнулять, то уже полностью:
EncPrev , EncPrevPrev //придётся убрать из прерывания и сделать глобальными и volatile
а так же
motoPosPrev
обнуления стоят на концевиках .
поставил старый код все работает .ну кроме джойстика и звук удержания пропал
ну я вроде в старом коде все починил . повторяемость . печать джойстик итд но надо тестить .
пришлось кнопкой 5 пожертвовать . а свободных нв плате пинов нет .
есть возможность 5 пин освободить ?
//Энкодер на пинах 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;
byte flag =0;
int T = 1;
int A = 560;
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; //сохранение предыдущего состояния
}
if (digitalRead(5)) {
MoveLoop();
}
}
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(){
int16_t deltaPos = enc-((int16_t) motorPos * Kmotor);
if(deltaPos>= 1) Step(1); // надо делать шаг +
if(deltaPos<= -1) Step(0); // надо делать шаг -
}
void loop() {
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 коцевика задий
PCICR=0;
digitalWrite(6, HIGH); // включим датчик бумаги
digitalWrite(ENABLE_PIN, LOW);
digitalWrite(DIR_PIN, LOW);
for (int i = 0; i < 2800; i++) { //дистация отьезда от коцевика
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(100); // скорость отьеда от limit
digitalWrite(STEP_PIN, LOW);
}
PCICR=1<<PCIE2;
enc =0 ;
motorPos = 0 ;
}
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; // разрешить прерваия энкодера
enc =0 ;
motorPos = 0 ;
}
A = analogRead(A0); // pin joystick
if (A > 650) {
T = map(A, 650, 1123, 500, 0);
digitalWrite(7, 1);
digitalWrite(ENABLE_PIN, LOW);
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(T);
digitalWrite(STEP_PIN, LOW);
}
if (A < 480) {
T = map(A, 480, 0, 500, 0); // 500, 0); шкала перерасчета
digitalWrite(7, 0);
digitalWrite(ENABLE_PIN, LOW);
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(T);
digitalWrite(STEP_PIN, LOW);
}
}
Думаю нужно тему создать по энкодерам .
фото файлы коды итд туда ложитьь.
тема актуальная и нигде ее нет .
у меня был набор распиновак плат год собирал от разных принтеров и ssd когда полетел все ушло . я ssd починил но инфа уже все .
от моего принтера есть распиновка двух энкодеров
один основной второй от сканера я его вместо дребезжащего энкодера буду использовать как крутилку или еще что нибудь
брошу пока сюда а далее дополню распиновкой основного энкодера
есть мои 3д модели в компасе созданные тоже туда же в тему пойдут .
все работает но если та часть которую я убрал из LOOP
и
положил в void MoveLoop()
то не верно печатает ровна также с накладками как и в коде у Дим-мычъ
видимо из LOOP пока не возможно уйти .
жертвую джойстиком и ушел на этот я на нем много тестил и он работает правильно .
//Энкодер на пинах 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);
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);
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); // включим датчик бумаги
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);
}
enc =0 ;
motorPos = 0 ;
}
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; // разрешить прерваия энкодера
enc =0 ;
motorPos = 0 ;
}
}
скоро Дим-Димычу маечку сделанную в единственном экземпляре презентуешь видимо )))
с удовольствием но это не скоро .
нужно доделать этот прототип . далее сделать по этой же схеме нормальный принтер но уже с текстильными чернилами по ткани
A3 .
@Arduman решил вопрос