• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Obliczanie czasu pomiędzy zdarzeniami
#1
Witam,
Jestem początkującym użytkownikiem Arduino Uno. Chciałem zbudować prosty układ, który mierzyłby czas staczającego się z równi pochyłej walca u jej podstawy. Zasada działania jest następująca: w odstępie 10mm zamontowane są dwa fototranzystory oświetlane diodami laserowymi; przejeżdżający walec przecina najpierw pierwszą wiązkę potem drugą. Na tej podstawie znając odległość pomiędzy fototranzystorami i czas na jaki wiązka została przecięta mogę policzyć prędkość (T1, T2 albo T = ?     ).
 
Poniżej zamieściłem przykłady program, który zwraca wartość funkcji micros(), kiedy zostanie przekroczony poziom referencyjny dla pierwszego fototranzystora (950). Czy jest możliwość wystartowania funkcji micros() od zera, kiedy zostanie przekroczona wartość referencyjna? Czy może istnieje, jakaś inna funkcja pozwalająca na obliczenie czasu?
Z góry bardzo dziękuje,
Michał

int czujnik_1 = A1;   //fototranzystor 1
int czujnik_2 = A2;   //fototranzystor 2
unsigned long time; //czas microsekundy

void setup() {
  Serial.begin(9600);        //inicjalizacja monitora szeregowego
  Serial.println("Pomiar predkośći");
 
}
 
void loop() {
  int war_1 = analogRead(czujnik_1);      //odczytanie wartości z A1
  int war_2 = analogRead(czujnik_2);      //odczytanie wartości z A2
  
  if (war_1 < 950)                      
  {

    time = micros();
  }

  if (war_1 < 950)
  {
Serial.println (time);
  }
 delayMicroseconds(1);                         //opóźnienie między kolejnymi odczytami
}
 
Odpowiedź
#2
Nie możesz wyzerować micros bo to funkcja która zwraca czas w us od momoentu startu programu. Wszystko masz w dokumentacji: https://www.arduino.cc/en/Reference/Micros(na dysku też)
Zamiast
Kod:
Serial.println(time);
daj
Kod:
Serial.println(micros()-time);
i będziesz miał różnicę czasu.
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
#3
Witam,
Niestety, Twój program nie będzie robić tego co od niego wymagasz.
Pozdrawiam.
 
Odpowiedź
#4
A czy mogę prosić o jakieś sugestie, jak go zmienić, żeby działa zgodnie z intencją?
 
Odpowiedź
#5
Witam,
W pętli loop proszę dac while, które nie robi nic z warunkiem, w którym odczytujesz pierwszy czujnik. Czyli robione jest nic dopóki wiązka nie zostanie przerwana. Następnie oczytujemy micros. Dalej znowu pętla while, która nie robi nic tylko z warunkiem dla drugiego czujnika i za pętla znowu odczytanie czasu. Wtedy wyliczona różnica będzie mogła być użyta do obliczenia prędkości. Czujniki muszą być umieszczone poza równia ukosna.
Pozdrawiam.
 
Odpowiedź
#6
Czy dobrze zrozumiałem, że chodzi o następującą modyfikację programu? Próbuję uruchomić w ten sposób, ale coś nadal jest nie tak.

int czujnik_1 = A1; //fototranzystor 1
int czujnik_2 = A2; //fototranzystor 2
unsigned long time_1; //czas microsekundy
unsigned long time_2; //czas microsekundy
void setup() {
Serial.begin(9600); //inicjalizacja monitora szeregowego
Serial.println("Pomiar predkosci");

}

void loop() {
int war_1 = analogRead(czujnik_1); //odczytanie wartości z A1
int war_2 = analogRead(czujnik_2); //odczytanie wartości z A2

while(war_1 < 950)
{
}
time_1 = micros();

while(war_2 < 950)
{
}
time_2 = micros();
delayMicroseconds(1); //opóźnienie między kolejnymi odczytami
Serial.println(time_2 - time_1);
}
 
Odpowiedź
#7
Witam.
Nie. Powinno być while (analogRead (czujnik_1)<950) {}
Dla drugiego while podobnie.
Reszta ok.
Pozdrawiam
 
Odpowiedź
#8
Zapomniałem,
Jako, że nie wiem jakie wartości są odczytywane przy przerwanej wiazce to być może zamiast znaku < wwarunku ma być znak >
 
Odpowiedź
#9
(28-01-2017, 07:35)Smaczek napisał(a): Zapomniałem,
Jako, że nie wiem jakie wartości są odczytywane przy przerwanej wiazce to być może zamiast znaku < wwarunku ma być znak >

Nie może tylko na pewno(patrząc na rysunek).
Jeśli warunkiem wykrycia jest spadek pomiaru poniżej jakiejś wartości to sprawdzamy to tylko raz i zapamiętujemy czas. Czyli w tym wypadku sprawdzamy czy pomiar jest większy i blokujemy w pętli while. Za pętlą zapamiętujemy czas i to samo robimy z drugim pomiarem.
Użyj symulatora( http://forum.arduinopolska.com/newreply....plyto=4984) to zobaczysz co się dzieje.
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
#10
Witam,
@namok, nie do końca tak to działa. Pętla while bezczynnie "czeka" na sygnał rozpoczęcia pomiaru, którym faktycznie- według rysunku- jest spadek odczytywanej wartości poniżej 950.
No chyba, że pisząc "blokujemy" miałeś na myśli blokadę przejścia do następnej instrukcji.
Pozdrawiam.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości