Проблемы компиляции с включенной библиотекой MX1508 для сборки Билли Басса

Спасибо за рассмотрение моего вопроса.

Я изучаю Arduino, чтобы научить сына основам программирования. Наткнулся на забавный проект: как связать Bluetooth со старым поющим Билли Бассом, чтобы он мог слушать, как рыба читает ему книги с плеера Yoto.

Оригинальная сборка: https://maker.pro/arduino/projects/how-to-animate-billy-bass-with-bluetooth-audio-source

Исходный код: https://github.com/TensorFlux/BTBillyBass

Код предназначен для Arduino Nano и вызывает библиотеку MX1508, которая управляет H-мостом, позволяя моторам рта и хвоста вращаться в обоих направлениях. У меня проблема с этой библиотекой.

Ошибка компиляции: «class MX1508» не имеет члена с именем «setSpeed»

Эта же ошибка возникает как в коде, написанном для проекта, так и в тестовом файле библиотеки. Я попытался проверить распространённые ошибки библиотеки, отслеживая её расположение и переустанавливая Arduino IDE, но проблема осталась. В поисках других пользователей с такой же проблемой я наткнулся на радостного пользователя Reddit. По иронии судьбы, пост , который решил их проблему, был удалён во время API-забастовки 2023 года. Вопросы других пользователей на других форумах до сих пор остаются без ответа.

Ниже я приведу более простой код тестового файла библиотеки, а не проекта, в котором та же ошибка. Спасибо.

Правка: я попробовал три отдельных метода установки библиотек. Первый был с менеджером библиотек, который искал и устанавливал запись с меткой «MX1508». Это был первый раз, когда я увидел указанную ошибку. Имя создателя (Cheng Saeturn) отличалось от имени, указанного в описании сборки, поэтому я также попытался вручную поместить папку MX1508 из github в папку (Arduino>BTBillyBass>libraries>MX1508). Это не сработало, поэтому я снова заметил того же автора, и что методы и функции отличаются. Последняя попытка, вероятно, должна была быть моей первой, которая просто использовала ссылку на github, указанную в описании сборки. Загрузка представляет собой основную папку с файлом .ino и библиотекой MX1508. (Arduino>BTBillyBass-master>BTBillyBass & >libraries>MX1508). Я удалил «-master» из папки, чтобы соответствовать .ino, и открыл скетч. Установил плату на Nano и скомпилировал; та же ошибка. Код библиотеки, указанный в этом вопросе, взят из третьей попытки с правильным автором библиотеки.

Правка 2: Я повторил шаги, чтобы добавить метод установки библиотеки для тестового файла, и обнаружил свою ошибку. Я забыл удалить исходную некорректную библиотеку с тем же именем из папки Arduino. Я удалил её, заменил правильной библиотекой (которая до этого момента находилась в папке скетча, но не в папке Arduino), и теперь и исходный, и тестовый скетчи успешно компилируются.

MX1508Test.ino

#include <MX1508.h>

MX1508 Motor(3, 5); //настраивает двигатель на ШИМ-контактах 3 и 5

void setup() {
    Motor.setSpeed(255); //устанавливает скорость ШИМ (от 0 до 255)
}

void loop() {
  Motor.forward(); //запускает двигатель вперед
  delay(1000);
  Motor.halt(); // останавливает двигатель
  delay(1000);
  Motor.backward(); // запускает двигатель назад
  delay(1000);
  Motor.halt();
  delay(1000);

}

MX1508.cpp

/*
MX1508 — библиотека для управления недорогими H-мостами с использованием микросхемы драйвера MX1508
Создано в 2019 году Джорданом Банкером <jordan@hierotechnics.com>
Передано в общественное достояние
*/

#include <MX1508.h>

MX1508::MX1508(int pin1, int pin2) {
  pinMode(pin1, OUTPUT);
  _pin1 = pin1;
  pinMode(pin2, OUTPUT);
  _pin2 = pin2;
}

void MX1508::forward() {
  analogWrite(_pin1, _motorSpeed);
  digitalWrite(_pin2, LOW);
}

void MX1508::backward() {
  digitalWrite(_pin1, LOW);
  analogWrite(_pin2, _motorSpeed);
}

void MX1508::setSpeed(int motorSpeed) {
  _motorSpeed = motorSpeed;
}

void MX1508::halt() {
  digitalWrite(_pin1, HIGH);
  digitalWrite(_pin2, HIGH);
}

MX1508.h

/*
MX1508 — библиотека для управления недорогими H-мостами с использованием микросхемы драйвера MX1508
Создано в 2019 году Джорданом Банкером <jordan@hierotechnics.com>
Передано в общественное достояние
*/



#ifndef MX1508_H
#define MX1508_H

#if (ARDUINO >=100)
#include "Arduino.h"
#else
#include "WProgram.h"
#endif

class MX1508 {
  public:
    // Constructor
    MX1508(int pin1, int pin2);

    // Methods
    void forward();
    void backward();
    void setSpeed(int motorSpeed);
    void halt();

  private:
    int _pin1;
    int _pin2;
    int _motorSpeed;
};
#endif

, 👍0

Обсуждение

Я не могу воспроизвести то, что вы описали, на основе того, что загружено из репозитория GitHub., @hcheung

пожалуйста, обновите свой пост, описав процедуру установки вашей библиотеки ... отредактируйте пост, не пишите комментарий, @jsotola

Предложение повторить мои шаги было хорошим. Я отредактировал сообщение, указав на свою ошибку и решение для компиляции. Выложу скетч сегодня вечером и тогда же напишу ответ, если всё пройдёт успешно., @Benjamin Burgess

Репозиторий GitHub не упакован как библиотека Arduino. Поэтому установить её просто через менеджер библиотек не получится. Однако неправильная установка библиотеки не приводит к ошибке class MX1508 has no member named 'setSpeed. Вы просто получаете сообщение «MX1508 is not found» или что-то в этом роде., @hcheung

Чтобы правильно установить библиотеку, переместите папку MAX1508 (не папку libraries) в каталог, где хранятся все библиотеки на вашем ПК., @hcheung


1 ответ


1

Проблема решена, скетч компилируется и загружается, рыба получает питание, подключается к Bluetooth, реагирует на усилитель и потенциометр, хлопает крыльями и разговаривает, как и задумано.

Проблема была связана с наличием двух отдельных библиотек с именем «MX1508». Поскольку я сначала использовал менеджер библиотек, содержащий неправильную версию MX1508, скетч смог прочитать библиотеку с правильным именем в правильном месте, содержащую неправильные функции. Это привело к ошибке «не имеет имени члена», а не к ошибке «не найден».

Необходимым решением было удаление неправильной библиотеки и последующая ее замена в каталоге библиотек на версию, созданную Джорданом Банкером.

Дополнительные примечания: громкость входного сигнала телефона и т.п. должна быть установлена на максимум. Распиновка потенциометра в сборке неверна. Левый = земля; Центральный = выход (A0 Arduino); Правый = вход (модуль Bluetooth).

,