ПК не распознает Arduino при работе с классом и библиотекой MIDIUSB
Недавно я купил Arduo Due, чтобы создать своего рода Midi-контроллер вместе с библиотекой MIDIUSB.
Я создал простую тестовую программу с 1 потенциометром (без использования класса) для тестирования библиотеки MIDIUSB, и все работает нормально, поэтому я решил расширить свою программу, чтобы она работала с более чем 1 потенциометром (с использование класса).
Однако мой компьютер перестал распознавать Arduino как MIDI-устройство с моим обновленным кодом. Когда я загружаю свой предыдущий код примера, все работает нормально. Я не получаю ошибок компиляции или чего-то еще. Я не понимаю, что я делаю неправильно. Если бы кто-нибудь мог объяснить мне, что я делаю неправильно, или мог бы дать мне решение, вы были бы героем, поскольку я не могу работать дальше, если эта проблема не будет решена. Спасибо!
Вот мой код для Custom_MIDI_controller_V2.ino:
#include "MIDIUSB.h"
#include "Class.h"
#define TOLERANCE 8
byte NUMBER_POTS = 5;
Pot PO0(A0, 1, 14);
Pot PO1(A1, 1, 15);
Pot PO2(A2, 1, 16);
Pot PO3(A3, 1, 17);
Pot PO4(A4, 1, 18);
Pot *POTS[] = {&PO0, &PO1, &PO2, &PO3, &PO4};
void setup() {
}
void loop() {
for (int i = 0; i < NUMBER_POTS; i++) {
int potValue = POTS[i]->getValue();
if(potValue != 255) {
controlChange(POTS[i]->_channel, POTS[i]->_control, potValue);
MidiUSB.flush();
}
}
}
void controlChange(byte channel, byte control, byte value) {
midiEventPacket_t event = {0x0B, 0xB0 | channel, control, value};
MidiUSB.sendMIDI(event);
}
Вот мой код Class.cpp:
#include "Arduino.h"
#include "Class.h"
#define TOLERANCE 8
Pot::Pot(int pin, int channel, int control) {
_pin = pin;
_channel = channel;
_control = control;
_value = analogRead(_pin);
_oldValue = _value - 10;
}
int Pot::getValue() {
int diff = abs(_value - _oldValue);
if(diff > TOLERANCE)
{
_oldValue = _value;
return map(_value, 0, 1023, 127, 0);
} else {
return 255;
}
}
А это код моего заголовка Class.h:
#ifndef Class_h
#define Class_h
#include "Arduino.h"
class Pot
{
public:
Pot(int pin, int channel, int control);
int getValue();
int _pin;
int _channel;
int _control;
int _value;
int _oldValue;
};
#endif
1 ответ
Вы должны быть осторожны с конструкторами в C++. Они вызываются на этапе инициализации глобальной переменной выполнения, что происходит до вызова main()
.
main()
вызывает подпрограммы, которые инициализируют и настраивают периферийные устройства и т. д. в чипе, а наличие analogRead()
в вашем конструкторе (что само по себе является еще одной ошибкой я упомяну ниже) есть хороший шанс (хотя я не знаю полной последовательности инициализации этого чипа), что он никогда не завершится, и, таким образом, ваша программа зависнет в этот момент.
Ваш analogRead()
в любом случае не хочет находиться в конструкторе, поскольку он будет выполняться только один раз при создании объекта. Вместо этого вы хотите, чтобы analogRead()
вызывался в тот момент, когда вам нужно получить аналоговое значение. В вашем коде это должно быть в начале int Pot::getValue()
.
- SerialUSB на Arduino Due
- Связь с пользовательским USB-ведомым устройством осуществляется с помощью DUE?
- Arduino Zero не распознается как MIDI-устройство через собственный USB-порт
- Кнопка стирания Arduino due и переключение питания
- Лучшее решение для параллельного чтения UART с помощью Arduino Due
- Собственный USB-порт Arduino и Simulink
- Лента Dotstar сходит с ума при подключении к MIDI-пианино
- Teensy 2.0 MIDI: количество нот в аккорде ограничено 6?
Несвязанная ошибка:
analogRead()
вызывается только один раз в конструкторе., @CL.Покажите, пожалуйста, тестовую программу, которая работала., @CL.
@CL не имеет отношения? Это вполне может быть основной причиной - конструктор вызывается до
main()
, где могут быть предварительно настроены такие вещи, как AnalogRead()`. Таким образом, он может никогда не пройти этот пункт программы., @MajenkoКакой смысл создавать массив указателей? Просто создайте массив объектов, как показано [здесь] (https://tttapa.github.io/Control-Surface-doc/Doxygen/d3/d8d/Multiple-Control-Change-Potentiometers_8ino-example.html), например., @tttapa