/* * SEGUIDOR DE LINEA CON ARDUINO * CODIGO BASE * Este código es la base para iniciar el seguidor de linea * aun no esta terminado, pero se ira completando hasta la * version final. * * NOTA: Esta codigo no usa la libreria QTR, por lo que el * procesamieto es manual y se puede ajustar de una mejor manera */ //------------------------------------------------------------ //----------------------VARIABLES----------------------------- //------------------------------------------------------------ int sensores[]={A0,A1,A2,A3,A4,A5,A6,A7};//Sensores int valores[8]; int umbral[]={1023,1023,1023,1023,1023,1023,1023,1023}; int numSensores=8;//total de sensres en la barra int ir =2;//encender y apagar la barra #define PWMA 9 #define AIN2 8 #define AIN1 7 #define BIN1 5 #define BIN2 4 #define PWMB 3 #define LED_DER 12 #define LED_IZQ 2 //------------------------------------------------------------ //----------------------------PID----------------------------- //------------------------------------------------------------ float kp=.5; float ki=0; float kd=0; int velocidad=100; int ultimaPosicion=0; int errorAnterior=0; int P,I,D; //------------------------------------------------------------ //----------------------INICIALIZACION------------------------ //------------------------------------------------------------ void setup() { //pines para controlar motores pinMode(PWMA,OUTPUT); pinMode(PWMB,OUTPUT); pinMode(AIN1,OUTPUT); pinMode(AIN2,OUTPUT); pinMode(BIN1,OUTPUT); pinMode(BIN2,OUTPUT); //establecer direccion de los motores digitalWrite(AIN1,HIGH); digitalWrite(AIN2,LOW); digitalWrite(BIN1,LOW); digitalWrite(BIN2,HIGH); Serial.begin(115200); //Inicializamos los pines de los sensores for(int x=0;x255){ analogWrite(PWMB,255); }else{ analogWrite(PWMB,motIzq); } } if(motDer<0){ analogWrite(PWMA,0); }else{ if(motDer>255){ analogWrite(PWMA,255); }else{ analogWrite(PWMA,motDer); } } } /* * Función que permite controlar dos led's uno derecho y * el otro en la izquierda del seguidor */ void luces(boolean izq,boolean der){ digitalWrite(LED_IZQ,izq); digitalWrite(LED_DER,der); } /* * Funcion que permite la lectura de los sensores de forma * analógica sin procesar nada, el resultado queda en el * arreglo llamado "valores" */ void leerRAW(){ //LEER LOS VALORES DE LOS SENSORES for(int x=0;x(umbral[x])?(x*500)+500:0; } } /* * Esta funcion tiene como objetivo encontrar el valor mas alto * y mas bajo de los sensores, para establecer su umbral, lo cual * se consigue sacando el promedio de el valor mas bajo (blanco) * y el mas alto (negro) */ void calibracion(){ int min[]={1023,1023,1023,1023,1023,1023,1023,1023}; int max[]={0,0,0,0,0,0,0,0}; digitalWrite(LED_BUILTIN,HIGH); for(int y=0;y<400;y++){ for(int x=0;xv){ min[x]=v; } if(max[x]