Mega+shild 1.4 проблема с концевиками

Кролик
Offline
Зарегистрирован: 24.02.2022

Добрый день форумчане. К Mega 2560 подключены двигатели (оси x,y,z) и концевики через shild 1.4. Всё работает, но как только каретка садится на концевик с него уже не съезжает. Прошу помощи в этом вопросе.

 
 
 
 
 
 
 
BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018
Кролик
Offline
Зарегистрирован: 24.02.2022

Добрый день форумчане. К Mega 2560 подключены двигатели (оси x,y,z) и концевики через shild 1.4. Всё работает, но как только каретка садится на концевик с него уже не съезжает. Прошу помощи в этом вопросе.

#define Y_EN A2
#define Y_STP A6
#define Y_DIR A7
 
#define X_EN 38
#define X_STP A0
#define X_DIR A1
 
#define Z_EN A8
#define Z_STP 46
#define Z_DIR 48
 
#define SLEEP 250
 
//#define X_MIN_PIN 3
#define X_MAX_PIN 2
//#define Y_MIN_PIN 14
//#define Y_MAX_PIN 15
//#define Z_MIN_PIN 18
//#define Z_MAX_PIN 19
 
int y=0; int x=0; int z=0;
 
void setup() 
{
   pinMode(Y_EN, OUTPUT); pinMode(Y_STP, OUTPUT); pinMode(Y_DIR, OUTPUT); digitalWrite(Y_EN, LOW); digitalWrite(Y_DIR, LOW);
   pinMode(X_EN, OUTPUT); pinMode(X_STP, OUTPUT); pinMode(X_DIR, OUTPUT); digitalWrite(X_EN, LOW); digitalWrite(X_DIR, LOW);
   pinMode(Z_EN, OUTPUT); pinMode(Z_STP, OUTPUT); pinMode(Z_DIR, OUTPUT); digitalWrite(Z_EN, LOW); digitalWrite(Z_DIR, LOW);
   Serial.begin(9600);
   pinMode(X_MAX_PIN, INPUT_PULLUP);
}
 
void move_y(int p)
{ for (int i=0; i <= p; i++) { digitalWrite(Y_STP, HIGH); delayMicroseconds(SLEEP); digitalWrite(Y_STP, LOW); delayMicroseconds(SLEEP); } }
 
void move_x(int p)
{ 
 
  
  for (int i=0; i <= p; i++) 
  { 
    if(digitalRead(X_MAX_PIN) == LOW)
    {
      digitalWrite(X_EN, HIGH); 
    }
    
    digitalWrite(X_STP, HIGH); 
    delayMicroseconds(SLEEP); 
    digitalWrite(X_STP, LOW); 
    delayMicroseconds(SLEEP); 
  }
}
 
void move_z(int p)
{ for (int i=0; i <= p; i++) { digitalWrite(Z_STP, HIGH); delayMicroseconds(SLEEP); digitalWrite(Z_STP, LOW); delayMicroseconds(SLEEP); } }
 
