collect2.exe *:错误:ld返回1退出状态Arduino Uno

时间:2018-02-14 12:27:11

标签: c++ arduino arduino-uno

这是我的arduino uno的代码,可以创建一个行跟随器bot,但编译器会返回此错误:

  

collect2.exe *:错误:ld返回1退出状态

这是我的代码:

#include "known_16bit_timers.h"
#include "TimerOne.h"
#include "TimerOne.h"
#include "TimerOne.h"
#include <TimerOne.h>

#define dW digitalWrite
#define dR digitalRead

#define _TIMERONE_h
#define BOT1  7
#define BOT2  6
#define LEDG  13

#define MOT1  2
#define MOT2  3
#define MOT3  4
#define MOT4  5

#define T_GENERAL         0
#define T_LEDS            (T_GENERAL+1)
#define T_CALIBRACION     (T_LEDS+1)
#define T_CANT            (T_CALIBRACION+1)

#define WHITE  1
#define BLACK  0

#define COLOR BLACK

#define RECTA   0
#define CURVA   1
#define FRENO   2

#define CANT_SENS     5
#define CANT_SENS_MAX 6

int ms[T_CANT];

const int CNY[CANT_SENS_MAX] = { A0, A1, A2, A3, A4, A5 };              //pines
int CNYmax[CANT_SENS_MAX] = { 0, 0, 0, 0, 0, 0 };                     //valor maximo que puede tomar (se calibra)
int CNYmin[CANT_SENS_MAX] = { 1023, 1023, 1023, 1023, 1023, 1023 };   //valor minimo que puede tomar (se calibra)
const int peso[CANT_SENS_MAX] = { 0, 1000, 2000, 3000, 4000, 5000 };    //peso para el promedio ponderado
int linea = 0;                                                        //posicion de la linea de -1000 a 1000
boolean last_dir = 1;                                                //ultima direccion, 0 izq, 1 der
boolean hay_linea = 0;
int settle_time = 200;

#define POR_MIN   50      
#define GIRO_MAX  1.25   

int maxVel = 600;         //velocidad maxima
int calVel = 200;         //velocidad de calibracion
float KP = 0.4;
float KD = 12;
float KI = 0;
float correccion = 0;
int proporcional = 0;
int derivada = 0;
int integral = 0;
int last_linea = 0;

int tramo = RECTA;
int last_mark = 0;
//                        RECTA CURVA FRENO
const int tramoVel[] = { 800,  600,  100 };
const float tramoKp[] = { 0.5,  0.4,  0.1 };
const float tramoKd[] = { 15,   12,   5 };
const float tramoKi[] = { 0,    0,    0 };

int start = 0;
TimerOne Timer1;
// the setup function runs once when you press reset or power the board
void setup() {
    Serial.begin(9600);
    Timer1.initialize(1000);
    Timer1.attachInterrupt(contador);

    pinMode(BOT1, INPUT_PULLUP);
    pinMode(BOT2, INPUT_PULLUP);

    pinMode(LEDG, OUTPUT);

    pinMode(MOT1, OUTPUT);
    pinMode(MOT2, OUTPUT);
    pinMode(MOT3, OUTPUT);
    pinMode(MOT4, OUTPUT);

    for (int x = 0; x <= CANT_SENS_MAX; x++) {
        pinMode(CNY[x], INPUT);
    }
}
void contador() {
    for (int x = 0; x < T_CANT; x++) {
        ms[x]++;
    }
}
void calcularLinea(boolean color) {    //1 para WHITE 0 para BLACK
    long CNYesc[CANT_SENS_MAX];         //para ponerlo en una escala de 1000
    hay_linea = 0;                      //por si se me fue de la linea //TIENE QUE EMPEZAR EN 0
    long numerador = 0;
    long denominador = 0;
    for (int x = 0; x <= CANT_SENS - 1; x++) {
        CNYesc[x] = analogRead(CNY[x]) - CNYmin[x];
        CNYesc[x] = CNYesc[x] * 1000;
        CNYesc[x] = CNYesc[x] / (CNYmax[x] - CNYmin[x]);
        if (color == 1) {
            CNYesc[x] = 1000 - CNYesc[x];     //lo doy vuelta si busco el BLACK
        }
        if (CNYesc[x] > 10 * POR_MIN) {       //detecta si hay una linea
            hay_linea = 1;
        }
        numerador += CNYesc[x] * peso[x];   //para el promedio ponderado
        denominador += CNYesc[x];         //para el promedio ponderado
    }
    if (hay_linea == 1) {
        linea = numerador / denominador;    //promedio ponderado
        linea = linea - (CANT_SENS - 1) / 2 * 1000;         //cambiar de 0 - 4000 a error
        last_dir = (linea >= 0) ? 1 : 0;    //acutaliza la ultima direccion
    }
    else {
        linea = 0 + (CANT_SENS - 1) * 1000 * last_dir;    //utiliza la info de la ultima direccion
        linea = linea - (CANT_SENS - 1) / 2 * 1000;         //cambiar de 0 - 4000 a error

                                                            //tramo = (start==1)? CURVA : RECTA;        //seguro
    }

    //dW(LEDG, hay_linea);
}
int cambiaTramo(boolean color) {
    color = !color;                   //en la plaquita individual el valor es inverso
    long CNYesc;
    int x = CANT_SENS_MAX - 1;
    CNYesc = analogRead(CNY[x]);/* - CNYmin[x];
                                CNYesc = CNYesc * 1000;
                                CNYesc = CNYesc / (CNYmax[x]-CNYmin[x]);*/
    if (color == 1) {
        CNYesc = 1000 - CNYesc;           //lo doy vuelta si busco el BLACK
    }
    if (CNYesc > 10 * POR_MIN) {          //detecta si hay una linea
        last_mark = 1;
    }
    else {
        if (last_mark == 1) {
            motorSpeed(-300, -300);
            delay(50);
            if (tramo == RECTA) {
                tramo = CURVA;
            }
            else {
                if (tramo == CURVA) {
                    tramo = RECTA;
                }
            }
        }
        last_mark = 0;
    }
    Serial.println(CNYesc);
    dW(LEDG, (CNYesc > 10 * POR_MIN));
    return tramo;
}void updatePID(int t) {
    maxVel = tramoVel[t];
    KP = tramoKp[t];
    KD = tramoKd[t];
    KI = tramoKi[t];
}

