Fehler beim Kompilieren für das Board Arduino Uno (gelöst)

Hi,
Ich bekomme eine Fehlermeldung,
die ich leider nicht gelöst bekomme.

Wenn ich die Zeile einfüge, um diese Bibliothek einzubinden,
bekomme ich nur bei meinem Code eine Fehlermeldung
Die komplette Fehlermeldung ist folgende:

Tone.cpp.o (symbol from plugin): In function `timer0_pin_port':
(.text+0x0): multiple definition of `__vector_7'
libraries/IRremote/IRremote.cpp.o (symbol from plugin):(.text+0x0): first defined here
collect2: error: ld returned 1 exit status
exit status 1
Fehler beim Kompilieren für das Board Arduino Uno.

Diese wird aber nur bei diesem Code ausgegeben,
wenn ich die oberste Bibliothek einbinde:

//Bibliotheken einbinden
#include "IRremote.h"

//Pins definieren
const int Motor_rechts_vor_Pin = 9;
const int Motor_links_vor_Pin = 5;
const int Motor_rechts_zurueck_Pin = 6;
const int Motor_links_zurueck_Pin = 3;
const int Infrarotsensor1_Pin = A1;
const int Infrarotsensor2_Pin = A2;
const int Infrarotsensor3_Pin = A3;
const int Lautsprecher_Pin = 2;
const int IR_Receiver_Pin = 11;

//Konstanten definieren
const int Infrarotschwelle = 600;
const int Standartgeschwindigkeit = 80;
const int Standartdrehwinkel = 40;

void setup() {
  
  //Module starten
  Serial.begin(9600);
  
  //Pins deklarieren
  pinMode(Motor_rechts_vor_Pin, OUTPUT);
  pinMode(Motor_links_vor_Pin, OUTPUT);
  pinMode(Motor_rechts_zurueck_Pin, OUTPUT);
  pinMode(Motor_links_zurueck_Pin, OUTPUT);
}

void loop() {
  
  //Defaulteinstellungen
  digitalWrite(Motor_rechts_vor_Pin, false);
  digitalWrite(Motor_links_vor_Pin, false);
  digitalWrite(Motor_rechts_zurueck_Pin, false);
  digitalWrite(Motor_links_zurueck_Pin, false);
  
  
  //waten bis Power_Taster gedrückt
  

  
  //Steuerung für das autonome Fahren
  boolean Fehlerkontrolle = autonomes_Fahren();

  //Fehlerkontrolle
  switch (Fehlerkontrolle) {
    case true:
      SuccessTone();
      Serial.println("Fahrt erfolgreich beendet");
    case false:
      ErrorTone();
      Serial.println("ERROR");
      Serial.println("Ein Fehler ist Aufgetreten");
  }

  delay(1000);
}


boolean autonomes_Fahren() {
  
  //Überprüfung ob das Auto richtig positioniert ist
  if(Infrarotkontrolle(1) == 0 && Infrarotkontrolle(2) == 1 && Infrarotkontrolle(3) == 0){
    //Programmverlauf wird nicht unterbrochen
  }else{
    Serial.println("Bitte positionieren Sie das Auto richtig");
    return false;
  }

  //Anfahren
  analogWrite(Motor_rechts_vor_Pin, Standartgeschwindigkeit);
  analogWrite(Motor_links_vor_Pin, Standartgeschwindigkeit);

  //abtasten der Linie
  while(Infrarotkontrolle(1) == 0 || Infrarotkontrolle(2) == 0 || Infrarotkontrolle(3) == 0) {
    
    //wenn alles normal ist
    if(Infrarotkontrolle(1) == 0 && Infrarotkontrolle(2) == 1 && Infrarotkontrolle(3) == 0) {
      
      //Standartgeschwindigkeit
      analogWrite(Motor_rechts_vor_Pin, Standartgeschwindigkeit);
      analogWrite(Motor_links_vor_Pin, Standartgeschwindigkeit);
    }else{

      //wenn zu viele Orientierungspunkte zu erfassen sind
      if(Infrarotkontrolle(1) == 1 && Infrarotkontrolle(2) == 0 && Infrarotkontrolle(3) == 1) {
        Serial.println("es stehen zu viele Orientierungspunkte zur Verfügung");
        return false;
      }
      
      //wenn keine Orientierungspunkte mehr zu erfassen sind
      if(Infrarotkontrolle(1) == 0 && Infrarotkontrolle(2) == 0 && Infrarotkontrolle(3) == 0) {
        Serial.println("es stehen keine Orientierungspunkte mehr zur Verfügung");
        return false;
      }else{
        
        //Richtung erfassen
        if(Infrarotkontrolle(1) == 1) {
          
          //in seine Richtung drehen
          Lenkung_vor(Standartgeschwindigkeit / 2, Standartdrehwinkel);
        }
        if(Infrarotkontrolle(3) == 1) {
          
          //in seine Richtung drehen
          Lenkung_vor(Standartgeschwindigkeit / 2, Standartdrehwinkel * -1);
        }
      }
    }
  }

  //Fahrt beendet
  return true;
}


int Infrarotkontrolle(int Infrarotsensor) {
  
  //Übersetzung in den jeweiligen Infrarotsensor_Pin
  int Infrarotsensor_Pin;
  switch(Infrarotsensor) {
    case 1:
      Infrarotsensor_Pin = Infrarotsensor1_Pin;
      break;
    case 2:
      Infrarotsensor_Pin = Infrarotsensor2_Pin;
      break;
    case 3:
      Infrarotsensor_Pin = Infrarotsensor3_Pin;
      break;
    default:
      Serial.println("Fehler bei den Infrarotpins");
      return -1;
  }
  
  //Kontrolle, ob der Infrarotsensor eine schwarze Linie erkennt
  if(analogRead(Infrarotsensor_Pin) > Infrarotschwelle) {
    return 1;
  }else{
    return 0;
  }
}


//Lenkung für vorwärts
void Lenkung_vor(int Geschwindigkeit, int Drehwinkel) {

  //welche Richtung
  if(Drehwinkel > 0) {
    analogWrite(Motor_rechts_vor_Pin,Geschwindigkeit - Drehwinkel);
  }else{
    analogWrite(Motor_links_vor_Pin,Geschwindigkeit + Drehwinkel);
  }
}

//Ton für Error
void ErrorTone() {
  tone(Lautsprecher_Pin, 450);
  delay(750);
  noTone(Lautsprecher_Pin);
}

//Ton für Erfolg
void SuccessTone() {
  tone(Lautsprecher_Pin, 196);
  delay(300);
  noTone(Lautsprecher_Pin);
  delay(25);
  tone(Lautsprecher_Pin, 196);
  delay(400);
  noTone(Lautsprecher_Pin);
}

Der Code ohne die Bibliothek funktioniert einwandfrei
und wurde auch schon in der Praxis getestet.

Komischerweise wird bei folgendem Code keine Fehlermeldung ausgegeben:

//www.elegoo.com
//2016.12.9

#include "IRremote.h"

const int IR_Receiver_Pin = 11; // Signal Pin des IR-Empfängers an Arduino Digital Pin 11

/*-----( Declare objects )-----*/
IRrecv irrecv(IR_Receiver_Pin);     // Erstellen Instanz von 'irrecv'
decode_results results;      // Erstellen Instanz von 'decode_results'

void setup() {
  
  irrecv.enableIRIn(); // Startet den Empfänger

}

void loop() {
  
translateIR();

}


//IR-Daten empfangen
int translateIR() {

  int received_data = -1;

  //Haben wir ein IR-Signal erhalten?
  if (irrecv.decode(&results)) {

    //IR-Signal bestimmen
    switch(results.value) {
      case 0xFFA25D: received_data = 1;     break; //POWER
      case 0xFFE21D: received_data = 2;     break; //FUNC/STOP
      case 0xFF629D: received_data = 3;     break; //VOL+
      case 0xFF22DD: received_data = 4;     break; //FAST BACK
      case 0xFF02FD: received_data = 5;     break; //PAUSE
      case 0xFFC23D: received_data = 6;     break; //FAST FORWARD
      case 0xFFE01F: received_data = 7;     break; //DOWN
      case 0xFFA857: received_data = 8;     break; //VOL-
      case 0xFF906F: received_data = 9;     break; //UP
      case 0xFF9867: received_data = 10;    break; //EQ
      case 0xFFB04F: received_data = 11;    break; //ST/REPT
      case 0xFF6897: received_data = 12;    break; //0
      case 0xFF30CF: received_data = 13;    break; //1
      case 0xFF18E7: received_data = 14;    break; //2
      case 0xFF7A85: received_data = 15;    break; //3
      case 0xFF10EF: received_data = 16;    break; //4
      case 0xFF38C7: received_data = 17;    break; //5
      case 0xFF5AA5: received_data = 18;    break; //6
      case 0xFF42BD: received_data = 19;    break; //7
      case 0xFF4AB5: received_data = 20;    break; //8
      case 0xFF52AD: received_data = 21;    break; //9
      case 0xFFFFFFFF: received_data = -1;  break; //REPEAT
      default: received_data = -1;                 //other button
    }
    
    delay(100);

    //Erhalte den nächsten Wert
    irrecv.resume();
    
  }

  return received_data;
}

Würde mich sehr über eine Rückmeldung freuen.
Grüße Carl

In deinem Sketch unterschlägst du die Library "tone.h".
Da gibt es offensichtlich einen Konflikt zwischen dieser und der "IRremote.h".

Nee, tone() gehört zur Standard Ausrüstung. Kollidiert aber mit IRremote weil dieses per Default den gleichen Timer beansprucht.

Stimmt, habe ich übersehen.
Danke für die Richtigstellung.

Wie kann es dann sein,
dass es im anderen Code funktioniert,
obwohl tone() immer geladen ist?

Ist es nicht.
Wenn tone nicht benutzt wird, wird auch die ISR vom Linker wegoptimiert.

Gibt es dafür eine einfache Lösung?
Oder muss ich nach einer anderen Möglichkeit schauen,
um Töne zu erzeugen?

Das kannst du natürlich tun.

Alternativ könntest du dafür sorgen, dass die IR Lib einen anderen Timer nutzt.

Ok.
Vielen Dank für die Antwort.
Mal schauen wie ich das löse :slight_smile: