Skocz do zawartości

[Bascom] Line Follower algorytm


Pomocna odpowiedź

Jeżeli liczysz prąd opornika+diody, to powinieneś uwzględnić spadek napięcia także na niej samej, tj. ok. 1.2V dla podczerwonej.

Dla Vcc=5V, diody IRED i opornika 150R masz zatem:

I=(Vcc-Uf)/150=(5-1.2)/150=25mA

co daje moc strat w diodzie:

P=Uf*I=1.2*0.025=30mW

to niewiele, więc jeśli czujniki są naprawdę ciepłe to może jest jakiś błąd gdzie indziej.

Np. czy Twoje oporniki są SMD? Jeżeli tak, to nadruk na nich "150" oznacza 15Ω a nie 150Ω 😐 bo trzecia cyfra mówi o liczbie zer dopisywanych do dwóch pierwszych cyfr.

Mierzyłeś ten prąd, choćby dla wszystkich czujników razem?

  • Lubię! 1

Dzięki Marku za wyjaśnienie,.

Tak, mój rezystor jest SMD i ma nadruk 151 czyli 150 Ohm.

Nie, nie liczyłem prądu dla wszystkich czujników.

Treker, czy Twoim zdaniem algorytm/program, który napisałem i widziałeś na filmiku idzie w dobrą stronę? Tzn. czy mogę z niego jeszcze więcej wyciągnąć dodając, np. człon D??

Nie ma sensu robić nic dalej, jeśli nie znalazłeś jeszcze błędu powodującego brak jazdy, gdy linie widzą dwa środkowe czujniki.

Racja, nie ma sensu brać się za coś innego (dalej), gdy jeszcze nie jest dokończone to pierwsze.

Tak więc muszę znaleźć przyczynę czemu te czujniki nie chcą współpracować z resztą.

Edit:

Tak mnie naszło... sprawdziłem listwę z czujnikami i wydaje mi się, że jest trochę wygięta (taki mały półokrąg) i skrajne czujniki (lewa, prawa strona) są niżej niż środkowe i wydaje mi się, że to może trochę wpływać na działanie tychże czujników, bo granica reagowania na linie jest taka sama dla wszystkich.

Napisałem Ci wcześniej, co musisz sprawdzić po kolei. Sprawdź reakcję każdego czujnika, wyliczoną pozycje i ilość czujników, jakie wykryły linie. Podaj wyniki i będziemy działać dalej.

1.Sprawdź reakcję każdego czujnika.

2.Sprawdź wyliczoną pozycje.

3.Sprawdź ilość czujników, jakie wykryły linie.

Ad.1.

*Czujnik 8 podpięty do ADC7 nie widzi czarnej linii.

Na białym tle na wyjściu napięcie wynosi 0,16V, ana czarnym 1,72V i wydaje mi się, że to napięcie jest za małe, aby uC wykrył stan wysoki, jak u innych czujników napięcie na czarnym tle wynosi ponad 3,6V.

Ad.2.

*Napisałem kod, aby dioda czerwona zapalała się kiedy moja Aktualna_pozycja jest dodatnia, czyli > 0 (to jest prawa strona robota) i jest całkiem dobrze poza jedą rzeczą, drugi czujnik (podpięty do ADC1) nie wykazuje się jako dodatni, bo jak ten czujnik jest nad czarną linią to dioda gaśnie, a nie powinna. Na wyjściu jest 1,2V jak u innych jest (które są nad czarną linią) jest ponad 3,6V.

*Teraz dioda niebieska ma się zapalić jak mamy Aktualną_pozycję ujemną < 0 i wszystko działa poza 8 czujnikiem (odwołanie do Ad.1.)

*A teraz Aktualna_pozycja ma być równa zero = 0 i jak bot jest środkowymi czujnikami na linii to obie diody się zapalają, czyli tak powinno być, jak jest na dodatniej i ujemnej stronie to gasną, tylko nie działa to na tych dwóch czujnikach (drugi i ósmy). W przypadku drugiego czujnika diody się zapalają i tak samo dla czujnika ósmego. Diody się zapalają jak wszystkimi czujnikami bot stoi na białym tle. Wagi środkowych czujników wynoszą: prawa 5 i lewa -5.

Ad.3.

*Napisałem taki program, żeby zapaliły się dwie diody jak nie wykryje żaden czujnik linii, czyli:

Sensor_on_black = 0 i to działą.

Później napisałem program, aby dioda czerwona się zapaliła jak jakikolwiek czujnik wykrył linie i to też działa, tylko bez czujników: drugiego i ósmego.

*Jak tylko dwa czujniki wykryją linie to ma sięzapalić dioda niebieska i to też ładnie działa poza czujnikami: drugi i ósmy.

I to już wszystko. Mam nadzieję, że wyczerpująco odpowiedziałem na Twoje pytania i będzie można ruszyć dalej.

Ad.1.

*Czujnik 8 podpięty do ADC7 nie widzi czarnej linii.

Na białym tle na wyjściu napięcie wynosi 0,16V, ana czarnym 1,72V i wydaje mi się, że to napięcie jest za małe, aby uC wykrył stan wysoki, jak u innych czujników napięcie na czarnym tle wynosi ponad 3,6V.

W takim razie musisz go najpierw naprawić. Po drugie stwierdzenie "napięcie jest za małe, aby uC wykrył stan wysoki" jest błędne - dokonujesz przecież pomiaru analogowego.

Ad.2.