void loop() 
{
  if (Serial.available() > 0) 
  {
    switch (Serial.read()) 
    {
      case 'y':
        y=Serial.parseInt();
        if(y>0) { digitalWrite(Y_DIR, LOW); }
        else { digitalWrite(Y_DIR, HIGH); y=-y; }
        move_y(y);
      break; 
      case 'x':
        x=Serial.parseInt();
        if(x>0) { digitalWrite(X_DIR, LOW); }
        else { digitalWrite(X_DIR, HIGH); x=-x; }
        move_x(x);
      break;     
      case 'z':
        z=Serial.parseInt();
        if(z>0) { digitalWrite(Z_DIR, LOW); }
        else { digitalWrite(Z_DIR, HIGH); z=-z; }
        move_z(z);
      break;
      case 's':
        delay(Serial.parseInt());
      break;
    default:;
    }
  }
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Что значит "не съезжает"? Может просто физически застревает и мощи не хватает сдёрнуть? Объясняйтесь толком.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

может как-то так?
 

void move_x(int p)
{
  for (int i = 0; i <= p; i++)
  {
    // для прямого направления
    if (digitalRead(X_MAX_PIN) == LOW || x > 0 )
    {
      digitalWrite(X_EN, HIGH);
      digitalWrite(X_STP, HIGH);
      delayMicroseconds(SLEEP);
      digitalWrite(X_STP, LOW);
      delayMicroseconds(SLEEP);
    }
   // для обратного направления
      if (digitalRead(X_MIN_PIN) == LOW || x < 0 )
    {
      // здесь должен быть код движения в обратном 
      // направлении пока не наедет на концевик
      digitalWrite(X_EN, HIGH);
      digitalWrite(X_STP, HIGH);
      delayMicroseconds(SLEEP);
      digitalWrite(X_STP, LOW);
      delayMicroseconds(SLEEP);
    }
  }
}

  void setup() {
  }

  void loop() {
   }

надо еще сделать процедуру обработки ошибок и при наезде на концевик выводить мерный остаток с кодом ошибки по оси

vrd
Offline
Зарегистрирован: 20.01.2022

А если надо откалибровать нулевую точку. Налетели на концевой -> скорость в 2 раза меньше -> съезжаем с концевого -> скорость в 10 раза меньше начальной -> наезжаем снова на концевой. Так можно получить точность нуля в 2-3 импульса.

Кролик
Offline
Зарегистрирован: 24.02.2022

Постараюсь объяснить и не тупить сильно. Программа по управлению 3мя осями. Пока мучаю только ось x.

Подключаю мегу к пк и перепрошиваю, далее даю питаниена шилд. Так вот каретка стоит (условно) по середине оси x, далее захожу вот сюда ->

набираю x1000 каретка перемещается вправо на 1000 шагов, соответственно пишу x-1000 каретка перемещается влево на место. Концевик находится в левой стороне. Мне необходимо чтобы каретка доходила до концевика в не зависимо на каком расстоянии она находится от концевика, просто задаю максимальное значение например x-50000, концевик срабатывает и двигатель прекращает работать. Это получилось вот такой код

void move_x(int p)
{ 

  for (int i=0; i <= p; i++) 
  { 
    
    if(digitalRead(X_MAX_PIN) == LOW) 
    {
      digitalWrite(X_EN, HIGH); 
    }
    
    digitalWrite(X_STP, HIGH); 
    delayMicroseconds(SLEEP); 
    digitalWrite(X_STP, LOW); 
    delayMicroseconds(SLEEP); 
  }
}

Но после того как концевик сработал какие бы я команды не писал двигатель не едет (ни в лево хотя я понимаю там ось заканчивается, ни в право). На данный момент делаю так, с помощью этого кода еду до концевика он срабатывает двигатель останавливается. Перепрошиваю мегу вот на такой код (предыдущий комментирую)->

void move_x(int p)
{ 

  for (int i=0; i <= p; i++) 
  { 
    
   // if(digitalRead(X_MAX_PIN) == LOW)
   // {
   //   digitalWrite(X_EN, HIGH); 
   // }
        
    if(digitalRead(X_MAX_PIN) == LOW)
    {
      digitalWrite(X_EN, LOW); 
      digitalWrite(X_DIR, LOW);
    }
    
    digitalWrite(X_STP, HIGH); 
    delayMicroseconds(SLEEP); 
    digitalWrite(X_STP, LOW); 
    delayMicroseconds(SLEEP); 
  }
}

пишу x1000 или x-1000 и каретка сходит с концевика и двигается в право т.к digitalWrite(X_DIR, LOW);.

Вот вопрос, а можно без перепрошивания меги каждый раз, чтобы каретка доезжала до концевика, концевик срабатывал и следующей функцией каретка съезжала с концевика в направлении от концевика? 

Кролик
Offline
Зарегистрирован: 24.02.2022

Всем спасибо проблему решил)