Классы Arduino, не могут получить значение свойства

Я изо всех сил пытался заставить шаговый двигатель работать с классом, но не могу получить свойство, возвращающее его значение в методе. Я получаю 0 (ноль) вместо 26 (ожидаемых) от _stepPin.

Я пробовал это->_stepPin безуспешно.

Вот код. Смотрите комментарии внутри.

 class MKSStepperMotors {

   public:
    int _dirPin;
    int _stepPin;
    int _enablePin;

    MKSStepperMotors(int dirPin, int stepPin, int enablePin) {

      int _dirPin = dirPin;
      int _stepPin = stepPin;
      int _enablePin = enablePin;

      //Habilitamos el motor
      pinMode(_enablePin, OUTPUT);
      digitalWrite(_enablePin, LOW);

      //Cambiamos la direccion y aumentamos la velocidad
      pinMode(_dirPin, OUTPUT);
      digitalWrite(_dirPin, LOW);

      // Le indicamos el pin de señal
      pinMode(_stepPin, OUTPUT);

    }

    void move(int steps, int stepDelay)
    {

      for (int x = 0; x < steps; x++) {
        Serial.println(_stepPin); // <-- _stepPin равен нулю, а не 26, как должно быть
        digitalWrite(_stepPin, HIGH); <-- _stepPin is zero and not 26 as it should
        delayMicroseconds(stepDelay);
        digitalWrite(_stepPin, LOW);  <-- _stepPin is zero and not 26 as it should
        delayMicroseconds(stepDelay);
      }
    }
};


 MKSStepperMotors pedo(28, 26, 24);

 void setup() {
  Serial.begin(250000);
}

 void loop() {

      pedo.move(3200,100);

}

, 👍0


2 ответа


Лучший ответ:

3

Помещая туда тип, вы создаете новые переменные. ТАК в вашем конструкторе:

 MKSStepperMotors(int dirPin, int stepPin, int enablePin) {

      int _dirPin = dirPin;
      int _stepPin = stepPin;
      int _enablePin = enablePin;

Вы начинаете с создания трех новых переменных с теми же именами, что и переменные-члены, определенные в классе. В остальной части конструктора они используются вместо тех, которые являются переменными-членами.

Вы должны убрать здесь "int".

У вас также есть еще одна ошибка. Конструктор может запускаться перед функцией инициализации, если один из этих объектов объявлен в глобальной области видимости. В этом случае такие вещи, как digitalWite и pinMode, пока не будут работать. Конструктор должен иметь только код для инициализации переменных, он никогда не должен касаться оборудования. Материал, который использует аппаратное обеспечение, должен находиться в другой функции-члене (обычно называемой begin или init), которую вы можете вызвать из установки.

,

Сработало!!!!! И я принял предложение метода «init». СПАСИБО., @FedeKrum


2

Вы повторно объявили поля-члены класса в своем конструкторе:

class MKSStepperMotors {

   public:
    int _dirPin;
    int _stepPin;
    int _enablePin;

    MKSStepperMotors(int dirPin, int stepPin, int enablePin) {

      int _dirPin = dirPin;
      int _stepPin = stepPin;
      int _enablePin = enablePin;
      ...
    }

int _dirPin = dirPin; объявляет локальную переменную с тем же именем, что и член вашего класса _dirPin, и затеняет ее, следовательно, ваши 3 члены класса никогда не инициализируются!

Вы должны изменить свой конструктор следующим образом:

    MKSStepperMotors(int dirPin, int stepPin, int enablePin) {

      _dirPin = dirPin;
      _stepPin = stepPin;
      _enablePin = enablePin;
      ...
    }

Или лучше использовать стандартную инициализацию конструктора C++:

    MKSStepperMotors(int dirPin, int stepPin, int enablePin)
    :_dirPin(dirPin),_stepPin(stepPin),_enablePin(enablePin) {
      ...
    }

В этом последнем примере вам не нужно инициализировать члены вашего класса в теле конструктора, поскольку они уже инициализированы до того, как тело будет выполнено (это идиоматическое использование C++).

,