Ошибка компиляции

Тема в разделе "Arduino & Shields", создана пользователем Евгений96, 8 апр 2016.

  1. Решил сделать робота. Нашел подходящий проект , все детали уже есть , осталось загрузить код на ардуино , но выдает при проверке ошибка компиляции , я в этом мало что соображаю , код брал с сайта , должно быть все правильно . Как можно исправить эту ошибка , может быть проблема с библиотекой , единственное что у меня горит красным это #include <Servo.h>


    exit status 1
    Ошибка компиляции.



    // EN: We use special library to receive and decode commands from IR remote.
    // RU: Подключаем специальную библиотеку, предоставляющую функции
    // приёма и передачи ИК-команд. Сайт проекта:
    // https://github.com/shirriff/Arduino-IRremote
    #include "IRremote.h"

    #include "ir_command_codes.h"

    #include <Servo.h>

    // EN: Analog pin where IR detector is pluged in.
    // RU: Аналоговый вход контроллера, к которму подключен ИК-приёмник.
    const int IR_PIN = A0;

    // EN: Servo pins.
    // RU: Цифровые выводы контролера, к которым подключены серводвигатели.
    const int LEFT_SERVO_PIN = 2;
    const int CENTRAL_SERVO_PIN = 4;
    const int RIGHT_SERVO_PIN = 7;

    // EN: Servo "zero" angle positions.
    // RU: Центральное ("нулевое") положение серводвигателей в градусах.
    const long LEFT_SERVO_ZERO_VALUE = 90;
    const long RIGHT_SERVO_ZERO_VALUE = 90;
    const long CENTRAL_SERVO_ZERO_VALUE = 90;

    // EN: Amplitude of left and right servos.
    // RU: Амплитула левого и правого серводвигателей.
    const long SIDE_SERVOS_FULL_AMPLITUDE = 30;
    // EN: Half amplitude of left and right servos. Is used when robot is turning
    // left or right while moving forward or backward.
    // RU: Уменьшенная амплитула левого и правого серводвигателей. Используется
    // при поворотах совмещённых с движением вперёд или назад.
    const long SIDE_SERVOS_HALF_AMPLITUDE = 15;
    // EN: Amplitude of central servo.
    // RU: Амплитула центрального серводвигателя.
    const long CENTRAL_SERVO_AMPLITUDE = 20;

    // EN: Periods for different speeds.
    // RU: Периоды колебаний для различных скоростей.
    const long STEP_PERIOD_VERY_SLOW = 2000;
    const long STEP_PERIOD_SLOW = 1500;
    const long STEP_PERIOD_FAST = 1000;
    const long STEP_PERIOD_VERY_FAST = 500;

    long lastMillis;
    long globalPhase;
    float angleShiftLeftServo;
    float angleShiftRightServo;
    float angleShiftCentralServo;
    long stepPeriod;
    long amplitudeLeftServo;
    long amplitudeRightServo;
    boolean isAttached;
    boolean isStopped;

    // EN: IRrecv class performs the decoding.
    // RU: Создаём объект ИК-приёмник. Этот объект принимает и декодирует ИК-сигналы от пульта.
    IRrecv irrecv(IR_PIN);

    Servo LeftServo;
    Servo RightServo;
    Servo CentralServo;

    void attachServos() {
    if (!isAttached) {
    LeftServo.attach(LEFT_SERVO_PIN);
    RightServo.attach(RIGHT_SERVO_PIN);
    CentralServo.attach(CENTRAL_SERVO_PIN);
    isAttached = true;
    }
    }

    // EN: In some positions servos can make noise and vibrate.
    // To avoid this noise and vibration detach servos when robot is stopped.
    // RU: В некоторых положениях серводвигатели могут вибрировать и шуметь.
    // Чтобы это избежать во время остановок робота, сервы надо отключать.
    void detachServos() {
    if (isAttached) {
    LeftServo.detach();
    RightServo.detach();
    CentralServo.detach();
    isAttached = false;
    }
    }

    void setup() {
    // EN: Start the IR receiver.
    // RU: Начинаем прослушивание ИК-сигналов.
    irrecv.enableIRIn();

    attachServos();
    isStopped = true;
    lastMillis = millis();

    angleShiftLeftServo = 0;
    angleShiftRightServo = 0;
    angleShiftCentralServo = 0;
    stepPeriod = STEP_PERIOD_FAST;
    }

    // EN: Gets angle for servo.
    // Param amplitude - amplitude of oscillating process,
    // param phaseMillis - current duration of oscillating,
    // param shiftAndle - phase of oscillating process.
    // RU: Получение угла для серводвигателя.
    // Параметр amplitude - амплитуда колебаний,
    // Параметр phaseMillis - текущая продолжительность колебаний,
    // Параметр shiftAndle - фаза колебаний.
    int getAngle(long amplitude, long phaseMillis, float shiftAngle) {
    float alpha = 2 * PI * phaseMillis / stepPeriod + shiftAngle;
    float angle = amplitude * sin(alpha);
    return (int)angle;
    }

    template<typename T,size_t N>
    boolean hasCode(T (&commandCodes)[N], long code) {
    for (int i = 0; i < N; i++) {
    if (commandCodes == code) {
    return true;
    }
    }
    return false;
    }

    void loop() {
    long millisNow = millis();
    long millisPassed = millisNow - lastMillis;
    if (isStopped) {
    // EN: We should wait for half a second. After that we think that servos are in zero
    // position and we can detach them.
    // RU: Ждём полсекунды, чтобы серводвигатели вышли в нулевое положение и отключаем их.
    if (millisPassed >= 500) {
    lastMillis = 0;
    detachServos();
    }

    globalPhase = 0;
    } else {
    lastMillis = millisNow;

    globalPhase += millisPassed;
    globalPhase = globalPhase % stepPeriod;
    }
    // EN: Declaration of the structure that is used for received and decoded IR commands.
    // RU: Описываем структуру results, в которую будут помещаться
    // принятые и декодированные ИК-команды:
    decode_results results;
    // EN: We can handle IR command if it is received and decoded successfully.
    // RU: Если команда успешно принята и декодирована, то мы можем её обрабатывать.
    if (irrecv.decode(&results)) {

    if (hasCode(IR_COMMAND_FORWARD_CODES, results.value) ||
    hasCode(IR_COMMAND_FORWARD_LEFT_CODES, results.value) ||
    hasCode(IR_COMMAND_FORWARD_RIGHT_CODES, results.value)) {

    attachServos();
    isStopped = false;
    angleShiftLeftServo = 0;
    angleShiftRightServo = 0;
    angleShiftCentralServo = PI/2;

    amplitudeLeftServo = SIDE_SERVOS_FULL_AMPLITUDE;
    amplitudeRightServo = SIDE_SERVOS_FULL_AMPLITUDE;
    if (hasCode(IR_COMMAND_FORWARD_LEFT_CODES, results.value)) {
    amplitudeLeftServo = SIDE_SERVOS_HALF_AMPLITUDE;
    } else if (hasCode(IR_COMMAND_FORWARD_RIGHT_CODES, results.value)) {
    amplitudeRightServo = SIDE_SERVOS_HALF_AMPLITUDE;
    }
    } else if(hasCode(IR_COMMAND_BACKWARD_CODES, results.value) ||
    hasCode(IR_COMMAND_BACKWARD_LEFT_CODES, results.value) ||
    hasCode(IR_COMMAND_BACKWARD_RIGHT_CODES, results.value)) {

    attachServos();
    isStopped = false;
    angleShiftLeftServo = 0;
    angleShiftRightServo = 0;
    angleShiftCentralServo = -PI/2;

    amplitudeLeftServo = SIDE_SERVOS_FULL_AMPLITUDE;
    amplitudeRightServo = SIDE_SERVOS_FULL_AMPLITUDE;
    if (hasCode(IR_COMMAND_BACKWARD_LEFT_CODES, results.value)) {
    amplitudeRightServo = SIDE_SERVOS_HALF_AMPLITUDE;
    } else if (hasCode(IR_COMMAND_BACKWARD_RIGHT_CODES, results.value)) {
    amplitudeLeftServo = SIDE_SERVOS_HALF_AMPLITUDE;
    }
    } else if (hasCode(IR_COMMAND_TURN_LEFT_CODES, results.value)) {
    attachServos();
    isStopped = false;
    angleShiftLeftServo = 0;
    angleShiftRightServo = PI;
    angleShiftCentralServo = -PI/2;
    amplitudeLeftServo = SIDE_SERVOS_FULL_AMPLITUDE;
    amplitudeRightServo = SIDE_SERVOS_FULL_AMPLITUDE;
    } else if (hasCode(IR_COMMAND_TURN_RIGHT_CODES, results.value)) {
    attachServos();
    isStopped = false;
    angleShiftLeftServo = 0;
    angleShiftRightServo = PI;
    angleShiftCentralServo = PI/2;
    amplitudeLeftServo = SIDE_SERVOS_FULL_AMPLITUDE;
    amplitudeRightServo = SIDE_SERVOS_FULL_AMPLITUDE;
    } else if (hasCode(IR_COMMAND_STOP_CODES, results.value)) {
    attachServos();
    isStopped = true;
    angleShiftLeftServo = 0;
    angleShiftRightServo = 0;
    angleShiftCentralServo = 0;
    amplitudeLeftServo = SIDE_SERVOS_FULL_AMPLITUDE;
    amplitudeRightServo = SIDE_SERVOS_FULL_AMPLITUDE;
    } else if (hasCode(IR_COMMAND_VERY_SLOW_CODES, results.value)) {
    // EN: globalPhase correction to save servo positions when changing period.
    // RU: Корректировка globalPhase чтобы сохранить положение серв при смене периода колебаний ног.
    globalPhase = globalPhase * STEP_PERIOD_VERY_SLOW / stepPeriod;
    stepPeriod = STEP_PERIOD_VERY_SLOW;
    } else if (hasCode(IR_COMMAND_SLOW_CODES, results.value)) {
    globalPhase = globalPhase * STEP_PERIOD_SLOW / stepPeriod;
    stepPeriod = STEP_PERIOD_SLOW;
    } else if (hasCode(IR_COMMAND_FAST_CODES, results.value)) {
    globalPhase = globalPhase * STEP_PERIOD_FAST / stepPeriod;
    stepPeriod = STEP_PERIOD_FAST;
    } else if (hasCode(IR_COMMAND_VERY_FAST_CODES, results.value)) {
    globalPhase = globalPhase * STEP_PERIOD_VERY_FAST / stepPeriod;
    stepPeriod = STEP_PERIOD_VERY_FAST;
    }
    // EN: Once a code has been decoded, the resume() method must be called to resume receiving codes.
    // RU: После декодирования кода для продолжения приёма должен вызаваться метод resume().
    irrecv.resume();
    }
    if (isAttached) {
    LeftServo.write(LEFT_SERVO_ZERO_VALUE + getAngle(amplitudeLeftServo, globalPhase, angleShiftLeftServo));
    RightServo.write(RIGHT_SERVO_ZERO_VALUE + getAngle(amplitudeRightServo, globalPhase, angleShiftRightServo));
    CentralServo.write(CENTRAL_SERVO_ZERO_VALUE + getAngle(CENTRAL_SERVO_AMPLITUDE, globalPhase, angleShiftCentralServo));
    }
    }
     
  2. ostrov

    ostrov Гуру

    Установите библиотеку Servo.h
     
  3. а можете её скинуть , я не понимаю как с ними работать , вроде установил но....