*Napisałem kod, aby dioda czerwona zapalała się kiedy moja Aktualna_pozycja jest dodatnia, czyli > 0 (to jest prawa strona robota) i jest całkiem dobrze poza jedą rzeczą, drugi czujnik (podpięty do ADC1) nie wykazuje się jako dodatni, bo jak ten czujnik jest nad czarną linią to dioda gaśnie, a nie powinna. Na wyjściu jest 1,2V jak u innych jest (które są nad czarną linią) jest ponad 3,6V.

*Teraz dioda niebieska ma się zapalić jak mamy Aktualną_pozycję ujemną

A co, gdy pozycja jest równa zero?

Ad.3.

*Napisałem taki program, żeby zapaliły się dwie diody jak nie wykryje żaden czujnik linii, czyli:

Sensor_on_black = 0 i to działą.

Później napisałem program, aby dioda czerwona się zapaliła jak jakikolwiek czujnik wykrył linie i to też działa, tylko bez czujników: drugiego i ósmego.

*Jak tylko dwa czujniki wykryją linie to ma sięzapalić dioda niebieska i to też ładnie działa poza czujnikami: drugi i ósmy.

No to chyba teraz nie masz innej opcji niż znalezienie usterek w czujnikach 2 i 8 😉

Po drugie stwierdzenie "napięcie jest za małe, aby uC wykrył stan wysoki" jest błędne - dokonujesz przecież pomiaru analogowego.

No fakt 😉 Zapomniałem, że dokonuję pomiar analogowy.

A co, gdy pozycja jest równa zero?

Napisałem:

A teraz Aktualna_pozycja ma być równa zero = 0 i jak bot jest środkowymi czujnikami na linii to obie diody się zapalają, czyli tak powinno być, jak jest na dodatniej i ujemnej stronie to gasną, tylko nie działa to na tych dwóch czujnikach (drugi i ósmy). W przypadku drugiego czujnika diody się zapalają i tak samo dla czujnika ósmego. Diody się zapalają jak wszystkimi czujnikami bot stoi na białym tle. Wagi środkowych czujników wynoszą: prawa 5 i lewa -5.
No to chyba teraz nie masz innej opcji niż znalezienie usterek w czujnikach 2 i 8 😉

To teraz priorytetem jest naprawa właśnie tych czujników 🙂

Edit 02.02.2014:

Walczę z tymi czujnikami i jakoś naprawiłem czujnik 2, ale ósmy jest nieugięty :/ Poprawiam luty, zmieniam rezystory, wymieniam KTIR'y i nic... Macie jakieś pomysły ?

Może masz jakieś zwarcie? Złe wartości rezystorów lub coś w programie (konf wej/wyj, podicągnięcia etc.)

Zwarcie...hmm... Wydaje mi się, że nie ma zwarcia. Wartości rezystorów to 150R i 10k, w programie mam tylko zaimplementowaną konfigurację ADC, nie używałem: Config PORTC = Input + konfiguracja ADC, zawsze tak robiłem i nie było problemu.

  • 2 tygodnie później...

Po przerwie (szkoła) mogę zacząć testować płytkę z czujnikami (8 sztuk) na nowej płytce, którą przed chwilą skończyłem. Jeżeli jutro uda mi się ją polutować to napiszę co i jak.

[ Dodano: 15-02-2014, 20:16 ]

Ok. Polutowana skończona płytka z czujnikami i działająca 🙂 Sprawdzałem jak ona się zachowuje, czyli robiłem testy jak parę postów wyżej i wszystko jest ok - jak chodzi o czujniki, bo testy robiłem na innym podwoziu (coś w stylu Pololu 3pi) i skrajne czujniki są baaardzo blisko kół i robot dziwnie jeździ, ale to już nie problem, bo zrobię nowy moduł na jakiejś atmedze i nowe podwozie (takie jak na LF'a przystało) i wtedy powtórzę testy (no i zapewne bot będzie jeździł lepiej, bo będzie miał listwę z czujnikami wysuniętą dalej w porównaniu do teraz).

  • 2 tygodnie później...

Testy nadal trwają, na razie na podwoziu testowym.

Filmik:

Regulator P

Kp = 1

Tp =127 (założone wolniejsze silniki)

-----------

EDIT:

*Ogólnie w lf'ach lepiej mieć parzystą, czy nieparzystą ilość czujników?

*Lepiej używać ADC, czy komparatorów (LM339)?

*Jak przypisywać wagi czujnikom, które są wysterowane przez komparatory? (czyli pin uC dostaje od razu 1/0)

U mnie nadal występuje ten problem, że jak czujnik 4 i 5 razem widzą linie to bot stoi, a jak zaimplementuje takie coś:

If Aktualna_poz = 0 Then
    Pwm1a = 127
    Pwm1b = 127
End If

To tego problemu nie ma, ale program sam powinien ustawić prędkość kół po dodaniu i odjęciu zera... (czyli prędkość zadana, np. 127 się nie zmieni)

Jeszcze spróbowałem pokombinować z czujnikami i programem i wyszło tak:

*Prawa storna robota (listwy czujników) jest dodatnia (wagi czujników są dodatnie), a lewa ujemna.

*Aktualna_poz = 0 to mają się zapalić dwie diody LED, czyli na czujnikach 4 i 5 (wagi 60 i -60), 60+(-60)/2

Sprawdzałem to obliczenie na Google i wynik wyszedł 30...! I jeżeli Bascom też tak liczy to prawdą jest, że diody wtedy nie świecą.

  • 2 tygodnie później...

Obliczenie na Googlach był poprawne, bo 60+(-60)/2=60-30=30

Ale w twoim programie chyba dzieliłeś sumę, a nie tylko ostatnią liczbę, choć nie wiem, bo nie znam Bascoma

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