Библиотека 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