Skocz do zawartości

Analiza impulsów czujnika


rezolut

Pomocna odpowiedź

Mam dowolny czujnik IR, powiedzmy TCRT5000, czy CNY70. Czujnik na wyjściu podaje stan powiedzmy, że wysoki po wykryciu przeszkody i stan przeciwny gdy przeszkody nie ma.

Niestety, czujnik reaguje zmianami stanów na przesuwającą się przed nim przeszkodę w osi prostopadłej. Przedmiot przesuwający się przed czujnikiem generuje kilka "wykryć" a mnie interesuje pierwsze wykrycie i ostatnie niewykrycie, czyli pierwsza 1 i ostatnie 0. Przy tym zmiany są nieregularne a czas między pierwszą 1 a ostatnim 0 może być zmienny.

Jak zatem wyeliminować takie "drgania" czujnika?

Pomiary impulsów w czasie, sumy czasów impulsów sprowadzają się do wprowadzania timeoutów, czyli wyłącznika czasowego po pierwszej 1.

Czy jest jakiś sposób by dokładnie wykryć pierwszą 1 i możliwie dokładnie ostatnie zero, przy jak najmniejszym timeoucie?

Link do komentarza
Share on other sites

Co rozumiesz przez "ostatnie zero, przy jak najmniejszym timeoucie"? Przecież nie możesz przewidzieć przyszłości więc ostatnie zero zawsze jest ostatnie właśnie względem przyjętego timeout'u - sam musisz go dobrać.

Skoro czujnik oddaje zera i jedynki to znaczy, że coś przed nim się zmienia. Jakaś cecha materiału lub wzajemne położenie (odległość) - coś czego nie dostrzegasz mają wpływ na sygnał z czujnika. Być może trzeba przejść na analizę ilościową czyli mówiąc po polsku zaprząc ADC? Bo wejście cyfrowe (lub komparator) maskuje mnóstwo niuansów sygnału. Pomiar wielkości analogowej mógłby pomóc odróżniać "jest" od "nie ma" w dużo bardziej pewny sposób. Teraz nie wiesz, czy sygnał spadł o 5 czy o 50%.

Link do komentarza
Share on other sites

Jest dokładnie jak piszesz.

Nie znam długości czasu wykrywania - konkretnie czasu, w którym przedmiot porusza się przed czujnikiem a ja mam wykryć jego początek i koniec. Mając na myśli "zero z timeoutem" myślałem o przedziale czasu do sprawdzenia po dowolnym zerze, czy jest na tyle długi, żeby uznać to zero za ostatnie zero.

Rzeczywiście, powierzchnia przedmiotu jest bardzo nierówna, na tyle, że powoduje różne odbicia wiązki i to pewnie stąd generowanie naprzemienne 1/0. Co gorsza, przedmiot posiada kilka przerw (dziur), w których na pewno wypadnie 0, i to nie ostatnie.

Próbowałem analizy analogowej, ale wypada ona podobnie z powodu dużej nierówności powierzchni. Może rzadszy, ale również dostaję ciąg 1/0.

Czy jedynym wyjściem pozostaje ustalenie długiego timeouta - tj. przyjąć, ze ostatnie 0 jest wtedy np. gdy jego długość (czas od niewykrycia 1) jest dłuższy od sumy czasów poprzednich "strobów"?

Link do komentarza
Share on other sites

Bałbym się takich dziwny operacji jak suma czegośtam. Zrób sobie taki filtr wejściowy przedłużający zero (czyli opóźniający tylko narastające zbocze z czujnika) o ustalony czas:

boolean filtr_wejsciowy(void)
{
static int licznik;

if (wczytaj_stan_czujnika() == 0)
 licznik = TIMEOUT;
else
 if (licznik)
   licznik--;

if (licznik == 0)
  return(1);
else
 return(0);
}

To będzie oddawało zero natychmiast po pierwszym stanie niskim i "trzymało" to zero przez czas TIMEOUT dzięki licznikowi. Dopiero stała jedynka na wejściu utrzymana przez czas TIMEOUT spowoduje oddanie stanu 1. Wywołuj tę funkcję co stały kwant czasu (w przerwaniu od timera?) a będziesz z niej dostawać odfiltrowany czujnik. Dalej możesz - już na tym odfiltrowanym sygnale - zrobić zliczanie zboczy czy co tam potrzebujesz. Niestety czas musisz dobrać doświadczalnie tak, żeby pokrywał te dziury i zapady sygnału.

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

Ale to chyba jest po prostu kwestia odróżniania dziur i nierówności w przedmiocie od dziur pomiędzy przedmiotami, prawda? Jeśli jesteś pewien, że dziury pomiędzy przedmiotami będą dużo większe niż dziury w przedmiocie, to sprawa jest prosta i timeout to załatwia.

Natomiast jeśli przedmioty są gęsto, to chyba będziesz musiał zastosować kilka takich czujników i zgłaszać przerwę tylko gdy wszystkie na raz nic nie wykryją.

Link do komentarza
Share on other sites

To będzie oddawało zero

Jakoś nie specjalnie mi to chce działać.

