Библиотека AfMotor Shield не работает с программированием по шаблону

Я могу перемещать двигатели с помощью библиотеки AfMotor Shield. ( < a href="https://github.com/adafruit/Adafruit-Motor-Shield-library">https://github.com/adafruit/Adafruit-Motor-Shield-library )

Нравится:

AF_DCMotor insertionMotor(1);
AF_DCMotor pumpMotor(2);

void setup()
{
  insertionMotor.setSpeed(255);
  pumpMotor.setSpeed(255);
  insertionMotor.run(RELEASE);
  pumpMotor.run(RELEASE);
  insertionMotor.run(FORWARD);
  pumpMotor.run(FORWARD);
}

Но если я хочу написать так, то работает только мотор с расширением шаблона, которое я назвал последним.

enum class direction {
  FRW = 0x01,
  BCKW,
};

template<int n, direction type>
class Motor : public AF_DCMotor {

public:

  Motor() : AF_DCMotor(n) {
    setSpeed(255);
    run(RELEASE);
    run(type);
  }
};
Motor<1, direction::FRW> fanMotor;
Motor<2, direction::FRW> pumpMotor;

Работает только двигатель насоса. Или если я назову fanMotor после pumpMotor, он все равно будет работать. Если я уберу pumpmotor и оставлю только fanMotor, то fanMotor тоже будет работать. Я что-то упустил из виду?

, 👍1


1 ответ


2

Ваш код выдает ошибку компилятора: in

run(type);

метод run() ожидает uint8_t, но получает direction. Добавление явного приведения к uint8_t приводит к его компиляции.

Теперь, как правило, я бы посоветовал вам никогда не прикасаться к оборудованию. в конструкторе. Проблема в том, что если вы создаете глобальный объект (например, вы делаете здесь), конструктор вызывается перед main(), таким образом до того, как ядро Arduino сможет инициализировать аппаратное обеспечение. Если ваш конструктор касается любого аппаратного регистра, это может конфликтовать с инициализация, которую ядро будет выполнять в самом начале основной().

Обычная идиома для выполнения любой аппаратной инициализации – определить в вашего объекта метод с именем begin() и вызовите его из setup():

template<int n, direction type>
class Motor : public AF_DCMotor {
public:
  Motor() : AF_DCMotor(n) {}

  void begin() {
    setSpeed(255);
    run(RELEASE);
    run((uint8_t) type);
  }
};
,

Да, вам стоит заняться кастингом. (static_cast может быть более подходящим). Но это не относится к моей проблеме. Также с этими строками конструктор вызывается перед main(). AF_DCMotor InsertionMotor(1); AF_DCMotor PumpMotor(2);, @Volkan Ünal