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