//czujnik IR

   sensor=!digitalRead(8); //negacja bo czujnik działa w odwrotnej logice niż dyskutujemy

   //obiekt wykryty
   if(sensor==1)
     licznik=2000;
   else
     if(licznik)
       licznik--;

   if(licznik==0)
   {
       if(stan3==0)
       {
         stan3=1;
         //wyslanie stanu czujnika do PC
         bufor[0]=22;bufor[1]=1;BTserial.write(bufor,2);delay(10);
         //linie weryfikacyjne - do skasowania
         Serial.print("ON:  ");Serial.print(stan3);Serial.print("  ");
         Serial.println(sensor);digitalWrite(13,HIGH);  
       }
   }     
  else
  {
       if(stan3==1)
       {  
         //zmiana stanu flagi reakcji na pierwsze wystapienie zera
         stan3=0;
         //wyslanie stanu czujnika do PC
         bufor[0]=22;bufor[1]=2;BTserial.write(bufor,2);delay(10);
         //linie weryfikacyjne - do skasowania                    
         Serial.print("OFF: ");Serial.print(stan3);Serial.print("  ");
         Serial.println(sensor);digitalWrite(13,LOW);   
       }
   }

Niska wartość TIMEOUT faktycznie działa raz, na 1/0 przy jednym przedmiocie. Przy większej ilości przedmiotów zaczyna się powtarzać (czyli otrzymuję 1/0/1/0). Zwiększenie TIMEOUT zmniejsza powtarzalność i znów otrzymuję jedno 1/0, ale z kolei zwiększenie szybkości przesuwu nie wykrywa nic. 🙁

Interesuje mnie pierwsza 1 - i to jest proste do wykrycia. Od tego momentu zaczyna się zabawa. Jestem w stanie zmierzyć czas między 1 a 0. Po 1 oczekuję 0 w nieznanym czasie, ale badając czasy impulsów śmieciowych jestem w stanie stwierdzić ile średnio trwa impuls śmieciowy 1/0 i jeśli 0 miałoby być ostatnie, pojawiłoby się po upływie tego średniego czasu (no... plus jakiś malutki czas dla bezpieczeństwa).

Na tej zasadzie, gdybym założył, że najdłuższy empiryczny czas przesuwu przed czujnikiem wynosi 10sek, to po pierwszej 1 dałbym 10sek delay i dalej zapewne wykryłbym 0 i byłoby to ostatnie 0. Nie chcę takiego delaya, gdy rzeczywisty przejazd wyniesie 0,5sek. Wobec tego badając cząstkowe czasy śmieciowych 1/0 określiłbym prawdopodobny czas po którym czujnik powinien wskazywać 0.

A może zamiast średnich czasów wyłapać maksymalny czas śmieciowego 1/0? Tylko skąd będę wiedział, że ostatni czas (właśnie będący maksymalnym) nie jest już czasem śmieciowym tylko następną 1 w kolejnej sekwencji ruchu.... 🙁

Link do komentarza
Share on other sites

A może zamiast średnich czasów wyłapać maksymalny czas śmieciowego 1/0? Tylko skąd będę wiedział, że ostatni czas (właśnie będący maksymalnym) nie jest już czasem śmieciowym tylko następną 1 w kolejnej sekwencji ruchu...

Będziesz wiedział jak już potrwa dłużej niż twoje maksimum. Niestety nie ma fizycznej możliwości wiedzieć o tym wcześniej, więc czujnik musi się znaleźć odpowiednio wcześniej na drodze przedmiotu, żebyś miał czas zdecydować czy dany impuls jest wystarczająco długi czy nie.

Link do komentarza
Share on other sites

A może zamiast średnich czasów wyłapać maksymalny czas śmieciowego 1/0? Tylko skąd będę wiedział, że ostatni czas (właśnie będący maksymalnym) nie jest już czasem śmieciowym tylko następną 1 w kolejnej sekwencji ruchu...

Będziesz wiedział jak już potrwa dłużej niż twoje maksimum. Niestety nie ma fizycznej możliwości wiedzieć o tym wcześniej, więc czujnik musi się znaleźć odpowiednio wcześniej na drodze przedmiotu, żebyś miał czas zdecydować czy dany impuls jest wystarczająco długi czy nie.

Yyy... chyba nie będę wiedział...

Pierwsza 1/0 trwa 1ms - max=1ms

Druga 1/0 trwa 0,5ms - max=1ms

Trzecia 1/0 trwa 10ms - może to być już nowy sygnał, ale może być też śmieć po chwilowo dłuższej ciszy 🙁

Maksimum tego nie wykryję 🙁 Ze średnimi czasami będzie podobnie. 10ms jest większe od średniej ale nie musi być ostatnie 🙁

Zamiast takich kombinacji lepiej odpuścić i dać od razu 3sek delay w jednym warunku.

Nie wiem czy w ogóle na jednym czujniku da się zrobić wykrywanie, o które mi chodzi 🙁

Myślicie, że się da?

Link do komentarza
Share on other sites

Niestety debounce nie spełniło zadania. Tak czy siak, odczyty wymagają wprowadzenia jakiegoś opóźnienia po otrzymaniu 0, i sprawdzaniu po opóźnieniu, czy 0 jest na pewno zerem, czyli czy jest zerem ostatnim.

Takie rozwiązanie jest równoznaczne z ustawieniem opóźnienia na pierwszej 1 i wyzerowanie zmiennych po zadanym czasie. Czyli wyłącznik czasowy po wykrytym impulsie.

Takie coś mi jednak nie całkiem odpowiada, kończę więc temat.

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