Помощь с условием

flying
Offline
Зарегистрирован: 12.11.2011

Добрый день.

Нужна помощь по куску кода.

Суть такова, собираю самодельный шлифовальный станок, имется две каретки, установленных под 90 относительно друг друга, условно назовем их X и Y. По Х перемещается каретка от концевика до концевика, но когда доходит до одного из концевиков мне нужно по Y сместить на небольшое растояние, затем по Х двигаемся в обратную сторону, и так по кругу. Это как бы не проблема, но кусок кода который отвечает за смещение Y, мне нужно выполнить один раз, сейчас у меня получется если остановить на концевике то по Y будет постоянное движение.

Буду очень благодарен за помощь. 

void moveYm ()
  {
     if (digitalRead(limitX1))  // перемещение по Х в +
      {
         digitalWrite(valveY1, HIGH); // смещение по Y
         delay(delayY); // смещение по Y
         digitalWrite(valveY1, LOW); // смещение по Y 

                    
        digitalWrite(valveX1, HIGH); // перемещение по Х
        digitalWrite(valveX2, LOW); // перемещение по Х
        
      }
     if (digitalRead(limitX2))  // перемещение по Х в -
      {
         digitalWrite(valveY1, HIGH); // смещение по Y
         delay(delayY); // смещение по Y
         digitalWrite(valveY1, LOW); // смещение по Y


        digitalWrite(valveX1, LOW); // перемещение по Х
        digitalWrite(valveX2, HIGH); // перемещение по Х
      }
      
  }

 

b707
Offline
Зарегистрирован: 26.05.2017

Типичная логическая ошибка - нужно контролировать не уровень сигнала с концевика, а его изменение. Для этого нужно при каждом считывании этого сигнала запоминать текущее состояние в переменной, а при следующем считывании сравнивать с прежним и что-то делать только если эти старое и новое состояние - РАЗНЫЕ..

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

Ну, приведённого кусочка недостаточно, чтобы советовать что-то уверенно. Я, например, не знаю, как у Вас сделано движение по X, когда концевики не достигнуты. Также я не не знаю как и когда эта ункция вызывается. Вы её постоянно вызываете при каждом шаге по x? Тогда неясно зачем строки 10-11 и 21-22 если по х Вы в другом месте двигаете.

Ну, в общем, Вам нужно завести флаг, который отвечает за то, что "сдвиг по y был, а после этого не было сдвигов по x, и сели этот флаг - истина, то по y не сдвигать. Типа так:

void moveYm () {
	static bool hvatit = false;
	if (digitalRead(limitX1)) { // перемещение по Х в +
		if (! hvatit) {
			digitalWrite(valveY1, HIGH); // смещение по Y
			delay(delayY); // смещение по Y
			digitalWrite(valveY1, LOW); // смещение по Y 
			digitalWrite(valveX1, HIGH); // перемещение по Х
			digitalWrite(valveX2, LOW); // перемещение по Х
			hvatit = true;
		}
	} else if (digitalRead(limitX2) && ! hvatit) { // перемещение по Х в -
		if (! hvatit) {
			digitalWrite(valveY1, HIGH); // смещение по Y
			delay(delayY); // смещение по Y
			digitalWrite(valveY1, LOW); // смещение по Y
			digitalWrite(valveX1, LOW); // перемещение по Х
			digitalWrite(valveX2, HIGH); // перемещение по Х
			hvatit = true;
		}
	} else {
		hvatit = false;
	}
}

Но точно сказать нельзя по этому кусочку, т.к. неясно как всё остальное сделано.

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

b707 пишет:

Для этого нужно при каждом считывании этого сигнала запоминать текущее состояние в переменной, а при следующем считывании сравнивать с прежним и что-то делать только если эти старое и новое состояние - РАЗНЫЕ..

Для человека с семилетним опытом работы с Ардуино это слишком сложно. Вы ещё про дребезг концевика скажите!

flying
Offline
Зарегистрирован: 12.11.2011

ЕвгенийП пишет:

как у Вас сделано движение по X, когда концевики не достигнуты.

Перемещение по Х это пневмоцилиндр, соответственно valveX1 и valveX2 это клапны, по Y, это эл. двигатель через винт.

При первом пуске цикла движемся по Х в +, дальше выполняется это код. 

flying
Offline
Зарегистрирован: 12.11.2011

Всем спасибо за помощь, программа работает.

Код не большой, еще может добавлю какието функции безопасности.

int limitX1 = 2; // концевик Х +
int limitX2 = 3; // концевик Х -
int limitY1 = 4; // концевик Y +
int limitY2 = 5; // концевик Y -
int cycleStart = 6; // пуск цикла
int pushButton7 = 7;
int pushButton8 = 8;

int valveX1 =  9;       // клапан Х в +
int valveX2 =  10;      // клапан Х в -
int valveY1 =  11;      // контактор Y в +
int valveY2 =  12;      // контактор Y в -

int delayY=100; // задержка вкл/выкл контактора Y



int cycleStartState = 0;        

void setup() {
  // put your setup code here, to run once:
  pinMode(limitX1, INPUT);
  pinMode(limitX2, INPUT);
  pinMode(limitY1, INPUT);
  pinMode(limitY2, INPUT);
  pinMode(cycleStart, INPUT);

  pinMode(valveX1, OUTPUT);
  pinMode(valveX2, OUTPUT);
  pinMode(valveY1, OUTPUT);
  pinMode(valveY2, OUTPUT);



}

void loop() {
 






  cycleStartState = digitalRead(cycleStart); //пуск цикла
  if (cycleStartState == HIGH)
    {

      while ((digitalRead(limitY1)) == LOW)
  {
    moveYm ();
  }

  while ((digitalRead(limitY2)) == LOW)
  {
    moveYp ();
  }
         
    }

    else {
    // все отключаем
    digitalWrite(valveX1, LOW);
    digitalWrite(valveX2, LOW);
    digitalWrite(valveY1, LOW);
    digitalWrite(valveY2, LOW);
  }

 
}


void moveYm () {
  static bool hvatit = true;
  if (digitalRead(limitX1) ) { // перемещение по Х в +
    if (! hvatit) {
      digitalWrite(valveY1, HIGH); // смещение по Y
      delay(delayY); // смещение по Y
      digitalWrite(valveY1, LOW); // смещение по Y 
      digitalWrite(valveX1, HIGH); // перемещение по Х
      digitalWrite(valveX2, LOW); // перемещение по Х
      hvatit = true;
    }
  }

  
  
  else if (digitalRead(limitX2)){// && ! hvatit) { // перемещение по Х в -
    if (! hvatit) {
      digitalWrite(valveY1, HIGH); // смещение по Y
      delay(delayY); // смещение по Y
      digitalWrite(valveY1, LOW); // смещение по Y
      digitalWrite(valveX1, LOW); // перемещение по Х
      digitalWrite(valveX2, HIGH); // перемещение по Х
      hvatit = true;
    }
  } else {
    hvatit = false;
  }
}


void moveYp () {
  static bool hvatit = true;
  if (digitalRead(limitX1) ) { // перемещение по Х в +
    if (! hvatit) {
      digitalWrite(valveY2, HIGH); // смещение по Y
      delay(delayY); // смещение по Y
      digitalWrite(valveY2, LOW); // смещение по Y 
      digitalWrite(valveX1, HIGH); // перемещение по Х
      digitalWrite(valveX2, LOW); // перемещение по Х
      hvatit = true;
    }
  }

  
  
  else if (digitalRead(limitX2)){// && ! hvatit) { // перемещение по Х в -
    if (! hvatit) {
      digitalWrite(valveY2, HIGH); // смещение по Y
      delay(delayY); // смещение по Y
      digitalWrite(valveY2, LOW); // смещение по Y
      digitalWrite(valveX1, LOW); // перемещение по Х
      digitalWrite(valveX2, HIGH); // перемещение по Х
      hvatit = true;
    }
  } else {
    hvatit = false;
  }
}