Chief Delphi

Chief Delphi (http://www.chiefdelphi.com/forums/index.php)
-   General Forum (http://www.chiefdelphi.com/forums/forumdisplay.php?f=16)
-   -   Disc Lauching Velocity (http://www.chiefdelphi.com/forums/showthread.php?t=110940)

nathannfm 24-01-2013 14:10

Re: Disc Lauching Velocity
 
Quote:

Originally Posted by Orion.DeYoe (Post 1221123)
You'll never get 53,000 RPM (free load speed of a CIM) out of a CIM attached to anything.

Ummmm...

*5,300 RPM

Ether 24-01-2013 14:28

Re: Disc Lauching Velocity
 
Quote:

Originally Posted by billbo911 (Post 1221140)
...

Thanks for the detailed answer.

I was wondering if you could achieve a similar result using only one sensor instead of two by interrupting on both rising and falling edges of that sensor (using the diameter of the frisbee as the distance).



billbo911 24-01-2013 14:33

Re: Disc Lauching Velocity
 
Quote:

Originally Posted by Ether (Post 1221176)
Thanks for the detailed answer.

I was wondering if you could achieve a similar result using only one sensor instead of two by setting up one pin to interrupt on both rising and falling edges. Or doesn't the hardware support that?



I'm sure it is possible, here is a quote from the Arduino Interrupt Reference page.

Quote:


attachInterrupt(interrupt, function, mode)....

...
mode
:
defines when the interrupt should be triggered. Four constants are predefined as valid values:

LOW to trigger the interrupt whenever the pin is low,
CHANGE to trigger the interrupt whenever the pin changes value
RISING to trigger when the pin goes from low to high,
FALLING for when the pin goes from high to low.
The Due board allows also:
HIGH to trigger the interrupt whenever the pin is high.
(Arduino Due only)

You would have to craft the ISR carefully, but it should be possible using the CHANGE mode. My only concern is that the second interrupt would occur before the processing of the first interrupt had completed.
Although, given the timing measurements we are seeing for this year's challenge, that should not be too much of an issue.

Orion.DeYoe 24-01-2013 14:36

Re: Disc Lauching Velocity
 
Quote:

Originally Posted by nathannfm (Post 1221173)
Ummmm...

*5,300 RPM

Lol yes, if you look I have corrected the post. That was a typo (a pretty major one I might add).

Ether 24-01-2013 14:55

Re: Disc Lauching Velocity
 
Quote:

Originally Posted by billbo911 (Post 1221181)
My only concern is that the second interrupt would occur before the processing of the first interrupt had completed

If your two sensors are only 12" apart, you'd have the same concern, since that distance is roughly the same as the single-sensor approach (wherein the distance is the diameter of the frisbee).

So as you said, since the frisbee speed is plenty slow, it's not a concern.

The reason I brought this up is, using the single-sensor approach it might be easier to set up to measure the speed of the frisbee as it is passing thru the shooter at various locations. This might produce some very revealing data about slippage.



billbo911 24-01-2013 15:12

Re: Disc Lauching Velocity
 
Quote:

Originally Posted by Ether (Post 1221195)
...
The reason I brought this up is, using the single-sensor approach it might be easier to set up to measure the speed of the frisbee as it is passing thru the shooter at various locations. This might produce some very revealing data about slippage.



Excellent idea!!
I'm not certain it would give any useful information that the off board Chronograph couldn't supply, but it would always be present and available for measurement. Real time feedback during a shot may not be possible, but by no means impossible.

We plan on using our free standing unit to profile our system. We will also make it available at the Sacramento Regional to any team that would like to test with it.

Now, you have piqued interest. I just HAVE to write the code for a single sensor Chronograph!!
Stay tuned for code.

billbo911 24-01-2013 15:45

Re: Disc Lauching Velocity
 
Quote:

Originally Posted by billbo911 (Post 1221202)
[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;
 }


billbo911 30-01-2013 16:45

Re: Disc Lauching Velocity
 
Quote:

Originally Posted by billbo911 (Post 1221226)
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.

Ether 30-01-2013 17:00

Re: Disc Lauching Velocity
 
Quote:

Originally Posted by billbo911 (Post 1224714)
I have verified the above code works quite well

Very cool! Thanks for posting that update :)

You've inspired me. For teams on a really tight budget that can't afford an Arduino, I wrote a small app that will run on any Pentium-based laptop or PC1 with a parallel port. It uses that port's status pins2 to get the elapsed time between rising and falling edges of a single sensor, or between the rising edges of two separate sensors, with +/- 2 μs accuracy.

If there's enough interest3, I'll clean it up and post a white paper.

1especially on the old junker ones with 133MHz Pentium
2these are pulled up to +3.3 volts on most parallel ports and need only be grounded to generate a signal.
3PM me if you'd be interested.




All times are GMT -5. The time now is 05:35.

Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Copyright © Chief Delphi