
30-01-2013, 16:45
|
 |
I prefer you give a perfect effort.
AKA: That's "Mr. Bill"
 FRC #2073 (EagleForce)
Team Role: Mentor
|
|
Join Date: Mar 2005
Rookie Year: 2005
Location: Elk Grove, Ca.
Posts: 2,368
|
|
|
Re: Disc Lauching Velocity
Quote:
Originally Posted by billbo911
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;
}
|
I have verified the above code works quite well as long as the sensor is aligned with the center of the Frisbee as it passes by.
If this alignment is not possible, or convenient, a simple modification to "DISK_DIAMETER" is required. Just enter the chord length of the Frisbee where the sample will be taken. Two digit precision is all that is needed.
__________________
CalGames 2009 Autonomous Champion Award winner
Sacramento 2010 Creativity in Design winner, Sacramento 2010 Quarter finalist
2011 Sacramento Finalist, 2011 Madtown Engineering Inspiration Award.
2012 Sacramento Semi-Finals, 2012 Sacramento Innovation in Control Award, 2012 SVR Judges Award.
2012 CalGames Autonomous Challenge Award winner ($$$).
2014 2X Rockwell Automation: Innovation in Control Award (CVR and SAC). Curie Division Gracious Professionalism Award.
2014 Capital City Classic Winner AND Runner Up. Madtown Throwdown: Runner up.
2015 Innovation in Control Award, Sacramento.
2016 Chezy Champs Finalist, 2016 MTTD Finalist
|