Buenas noches este es mi primer proyecto, es un seguidor de lineas negras con fondo blanco y que además tiene que dar la distancia recorrida.
El carrito sigue perfectamente el camino, ahora tengo problemas con la distacia. Lo que estoy intentando es hacer es tomar el tiempo que esta avanzado(solo tomo el tiempo en que el carro esta en el camino correcto, pues cuando da alguna vuelta gira sobre su propio eje y no avanza, lo estoy intentando con millis) y sabiendo su velocidad aplico la fórmula Vel=Dist*Tiempo.
Con lo que tengo el problema es para tomar el tiempo en que esta avanzado, a continuacion pego el codigo, borre unas cosas irrelevantes para no ocupar mucho espacio
unsigned long TimeT=0;
unsigned long TimeEntrada=0;
void setup() {
Serial.begin(9600);
}
void loop () {
unsigned long TimeAhora = millis();
int velIZQ = 105;
int velDER = 100;
//Lectura de los sensores reflectores opticos
int vQrdIZQ = analogRead(sQrdIZQ);
int vQrdDER = analogRead(sQrdDER);
// Avance, si los sensores leen “blanco” avanzara derecho, este es el tiempo que quiero tomar
if( vQrdIZQ<700 && vQrdDER<600){
** TimeEntrada=TimeAhora; //Guarda el tiempo en que empezó a avanzar**
//comandos para que avance
digitalWrite(IN1IZQ, LOW);
digitalWrite(IN2IZQ, HIGH);
analogWrite(pwmDER, velDER);
digitalWrite(IN3DER, HIGH);
digitalWrite(IN4DER, LOW);
analogWrite(pwmIZQ, velIZQ);
//se vuelven a leer los sensores
int vQrdIZQ = analogRead(sQrdIZQ);
int vQrdDER = analogRead(sQrdDER);
TimeT=(TimeT)+(TimeAhora-TimeEntrada); // tiempo total es igual al tiempo total + (el tiempo de ahora menos el tiempo en que entro al if)
}
// Vuelta derecha, si el sensor de la derecha lee negro,el carro necesitara dar vuelta a la derecha
if( vQrdIZQ<700 && vQrdDER>600){
// cambios de velocidad para que pueda dar bien las vueltas
velIZQ=velIZQ+50;
velDER=velDER+50;
digitalWrite(IN1IZQ, LOW);
digitalWrite(IN2IZQ, HIGH);
analogWrite(pwmDER, velDER);
digitalWrite(IN3DER, LOW);
digitalWrite(IN4DER, HIGH);
analogWrite(pwmIZQ, velIZQ);
//se vuelven a leer los sensores
int vQrdIZQ = analogRead(sQrdIZQ);
int vQrdDER = analogRead(sQrdDER);
int vHerIZQ = analogRead(sHerIZQ);
int vHerDER = analogRead(sHerDER);
}
// Vuelta izquierda
if( vQrdIZQ>700 && vQrdDER<600){
velDER=velDER+50;
velIZQ=velIZQ+50;
digitalWrite(IN1IZQ, HIGH);
digitalWrite(IN2IZQ, LOW);
analogWrite(pwmDER, velDER);
digitalWrite(IN3DER, HIGH);
digitalWrite(IN4DER, LOW);
analogWrite(pwmIZQ, velIZQ);
int vQrdIZQ = analogRead(sQrdIZQ);
int vQrdDER = analogRead(sQrdDER);
int vHerIZQ = analogRead(sHerIZQ);
int vHerDER = analogRead(sHerDER);
}
// Stop, al entrar a esta decisión quiere decir que terminó su recorrido
if( vQrdIZQ>700 && vQrdDER>600){
digitalWrite(IN1IZQ, LOW);
digitalWrite(IN2IZQ, LOW);
analogWrite(pwmDER, velDER);
digitalWrite(IN3DER, LOW);
digitalWrite(IN4DER, LOW);
analogWrite(pwmIZQ,velIZQ);
//como ya termino su recorrido, aqui quiero imprimir el tiempo que estuvo en "avance"
** unsigned long Time=TimeT/1000; //el tiempo que estuvo avanzando en segundos**
** Serial.println(Time);**
** delay(1000);**
}
}
En negrits esta lo que tiene que ver con la toma del tiempo, el problema es que cuando termina su recorrido lo conecto a la pc y en el serial me imprime 0
Saludos y gracias de antemano.
PD: Otra opcion seria utilizar un encoder, como podria utilizar esto?