Когда я проверяю скетч, я получаю несколько ошибок

Я новичок в кодировании 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'

, 👍3

Обсуждение

Ошибки показаны в Arduino IDE под скетчем. Отметьте соответствующий текст, нажмите Control+C, нажмите «редактировать» на этом сайте, нажмите в конце текста в появившемся текстовом редакторе. Нажмите Control+V, чтобы вставить текст в вопрос. Затем выделите весь текст сообщения об ошибке и нажмите кнопку {}, которую вы видите над текстом в текстовом редакторе., @chrisl


1 ответ


1

Кажется, вы собираете скетч из папки, в которой находится более 1 файла .ino. Я догадываюсь об этом по путям, упомянутым в сообщениях об ошибках.

Среда разработки Arduino IDE поддерживает организацию кода в несколько файлов .ino, что упрощает чтение большого кода. Для этого он собирает все файлы .ino в папку основного скетча, чтобы они компилировались вместе.

Поскольку у вас есть как минимум 2 полных скетча в одной папке, это приводит к ошибке переопределения, так как эти ресурсы (переменная pwm и функции setup() и loop()) уже определены в первом скетче, когда компилятор получает второй скетч.

Вы должны поместить все свои индивидуальные наброски в свои папки. Тогда ошибка не появится. Я попытался скомпилировать два ваших скетча по отдельности, и это сработало.

,

Большое спасибо... буду работать над созданием индивидуальных скетчей!, @Wayne Hensley

Большой! Каждый скетч в отдельном файле в отдельной папке, @chrisl

@WayneHensley Если этот ответ решил ваш вопрос, вы можете принять его как правильный :), @chrisl