ПК не распознает 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

Обсуждение

Несвязанная ошибка: 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


1 ответ


1

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

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

Ваш analogRead() в любом случае не хочет находиться в конструкторе, поскольку он будет выполняться только один раз при создании объекта. Вместо этого вы хотите, чтобы analogRead() вызывался в тот момент, когда вам нужно получить аналоговое значение. В вашем коде это должно быть в начале int Pot::getValue().

,