Skocz do zawartości

Budowa urządzenia mierzącego czas okrążenia


PAWEL1

Pomocna odpowiedź

Dzień dobry.

chciałbym zbudować układ pomiaru czasu

założenia:

OBIEKT PRZEKRACZA LINIĘ START-u

PO PRZEKROCZENIU PUNKTU POMIARU „META” WYŚWIETLA SIĘ CZAS KTÓRY UPŁYNĄŁ OD STARTU

Czujniki:

Cyfrowy czujnik odległości 150cm – Waveshare (x2)

LUB

Moduł detektora przeszkód z czujnikiem IR (x2)

 

WYŚWIETLACZ:

JAZDA NACZAS „LINE FOOLOWER’

META : 00:00:000

CZAS WYŚWIETLANY:

00:00:000 (MINUTY : SEKUNDY : TYSIĘCZNE SEKUNDY)

POMIAR CZASU_1.pdfPOMIAR CZASU_1.pdf

START – JEDNYM Z PRZYCISKÓW NA WYŚWIETLACZU

STOP - JEDNYM Z PRZYCISKÓW NA WYŚWIETLACZU

RESET POMIARÓW ZA POMOCĄ JEDNYM Z PRZYCISKÓW NA WYŚWIETLACZU)

UKŁAD NA „KABLACH”

ZASILANIE BATERIA 5V {POWERBANK)

CZY UKŁAD MOŻE DZIAŁAĆ NA JEDNYM CZUJNIKU (BRAMCE). TRASA JAKO OKRĄŻENIE I EWENTUALNIE DWA OKRĄŻENIA?

 

 

dziękuję za wszelką pomoc

Paweł

 

 

I ZAŁĄCZNIK

😉

POMIAR CZASU_1.pdf

Link do komentarza
Share on other sites

Cześć, witamy na forum 😀

11 godzin temu, PAWEL1 napisał:

CZY UKŁAD MOŻE DZIAŁAĆ NA JEDNYM CZUJNIKU (BRAMCE). TRASA JAKO OKRĄŻENIE I EWENTUALNIE DWA OKRĄŻENIA?

Tak. Czujnik może wykryć 2 stany i 2 przejścia (zbocza). Ciebie interesuje te pierwsze kiedy nie było nic w bramce a teraz się pojawiło. Taka sytuacja może co prawda zajść gdy coś jedzie do przodu lub się cofnie, więc musisz się zastanowić czy bramka ma być odporna na takie zachowanie.

W najprostszym przypadku odejmujesz czasy, w których zaszło przerwanie wiązki w bramce. Jeżeli chcesz badać kierunek w jakim porusza się robot, to musisz dać 2 czujniki (podobnie jak w enkoderze).

Jak chcesz kilka okrążeń, to po prostu w nieskończoność odejmujesz czasy i wyświetlasz tylko te aktualne.

  • Lubię! 1
Link do komentarza
Share on other sites

O jakiej funkcji delay piszesz, bo nie wiem gdzie ma być użyta?

Tu chyba nie da się przekombinować 🤔 chyba.

bool dziala = false;

Jeżeli zbocze narastajace, to:

  jezeli !dziala:

      start = milis()
      dziala = true

  w przeciwnym razie: //minimum 1 okrazenie:

      delta_czas = milis() - start

      wypisz_czas(delta_czas)

 

Edytowano przez Gieneq
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

wykorzystałem pomoc i jest program, niestety jak zwykle jest błąd

sensor Arduino ir proximity sensor interfacing

wg strony http://blog.circuits4you.com/2016/04/arduino-ir-proximity-sensor-interfacing.html

program działa na module arduino nano 3.0 atmega328p

program liczący czas już nie

//czas przejazdu

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2); //ustawienie adresu lcd na magistrali I2C 0x27 dla wyswietlacza 16 znakow w 2 liniach

const int ProxSensor_start;
const int ProxSensor_stop;

int sygnal_reset = 7; // numer pinu do podania sygnału high dla resetu czasu przejazdu
int ProxSensor_start = 8; // numer pinu do podania sygnału high dla start
int ProxSensor_stop = 9; // numer pinu do podania sygnału high dla stop


unsigned long czas_start;
unsigned long czas_meta;
//unsigned long czas_przejazdu;
unsigned long timeStart, timeStop, timeElapsed;
int w=0

void setup()                        // ustawienia poczatkowe dla programu

{
  lcd.init(); // wyswietlacz
  lcd.backlight();
  lcd.setCursor(0,0);
  lcd.print("CZAS PRZEJAZDU:");
  lcd.setCursor(0,1);               // ustawienie kursora w pierwszej pozycji w drugim wierszu
  lcd.print("00:00:000");            // wypisanie komunikatu
  
  pinMode(ProxSensor_start, INPUT);
  pinMode(ProxSensor_stop, INPUT);
}

void loop()
{
  if(digitalRead(ProxSensor_start) == HIGH && w = 0) // sygnal start, rozpoczecie liczenia czasu
  {
    czas_start = milis();
    w=1
  }
  if(digitalRead(ProxSensor_meta) == HIGH && w = 1) // sygnal stop, zakoncz liczenie czasu
  {
    lcd.setCursor(0,1);
    wyswietl_wynik(czas_start, milis());
  }
  else
  {
    w = 0
  }
  if(digitalRead(sygnal_reset) == HIGH)
  {
    lcd.setCursor(0,0);
    lcd.print("CZAS PRZEJAZDU:");
    lcd.setCursor(0,1);
    lcd.print(00:00:000);
    w = 0
  }
}

