Quote:
Originally Posted by billbo911
[size="4"]...
Now, you have piqued interest. I just HAVE to write the code for a single sensor Chronograph!!
Stay tuned for code.
|
As promised...
This "should" work for a single sensor It is untested, but based off a working two sensor version. I left the original code in place but commented out.
BTW. it is already set up to print it's data to an I2C connected LCD. Modifying it to send data to the cRio would be quite simple.
Code:
/*******************************************************************************************
* This Sketch is for a Chronograph that uses the "micros" function to capture two points in*
* time and determines how much time has elapsed between them in microseconds. By knowing *
* the distance between the to sensors, the velocity of the object can be determined. *
* Bill Kendall, Jan. 15, 2013 *
* I2C LCD Display function added 01/18/13 *
* Modified for single sensor 01/24/13 *
*******************************************************************************************/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F,20,4); //Create object "lcd" at address 0x30, 20 X 4 display
//float SENSOR_DIST = 12; //This value is the distance between the sensors in inches
float DISK_DIAMETER = 11.0; // Diameter of Frisbee in inches.
float distance;
unsigned long event1 = 0; // value in 'micros" at the time of this first trigger
unsigned long event2 = 0; // value in 'micros" at the time of this second trigger
int firstint = 0; //Set to 1 if Interrupt 0 has occurred
int calculate = 0; // If set to 1, a calculation and display of the velocity will occur
unsigned long duration = 0; // Amount of elapsed time between events
float velocity = 0;
int sample = 0;
int flasher = 13; //LED attached to pin 13
void setup (void)
{
attachInterrupt (0, ISR0, CHANGE); // Interupt 0 (pin 2) calls "ISR0" Thie is the first trigger
//attachInterrupt (1, ISR1, RISING); // Interupt 1 (pin 3) calls "ISR1" This is the second trigger
//distance = (SENSOR_DIST/12.0); // Convert sensor spacing to feet
distance = (DISK_DIAMETER/12.0); // Convert disk diameter to feet
pinMode(flasher, OUTPUT);
Serial.begin(115200); // connect to the serial port
lcd.init(); // initialize the lcd
// Print our characters on the LCD
lcd.backlight(); //Backlight ON if under program control
lcd.setCursor(3,1); //Start at character 3 on line 1
lcd.print("2073 Cronograph");
delay(2000);
lcd.clear();
//lcd.setCursor(2,1);
//lcd.print("From YourDuino");
//delay(1000);
lcd.setCursor(8,0);
lcd.print("2013");
lcd.setCursor(3,1);
lcd.print("Ultimate Ascent");
lcd.setCursor(2,3);
delay(1000);
lcd.print("PGHSRobotics.com");
}
void ISR0 (void)
{
if (firstint == 0)
{
event1 = micros(); // record the microseconds counter
firstint = 1;
}
else
{
event2 = micros(); // record the microseconds counter
firstint = 0; // reset firstint
calculate = 1;
}
}
/*void ISR0 (void)
{
event1 = micros(); // record the microseconds counter
firstint = 1;
}
void ISR1 (void)
{
event2 = micros(); // record the microseconds counter
calculate = 1;
}*/
void loop (void)
{
if (calculate == 1)
{
RunMath ();
}
delay (500);
}
void RunMath (void)
{
digitalWrite(flasher, HIGH);
delay(250);
digitalWrite(flasher, LOW);
duration = (event2 - event1); // elapsed time between triggers in u seconds
velocity = (((distance)*1000000)/(duration)); // Calculate velocity in feet per second
sample ++;
lcd.clear();
lcd.setCursor(1,0);
lcd.print("Frisbee velocity is");
lcd.setCursor(3,1);
lcd.print (velocity,2);
lcd.print(" ft./sec.");
lcd.setCursor(9,3);
lcd.print("Sample #");
lcd.print(sample); // Prints # of samples since reset
/* Serial.print("The Frisbee is moving at ");
Serial.print (velocity,2);
Serial.println(" ft./sec.");*/
calculate = 0;
firstint = 0;
}