Помощь с условием
- Войдите на сайт для отправки комментариев
Чт, 31/08/2017 - 12:33
Добрый день.
Нужна помощь по куску кода.
Суть такова, собираю самодельный шлифовальный станок, имется две каретки, установленных под 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); // перемещение по Х
}
}
Типичная логическая ошибка - нужно контролировать не уровень сигнала с концевика, а его изменение. Для этого нужно при каждом считывании этого сигнала запоминать текущее состояние в переменной, а при следующем считывании сравнивать с прежним и что-то делать только если эти старое и новое состояние - РАЗНЫЕ..
Ну, приведённого кусочка недостаточно, чтобы советовать что-то уверенно. Я, например, не знаю, как у Вас сделано движение по 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; } }Но точно сказать нельзя по этому кусочку, т.к. неясно как всё остальное сделано.
Для этого нужно при каждом считывании этого сигнала запоминать текущее состояние в переменной, а при следующем считывании сравнивать с прежним и что-то делать только если эти старое и новое состояние - РАЗНЫЕ..
Для человека с семилетним опытом работы с Ардуино это слишком сложно. Вы ещё про дребезг концевика скажите!
как у Вас сделано движение по X, когда концевики не достигнуты.
Перемещение по Х это пневмоцилиндр, соответственно valveX1 и valveX2 это клапны, по Y, это эл. двигатель через винт.
При первом пуске цикла движемся по Х в +, дальше выполняется это код.
Всем спасибо за помощь, программа работает.
Код не большой, еще может добавлю какието функции безопасности.
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; } }