Библиотека 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 тоже будет работать. Я что-то упустил из виду?
@Volkan Ünal, 👍1
1 ответ
Ваш код выдает ошибку компилятора: 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);
}
};
- C++ против языка Arduino?
- Как использовать SPI на Arduino?
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- Ошибка: expected unqualified-id before 'if'
- Что лучше использовать: #define или const int для констант?
- Библиотека DHT.h не импортируется
- Функции со строковыми параметрами
- Светодиоды: разница между общим анодом и общим катодом
Да, вам стоит заняться кастингом. (static_cast может быть более подходящим). Но это не относится к моей проблеме. Также с этими строками конструктор вызывается перед main(). AF_DCMotor InsertionMotor(1); AF_DCMotor PumpMotor(2);, @Volkan Ünal