float calcCorreccion(void) {
    proporcional = linea;
    derivada = linea - last_linea;
    integral = linea + last_linea;
    last_linea = linea;
    correccion = (KP*proporcional + KD*derivada + KI*integral);
    if (correccion > 0) {
        correccion = (correccion > maxVel*GIRO_MAX) ? maxVel*GIRO_MAX : correccion;
    }
    if (correccion < 0) {
        correccion = (correccion < -maxVel*GIRO_MAX) ? -maxVel*GIRO_MAX : correccion;
    }

    return (float)(KP*proporcional + KD*derivada + KI*integral);
}

void motorSpeed(int m1, int m2) { //entre 1000 y -1000
    int en1 = map(abs(m1), 0, 1000, 0, 255);
    int en2 = map(abs(m2), 0, 1000, 0, 255);
    en1 = (m1>0) ? 255 - en1 : en1;
    en2 = (m2 >= 0) ? en2 : 255 - en2;
    analogWrite(MOT2, en1);
    analogWrite(MOT4, en2);
    digitalWrite(MOT1, (m1 > 0) ? HIGH : LOW);
    digitalWrite(MOT3, (m2 >= 0) ? LOW : HIGH);
}


// the loop function runs over and over again until power down or reset
void loop() {
    calcularLinea("BLACK");
    correccion = calcCorreccion();


    updatePID(cambiaTramo(COLOR));

    if (dR(BOT1) == 0) {
        delay(500);
        calibrar(calVel, -calVel, 300);
        calibrar(-calVel, calVel, 400);
        calibrar(calVel, -calVel, 500);
        calibrar(-calVel, calVel, 400);
    }
    if (dR(BOT2) == 0) {
        while (dR(BOT2) == 0) {}
        start = 1;
        tramo = RECTA;
        last_mark = 0;
        ms[T_GENERAL] = 0;
    }
    if (start) {
        updatePID(cambiaTramo(COLOR));

        if (correccion > 0) {
            motorSpeed(maxVel, maxVel - correccion);
        }
        else {
            motorSpeed(maxVel + correccion, maxVel);
        }
    }
}
void calibrar(int m1, int m2, int timeCal) {         //velocidad de los motores y timepo de calibracion
    ms[T_CALIBRACION] = 0;
    while (ms[T_CALIBRACION] < timeCal) {
        if (ms[T_CALIBRACION] % 100 >= 50) {                //Titilar los leds
            dW(LEDG, 1);
        }
        else {
            dW(LEDG, 0);
        }
        motorSpeed(m1, m2);
        int CNYread[CANT_SENS_MAX];
        for (int x = 0; x <= CANT_SENS_MAX - 1; x++) {
            CNYread[x] = analogRead(CNY[x]);
            CNYmin[x] = (CNYread[x] < CNYmin[x]) ? CNYread[x] : CNYmin[x];
            CNYmax[x] = (CNYread[x] > CNYmax[x]) ? CNYread[x] : CNYmax[x];
        }
    }
    motorSpeed(0, 0);
    dW(LEDG, 1);
}

有人能帮帮我吗? 我还在Visual Studio 2015和arduino应用程序中测试我的代码。 对不起我的英语不好。

0 个答案:

没有答案