Вы находитесь на странице: 1из 17

UNIVERSIDAD NACIONAL

PEDRO RUIZ GALLO


FACULTAD DE CIENCIAS FISICAS Y MATEMATICAS

PROYECTO FINAL
“Seguidor de línea”

CARRERA :
Ingeniería Electrónica.

CURSO :
Control I.

DOCENTE :
Ing. Sandra Aznarán.

ESTUDIANTES :
-Barboza Huanambal Ronald.
-Díaz Esquén César Anthony.
-Jiménez Ramos Delsen.
-Millones Quesquén José Edu.
-Solis Reyes Gary Juan.
-Severino Garay Ubix.

LAMBAYEQUE, 09 DE FEBRERO DEL 2017


I.- FUNDAMENTOS:
 SEGUIDOR DE LÍNEA:
Son robots que cumplen una única misión: seguir una línea
marcada en el suelo normalmente de color negro sobre un
tablero blanco (normalmente una línea negra sobre un fondo
blanco).

 SENSORES:
Un rastreador detecta la línea a seguir por medio de dos
sensores. Hay muchos tipos de sensores que se pueden usar para
este fin; sin embargo, los más populares son los sensores
infrarrojos (IR), que en su versión más común constan cada uno
del dúo: LED infrarrojo más fototransistor. El primero emite una
pequeña señal infrarroja que será "rebotada o absorbida"
dependiendo de la base (fondo blanco o línea negra) y ésta será
detectado por el fototransistor.

Para nuestra aplicación consideraremos que la salida de estos


sensores será "0" cuando vean "blanco" y "1" cuando vean
"negro".

 MOTORES:
El robot se mueve utilizando motores. Dependiendo del tamaño,
el peso, la precisión del motor, entre otros factores.
Estos motores serán gobernados por el puente H tb6612fng, el
cuál permite además de modificar su sentido de giro, el control
de su velocidad mediante el uso de señales PWM, las cuáles
podemos variar mediante el módulo Arduino Nano.

 RUEDAS:
Las ruedas del robot son movidas por los motores. Normalmente
se usan ruedas de materiales anti-deslizantes para asegurar
buena tracción. Su tamaño es otro factor a tener en cuenta a la
hora de armar el robot.
 FUENTE DE ENERGÍA:
El robot obtiene la energía que necesita para su funcionamiento
de baterías. El peso, capacidad de descarga y duración son
factores a tener en cuenta a la hora de escoger un modelo o
tamaño.
 TARJETA DE CONTROL:
Ella es la responsable de la lectura de los sensores, la toma de
decisiones y el control de los motores. En nuestro proyecto se ha
usado una tarjeta Arduino Nano.

 FUNCIONAMIENTO:
El algoritmo para seguir la línea es muy sencillo. Si ambos
sensores detectan "negro" el robot seguirá avanzando. Cuando el
sensor de la derecha detecte "blanco" y el de la izquierda
"negro", el robot girará a la izquierda, y cuando ocurra el caso
contrario girará a la derecha. Si ambos sensores leen "blanco", el
robot permanecerá parado.

III.- PROCEDIMIENTO:
1) Lista de Materiales:
- 01 Arduino Nano.

- 01

- 08 Sensores

- 01 Puente H tb6612fng.
- 02 Minimotores N20.

- Jumpers
- Pulsadores
- 02 Llantas .
IV.- DISEÑO DE LA PLACA:
V.- PROGRAMACIÓN:
int sd4=A0;
int sd3=A1;
int sd2=A2;
int sd1=A3;
int si1=A4;
int si2=A5;
int si3=A6;
int si4=A7;
int error=0;
int error_previo=0;
int Kp=0;
int proporcional=0;
int vel=0;

int enMotord = 6;
int in1Motord = 7;
int in2Motord = 8;
int enMotori= 9;
int in1Motori= 10;
int in2Motori = 11;

