/* * 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; //------------------------------------------------------------ //----------------------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;x"); Serial.println(error); luces(false,false); float pid=kp*error; acelerar(70+pid,70-pid); } void acelerar(int motIzq, int motDer){ if(motIzq<0){ analogWrite(PWMB,0); }else{ if(motIzq>255){ analogWrite(PWMB,255); }else{ analogWrite(PWMB,motIzq); } } if(motDer<0){ analogWrite(PWMA,0); }else{ if(motDer>255){ analogWrite(PWMA,255); }else{ analogWrite(PWMA,motDer); } } } 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, por el momento solo * encuentra los valores bajos (blancos) y queda pendiente encontrar * los valores negros para obtener su promedio para el umbral. * * TODO:reacomodar esta función */ 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]