Bgiorno a tutti,
dunque ritorno alla carica per portare avanti qualche tentativo grazie anche alle utili informazioni fornite nel thread. Ho una manciata di fotodiodi, diodi ir e normali. Vorrei fare qualche prova pratica sia sul codice sia sul funzionamento del rilevatore di velocità.
Il codice è quello di cui al post #1 che riporto di seguito per comodità. Lo sto studiando ma, vista la mia ancora scarsa preparazione a riguardo vi chiedo gentilmente di fornirmi un vostro parere.
Pr la parte hardware cme detto al momento ho solo diodi e fotodiodi...sono questi in in grado ri rilevare velocità di 160/170 metri x secondo?
/*
Tomado de http://aeroquad.com/showthread.php?845-How-do-I-make-a-tachometer-with-my-spare-arduino-board-and-IR-LED-and-RECEIVER
Modificado por Pablo Andrade Mejía http://www.arduinolab.wordpress.com
05 de Noviembre de 2012
Se le añadió la función de enviar la velocidad en metros por segundo y pies por segundo al monitor serial
lo que quita la necesidad de tener una pantalla de cristal líquido
Aquellos que tengan dudas acerca de cómo se debe conectar los sensores para que funcione correctamente
hagan click aquí http://www.instructables.com/id/Arduino-Based-Optical-Tachometer/step3/IR-Detector-Circuit/
Los fotodiodos o fototransistores son nombrados como attachInterrupt(0, front, CHANGE); Éste está relacionado
con el pin digital 2, y, el attachInterrupt(1, rear, CHANGE); Éste está relacionado con el pin digital 3
Quienes quieran probarlo pueden conectar dos botones a los pines 2 y 3
Los fotodiodos deben tener una resistencia entre 10k y 100kohm conectados al colector (pin, o pata larga) y esta al pin digital
para asegurarnos que cuando el haz de luz sea interrumpido el voltaje llegue a 0 o tierra
*/
#include <LiquidCrystal.h>
#define MPS2FPSCOEFF 3.28084
#define LENGTH 0.159
#define MICRO2SEKCOEFF 1000000
LiquidCrystal lcd(4, 5, 6, 7, 8, 9);
volatile int stateFront = HIGH;
volatile int stateRear = HIGH;
int led1 = 12;
int led2 = 13;
int startChrono;
unsigned long startTime, stopTime, elapsed;
double fpsSpeed, mpsSpeed; //double tiene la misma función que float, así que no hay que preocuparse
void setup()
{
Serial.begin(9600);
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("Super Chrono");
Serial.print("Cronografo");
lcd.setCursor(0, 1);
lcd.print("by Honk");
delay(700);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Initializing...");
Serial.println("Inicializando");
delay(700);
lcd.clear();
startChrono = 0;
elapsed = 0;
fpsSpeed = mpsSpeed = 0;
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
/*
Sí los resultados no son los esperados donde dice CHANGE cambien por RISING o LOW
tanto como en attachInterrupt(0, front, " "); como en attachInterrup(1, rear, " ");
Sí todo resulta bien simplemente no hagan nada
*/
attachInterrupt(0, front, CHANGE); //0 (on digital pin 2) kanske falling/rising/low
attachInterrupt(1, rear, CHANGE); //1 (on digital pin 3)
lcd.setCursor(0, 0);
lcd.print("Take a shot!");
Serial.println("Preparado para disparar?");
}
void loop()
{
//Start counting when interrupted
if(stateFront == LOW && startChrono == 0)
{
startTime = micros(); // Count microseconds since start
startChrono = 1; // Set Chrono flag
digitalWrite(led1, HIGH);
}
// Stop counting and calculate speed
if(stateRear == LOW && startChrono == 1)
{
stopTime = micros(); // Count microseconds since start
startChrono = 0; // Clear Chrono flag
elapsed = stopTime - startTime; // Calculate elapsed time (in us)
digitalWrite(led2, HIGH);
mpsSpeed = (LENGTH*(MICRO2SEKCOEFF)) / elapsed; // s = v * t, v = s / t
fpsSpeed = mpsSpeed * MPS2FPSCOEFF;
lcd.clear();
lcd.print("Fps: ");
lcd.print(fpsSpeed);
Serial.println("PPS(Pies por segundo) ");
Serial.print(fpsSpeed);
lcd.setCursor(0, 1);
lcd.print("m/s: ");
lcd.print(mpsSpeed);
Serial.println("Metros por segundo ");
Serial.print(mpsSpeed);
startChrono = 0;
delay(500);
digitalWrite(led2, LOW);
digitalWrite(led1, LOW);
}
}
void front()
{
stateFront = !stateFront;
}
void rear()
{
stateRear = !stateRear;
}