View Single Post
  #22   Spotlight this post!  
Unread 24-01-2013, 15:45
billbo911's Avatar
billbo911 billbo911 is offline
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
billbo911 has a reputation beyond reputebillbo911 has a reputation beyond reputebillbo911 has a reputation beyond reputebillbo911 has a reputation beyond reputebillbo911 has a reputation beyond reputebillbo911 has a reputation beyond reputebillbo911 has a reputation beyond reputebillbo911 has a reputation beyond reputebillbo911 has a reputation beyond reputebillbo911 has a reputation beyond reputebillbo911 has a reputation beyond repute
Re: Disc Lauching Velocity

Quote:
Originally Posted by billbo911 View Post
[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;
 }
__________________
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
Reply With Quote