Почти работает. Я только поменял if(!digitalRead(leftSensor)), if(!digitalRead(rightSensor)) на if(digitalRead(leftSensor)), if(digitalRead(rightSensor)) так как концевик работает немного по другому изначально в инверсии. Вы поняли то что я хотел но есть 1 проблема это дребезг. По сути пока кнопка зажата проиходит дребезг но как только она отжимается все работает как надо.
С трудом вас понимаю. Но да. Есть только проблема с циклами если я буду использовать for то все что после него не будет работать пока не выйду из цикла. А там еще есть другой двигатель работающий по другим принципам. Еще планирую добавить LCD дисплей с инкодером и сделать свеого рода меню для управления скоростью двигателей, временем и режимами работы.
Под циклом здесь понимается - главный цикл - работа программы - Loop{}. Просто компилятор скрывает от нас команду в коде безусловного перехода из конца программы в начало.
Концевик, на то и концевик - щель в нем должна быть открыта. Это высокий уровень, если мне склероз не изменяет. Задержки в коде минимальны, как только щель перекроется сразу реверс будет в этой же итерации.Хотя, наверное и можно шажок делать сразу при срабатывании датчика.. Код (C++): if(!digitalRead(leftSensor)){ processTmr = millis(); currentDirection = !currentDirection; digitalWrite(dirPin, currentDirection); digitalWrite(stepPin, HIGH); }
Это не флаг, это - тряпка. Флаг это когда кОретко приехала, допустим, вправо и когда сработал правый концевик вы подняли right_flag=1; left_flag=0. Дальше пишется условие if (все планеты сошлись и right_flag==1) едем влево и нам пофиг на КЛАЦ-КЛАЦ-КЛАЦ концевика. Приехали влево, сработал концевик, меняем флаги right_flag=0; left_flag=1 и дальше все повторяется, но уже в другую сторону
К сожалению, дребезг остался. Как только достигает концевика, начинает дребезжать на месте туда-сюда.
тогда так : Код (C++): if(digitalRead(leftSensor)){ processTmr = millis(); currentDirection = false; } if(!digitalRead(rightSensor)){ processTmr = millis(); currentDirection = true; } или на оборот (я про направление ложь/истина).
А точно там все правильно подключено? Пины, напряжения? Если да, то у меня больше мыслей нет, по этому поводу
Проверил все подключено нормально. Я думаю может какую то маленькую задержку поставить при контакте с концевиком 50 или 100мсек.
Я попробовал банальный делей поставить и все заработало, но конечно делей не вариант тут использовать. Все таки он замедляет работу. Код (C++): if(digitalRead(leftSensor)){ processTmr = millis(); currentDirection = true; delay(100); } if(digitalRead(rightSensor)){ processTmr = millis(); currentDirection =false ; delay(100); }
можно попробовать, как писали выше, steppin сигнал инвертировать. Видимо в этом проблема. У меня под рукой железяк нет, поэтому могу только предполагать
Я не совсем понимаю что значит "steppin сигнал инвертировать". Я думал currentDirection = true; это и есть инверсия.
это направление. а есть еще тики для шагов Код (C++): digitalWrite(stepPin, !digitalRead(stepPin)); но можно, при смене направления по датчикам сдвинуть внутренний таймер моторов (чтоб без делай) Код (C++): if(digitalRead(leftSensor)){ currentDirection =true; processTmr = millis(); motorTmr = millis() + 90; } if(digitalRead(rightSensor)){ currentDirection =false; processTmr = millis(); motorTmr = millis() + 90; } в таком случае, он подождет 100 мс и начнет крутить в другую сторону (а не 10 мс)
Я попробовал, но что-то не так он просто зависает и двигатель начинает просто пищать. При этом ни каких движения не происходит.
вообще, движки дело тонкое и индивидуальное, я когда настраивал свои, брал приличное время переключения обмоток (пин степ), затем его уменьшал, и смотрел как он себя ведет. Не пропускает ли шаги, не долбит ли на 1 месте, не греется и т.п. Тут за переключение обмоток отвечает время motorDelay =10;// Для обмоток мотора. поэтому советую с ним поиграться.
Код (C++): if(digitalRead(leftSensor) && left_flag){ left_flag=0; right_flag=1; processTmr = millis(); currentDirection = true; } if(digitalRead(rightSensor) && right_flag){ left_flag=1; right_flag=0; processTmr = millis(); currentDirection =false ; }
Проверил ваш код. Он ни чего не дал. Концевики в этом случае вообще ни как не влияют на работу как будто их и нет. Может я конечно не так отобразил ваш код. Код (C++): unsigned long motorTmr = 0, processTmr= 0; float processDelay = 630, // Общее вращение motorDelay = 1; // Для обмоток мотора bool currentDirection = false, left_flag = false, right_flag = false; const byte leftSensor = 8, rightSensor = 9, dirPin = 3, stepPin = 2; void setup(){ pinMode(leftSensor, INPUT_PULLUP); pinMode(rightSensor, INPUT_PULLUP); pinMode(dirPin, OUTPUT); pinMode(stepPin, OUTPUT); motorTmr = processTmr = millis(); } void loop(){ if(digitalRead(leftSensor) && left_flag){ left_flag=0; right_flag=1; processTmr = millis(); currentDirection = true; } if(digitalRead(rightSensor) && right_flag){ left_flag=1; right_flag=0; processTmr = millis(); currentDirection =false ; } if (millis() - processTmr <= processDelay){ if(millis() - motorTmr >= motorDelay){ motorTmr = millis(); digitalWrite(dirPin, currentDirection); digitalWrite(stepPin, !digitalRead(stepPin)); } } else { processTmr = millis(); currentDirection = !currentDirection; } }