Arduino: Почему мой шаговый двигатель не движется в обратном направлении? - PullRequest
0 голосов
/ 11 июля 2020
• 1000 в направлении 200 шагов, затем выполните 200 шагов в обратном направлении. Кажется, что он выполняет начальные 200 шагов, но затем останавливается, почему?

В функции setup:

stepper.setCurrentPosition(0);
// Set the maximum speed in steps per second:
stepper.setMaxSpeed(1000);  

В функции loop:

 while(stepper.currentPosition() < 300){
   stepper.moveTo(200);
   stepper.setSpeed(200);
   stepper.run();
   
  if (stepper.distanceToGo() == 0) {
      stepper.moveTo(-stepper.currentPosition());
      stepper.setSpeed(200);
      stepper.run();
  }

 }

Вот мой код целиком. if/else внизу - это место, где я хочу запустить двигатель. Я вставил в этот блок нерабочий пример кода:

#include <deprecated.h>
#include <MFRC522.h>
#include <MFRC522Extended.h>
#include <require_cpp11.h>
// Include the AccelStepper library:
#include <AccelStepper.h>


// constants won't change. They're used here to set pin numbers:
const int BUTTON_PIN = 2; // the number of the pushbutton pin
#define BLUE 7
#define GREEN 6
#define RED 3
#define RST_PIN 9     // Configurable, see typical pin layout above
#define SS_PIN  53   // Configurable, see typical pin layout above


#define dirPin 10
#define stepPin 11
#define motorInterfaceType 1


// Variables will change:
String authKeyFob = "123456789";
String card_ID="";
int ledState         = 0;     // remember current led state
int buttonState      = 0;  
int oldButtonState = 0;
bool toggle = false;

MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance
AccelStepper stepper = AccelStepper(motorInterfaceType, stepPin, dirPin);

void setup() {

  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);
 
  while (!Serial);     // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
  SPI.begin();         // Init SPI bus
  mfrc522.PCD_Init();  // Init MFRC522 card


  // initialize the pushbutton pin as an pull-up input
  // the pull-up input pin will be HIGH when the switch is open and LOW when the switch is closed.
  pinMode(BUTTON_PIN, INPUT);
  pinMode(GREEN, OUTPUT);
  pinMode(RED, OUTPUT);
  pinMode(BLUE, OUTPUT);

  stepper.setCurrentPosition(0);
  stepper.setMaxSpeed(1000);
  stepper.setAcceleration(50);
 // stepper.setSpeed(200);
 // stepper.moveTo(200);
  
}

void loop() {
 
/*
  // Change direction once the motor reaches target position
  if (stepper.distanceToGo() == 0) {
    stepper.moveTo(-stepper.currentPosition());
  }
  // Move the motor one step
  stepper.run();
*/
  buttonState = digitalRead(BUTTON_PIN);


  // read the state of the switch/button:
  oldButtonState = LOW;    //  NEED TO ADD A DECLARATION FOR THIS BEFORE SETUP
  buttonState = digitalRead(BUTTON_PIN);

  // Look for new cards, and select one if present
  if (!mfrc522.PICC_IsNewCardPresent() ) {

  }
 

  if(mfrc522.PICC_ReadCardSerial() ){
      card_ID="";
      for (byte i = 0; i < mfrc522.uid.size; i++) {
         card_ID += mfrc522.uid.uidByte[i];
      }

      if(card_ID == authKeyFob){
        toggle = !toggle;
        delay(200);
      }
  }

  //  if the button just became pressed...
  if(buttonState == HIGH && oldButtonState==LOW){
    toggle = !toggle;  // same thing, toggle our variable. 
    delay(200);
  }
  

  if (toggle) {
    digitalWrite(GREEN, HIGH);
    digitalWrite(RED, LOW);
    stepper.moveTo(200);
    stepper.setSpeed(200);
    stepper.run();
       
  } else {
    digitalWrite(GREEN, LOW);
    digitalWrite(RED, HIGH);
    stepper.moveTo(200);
    stepper.setSpeed(200);
    stepper.run();

  }
  oldButtonState = buttonState;  // save the button state for next time

}

Ответы [ 2 ]

0 голосов
/ 12 июля 2020

Этот код перемещает шаговый двигатель в каждом направлении.

  if (toggle) {
    digitalWrite(GREEN, HIGH);
    digitalWrite(RED, LOW);
    while(stepper.currentPosition() <= 200){
      stepper.moveTo(200);
      stepper.setSpeed(200);
      stepper.runSpeedToPosition();
      if(stepper.currentPosition()==200){
        break;
      }
    }
  } else {
    digitalWrite(GREEN, LOW);
    digitalWrite(RED, HIGH);
    while(stepper.currentPosition() >= -200){
      stepper.moveTo(-200);
      stepper.setSpeed(200);
      stepper.runSpeedToPosition();
      if(stepper.currentPosition()==-200){
        break;
      }
    }
  }
0 голосов
/ 11 июля 2020

Метод выполнения не блокируется. Достаточно сделать один шаг, если пора. Итак, давайте пройдемся по вашему коду. Сначала мы вводим while l oop, указываем шаг на 200, устанавливаем скорость и запускаем вызов. Мы повторяем это снова и снова. Если мы дойдем до точки, где у нас есть от 0 до go, тогда вы скажете moveTo в отрицательную позицию, установите скорость, вызовите run один раз, а затем while l oop завершится и повторяется. На этом повторении мы говорим «перейти к 200» и начинаем называть «беги». Таким образом, вы вызываете run только один раз с параметром moveTo, установленным на отрицательное число.

Вам нужно переосмыслить logi c на этом. Я не знаю, что еще в вашем l oop, поэтому сложно сказать, что именно вы хотите. Если вы действительно настаиваете на блокировке на время l oop, тогда:

stepper.moveTo(200);
stepper.setSpeed(200);
while(stepper.distanceToGo() != 0){
   stepper.run();
}
stepper.moveTo(-200);
while(stepper.distanceToGo != 0){
   stepper.run();
}
...