Skocz do zawartości

LineFollower kąt prosty


Pomocna odpowiedź

Napisano

Nie mogę rozgryść co zrobić gdy robot wypadnie z toru podczas pokonywania kątu prostego 🙁 .

Chodzi tu o program. Co zrobić żeby LF wykonał poprzednią czynność "gdy straci linie" podczas zakrętu ❓

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

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

Co w tym trudnego 😉? Przecież to jeden if z elsem.

Jak sterujesz robotem (if, case, PID), powiedz jak wygląda Twój kod to coś doradzimy?

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

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

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ą 😉

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

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 😉

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