Está en la página 1de 6

Universidad Galileo

Facultad: FISICC
Curso: Sistemas de
Arquitectura
Seccin: A
Catedrticos: Ing. Oscar
Rodas
Ing. Cristian Aguilar

Guatemala 28 de Abril del 2016


Alumno: Alexander Hung /
Abraham Hernndez
Carnet: 14001240 / 14005269
Hora de clase: 16:00-17:40
Da de clase: Jueves

Proyecto #3 Line Tracker


Objetivos: Este proyecto consiste en disear y consturir un carrito que siga una
linea blanca sobre una superficie negra por medio de sensores infrarrojos, para
eso debemos aprender el uso de las tarjetas microcontroladoras, sensores y
motores para combinarlos.
Resumen: Para fabricar el carrito usamos dos motores DC, 5 sensores infrarrojos
QRD1114 un puente H y una tarjeta Spark Core para controlar dichos motores,
para programar usamos una tarjeta oruga, la cual usa el mismo lenguaje que
arduino.
Teora: Un line tracker se compone de un sensor de luz infrarroja y un LED
infrarrojo, funciona mediante la iluminacin de una superficie con luz infrarroja, el
sensor a continuacin recoge la radiacin infrarroja reflejada y , en base a su
intensidad, determina la reflectividad de la superficie en cuestin, las superficies
de color reflejarn ms luz que las superficies oscuras; por lo tanto, las superficies
de colores claros aparecer ms brillante al sensor, esto permite al sensor
detectar una lnea oscura sobre una superficie plida, o una lnea plida sobre una
superficie oscura.
Los sensores que utilizamos son los QRD1114.

El valor valor de la resistencia del led del sensor lo calculamos con la siguiente
VccVled
Rled=
ecuacin:
donde vcc es el voltaje de la bateria de
If
alimentacin, Vled es el voltaje requerido por el led, If es la corriente del mismo.

La tarjeta controladora que usamos es un Spark Core el cual es compatible con el


lenguaje de arduino, la lectura analoga del spark core es de 12 bits en
comparacin del arduino que es de 10 bits, esto nos da una mejor resolucin; por
este motivo decidimos usar dicha tarjeta.

Usamos el puente H para lograr que el motor elctrico DC logre girar en ambos sentidos,
avance y retroceso.

Cdigo:
//definicion de los pines de los motores
//motor DC Izquierdo (A)
#define motorA_fase D3 //GPIO (direccion del motor)--> 0 == Adelante || 1 == Retroceso
#define motorA_PWM D1 //PWM (velocidad del motor) --> valor de 0 -- 255
//motor DC Derecho (B)
#define motorB_fase D2 //GPIO (direccion del motor)--> 0 == Adelante || 1 == Retroceso
#define motorB_PWM D0 //PWM (velocidad del motor) --> valor de 0 -- 255

//LEDS indicadores
#define led_izquierda D5 //led indicador
#define led_derecha D4 //led indicador
//definicion de los pines de los sensores QRD1114
#define derecho_aux A0
#define derecho A1
#define central A2
#define izquierdo A3
#define izquierdo_aux A4
//limite entre la superficion blanca y negra
#define limit_superficie 2654
//controles del tracker
int control_comienzo = 0; //0 si es la primera vez, 1 en caso contrario
//metodo para configurar los modos de pines y puerto serial
void setup(){
//inicialiazion del puerto Serial
Serial.begin(9600);
//configuracion del los pines del motor Derecho
pinMode(motorB_fase, OUTPUT); //direccion del motor
pinMode(motorB_PWM, OUTPUT); //velocidad del motor
//configuracion de los pines del motor Izquierdo
pinMode(motorA_fase, OUTPUT); //direccion del motor
pinMode(motorA_PWM, OUTPUT); //velocidad del motor
//configuracion de los pines de los LEDS indicadores
pinMode(led_derecha, OUTPUT); //led indicador derecha
pinMode(led_izquierda, OUTPUT); //led indicador izquierda
}
//metodo para que avance hacia adelante
void mover_adelante(){
digitalWrite(led_derecha, LOW); //LED apagado
digitalWrite(led_izquierda, LOW); //LED apagado
digitalWrite(motorA_fase, LOW); //motor en fase hacia adelante
digitalWrite(motorB_fase, LOW); //motor en fase hacia adelante
analogWrite(motorA_PWM, 100); //velocidad del motor
analogWrite(motorB_PWM, 100); //velocidad del motor
}
//metodo para que avance hacia atras
void mover_atras(){
digitalWrite(led_derecha, LOW); //LED apagado
digitalWrite(led_izquierda, LOW); //LED apagado
digitalWrite(motorA_fase, HIGH);
digitalWrite(motorB_fase, HIGH);
analogWrite(motorA_PWM, 100);
analogWrite(motorB_PWM, 100);
}
//metodo para que gire hacia la derecha
void mover_derecha(){
digitalWrite(led_derecha, HIGH); //LED encendido
delay(100);
digitalWrite(led_izquierda, LOW); //LED apagado
digitalWrite(motorB_fase, HIGH);
digitalWrite(motorA_fase, LOW);
analogWrite(motorB_PWM, 100);
analogWrite(motorA_PWM, 80);
}
//metodo para que gire hacia la izquierda
void mover_izquierda(){
digitalWrite(led_derecha, LOW); //LED apagado
digitalWrite(led_izquierda, HIGH); //LED encendido
delay(100);
digitalWrite(motorA_fase, HIGH);
digitalWrite(motorB_fase, LOW);
analogWrite(motorA_PWM, 100);
analogWrite(motorB_PWM, 80);
}
//metodo par que pare
void parar(){
digitalWrite(led_derecha, HIGH); //LED encendido
digitalWrite(led_izquierda, HIGH); //LED encendido
digitalWrite(motorA_fase, LOW);
digitalWrite(motorB_fase, LOW);
analogWrite(motorA_PWM, 0);
analogWrite(motorB_PWM, 0);
}
//main
void loop(){
//variables de control de los sensores QRD1114
int sensor_derecho_aux = analogRead(derecho_aux);
int sensor_derecho = analogRead(derecho);
int sensor_central = analogRead(central);
int sensor_izquierdo = analogRead(izquierdo);
int sensor_izquierdo_aux = analogRead(izquierdo_aux);
//comprobacio el estado de control
if(control_comienzo == 0){
Serial.println("Bon voyage");
mover_adelante();
delay(100);
control_comienzo = 1;
}else{
//comprobacion que el Sensor del centro este sobre la linea blanca y los demas sobre la linea negra
if (sensor_central >= limit_superficie && sensor_derecho_aux < limit_superficie && sensor_derecho < limit_superficie && sensor_izquierdo < limit_superficie && sensor_izquierdo_aux <
limit_superficie){
mover_adelante();
Serial.println("Mover hacia adelante");
delay(100);
//comprobacion que el sensor derecho este sobre la linea blanca y el auxiliar sobre la negra
}else if (sensor_derecho >= limit_superficie && sensor_derecho_aux < limit_superficie){
mover_izquierda();
Serial.println("Mover hacia la izquierda");
delay(100);
//comprobacion que el sensor derecho auxiliar este sobre la linea blanca y el derecho sobre la linea negra
}else if (sensor_derecho <= limit_superficie && sensor_derecho_aux >= limit_superficie){
mover_izquierda();
Serial.println("Mover hacia la izquierda");
delay(100);
//comprobacion que el sensor derecho, derecho auxiliar este sobre la linea blanca y los demas sobre la linea negra
}else if (sensor_derecho >= limit_superficie && sensor_derecho_aux >= limit_superficie && sensor_central < limit_superficie){
mover_izquierda();
Serial.println("Mover hacia la izquierda");
delay(100);
//comprobacion que el sensor izquierdo este sobre la linea blanca y el auxiliar este sobre la linea negra
}else if (sensor_izquierdo >= limit_superficie && sensor_izquierdo_aux < limit_superficie){
mover_derecha();

Serial.println("Mover hacia la derecha");


delay(100);
//comprobacion que el sensor izquierdo auxiliar este sobre la linea blanca y izquierdo sobre la linea negra
}else if(sensor_izquierdo_aux >=limit_superficie && sensor_izquierdo < limit_superficie){
mover_derecha();
Serial.println("Mover hacia la derecha");
delay(100);
//comprobacion que los sensores izquierdo, izquierdo auxiliar este sobre la linea blanca y los demas sobre la linea negra
}else if(sensor_izquierdo >= limit_superficie && sensor_izquierdo_aux && sensor_central < limit_superficie){
mover_derecha();
Serial.println("Mover hacia la derecha");
delay(100);
//compobrobacion que todos los sensores esten en blanco
}else if (sensor_central >= limit_superficie && sensor_derecho >= limit_superficie && sensor_derecho_aux >= limit_superficie &&
sensor_izquierdo >=limit_superficie && sensor_izquierdo_aux >= limit_superficie){
parar();
Serial.println("Tracker parado");
delay(100);
}
}
}

Bibliografa:
http://www.education.rec.ri.cmu.edu/products/cortex_video_trainer/lesson/55LineTracking1.html
https://www.kickstarter.com/projects/sparkdevices/spark-core-wi-fi-for-everything-arduinocompatible
https://www.fairchildsemi.com/datasheets/QR/QRD1114.pdf

Anexos:

También podría gustarte