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

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...

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.