Всем привет! Имееется скетч. До добавления в него библиотеки 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]
У Вас конфликтуют библиотеки IRremote и Servo. Проблема, в том, что используется 1 и тот же таймер 1. Вашу библиотеку IRremote, я не вижу, поэтому сложно говорить. Если возможно дайте ссылку на нее, если не эта - https://github.com/arduino/Arduino/tree/master/libraries/RobotIRremote. И какую плату используете?
Добрый день! Плата ардуино уно. Да, бибилотека такая. Дело в том, что у меня уже был конфликт библиотек между IRremote и AFMotor я тогда и поменял в библиотеке IRremote таймер со 2 на 1. Теперь получается, что никак этот конфликт не устранить?
Попробуйте сделать следующее. Библиотеку Servo не трогаем. Вернуть 2 таймер в IRremote. А AFMotor подключить на 5 и 6 пин. Если не получится, пишите.
Это я немного запутался, извините, у Вас 4 DC, с 4 и данными библиотеками не получится. А вот 2 DC должно получится, проверьте, просто закомментируйте Код (Text): AF_DCMotor motor_a(1); AF_DCMotor motor_b(2); И сделайте, что писал выше Надо подумать, как сделать на 4 и возможно ли это.
Отрывают на работе, из того, что мне пришло в голову. 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.
А Вы можете пояснить, тогда каким образом работают два вывода под сервомашинки на моторшилде l239d? если 2 таймера уходят только на ШИМ 4 двигателей, а у уно их всего 3?
Все очень просто, сервомашинки работаю не на ШИМ. Как это сигнал только не называют 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. Где-то видел в продаже в РФ.