void leer(){
sd4 = analogRead(A0);
sd3 = analogRead(A1);
sd2 = analogRead(A2);
sd1 = analogRead(A3);
si1 = analogRead(A4);
si2 = analogRead(A5);
si3 = analogRead(A6);
si4 = analogRead(A7);

if (analogRead(A0)>600){sd4=1;} else{sd4=0;}
if (analogRead(A1)>600){sd3=1;} else{sd3=0;}
if (analogRead(A2)>600){sd2=1;} else{sd2=0;}
if (analogRead(A3)>600){sd1=1;} else{sd1=0;}
if (analogRead(A4)>600){si1=1;} else{si1=0;}
if (analogRead(A5)>600){si2=1;} else{si2=0;}
if (analogRead(A6)>600){si3=1;} else{si3=0;}
if (analogRead(A7)>600){si4=1;} else{si4=0;}
/*
Serial.print("sensores: ");
Serial.print(si4);
Serial.print(" - ");
Serial.print(si3);
Serial.print(" - ");
Serial.print(si2);
Serial.print(" - ");
Serial.print(si1);
Serial.print(" - ");
Serial.print(sd1);
Serial.print(" - ");
Serial.print(sd2);
Serial.print(" - ");
Serial.print(sd3);
Serial.print(" - ");
Serial.println(sd4); */

void lectura(void) {
leer();
if(si3==1&&si2==1&&si1==1&&sd1==1&&sd2==1&&sd3==0) {error=-5;}
if(si3==1&&si2==1&&si1==1&&sd1==1&&sd2==0&&sd3==0) {error=-4;}
if(si3==1&&si2==1&&si1==1&&sd1==1&&sd2==0&&sd3==1) {error=-3;}
if(si3==1&&si2==1&&si1==1&&sd1==0&&sd2==0&&sd3==1) {error=-2;}
if(si3==1&&si2==1&&si1==1&&sd1==0&&sd2==1&&sd3==1) {error=-1;}
if(si3==1&&si2==1&&si1==0&&sd1==0&&sd2==1&&sd3==1) {error=0;}
if(si3==1&&si2==1&&si1==0&&sd1==1&&sd2==1&&sd3==1) {error=1;}
if(si3==1&&si2==0&&si1==0&&sd1==1&&sd2==1&&sd3==1) {error=2;}
if(si3==1&&si2==0&&si1==1&&sd1==1&&sd2==1&&sd3==1) {error=3;}
if(si3==0&&si2==0&&si1==1&&sd1==1&&sd2==1&&sd3==1) {error=4;}
if(si3==0&&si2==1&&si1==1&&sd1==1&&sd2==1&&sd3==1) {error=5;}
if(error!=7){
error_previo=error;}
if(si3==1&&si2==1&&si1==1&&sd1==1&&sd2==1&&sd3==1) {error=7;}

void prop() {

lectura();
proporcional=error*Kp;
if(proporcional<-vel||proporcional>vel) {proporcional=vel;}
proporcional=abs(proporcional);
A();

if(error==0) {
velmotores(vel,vel);
}

if(error==7) {
velmotores(vel,vel);

if(error_previo>0) {
I();
}

if(error_previo<0) {
D();
}
}
if(error<0) {
velmotores(vel-proporcional, vel);
}

if(error>0) {
velmotores(vel, vel-proporcional);
}

void p(){// RETRO


while(true){
digitalWrite(in1Motord,HIGH);
digitalWrite(in2Motord,HIGH);
digitalWrite(in1Motori,HIGH);
digitalWrite(in2Motori,HIGH);
}
}
void R(){// RETRO
leer();
digitalWrite(in1Motord,LOW);
digitalWrite(in2Motord,HIGH);
digitalWrite(in1Motori,LOW);
digitalWrite(in2Motori,HIGH);
}

void A(){// AVANZA


leer ();
digitalWrite(in1Motord,HIGH);
digitalWrite(in2Motord,LOW);
digitalWrite(in1Motori,HIGH);
digitalWrite(in2Motori,LOW);
}

void S(){//DETENIDO
leer();
digitalWrite(in1Motord,LOW);
digitalWrite(in2Motord,LOW);
digitalWrite(in1Motori,LOW);
digitalWrite(in2Motori,LOW);
}

void D(){
leer();
digitalWrite(in1Motord,LOW);
digitalWrite(in2Motord,HIGH);
digitalWrite(in1Motori,HIGH);
digitalWrite(in2Motori,LOW);
}

void I(){
leer();
digitalWrite(in1Motord,HIGH);
digitalWrite(in2Motord,LOW);
digitalWrite(in1Motori,LOW);
digitalWrite(in2Motori,HIGH);
}

void velmotores(int md, int mi){


analogWrite(enMotord,md);
analogWrite(enMotori,mi);
}

void setup(){
pinMode(si4,INPUT);
pinMode(si3,INPUT);
pinMode(si2,INPUT);
pinMode(si1,INPUT);
pinMode(sd1,INPUT);
pinMode(sd2,INPUT);
pinMode(sd3,INPUT);
pinMode(sd4,INPUT);
pinMode(in1Motord, OUTPUT);
pinMode(in2Motord, OUTPUT);
pinMode(in1Motori, OUTPUT);
pinMode(in2Motori, OUTPUT);
Serial.begin(9600);

//NEGRO == 0
//BLANCO == 1 ENTIENDE MIERDA

void loop(){
while(true){
vel=70;
Kp=40;
prop();
leer();
if(sd4 == 0)
f1();
}
}

void f1(){
while(true){

analogWrite(6,40);
analogWrite(9,40);
A();
delay(60);
f2();
}
}
void f2(){
while(true){

analogWrite(6,40);
analogWrite(9,40);
D();
leer();
if(sd1== 0)
f3();
}
}
void f3(){
while(true){
vel=70;Kp=40;prop();leer();
if(si3 == 0)
f4();
}
}
void f4(){
while(true){
analogWrite(6,40);
analogWrite(9,40);
A();
delay(60);
f5();
}
void f5(){
while(true){
analogWrite(6,40);
analogWrite(9,40);
I();
leer();
if(si1== 0)
f6();
}
}
void f6(){
while(true){
vel=60;
Kp=40;
prop();
leer();
if(sd4 == 0)
f7();
}
void f7(){
while(true){
analogWrite(6,40);
analogWrite(9,40);
A();
delay(60);
f8();
}
}
void f8(){
while(true){
analogWrite(6,40);
analogWrite(9,40);
D();
leer();
if(sd1== 0)
f9();
}
}
void f9(){
while(true){
vel=40;
Kp=40;
prop();
leer();
if(sd4 && sd3 == 0)
f10();
}
}
void f10(){
while(true){
analogWrite(6,60);
analogWrite(9,60);
A();
delay(120);
f11();
}
}
void f11(){
while(true){
analogWrite(6,60);
analogWrite(9,60);
D();
leer();
if(sd2==0 && sd1==1)
f12();
}
}
void f12(){
while(true){
vel=50;
Kp=20;
prop();
leer();
if(sd4==0)
f13();
}
}
void f13(){
while(true){
analogWrite(6,60);
analogWrite(9,60);
A();
delay(120);
f14();
}
}
void f14(){
while(true){
analogWrite(6,60);
analogWrite(9,60);
D();
leer();
if(sd1==0)
f15();
}
}
void f15(){
while(true){
vel=50;
Kp=20;
prop();
leer();
if(si4==0)
f16();
}
}
void f16(){ /////////
while(true){
analogWrite(6,60);
analogWrite(9,60);
A();
delay(120);
f17();
}
}
void f17(){
while(true){
analogWrite(6,60);
analogWrite(9,60);
I();
leer();
if(si1==0)
f18();
}
}
void f18(){
while(true){
vel=50;
Kp=20;
prop();
leer();
if(si4==0)
f19();
}
}
void f19(){ /////////
while(true){
analogWrite(6,60);
analogWrite(9,60);
A();
delay(120);
f20();
}
}
void f20(){
while(true){
analogWrite(6,60);
analogWrite(9,60);
I();
leer();
if(si1==0)
f21();
}
}
void f21(){
while(true){
vel=50;
Kp=20;
prop();
leer();
if(sd4==0)
f22();
}
}
void f22(){ /////////
while(true){
analogWrite(6,60);
analogWrite(9,60);
A();
delay(90);
f23();
}
}
void f23(){
while(true){
analogWrite(6,60);
analogWrite(9,60);
D();
leer();
if(sd1==0)
f24();
}
}
void f24(){
while(true){
vel=50;
Kp=20;
prop();
leer();
if(sd4==0)
f25();
}
}
void f25(){ /////////
while(true){
analogWrite(6,60);
analogWrite(9,60);
A();
delay(90);
f26();
}
}
void f26(){
while(true){
analogWrite(6,60);
analogWrite(9,60);
D();
leer();
if(sd1==0)
f27();
}
}
void f27(){
while(true){
vel=50;
Kp=20;
prop();
leer();
if(si4==0)
f28();
}
}
void f28(){ /////////
while(true){
analogWrite(6,60);
analogWrite(9,60);
A();
delay(90);
f29();
}
}
void f29(){
while(true){
analogWrite(6,60);
analogWrite(9,60);
I();
leer();
if(si1==0)
f30();
}
}
void f30(){
while(true){
vel=50;
Kp=20;
prop();
leer();
if(sd4==0)
f31();
}
}//////////////////////////////////////////////
void f31(){ /////////
while(true){
analogWrite(6,60);
analogWrite(9,60);
A();
delay(90);
f32();
}
}
void f32(){
while(true){
analogWrite(6,60);
analogWrite(9,60);
D();
leer();
if(sd1==0)
f33();
}
}
void f33(){
while(true){
vel=50;
Kp=20;
prop();
leer();
if(sd4 && si4==0)
p();
}
}
V.-IMÁGENES:

Вам также может понравиться