Шаговый двигатель перемещается только на один шаг за раз с помощью ИК-датчика.

Я пытаюсь заставить оба двигателя работать одновременно, как только датчик движения обнаружит препятствие. Оба двигателя работают нормально сами по себе, но когда я использую датчик, двигатели перемещаются только на один шаг за каждое обнаруженное движение.

  • Ардуино Мега (ATMega 2560)
  • (2) Шаговый двигатель NEMA 17/A4988
  • Модуль цифрового ИК-датчика
#include <Arduino.h>
#include <avr/io.h>
#include <AccelStepper.h>

AccelStepper stepper(1,5,4); // с драйвером (1, шаг, направление)
AccelStepper stepper2(1,9,8);

const int pin_ir_in = 3;
int prev_state = 1;
int curr_state = 1;
int counter =0;


void setup() {
  Serial.begin(9600);
  pinMode(6,OUTPUT); // Давать возможность
  pinMode(10,OUTPUT);

  digitalWrite(6,LOW); // Установить низкий уровень включения
  digitalWrite(10,LOW);
}

void loop() {
  digitalWrite(6,LOW); // Установить низкий уровень включения
  if (stepper.distanceToGo() == 0)
  { 
    delay(1000);
    stepper.moveTo(100);
    stepper.setMaxSpeed(200);
    stepper.setAcceleration(100);

  }

   digitalWrite(10,LOW); // Установить низкий уровень включения
     if (stepper2.distanceToGo() == 0)
  {  
    delay(1000);
    stepper2.moveTo(100);
    stepper2.setMaxSpeed(200);
    stepper2.setAcceleration(100);

  }


int curr_state = digitalRead(pin_ir_in);
if (curr_state != prev_state)
{
  if (curr_state == 0)
  {
    stepper.run();  // На самом деле совершает шаговое движение
    stepper2.run();  
    delay(500);
  }
  prev_state = curr_state;

}

}

, 👍0

Обсуждение

Я думаю, что функция запуска должна вызываться неоднократно, пока вы не достигнете позиции, а не только один раз, @chrisl


1 ответ


1

Как сказал Крисл, вам нужно неоднократно вызывать run.

Я попытался переписать код, который вы дали, хотя я не совсем уверен, чего вы пытаетесь достичь.

void loop() 
{
  stepper.run();  // На самом деле совершает шаговое движение
  stepper2.run();  


  int curr_state = digitalRead(pin_ir_in);
  if (curr_state != prev_state)
  {
    if (curr_state == 0) // Активирован датчик движения
    {
      stepper.moveTo(100);
      stepper.setMaxSpeed(200);
      stepper.setAcceleration(100);
      stepper2.moveTo(100);
      stepper2.setMaxSpeed(200);
      stepper2.setAcceleration(100);
    }
    prev_state = curr_state;
  }
}
,