Estoy tratando de construir un crono de pistola ASG basado en un detector de brechas. Conecté con éxito dos detectores de espacio a Arduino Uno, escribí un programa, que mide el tiempo entre dos picos de voltaje (en cada detector de espacio) y los conecté a un perfil de aluminio, de manera que el proyectil ASG debe cruzar las corrientes de infrarrojos de los detectores de espacio (el proyectil ASG tiene 6 mm de diámetro, el perfil tiene alrededor de 8-9 mm de espacio en el interior, el detector se coloca exactamente en el centro, verticalmente.
La configuración se ve como la siguiente (sin el perfil):
Ahora,cuandocolocoelproyectileneseperfil,Arduinonotacorrectamentedospicos(decadadetector)ymideeltiempoentreellos.PerocuandodispareelproyectildesdelalentapistolaASGbasadaenlaprimavera,nopasanada.
Misospechaesqueeltiempo,cuandoelproyectilcubreelflujodeIRestancorto,eldetectornotienetiemposuficienteparaelevarelvoltajey,porlotanto,Arduinonoregistraningúncambio.
Laparteprincipaldelcódigofuenteseveasí:
#include"Display.h"
#include "Keypad.h"
#include "Menu.h"
#include "EnableInterrupt.h"
// Global variables -----------------------------------------------------------
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
Display display(lcd, 16, 2);
Keypad keypad;
BaseMenuItem * mainItems[] =
{
new ActionMenuItem("\x01 Pomiar FPS", 1),
};
MainMenu mainMenu(display, mainItems, sizeof(mainItems) / sizeof(BaseMenuItem *));
// *** FPS measurement ***
unsigned long fpsStart;
unsigned long fpsEnd;
int fpsMode = 0;
// Global functions -----------------------------------------------------------
void detector1Up()
{
fpsStart = micros();
fpsMode = 1;
disableInterrupt(A1);
enableInterrupt(A2, detector2Up, RISING);
}
void detector2Up()
{
fpsEnd = micros();
fpsMode = 2;
disableInterrupt(A2);
}
void fpsDisplay(long ms)
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ms: ");
lcd.print(ms);
}
void fpsDisplayMissedError()
{
lcd.clear();
lcd.print(" *** Error *** ");
lcd.setCursor(0, 1);
lcd.print("Missed 2 sensor");
}
void fpsMeasurement()
{
fpsMode = 0;
enableInterrupt(A1, detector1Up, RISING);
fpsDisplay(0);
bool finish = false;
while (!finish)
{
if (fpsMode == 1)
{
// Checking if particle missed second sensor
unsigned long now = micros();
if (now > fpsStart && now - fpsStart > 1000000)
{
// If second passed after first measurement, assume, that
// particle missed second sensor
// Stop waiting for second sensor
disableInterrupt(A2);
fpsDisplayMissedError();
// Restart measurement
fpsMode = 0;
enableInterrupt(A1, detector1Up, RISING);
}
}
if (fpsMode == 2)
{
// Checking if measurement was made
if (fpsEnd > fpsStart)
{
unsigned long timeDist = fpsEnd - fpsStart;
fpsDisplay(timeDist);
Serial.print("Measured time: ");
Serial.print(timeDist);
Serial.print("\n");
}
fpsMode = 0;
enableInterrupt(A1, detector1Up, RISING);
}
else
{
// Waiting for keypress - exiting mode
int key = keypad.ReadKey();
if (key != KEY_NONE)
finish = true;
}
}
disableInterrupt(A1);
disableInterrupt(A2);
}
void setup()
{
Serial.begin(9600);
while (!Serial);
// (...)
delay(2000);
mainMenu.Show();
}
void loop()
{
int key = keypad.ReadKey();
int result = mainMenu.Action(key);
if (result == 1)
{
fpsMeasurement();
mainMenu.Show();
}
}
¿Cómo puedo mejorar el hardware o el software para registrar la partícula y así poder medir su velocidad?
Editar:
Para evitar discusiones demasiado grandes en los comentarios, proporcionaré toda la información solicitada aquí:
@PlasmaHH: el detector de huecos usa (supongo) un diodo IR y un detector IR en el otro lado. Cuando se conecta a Arduino, proporciona baja tensión sin obstáculos y alta tensión en obstáculos entre el diodo y el detector. No tengo valores aquí, pero por lo que recuerdo, los valores eran 31-32 sin obstáculos y alrededor de 800 cuando había obstáculos (Arduino escala el voltaje de 0 ~ 5V a 0 ~ 1023).
@JRE: Los esquemas del detector están [en la página de la tienda del detector] (dejando el enlace si se necesita más información) 2 .
Primerplanodelpropiodetector:
@OllinLanthrop:Estoesraro,laBúsquedadeimágenesdeGoogleen"Perfil de aluminio" devuelve exactamente lo que he usado. Pero para mayor claridad, estoy usando la siguiente pieza de aluminio:
Taladreagujerosendoslugaresenelperfil,demodoquelavigadeldetectorpaseexactamenteatravésdelperfilylosagujerosesténcentradosverticalmenteenelperfil.Esperoquelaimagentedémásinformaciónsobremicompilación.Además,elproyectilde"caída" debería tener más sentido ahora.
También, un cronógrafo de pistola (o cronógrafo) es un dispositivo que mide la velocidad del proyectil. El comercial se parece a lo siguiente: