Skocz do zawartości

Chronograf kodowanie


Pomocna odpowiedź

Zgadzam się energia to przekręt 🙂 Błąd poprawiony.

Co do odległości między czujnikami starałem się ustawić jak najbardziej dokładnie. Nie zmienia to faktu, że poza suwmiarką i starannością wykonania mogło się coś przesunąć.

Sposób obliczeń w oparciu o bazową stronę

"Calc for 60mm =

((60mm/2.54)/12)×1000000= 196850"

W moim przypadku było niecałe 100mm więc przyjąłem wynik "328083" - W większości przykładów, które spotkałem w sieci wynik zaokrąglany jest do "333333" staram się rozszyfrować dlaczego.

Korci mnie porównanie z prawdziwym chronografem.

"..staram się rozszyfrować dlaczego"

Nie rozczulaj mnie. Przecież przeliczania czasu na prędkość to chyba w podstawówce uczą.

v=s/t

Jeżeli długość odcinka pomiarowego wyrazisz w metrach a czas w mikrosekundach to wynik dostajesz w milionach metrów na sekundę, np:

v=0.1m/500µs=0.0002

Jeżeli chcesz to zamienić na m/s musisz wynik pomnożyć przez milion:

0.0002*1000000=200m/s

A upraszczając, dla bazy 10cm możesz odpowiednią stałą od razu zdefiniować sobie gdzieś w programie:

K = 100000

i liczyć:

v[m/s] = K / t[µs]

Gdybyś chciał zmienić bazę pomiarową s na jakąś inną długość, musisz policzyć nową stałą:

K = 10000 * s[cm]

Czyli dajmy na to dla innego chronometru z odcinkiem pomiarowym 17.5cm masz stałą:

K = 10000 * 17.5 = 175000

i wtedy dla zmierzonego czasu np. 875us dostajesz:

v = K/t = 175000 / 875 = 200m/s

Jeśli wynik chcesz pokazywać również w calach/sekundę, stopach/minutę czy milach/godzinę to po prostu wyznaczasz (lub znajdujesz w internecie) odpowiedni współczynnik przeliczeniowy i mnożysz. Co tu jest do rozszyfrowywania???

  • Lubię! 1

Zastanawiałem się w jaki sposób dopisać kod do ustawiania wagi pocisku.

Menu na trzech przyciskach (set, up, down)

Przeczytałem kursy podstawowe. Jest kilka punktów zaczepienia. Na przykład pomyślałem o takim rozwiązaniu

  while (digitalRead(7) == HIGH) {} //Jeśli  przycisk "set" jest wciśnięty 

weight_settings(); // kod ustawiający wagę "+", "-"

 while (digitalRead(7) == HIGH) {} //Jeśli przycisk "set" jest wciśnięty to program już nie wyjdzie bo się zatrzyma na najbliższej pętli :(

Serial.println("I am waiting for a shot - YOU can shoot!");

while(digitalRead(firstsensor_1) == 0);

while(digitalRead(firstsensor_1));
time1 = micros();  


while(digitalRead(secoundsensor_2));
time2 = micros();   

printserial();

Albo takim

int wybor;

void setup() {
 Serial.begin(9600); 
 pinMode (switchPin_plus, INPUT_PULLUP);
pinMode (switchPin_minus, INPUT_PULLUP);
pinMode (switchPin_set, INPUT_PULLUP);
}

void loop() {

 if(digitalRead(switchPin_set)) { // i tutaj o zgrozo jaki warunek?!
   wybor =   //error w głowie brak pomysłu :(
 }

switch (wybor) {
   case 1:
     Serial.println("Ustawienia Wagi");
       weight_settings();
   break;
     case 2:
Serial.println("I am waiting for a shot - YOU can shoot!");

while(digitalRead(firstsensor_1) == 0);

while(digitalRead(firstsensor_1));
time1 = micros();  


while(digitalRead(secoundsensor_2));
time2 = micros();   

printserial();

   break;
 } 

Witki mi opadają. Proszę o jakąś podpowiedź.

  • 7 miesiące później...

Witam,

Nie chce zakładać nowego tematu więc zapytam tutaj,
Chciałem zrobić sobie coś podobnego (tyle, że do asg) do zrobienie bramek użyłem:

-Nadajnik IR 5mm 940nm LIRED5B-940-H https://botland.com.pl/szukaj?controller=search&orderby=position&orderway=desc&search_query=Nadajnik+IR+5mm+940nm+LIRED5B-940-H+&submit_search=

-Odbiornik podczerwieni TSOP2236 - 36 kHz https://botland.com.pl/odbiorniki-podczerwieni/181-odbiornik-podczerwieni-tsop2236-36khz-.html?search_query=Odbiornik+podczerwieni+TSOP2236+-+36+kHz+&results=6

I teraz pytanie: kiedy przesuwam przez bramki powoli np. palec, karton itp. wszystko jest ok natomiast jeśli zrobię to szybko nic się nie dzieje nie ma żadnego odczytu czy to może być wina komponentów jakie użyłem?

kod wygląda tak: (praktycznie kopia tego co już się tutaj znalazło)

#include <Wire.h>

#define sensor1 2
#define sensor2 3

unsigned long time1;
unsigned long time2;
float fps, elap;
int czujnik1;
int czujnik2;

void setup() {
Serial.begin(9600);

pinMode (sensor1, INPUT);
pinMode (sensor2, INPUT);
digitalWrite(sensor1, HIGH);
digitalWrite(sensor2, HIGH);
}

void loop() {

Serial.println("Wal...");


while(digitalRead(sensor1) == 0);

while(digitalRead(sensor1));
time1 = micros();
while(digitalRead(sensor2));
time2 = micros();


printserial();


}


void printserial(){
elap = time2 - time1;
fps = 328083/elap;
Serial.println(fps );

} 

Tak wiem temat trochę stary nie widziałem sensu zakładania nowego, za wszelką podpowiedź z góry dziękuję.

Pokaż schemat. W jaki sposób generujesz przebieg sterujący nadajnikiem? W kodzie nic nie ma na ten temat.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...