Управление скоростью шагового двигателя с помощью Arduino

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

#include <Stepper.h>
const int ForwardLimitSwitchPin = 2;
const int ReverseLimitSwitchPin = 3;
const int StepperStepPin = 4;
const int StepperDirectionPin = 5;
const int LimitSwitchActivated = LOW;  // Limit switch grounds pin
const int StepperMaxRPM = 255;//default = 100


const int swDireita = 13;
const int swEsquerda = 12;
int velMotor = 0;

static const unsigned long REFRESH_INTERVAL = 1000; // ms
static unsigned long lastRefreshTime = 0;

boolean flag;

//Stepper stepper(200, StepperStepPin, StepperDirectionPin);
Stepper stepper(200, 8, 9, 10, 11);


void setup() {
  pinMode(swDireita, INPUT);
  pinMode(swEsquerda, INPUT);

  digitalWrite(swDireita, HIGH);
  digitalWrite(swEsquerda, HIGH);

  pinMode(ForwardLimitSwitchPin, INPUT_PULLUP);
  pinMode(ReverseLimitSwitchPin, INPUT_PULLUP);
  stepper.setSpeed(StepperMaxRPM);


  Serial.begin(115200);
}

void loop() {
  while (digitalRead(swDireita) == 0) {
    motorDireita();
  }

  velMotor = 0;

  while (digitalRead(swEsquerda) == 0) {
    motorEsquerda();
  }

  velMotor = 0;

  while (digitalRead(swDireita) == 0 && digitalRead(swEsquerda) == 0) {
    motorParado();
  }
  velMotor = 0;
}

void motorParado() {
  Serial.print("Ambos ativados, parada");
  Serial.print("\n");
  stepper.setSpeed(0);
  stepper.step(0);

}


void motorDireita() {
  //51 por segundo para 5 seg total
  /*if(!flag){
    flag = true;
    velMotor = 51;

    }else */
  if (velMotor < 255 && millis() - lastRefreshTime >= REFRESH_INTERVAL) {
    lastRefreshTime += REFRESH_INTERVAL;
    velMotor += 25;
  }

  //int motorSpeed = map(sensorReading, 0, 1023, 0, 100);
  //int motorSpeed = map(velMotor, 0, 1023, 0, 255);

  Serial.print("direita ativada, velocidade: ");
  Serial.print(velMotor);
  //Serial.print(motorSpeed);
  Serial.print("\n");

  stepper.setSpeed(velMotor);
  //stepper.setSpeed(motorSpeed);
  stepper.step(1);
}

void motorEsquerda() {
  //51 por segundo para 5 seg total

  if (velMotor < 255 && millis() - lastRefreshTime >= REFRESH_INTERVAL) {
    lastRefreshTime += REFRESH_INTERVAL;
    velMotor += 51;
  }

  Serial.print("Esquerda ativida, velocidade: ");
  Serial.print(velMotor);
  Serial.print("\n");

  stepper.setSpeed(velMotor);
  stepper.step(-1);
}

person Pedro_Galahad    schedule 06.07.2018    source источник
comment
Вам следует посмотреть техническое описание своего шагового двигателя и выяснить, как с ним работает связь.   -  person Christian Gibbons    schedule 06.07.2018
comment
Внутри вашего кода вы используете stepper.setSpeed для изменения скорости. Я не уверен, как это делает потенциометр.   -  person busybear    schedule 07.07.2018


Ответы (1)


Для всех, кто пришел сюда, я нашел решение. Похоже, что биполярный шаговый двигатель просто движется с определенной скоростью {80,100, 160, 180, 200,220, 255}, а мой код - от 0 до 255, поэтому я просто изменил код, чтобы перейти на определенные скорости в зависимости от времени, когда Переключатель нажат! Спасибо за помощь xD

#include <Stepper.h>

/*
  const int ForwardLimitSwitchPin = 2;
  const int ReverseLimitSwitchPin = 3;
  const int StepperStepPin = 4;
  const int StepperDirection = 5;
*/
const int StepperMaxRPM = 255; //default = 100

const int swDireita = 13;
const int swEsquerda = 12;
int velMotor = 80;

static const unsigned long REFRESH_INTERVAL = 1000; //ms
static unsigned long lastRefreshTime = 0;

//Stepper stepper(200, StepperStepPin, StepperDirectionPin);
Stepper stepper(200, 8, 9, 10, 11);

void setup() {
  Serial.begin(115200);

  pinMode(swDireita, INPUT);
  pinMode(swEsquerda, INPUT);

  digitalWrite(swDireita, HIGH);
  digitalWrite(swEsquerda, HIGH);

  stepper.setSpeed(StepperMaxRPM);
}

void loop() {
  while (digitalRead(swDireita) == 0) {
    motorDireita();
  }
  while (digitalRead(swEsquerda) == 0) {
    motorEsquerda();
  }
  while (digitalRead(swEsquerda) == 1 && digitalRead(swDireita) == 1) {
    Serial.print("to aqui");
    velMotor = 0;
    stepper.setSpeed(velMotor);
    Serial.print(velMotor);
  }
}

void motorDireita() {
  if (millis() - lastRefreshTime >= REFRESH_INTERVAL) {
    lastRefreshTime += REFRESH_INTERVAL;
    switch (velMotor) { //80//100//160//180//200//220//255
      case 0:
        Serial.print("antes: ");
        Serial.print(velMotor);
        velMotor = 80;
        stepper.setSpeed(velMotor);
        break;
      case 80:
        velMotor = 100;
        stepper.setSpeed(velMotor);
        break;
      case 100:
        velMotor = 160;
        stepper.setSpeed(velMotor);
        break;
      case 160:
        velMotor = 180;
        stepper.setSpeed(velMotor);
        break;
      case 180:
        velMotor = 200;
        stepper.setSpeed(velMotor);
        break;
      case 200:
        velMotor = 220;
        stepper.setSpeed(velMotor);
        break;
      case 220:
        velMotor = 255;
        stepper.setSpeed(velMotor);
        break;
    }
  }
  Serial.print(velMotor);
  Serial.print("\n");
  stepper.step(1);
}

void motorEsquerda() {
  if (millis() - lastRefreshTime >= REFRESH_INTERVAL) {
    lastRefreshTime += REFRESH_INTERVAL;
    switch (velMotor) { //80//100//160//180//200//220//255
      case 0:
        Serial.print("antes ");
        Serial.print(velMotor);
        velMotor = 80;
        stepper.setSpeed(velMotor);
        break;
      case 80:
        Serial.print("antes ");
        Serial.print(velMotor);
        velMotor = 100;
        stepper.setSpeed(velMotor);
        break;
      case 100:
        Serial.print("antes ");
        Serial.print(velMotor);
        velMotor = 160;
        stepper.setSpeed(velMotor);
        break;
      case 160:
        Serial.print("antes ");
        Serial.print(velMotor);
        velMotor = 180;
        stepper.setSpeed(velMotor);
        break;
      case 180:
        Serial.print("antes ");
        Serial.print(velMotor);
        velMotor = 200;
        stepper.setSpeed(velMotor);
        break;
      case 200:
        Serial.print("antes ");
        Serial.print(velMotor);
        velMotor = 220;
        stepper.setSpeed(velMotor);
        break;
      case 220:
        Serial.print("antes ");
        Serial.print(velMotor);
        velMotor = 255;
        stepper.setSpeed(velMotor);
        break;
    }
  }

  Serial.print(velMotor);
  Serial.print("\n");
  stepper.step(-1);
}
person Pedro_Galahad    schedule 11.07.2018