SWIFT DRAGON F5
Universidad del Valle
Introducción a la ingeniería electrónica
Julio Hernán Flores Acosta - 2170357
Fase 5: Robot seguidor de línea Swift Dragon

Batería LiPo (polímero de iones de litio) de descarga alta, permite que los dos motores puedan funcionar correctamente abasteciendo su consumo de de 300 mah, además de suministrar la corriente suficiente para que el Arduino y puente h puedan funcionar.
Características
- Capacidad: 1000mAh
- Voltaje: 2S1P / 2 / celulares 7.4V
- Descarga: 25C Constante / 35C Burst
- Peso: 67 g (incluyendo cable y enchufe)
- Dimensiones: 72x34x15mm
- Conector de Balance: JST-XH
Esquema final de conexión entre los compuestos utilizados
Diagrama de bloques
CODIGO PIDPID significa Proporcional, Integral y Derivada.
El valor proporcional es aproximadamente proporcional a la posición del robot con respecto a la línea. Es decir, si el robot está centrado con precisión en la línea, se espera un valor proporcional de exactamente 0.
El valor integral registra el historial del movimiento del robot: es una suma de todos los valores del término proporcional que se registraron desde que el robot comenzó a funcionar.
La derivada es la tasa de cambio del valor proporcional.
CODIGO PROGRAMACION FINALIZADO SEGUIDOR DE LINEA
PID significa Proporcional, Integral y Derivada.
El valor proporcional es aproximadamente proporcional a la posición del robot con respecto a la línea. Es decir, si el robot está centrado con precisión en la línea, se espera un valor proporcional de exactamente 0.
El valor integral registra el historial del movimiento del robot: es una suma de todos los valores del término proporcional que se registraron desde que el robot comenzó a funcionar.
La derivada es la tasa de cambio del valor proporcional.
#include <QTRSensors.h> // Se hace uso de la librería para los sensores QTR-8A
//PUENTE H int PWMA=5; int AIN2=6; int AIN1=7; int PWMB=11; int BIN2=10; int BIN1=9; int STANDBY=8; int LED=13; int P=0; int I=0; int D=0; int LAST=0; float vel; //SE DEFINE LA VELOCIDAD int VelMax =57;//SE ADAPTAN Y ASIGNAN PINES LOS SENSORES
#define NUM_SENSORS 8 // number of sensors used #define TIMEOUT 2500 // waits for 2500 microseconds for sensor outputs to go low #define EMITTER_PIN 12 // emitter is controlled by digital pin 2 // ENTRADAS SENSORES
QTRSensorsRC qtra((unsigned char[]) {A7, A6, A5, A4, A3, A2, A1, A0}, NUM_SENSORS, TIMEOUT, EMITTER_PIN); unsigned int sensorValues[NUM_SENSORS]; unsigned int position=0;
void setup()
//SE ASIGNAN LOS PINES
{ pinMode(PWMA,OUTPUT); pinMode(AIN1,OUTPUT); pinMode(AIN2,OUTPUT); pinMode(PWMB,OUTPUT); pinMode(BIN1,OUTPUT); pinMode(BIN2,OUTPUT); pinMode(LED,OUTPUT); pinMode(STANDBY,OUTPUT);//PROCESO DE SENSADO (OBTENCIÓN DE VALORES) delay(1500); for (int j = 0; j <150; j++) { digitalWrite(LED, HIGH); delay(20); qtra.calibrate(); // reads all sensors 10 times at 2.5 ms (8 sensores) digitalWrite(LED, LOW); // turn off LED delay(20); }
//APAGADO DEL LED digitalWrite(LED, LOW);
// ARANQUE DE LOS MOTORES digitalWrite(AIN1,LOW); digitalWrite(AIN2,HIGH); digitalWrite(BIN1,HIGH); digitalWrite(BIN2,LOW); analogWrite(PWMA,0); analogWrite(PWMB,0);
//HABILITA EL PUENTE H PARA SU FUNCIONAMIENTO
digitalWrite(STANDBY, HIGH); delay(4000);
void loop()
{ //GENERAR VALORES unsigned int position = qtra.readLine(sensorValues); for (unsigned char i = 0; i < NUM_SENSORS; i++) { Serial.print(sensorValues[i]); Serial.print('\t'); } Serial.println(position); // comment this line out if you are using raw values delay(250); //LEEMOS LA SEÑAL DE LOS SENSORES qtra.read(sensorValues); position = qtra.readLine(sensorValues, QTR_EMITTERS_ON, 0); P = ((position)-(3500)); /// ERROR/////FRENOS//// if(P<-3500){ analogWrite(PWMA,200); // V MOTOR DERECHO analogWrite(PWMB,255); // V MOTOR IZQUIERDO digitalWrite(AIN1,LOW); ///DISMINUCION DEV, RETROCEDE digitalWrite(AIN2,HIGH); digitalWrite(BIN1,LOW); ///RETROCEDE digitalWrite(BIN2,HIGH); } else if (P>3500){ analogWrite(PWMA,255); // VMOTOR DERECHO analogWrite(PWMB,200); // V MOTOR IZQUIERDO digitalWrite(AIN1,HIGH); ///DISMINUCION DE V, RETROCEDE digitalWrite(AIN2,LOW); digitalWrite(BIN1,HIGH); ///FRENTE digitalWrite(BIN2,LOW); } else{ D= (P - LAST); /// ERROR MENOS EL ERROR ANTERIOR I=(P+ LAST); //INTEGRAL vel=(P*0.02)+(D*1.20)+(I*0.0052); if(vel >VelMax) vel=VelMax; if(vel<-VelMax) vel=-VelMax; analogWrite(PWMA,VelMax-vel); // VELOCIDAD MOTOR DERECHO analogWrite(PWMB,VelMax+vel); // VELOCIDAD MOTOR IZQUIERDO digitalWrite(AIN1,LOW); ///FRENTE digitalWrite(AIN2,HIGH); digitalWrite(BIN1,HIGH); ///FRENTE digitalWrite(BIN2,LOW); LAST=P; } }
Comentarios
Publicar un comentario