Когда я проверяю скетч, я получаю несколько ошибок
Я новичок в кодировании Arduino и загрузил скетч для PCA9685, чтобы использовать его с моделью железных дорог и управлением стрелочными переводами. Когда я проверяю скетч, я получаю несколько ошибок ... Я даже не знаю, как их решить, и мне может понадобиться помощь. Есть два скетча:
1:
/*************************************************** ********
Этот скетч можно использовать для управления любым количеством стрелочных переводов на
Модель железной дороги. Кодовые блоки могут быть добавлены для размещения любого количества
сервоприводов. В этом скетче для демонстрации используются только два сервопривода.
Кнопку можно заменить переключателем SPST.
обычно используется на панели управления. Можно использовать трехконтактный двухцветный светодиод.
вместо двух отдельных светодиодов в каждой цепи.
В переключателе используется подтягивающий резистор 10 кОм.
В светодиодах используется резистор 330 Ом. Один на пару светодиодов
Создано 02.03.2019 Томом Квичаком
https://tomstrainsandthings.com/
Дополнительные проекты Arduino можно найти по указанному выше веб-адресу.
******************************************************* **/
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
int buttonPin0 = 2; // Можно добавить столько кнопок, сколько нужно
int ledPin0C = 3; // C обозначает закрытую позицию стрелочного перевода
int ledPin0T = 4; // T обозначает брошенное положение стрелочного перевода
int buttonState0 = 0;
int buttonPin1 = 5;
int ledPin1C = 6;
int ledPin1T = 7;
int buttonState1 = 0;
void setup() {
Serial.begin(9600);
Serial.println("pca9685_TurnoutFinal!");
pwm.begin();
pwm.setPWMFreq(60);
delay(30);
pinMode(ledPin0C, OUTPUT);
pinMode(ledPin0T, OUTPUT);
pinMode(buttonPin0, INPUT);
pinMode(ledPin1C, OUTPUT);
pinMode(ledPin1T, OUTPUT);
pinMode(buttonPin1, INPUT);
}
void loop() {
///////////
buttonState0 = digitalRead(buttonPin0);
if (buttonState0 == HIGH) {
pwm.setPWM(0, 0, 370);
digitalWrite(ledPin0T, LOW);
digitalWrite(ledPin0C, HIGH);
}
else {
pwm.setPWM(0, 0, 285);
digitalWrite(ledPin0C, LOW);
digitalWrite(ledPin0T, HIGH);
}
//////////
buttonState1 = digitalRead(buttonPin1);
if (buttonState1 == HIGH) {
pwm.setPWM(1, 0, 370);
digitalWrite(ledPin1T, LOW);
digitalWrite(ledPin1C, HIGH);
}
else {
pwm.setPWM(1, 0, 285);
digitalWrite(ledPin1C, LOW);
digitalWrite(ledPin1T, HIGH);
}
//////////
}
2:
/*************************************************** ********
Это пример для нашего 16-канального ШИМ-усилителя Adafruit. Сервопривод
Тест сервоприводов - это будет управлять 8 сервоприводами, один за другим на
первые 8 контактов PCA9685
Возьмите один сегодня в магазине Adafruit!
------> http://www.adafruit.com/products/815
Эти драйверы используют I2C для связи, для связи требуется 2 контакта.
интерфейс.
Adafruit вкладывает время и ресурсы, предоставляя этот открытый исходный код,
пожалуйста, поддержите Adafruit и оборудование с открытым исходным кодом, купив
продукты от Adafruit!
Написано Лимором Фридом/Ладьядой для Adafruit Industries.
Лицензия BSD, весь текст выше должен быть включен в любое распространение
******************************************************* **/
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
// Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver (0x41);
#define SERVOMIN 110 // это "минимальная" длина импульса (из 4096)
#define SERVOMAX 510 // это «максимальная» длина импульса (из 4096)
// Возможно, придется скорректировать значения, чтобы они соответствовали вашим сервоприводам
// Проверьте свой сервопривод с помощью процедур, описанных ниже
// счетчик нашего сервопривода
uint8_t servonum = 0;
void setup() {
Serial.begin(9600);
Serial.println("pca9685_TurnoutTest!");
pwm.begin();
pwm.setPWMFreq(60); // Аналоговые сервоприводы работают с частотой обновлений ~60 Гц
delay(50);
}
///////////////////Функции///////////////////////
void driveMin() {
pwm.setPWM(servonum, 0, SERVOMIN); //Используем для проверки нижнего диапазона
}
void driveMax() {
pwm.setPWM(servonum, 0, SERVOMAX); //Используем для проверки верхнего диапазона
}
///////////////Конец функций///////////////////
void loop() {
for( int angle =0; angle<181; angle +=15){ // сейчас только тестирование
delay(500);
pwm.setPWM(1, 0, convert2angle(angle) ); // Это может понадобиться только для подметания сервопривода
}
}
int convert2angle(int myang){
int pulse = map(myang,0, 180, SERVOMIN,SERVOMAX);// угол отображения от 0 до 180 до минимального и максимального сервопривода
Serial.print("Angle/Pulse: ");Serial.print(myang);
Serial.print(" / "); Serial.println(pulse);
return pulse;
}
СООБЩЕНИЯ ОБ ОШИБКАХ:
pca9685_TurnoutTest:23:25: error: redefinition of 'Adafruit_PWMServoDriver pwm'
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
^
C:\Users\wdhen\Documents\Arduino\libraries\Adafruit-PWM-Servo-Driver-Library-master\examples\pca9685_TurnoutFinal\pca9685_TurnoutFinal.ino:21:25: note: 'Adafruit_PWMServoDriver pwm' previously declared here
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
^
C:\Users\wdhen\Documents\Arduino\libraries\Adafruit-PWM-Servo-Driver-Library-master\examples\pca9685_TurnoutFinal\pca9685_TurnoutTest.ino: In function 'void setup()':
pca9685_TurnoutTest:35:6: error: redefinition of 'void setup()'
void setup() {
^
C:\Users\wdhen\Documents\Arduino\libraries\Adafruit-PWM-Servo-Driver-Library-master\examples\pca9685_TurnoutFinal\pca9685_TurnoutFinal.ino:33:6: note: 'void setup()' previously defined here
void setup() {
^
C:\Users\wdhen\Documents\Arduino\libraries\Adafruit-PWM-Servo-Driver-Library-master\examples\pca9685_TurnoutFinal\pca9685_TurnoutTest.ino: In function 'void loop()':
pca9685_TurnoutTest:52:6: error: redefinition of 'void loop()'
void loop() {
^
C:\Users\wdhen\Documents\Arduino\libraries\Adafruit-PWM-Servo-Driver-Library-master\examples\pca9685_TurnoutFinal\pca9685_TurnoutFinal.ino:48:6: note: 'void loop()' previously defined here
void loop() {
^
Using library Wire at version 1.0 in folder: C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.21.0_x86__mdqgnx93n4wtt\hardware\arduino\avr\libraries\Wire
Using library Adafruit-PWM-Servo-Driver-Library-master at version 2.0.0 in folder: C:\Users\wdhen\Documents\Arduino\libraries\Adafruit-PWM-Servo-Driver-Library-master
exit status 1
redefinition of 'Adafruit_PWMServoDriver pwm'
@Wayne Hensley, 👍3
Обсуждение1 ответ
Кажется, вы собираете скетч из папки, в которой находится более 1 файла .ino. Я догадываюсь об этом по путям, упомянутым в сообщениях об ошибках.
Среда разработки Arduino IDE поддерживает организацию кода в несколько файлов .ino, что упрощает чтение большого кода. Для этого он собирает все файлы .ino в папку основного скетча, чтобы они компилировались вместе.
Поскольку у вас есть как минимум 2 полных скетча в одной папке, это приводит к ошибке переопределения, так как эти ресурсы (переменная pwm
и функции setup()
и loop()
) уже определены в первом скетче, когда компилятор получает второй скетч.
Вы должны поместить все свои индивидуальные наброски в свои папки. Тогда ошибка не появится. Я попытался скомпилировать два ваших скетча по отдельности, и это сработало.
Большое спасибо... буду работать над созданием индивидуальных скетчей!, @Wayne Hensley
Большой! Каждый скетч в отдельном файле в отдельной папке, @chrisl
@WayneHensley Если этот ответ решил ваш вопрос, вы можете принять его как правильный :), @chrisl
- Как изменить скорость нескольких сервоприводов, работающих одновременно с модулем PCA9685?
- Одновременное использование SDA и SCL с аналоговыми входами
- Первый проект I2C - Невозможно получить какое-либо движение сервопривода с помощью PCA9685
- Как управлять выключателем питания RC с помощью Arduino-/Adafruit-Board?
- Невозможно найти модуль PCA9685 при использовании библиотеки I2CScanner: нет движения сервопривода.
- Проблемы с пониманием минимальных и максимальных параметров серводвигателя
- Как Arduino Uno может поддерживать до 12 сервоприводов, если у него всего 6 цифровых выводов ШИМ?
- Высокочастотный PWM на Adafruit Feather M0
Ошибки показаны в Arduino IDE под скетчем. Отметьте соответствующий текст, нажмите Control+C, нажмите «редактировать» на этом сайте, нажмите в конце текста в появившемся текстовом редакторе. Нажмите Control+V, чтобы вставить текст в вопрос. Затем выделите весь текст сообщения об ошибке и нажмите кнопку
{}
, которую вы видите над текстом в текстовом редакторе., @chrisl