RoboCup Junior IR Ball Ball

0

RoboCup Junior utiliza una bola IR que emite luz infrarroja pulsante (antes de esto, era un haz de luz constante que detecta No se pudo diferenciar de las fuentes ambientales). Una presentación que describe los posibles métodos para detectar el balón mencionó el uso de TSOP1138s y la programación del microcontrolador.

¿Cuál sería la mejor manera de usar un Arduino / ATmega para leer los pulsos? Los tiempos involucrados son muy pequeños, y con una interrupción no puedo usar las funciones de tiempo.

EDITAR: Después de un poco de limpieza, parece que debería haber usado el TSOP1140 en su lugar. Si alguien puede explicar cómo funcionan estos pequeños, sería una gran ayuda, pero mientras tanto esperaré a que llegue mi pedido.

    
pregunta randName

2 respuestas

1

El enfoque básico es hacer un controlador de interrupción que se invoque cada vez que el receptor IR reciba un pulso.

Cuando recibe cada pulso, captura el tiempo transcurrido desde el pulso anterior. Si el tiempo transcurrido es de 25 microsegundos, usted sabe que está en medio de recibir una ráfaga de pulsos, y debe contarlos. Si hay un intervalo de 346 microsegundos o más, sabes que estás en el intervalo de transmisión. Luego puedes contar los pulsos que has recibido. Si hay 8 pulsos, sabes que la bola está muy lejos, ya que solo recibiste los pulsos de mayor fuerza. Si hay 12 pulsos, está un poco más cerca. Del mismo modo, hasta que reciba 20 pulsos, lo que significa que es el más cercano a la pelota que puede medir.

Por supuesto, al estar en el mundo real, es posible que se pierda un pulso o dos por alguna razón, por lo que su método de conteo debería tenerlo en cuenta. Del mismo modo, el tiempo puede estar un poco apagado (ya sea el reloj o el reloj de la bola puede estar ligeramente apagado), por lo que también debería tenerse en cuenta. Si la bola no es visible en absoluto, no se leerán pulsos.

En el entorno de Arduino, usaríamos las funciones de interrupción y el código básico se vería así. Supongamos que la entrada está en el pin digital 7.

volatile int npulses = 0;             // number of pulses received in this "set"
volatile unsigned long lasttime = 0;  // timestamp of last pulse received
volatile int distance = 0;


void dopulse()
{
    unsigned long now;  // the current time in microseconds
    now = micros();
    elapsed = now - lasttime;
    lasttime = now;
    if (elapsed > 300) {
        distance = npulses;
        npulses = 1;
   }
   else {
       npulses += 1;
   }
}

void setup()
{
    pinMode(7, OUTPUT);
    attachInterrupt(7, dopulse, RISING);
    ...
}
    
respondido por el Mark Harrison
0

(Lamento mucho la mala calidad de mi pregunta, pero también agradezco el perdón de la comunidad. Lo puliré).

Los TSOP1140 han llegado y funcionan de maravilla. Todo lo que se necesitaba para leer el IR era un simple PulseIn () con tiempos de espera adecuados (aproximadamente 2000µS era suficiente) porque la señal ya había sido demodulada por el sensor.

Aquí está la parte del código que usé con el sensor conectado al pin 2.

void loop()
{
  duration = pulseIn(2,LOW,2000);
  if(duration)
  {
    total -= samples[index]; samples[index] = duration;
    total += samples[index]; index = (index+1)%SAMPLES;
    average = total/SAMPLES;
    Serial.println(average);
  }
  // clear cache if nothing detected
  else { for(byte i=0;i<SAMPLES;i++){ samples[i]=0; } total=0; }
}
    
respondido por el randName

Lea otras preguntas en las etiquetas