Skocz do zawartości

LineFollower kąt prosty


Szuszy

Pomocna odpowiedź

Z każdym odczytem możesz przypisywać jednej zmiennej wartość gdy linia jest po prawej (np. 1) lub lewej (0) stronie - dzięki temu będziesz wiedział, w którą stronę robot musi się obracać (z której strony widział linię ostatni raz).

Link do komentarza
Share on other sites

Przy każdym przejściu pętli, gdy robot jest nad torem zapisuj sobie aktualny stan czujników, gdy nagle stracisz z czujników linie, sięgasz do zmiennej, w której masz ostatnią poprawną pozycję robota nad linią. Na tej podstawie decydujesz o sposobie powrotu na trasę.

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

Oto jest program:

$regfile = "2313def.dat"
$crystal = 4000000
'$noramclear

Config Portb = Output
Config Portd = Input
Portb = &B00000000
Portd = &B00000000

Motor_lp Alias Portb.0
Motor_lt Alias Portb.1
Motor_pp Alias Portb.3
Motor_pt Alias Portb.2

Sensor_p Alias Pind.2
Sensor_s Alias Pind.5
Sensor_l Alias Pind.4


Do
  If Sensor_l = 1 And Sensor_s = 0 And Sensor_p = 1 Then   'go along
     Gosub Go

   Elseif Sensor_l = 0 And Sensor_s = 1 And Sensor_p = 1 Then       'turn left
     Gosub Lewt

   Elseif Sensor_l = 0 And Sensor_s = 0 And Sensor_p = 1 Then       'turn left
     Gosub Lewt


   Elseif Sensor_l = 1 And Sensor_s = 1 And Sensor_p = 0 Then       'turn right
     Gosub Righ

   Elseif Sensor_l = 1 And Sensor_s = 0 And Sensor_p = 0 Then       'turn right
     Gosub Righ



  End If
Loop


Go:
Motor_lt = 1
Motor_pt = 1
Return

Lewt:
Motor_lt = 0
Motor_pt = 1
Return

Righ:
Motor_lt = 1
Motor_pt = 0

Return
Link do komentarza
Share on other sites

Dim zmienna as bit

Do
  If Sensor_l = 1 And Sensor_s = 0 And Sensor_p = 1 Then   'go along
     Gosub Go

   Elseif Sensor_l = 0 And Sensor_s = 1 And Sensor_p = 1 Then       'turn left
     Zmienna = 0
     Gosub Lewt

   Elseif Sensor_l = 0 And Sensor_s = 0 And Sensor_p = 1 Then       'turn left
     Gosub Lewt


   Elseif Sensor_l = 1 And Sensor_s = 1 And Sensor_p = 0 Then       'turn right
    Zmienna =  1
    Gosub Righ

   Elseif Sensor_l = 1 And Sensor_s = 0 And Sensor_p = 0 Then       'turn right
     Gosub Righ



  End If
Loop 

Wtedy wiesz z której strony czujnik widział jako ostatni linię

potem możesz dodać:

Elseif Sensor_l = 0 And Sensor_s = 0 And Sensor_p = 0 Then       'turn right
If Zmeinna = 1 then
Gosub Righ
Else
Gosub lewt
End if
  • Lubię! 1
Link do komentarza
Share on other sites

Czyli program ma wyglądać tak:

$regfile = "2313def.dat"
$crystal = 4000000
'$noramclear

Config Portb = Output
Config Portd = Input
Portb = &B00000000
Portd = &B00000000

Motor_lp Alias Portb.0
Motor_lt Alias Portb.1
Motor_pp Alias Portb.3
Motor_pt Alias Portb.2

Sensor_p Alias Pind.2
Sensor_s Alias Pind.5
Sensor_l Alias Pind.4


Do
  If Sensor_l = 1 And Sensor_s = 0 And Sensor_p = 1 Then   'go along
     Gosub Go

   Elseif Sensor_l = 0 And Sensor_s = 1 And Sensor_p = 1 Then       'turn left
     Zmienna = 0
     Gosub Lewt

   Elseif Sensor_l = 0 And Sensor_s = 0 And Sensor_p = 1 Then       'turn left
     Gosub Lewt


   Elseif Sensor_l = 1 And Sensor_s = 1 And Sensor_p = 0 Then       'turn right
     Zmienna = 1
     Gosub Righ

   Elseif Sensor_l = 1 And Sensor_s = 0 And Sensor_p = 0 Then       'turn right
     Gosub Righ

    Elseif Sensor_l = 0 And Sensor_s = 0 And Sensor_p = 0 Then
     If Zmeinna = 1 Then
     Gosub Righ
     Else
     Gosub Lewt



  End If
Loop


Go:
Motor_lt = 1
Motor_pt = 1
Return
Lewt:
Motor_lt = 0
Motor_pt = 1

Return
Righ:
Motor_lt = 1
Motor_pt = 0

Return
Link do komentarza
Share on other sites

Do tej części:

    Elseif Sensor_l = 0 And Sensor_s = 0 And Sensor_p = 1 Then       'turn left
     Gosub Lewt 

Dodaj:

Zmienna = 0 

Do tej:

    Elseif Sensor_l = 1 And Sensor_s = 0 And Sensor_p = 0 Then       'turn right
     Gosub Righ 

Dodaj:

Zmienna = 1 

Lepiej byłoby przepisać ten kod na cesach, a jak to mają być początki to te if też jeszcze ujdą 😉

Link do komentarza
Share on other sites

Muszę zrobić powracanie na trasę. Program jest na casach. Jak mam case else odczytuję tą zmienną położenia i tu moje pytanie jak teraz wyjść do któregoś z wcześniejszych casów. Do okoła to można zrobić w case else następnego case ale pewnie macie lepszy pomysł.

Link do komentarza
Share on other sites

Trochę namieszałeś, więc odpowiem tak, jak zrozumiałem pytanie 😉

Powinieneś mieć case dla flagi czujników 00000000 (brak linii pod robotem) i w nim mieć If'a który zależnie od poprzedniego poprawnego odczytu kierowałby robotem w prawo lub w lewo -> do czasu odnalezienia linii.

Nie umieszczaj tego w case else, bo możesz mieć ciekawe przygody z robotem - pomyśl jak podczas jazdy wyglądają odczyty 😉

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.