void wyswietl_wynik(long timeStart, long timeStop)
{
  float h,m,s.ms;
  unsigned long over;
   timeElapsed = timeStop-timeStart;
//   h=int(timeElapsed/3600000);
  over=timeElapsed%3600000;
  m=int(over/60000);
  over=over%60000;
  s=int(over/1000);
  ms=(over%1000);
//   if(h>=0 and h<=9){lcd.print("0");}
//  lcd.print(h,0);
//  lcd.print(":");
    lcd.setCursor(0,1);
    if(m>=0 and m<=9){lcd.print("0");}
    lcd.print(m,0);
    lcd.print(":");
    if(s>=0 and s<=9){lcd.print("0");}
    lcd.print(s,0);
    lcd.print(":");
    if(ms>=0 and ms<=9){lcd.print("0");}
    lcd.print(ms,0);
}

 

Connection Diagram.png

Link do komentarza
Share on other sites

po poprawkach układ działa

pojawił się problem ponownego załączenia odliczania czasu 

impuls start - impuls stop = wynik czas -> ponownie start odmierza od początku

co zrobić aby czekał na impuls reset i dopiero wtedy gotowy do kolejnego pomiaru

// czas przejazdu robota

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);   // ustawienie adresu LCD na magistrali I2C 0x27 dla wyświetlacza - 16 znaków w 2 liniach

int przycisk_reset = 7;             // numer pinu arduino do podłączenia przycisku reset, rezystor do masy 1k
int czujnik_start = 8;              // numer pinu arduino do podłączenia czujnika laserowego na starcie
int czujnik_stop = 9;               // numer pinu arduino do podłączenia czujnika laserowego na mecie
unsigned long czas_start;           // zapisanie czasu początku przejazdu
unsigned long czas_stop;           // zapisanie czasu końca przejazdu
unsigned long timeStart, timeStop, timeElapsed; // czasy w funkcji zmieniajacej czas z milisekund na czas zrozumiały dla człowieka
int w = 0;                          // zmienna pomocnicza ustawiona na 0

void setup()                        // ustawienia początkowe dla programu
{
  lcd.init();                       // inicjalizacja wyświetlacza LCD 
  lcd.backlight();                  // wygaszenie wyświetlacza LCD
  lcd.setCursor(0,0);               // ustawienie kursora w pierwszej pozycji w pierwszym wierszu
  lcd.print("Czas przejazdu:");     // wypisanie komunikatu
  lcd.setCursor(0,1);               // ustawienie kursora w pierwszej pozycji w pierwszym wierszu
  lcd.print("00:00:000");            // wypisanie komunikatu
  pinMode(czujnik_start, INPUT);    // ustawienie pinów jako wejść
  pinMode(czujnik_stop, INPUT);     // ustawienie pinów jako wejść
}

void loop()                         // początek pętli programu
{
  if (digitalRead(czujnik_start) == LOW && w == 0) // sprawdzenie warunku czy czujnik start otrzymał impuls i czy zmienna 'w' równa się 0
    { 
      czas_start = millis();        // przypisanie do zmiennej aktualnej wartości wewnętrznego licznika
      w = 1;                        // zmienna pomocnicza ustawiona na 1
    }
  if (digitalRead(czujnik_stop) == HIGH && w == 1)   // sprawdzenie warunku czy czujnik meta nie otrzymał impulsu i czy zmienna 'w' równa się 1
    { 
      lcd.setCursor(0,1);           // ustawienie kursora w pierwszej pozycji w drugim wierszu
      wyswietl_wynik(czas_start, millis()); // uruchomienie funkcji zmieniającej czas z milisekund na czas zrozumiały dla człowieka
    }
      else
       { 
         w = 0;                     // zmienna pomocnicza ustawiona na 0
       }
  if (digitalRead(przycisk_reset) == HIGH)  // sprawdzenie warunku czy przycisk reset otrzymał impuls
    { 
      lcd.setCursor(0,0);           // ustawienie kursora w pierwszej pozycji w pierwszym wierszu
      lcd.print("Czas przejazdu:"); // wypisanie komunikatu
      lcd.setCursor(0,1);           // ustawienie kursora w pierwszej pozycji w drugim wierszu
      lcd.print("00:00:000");        // wypisanie komunikatu
      w = 0;                        // zmienna pomocnicza ustawiona na 0
    }
}

void wyswietl_wynik(long timeStart, long timeStop)  // funkcja zmieniająca czas z milisekund na czas zrozumiały dla człowieka
{
  float h,m,s,ms;
  unsigned long over;
    timeElapsed = timeStop-timeStart;
//    h=int(timeElapsed/3600000);
    over=timeElapsed%3600000;
    m=int(over/60000);
    over=over%60000;
    s=int(over/1000);
    ms=(over%1000);
//      if(h>=0 and h<=9){lcd.print("0");}
//      lcd.print(h,1);
//      lcd.print(":");
      lcd.setCursor(0,1);
      if(m>=0 and m<=9){lcd.print("0");}
      lcd.print(m,0);
      lcd.print(":");
      if(s>=0 and s<=9){lcd.print("0");}
      lcd.print(s,0);
      lcd.print(":");
      if(ms>=0 and ms<=9){lcd.print("0");}
      lcd.print(ms,0);
}

kolejny krok to rozbudowanie o dodatkowy punkt pomiarowy

foto1.jpg

dziękuję Rafałowi za czas spędzony przy programie

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.