@Chaynik_v_code

Направление шагового двигателя Arduino?

Сделал градусник с вертикальной шкалой , подключил датчик , при считывании температуры раз в N минут двигатель вращает направляющую, стрелка едет к температуре на N сигналов. При увеличении температуры - стрелка штатно едет вверх, при уменьшении - почему то так же вверх, хотя должна вниз .Все данные в порт выводятся верные ( температура, в какую поз по сигналам нужно ехать и т.д.) Помогите разобраться. Вот часть кода с движением :

void moveStepperToPosition(int position) {
  long targetPosition1 = position * stepsPerDegree;
  Serial.print("dvijenie v poz: ");
  Serial.println(targetPosition1);

  if (stepper.currentPosition() < targetPosition1) {
    Serial.println("dvigaemsya vverx...");
      stepper.moveTo(targetPosition1);   
      stepper.runToPosition();  
  } else if (stepper.currentPosition() > targetPosition1) {
    Serial.println("dvigaemsya vniz...");
     stepper.moveTo(targetPosition1);  
     stepper.runToPosition();
  }

 else {
  Serial.println("yje tyt .");
}

while (stepper.distanceToGo() != 0) {
  stepper.run();
  delay(1);


position - градусы с датчика stepsPerDegree - количество шагов двигателя на 1 градус ( задаю сам в зависимости от размеров шкалы градусника).Когда тестовый код запускаю ,указываю текущую позицию условно 1000, а движение в поз. 500, то едет вниз на 500 сигналов исправно ,в моем же коде в любом раскладе едет вверх.
  • Вопрос задан
  • 168 просмотров
Решения вопроса 1
@mordo445
Посмотрел в описании библиотеки за вас
moveTo()
void AccelStepper::moveTo	(	long 	absolute	)

Set the target position. The run() function will try to move the motor (at most one step per call) from the current position to the target position set by the most recent call to this function. Caution: moveTo() also recalculates the speed for the next step. If you are trying to use constant speed movements, you should call setSpeed() after calling moveTo().

Parameters
[in] absolute The desired absolute position. Negative is anticlockwise from the 0 position.
References computeNewSpeed().

Referenced by
move(), MultiStepper::moveTo(), and runToNewPosition()
.

Таки функция ждет положительные и отрицательные значения в шагах мотора, для поворота от нулевой позиции. Жаль нет под рукой мотора, проверить. Попробуйте переписать код и проверить что там попадает в функцию в виде position.
Конструкция
while (stepper.distanceToGo() != 0) {
  stepper.run();
...};

должна быть лишняя, потому как
stepper.runToPosition();
блокирует выполнения кода в основном цикле, пока мотор не докатит до нужной позиции, опять же из описания библиотеки.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Daemon23RUS
@Daemon23RUS
Если закрыть глаза на странную конструкцию if .. else if .. то этот кусочек кода инициирует движение, и там внутри должно бы приниматься решение вниз или вверх.
stepper.moveTo(targetPosition1);   
stepper.runToPosition()

Но что там внутри, нам не ведомо, Вы не показали.
Ответ написан
@Bright144
У тебя условия есть, но в условие if и else у тебя выполняется одно и тоже действие:
stepper.moveTo(targetPosition1);
stepper.runToPosition();
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы