Ошибка компилятора. Прошу помощи.

Тема в разделе "Arduino & Shields", создана пользователем Torresok, 25 авг 2015.

  1. Torresok

    Torresok Нуб

    Всем привет! Имееется скетч. До добавления в него библиотеки Servo.h все работало прекрасно. Теперь же компилятор выдает ошибку:

    Robot IR Remote\IRremote.cpp.o: In function `__vector_11':
    C:\Program Files\Arduino\libraries\RobotIRremote\src/IRremote.cpp:120: multiple definition of `__vector_11'
    Servo\avr\Servo.cpp.o:C:\Program Files\Arduino\libraries\Servo\src\avr/Servo.cpp:81: first defined here
    collect2.exe: error: ld returned 1 exit status
    Ошибка компиляции.

    Помогите разобраться. Спасибо!
    Код (Text):

     
    #include <Servo.h>
    #include <IRremote.h>
    #include <AFMotor.h>

    #define M_FORWARD BACKWARD
    #define M_BACKWARD FORWARD
    #define HI_MOVE 255
    AF_DCMotor motor_a(1);  
    AF_DCMotor motor_b(2);  
    AF_DCMotor motor_c(3);
    AF_DCMotor motor_d(4);
    Servo arm1;
    Servo arm2;
    int RECV_PIN = 14;
    IRrecv irrecv(RECV_PIN);
    decode_results results;

    void setup()
    {
      Serial.begin(9600);
      irrecv.enableIRIn(); // Запускаем ИК приемник
      arm1.attach(9);
      arm2.attach(10);
      arm1.write(90);
      arm2.write(90);
     
      //pinMode(10, OUTPUT);
      //pinMode(11, OUTPUT);
     
    }
    void loop()
    {
      if (irrecv.decode(&results))
      {
      Serial.println(results.value, HEX);
      go(results.value);
      delay(100);
      irrecv.resume(); // Считываем код с ИК приемника
      }
      delay(100);
    }
    void control_servo (unsigned char rotation)
    {
      Serial.println (rotation, HEX);
      switch (rotation)
      {
     case 0xFF:
      arm1.write (180);
      break;
     case 0xFFF:
      arm1.write (90);
      break;
     case 0xFFFF:
      arm2.write (180);
      break;
     case 0xFFFFF:
      arm2.write (90);
      break;
    }
    }
    //
    // Подпрограмма управления двигателями
    //
    void go(unsigned char direction)
    {
      Serial.println(direction, HEX);
      switch (direction)
      {
     
     
      case 0xF7://Код кнопки СТОП
      motor_a.run(RELEASE);
      motor_b.run(RELEASE);
      motor_c.run(RELEASE);
      motor_d.run(RELEASE);
      //digitalWrite(10, LOW);
      //digitalWrite(11, LOW);
      break;
     
      case 0x77://Код кнопки ВПЕРЕД мотор(а)
      motor_a.setSpeed(HI_MOVE);
      motor_a.run(M_FORWARD);
      //digitalWrite(10, HIGH);
      //digitalWrite(11, HIGH);
      break;
      case 0xB7://Код кнопки ВПЕРЕД мотор (б)
      motor_b.setSpeed(HI_MOVE);
      motor_b.run(M_FORWARD);
      //digitalWrite(10, LOW);
      //digitalWrite(11, HIGH);
      break;
      case 0x37://Код кнопки ВПЕРЕД мотор (с)
      motor_c.setSpeed(HI_MOVE);
      motor_c.run(M_FORWARD);
      //digitalWrite(10, HIGH);
      //digitalWrite(11, LOW);
      break;
     
      case 0xD7://Код кнопки ВПЕРЕД мотор (д)
      motor_d.setSpeed(HI_MOVE);
      motor_d.run(M_FORWARD);
      //digitalWrite(10, LOW);
      //digitalWrite(11, HIGH);
      break;
      case 0x57://Код кнопки НАЗАД мотор(а)
      motor_a.setSpeed(HI_MOVE);
      motor_a.run(M_BACKWARD);
      //digitalWrite(10, HIGH);
      //digitalWrite(11, LOW);
      break;
      case 0x97://Код кнопки НАЗАД мотор (б)
      motor_b.setSpeed(HI_MOVE);
      motor_b.run(M_BACKWARD);
      //digitalWrite(10, LOW);
      //digitalWrite(11, LOW);
      break;
      case 0x17://Код кнопки НАЗАД мотор (с)
      motor_c.setSpeed(HI_MOVE);
      motor_c.run(M_BACKWARD);
      //digitalWrite(10, LOW);
      //igitalWrite(11, LOW);
      break;
      case 0xE7://Код кнопки НАЗАД мотор (д)
      motor_d.setSpeed(HI_MOVE);
      motor_d.run(M_BACKWARD);
      //digitalWrite(10, LOW);
      //digitalWrite(11, LOW);
      break;
      }
    }[/I]
     
     
     
     
     
    Последнее редактирование: 25 авг 2015
  2. Alex19

    Alex19 Гуру

    У Вас конфликтуют библиотеки IRremote и Servo.

    Проблема, в том, что используется 1 и тот же таймер 1. Вашу библиотеку IRremote, я не вижу, поэтому сложно говорить. Если возможно дайте ссылку на нее, если не эта - https://github.com/arduino/Arduino/tree/master/libraries/RobotIRremote.

    И какую плату используете?
     
  3. Torresok

    Torresok Нуб

    Добрый день! Плата ардуино уно. Да, бибилотека такая. Дело в том, что у меня уже был конфликт библиотек между IRremote и AFMotor я тогда и поменял в библиотеке IRremote таймер со 2 на 1. Теперь получается, что никак этот конфликт не устранить?
     
  4. Alex19

    Alex19 Гуру

    Попробуйте сделать следующее.

    Библиотеку Servo не трогаем.
    Вернуть 2 таймер в IRremote.
    А AFMotor подключить на 5 и 6 пин.

    Если не получится, пишите.
     
  5. Torresok

    Torresok Нуб

    А как подключить библиотеку на 5 и 6 пин? я использую драйвер двигателя на L293d(4 dc движка).
     
  6. Alex19

    Alex19 Гуру

    Это я немного запутался, извините, у Вас 4 DC, с 4 и данными библиотеками не получится.

    А вот 2 DC должно получится, проверьте, просто закомментируйте
    Код (Text):
    AF_DCMotor motor_a(1);
    AF_DCMotor motor_b(2);
    И сделайте, что писал выше
    Надо подумать, как сделать на 4 и возможно ли это.
     
  7. Torresok

    Torresok Нуб

    Да, вот так все заработало. Но двигатели 1-2 мне очень нужны......
     
  8. Torresok

    Torresok Нуб

    как быть?
     
  9. Alex19

    Alex19 Гуру

    Отрывают на работе, из того, что мне пришло в голову.

    1. Использование Mega 2560
    2. Использование 2-х Uno, Nano и т.д. (на ATmega328).
    3. Отказаться от AFMotor или переписать ее с помощью SoftPWM. К примеру при помощи данной библиотеки - https://code.google.com/p/rogue-code/wiki/SoftPWMLibraryDocumentation.

    Возможно есть еще варианты, в виде расширение ШИМ с помощью плат на I2C, но это все равно приведет к необходимости переписывать библиотеки. А так же, вариации на тему объединения в 1 таймере к примеру Servo и IRremote.

    Проблема в том, что у Arduino UNO 3 таймера.
    Если грубо
    Для библиотеки Servo нужен таймер 1, как только мы забираем его, теряем ШИМ на 9 и 10 ноге.
    Библиотека IRremote, тоже нужен таймер, можем выбрать 1 или 2, выбрали 2 теряем ШИМ 3 и 11 ноге.
    Библиотека AFMotor использует ШИМ, у Вас 4 мотора, следовательно надо 4 ШИМ. А для них надо 2 таймера.

    Все зависит от Вашего опыта и времени, я бы начал разбираться в AFMotor и SoftPWM, тем самым программно получить 4 ШИМ на 1-ном таймере. Но пришлось бы разобраться во многих нюансах AVR. Если сомневаетесь в знаниях или мало времени, берите Mega.
     
  10. Torresok

    Torresok Нуб

    Большое Вам спасибо за ответ!
     
  11. Torresok

    Torresok Нуб

    А Вы можете пояснить, тогда каким образом работают два вывода под сервомашинки на моторшилде l239d? если 2 таймера уходят только на ШИМ 4 двигателей, а у уно их всего 3?
     
  12. Alex19

    Alex19 Гуру

    Все очень просто, сервомашинки работаю не на ШИМ. Как это сигнал только не называют PPM, PDM и т.д., более подробнее, тут - http://wiki.amperka.ru/робототехника:сервоприводы.

    1 таймер можно подключить до 12 серв, если не ошибаюсь, им требуется 16 битный таймер, у Uno такой, только 1 - Таймер 1. Речь идет именно о библиотеке Servo - https://www.arduino.cc/en/Reference/Servo. Видел реализации и на 8-битных, для AVR (СИ).

    А для 4 моторов используется 4 ШИМ, то есть 2 таймера 0 и 2-ой.
    Это можно увидеть в библиотеке - https://github.com/adafruit/Adafruit-Motor-Shield-library/blob/master/AFMotor.cpp.

    Таким образом, на данном шилде можно подключить 4 мотора и 2 сервы. Правда шимов не останется.

    4. Вариант использование, данных плат или их аналогов - https://www.adafruit.com/products/815. Где-то видел в продаже в РФ.
     
  13. Torresok

    Torresok Нуб

    Спасибо Вам огромное. Теперь все понятно.