Ayuda, seguidor de linea
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, 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ó 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 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 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 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 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 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?
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, 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ó 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 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 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 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 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 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?
...
void loop () {
unsigned long timeahora = millis(); // almacenas valor milis para controlar pongamos un valor 1234
...
if( vqrdizq<700 && vqrdder<600){
timeentrada=timeahora; //guarda el tiempo en que empezó avanzar, ahora timeentrada también vale 1234
...
timet=(timet)+(timeahora-timeentrada); // tiempo total es igual al tiempo total 0 en un principio + (1234-1234)
void loop () {
unsigned long timeahora = millis(); // almacenas valor milis para controlar pongamos un valor 1234
...
if( vqrdizq<700 && vqrdder<600){
timeentrada=timeahora; //guarda el tiempo en que empezó avanzar, ahora timeentrada también vale 1234
...
timet=(timet)+(timeahora-timeentrada); // tiempo total es igual al tiempo total 0 en un principio + (1234-1234)
Arduino Forum > International > Español > Proyectos (Moderators: surbyte, Hector_A) > Ayuda, seguidor de linea
arduino
Comments
Post a Comment