Проблемы компиляции с включенной библиотекой 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
1 ответ
Проблема решена, скетч компилируется и загружается, рыба получает питание, подключается к Bluetooth, реагирует на усилитель и потенциометр, хлопает крыльями и разговаривает, как и задумано.
Проблема была связана с наличием двух отдельных библиотек с именем «MX1508». Поскольку я сначала использовал менеджер библиотек, содержащий неправильную версию MX1508, скетч смог прочитать библиотеку с правильным именем в правильном месте, содержащую неправильные функции. Это привело к ошибке «не имеет имени члена», а не к ошибке «не найден».
Необходимым решением было удаление неправильной библиотеки и последующая ее замена в каталоге библиотек на версию, созданную Джорданом Банкером.
Дополнительные примечания: громкость входного сигнала телефона и т.п. должна быть установлена на максимум. Распиновка потенциометра в сборке неверна. Левый = земля; Центральный = выход (A0 Arduino); Правый = вход (модуль Bluetooth).
- Две батареи делят землю?
- L298N Dual Motor Controller Enable Pin имеет питание, но двигатели не работают
- Нужна помощь с библиотекой U8GLIB
- Использование библиотеки емкостных датчиков с мультиплексором 74HC4067
- Как соединить L293D и MPU6050 для совместной работы?
- Arduino IRremote перестает работать
- Как остановить двигатель через заданное время?
- Остановка двигателя постоянного тока с двумя концевыми выключателями
Я не могу воспроизвести то, что вы описали, на основе того, что загружено из репозитория GitHub., @hcheung
пожалуйста, обновите свой пост, описав процедуру установки вашей библиотеки ... отредактируйте пост, не пишите комментарий, @jsotola
Предложение повторить мои шаги было хорошим. Я отредактировал сообщение, указав на свою ошибку и решение для компиляции. Выложу скетч сегодня вечером и тогда же напишу ответ, если всё пройдёт успешно., @Benjamin Burgess
Репозиторий GitHub не упакован как библиотека Arduino. Поэтому установить её просто через менеджер библиотек не получится. Однако неправильная установка библиотеки не приводит к ошибке
class MX1508 has no member named 'setSpeed. Вы просто получаете сообщение «MX1508 is not found» или что-то в этом роде., @hcheungЧтобы правильно установить библиотеку, переместите папку MAX1508 (не папку libraries) в каталог, где хранятся все библиотеки на вашем ПК., @hcheung