desktop

Sensores Pololu QTR 1RC

Hola soy un poco nuevo en esto de la electronica y programacion. He comprado unos sensores pololu qtr 1rc para ponerlos a un minisumo que tengo pero el problema es que no los he sabido hacer funcionar. Ya probe con lo que pololu dice pero nada de nada. Por favor si alguien tiene experiencia con estos sensores y me diga como usarlos, ya que todo lo he probado con un microcontrolador PIC 16f628a y los he programado en C con PIC C compiler. En si lo que quiero que el programa haga es que que los motores vallan al frente mientras no detecte el sensor y una vez que detecte los motores hagan otra rutina. Pondre la programacion que uso. Por favor lo que me interesa es saber como se programan o como los hago funcionar.

#include <16f628a.h>
#fuses NOWDT,NOPROTECT,NOPUT,INTRC_IO,NOBROWNOUT,MCLR,NOLVP,NOCPD
#use delay (clock = 4000000)
#use standard_io(a)
#use standard_io(b)


void main()
{
output_high(PIN_A0);
delay_us(10);

input(PIN_A0) == 0;
while(input(PIN_A0) != 1)
{
output_high(PIN_A1);
output_low(PIN_A2);
}

output_high(PIN_A2);
output_low(PIN_A3);
}
 
Era primero cargar, luego pasar a entrada y esperar contando cuanto tarda en descargar, el ==0 está demás, en el while deberías hacer una cuenta, algo como
Código:
Int tiempo=0;
While(input(PIN_A0) ==1) tiempo++;
Después es que debes evaluar el tiempo que y es con ello que va tu condicional para controlar los motores.
 
Hola, gracias por comentar. Entonces debo cargar primero haciendo output_high(pin_a0); a la salida de señal del sensor y después como lo hago entrada?.
Lo que quiero es que los motores avancen mientras los sensores no detecten, por eso puse ese while, pero una vez que detecten giren pero no se si este bien o como lo hago?
 
Cuando usas input(PIN_A0); el compilador cambia el pin a entrada, lo que decía es que input(PIN_A0)==0 esta mal, por que el == es comparación lógica y no tiene sentido realizarla por que no estas usando eso ahí.

Luego en tu while pones (input(PIN_A0) != 1), lo que significa: mientras NO sea 1 ejecutara lo siguiente...
Lamentablemente, el condensador primero se carga así que al llegar a esa ejecución, SÍ es 1 el valor, por lo cual no se ejecuta el while y se escapa a la siguiente parte del código.

Tampoco uses el void main así directamente, una ves que tu programa se ejecuta se termina la ejecución, lo cual no esta definido correctamente en que se hará después de que ello ocurra, la estuctura de tu programa debía ser algo así
Código:
//cabeceras
#include <16f628a.h>

//Directivas
#fuses NOWDT,NOPROTECT,NOPUT,INTRC_IO,NOBROWNOUT,MCLR,NOL VP,NOCPD
#use delay (clock = 4000000)
#use standard_io(a)
#use standard_io(b)

//otras macros
#define PIN_SENSOR PIN_A0

//prototipo de funciones

int leer_sensor();
void configurar();

//funciones
void main(){
  configurar();
  //bucle infinito para la ejecución principal
  while(1){
    int valor_sensor = leer_sensor();
    . . . 
  }
}

int leer_sensor(){
  output_high(PIN_SENSOR);
  delay_us(10);
  int tiempo=0;
  while(input(PIN_SENSOR) ==1){
    tiempo++;
    //otro delay si queremos tomar lecturas de mayor tiempo
  }
  return tiempo;
}
void configurar(){
  //la configuración de los puertos y perifericos
}

Así tienes un programa más ordenado, fácil de entender y de modificar cuando lo requieras.
 
Atrás
Arriba