Skocz do zawartości

LineFollower kąt prosty


Pomocna odpowiedź

$regfile = "m8def.dat"                                      ' Typ procesora ( ATMEGA 8 )
$crystal = 1000000                                          'Taktowanie procesora ( 1Mhz )

Config Portc = Output
Config Portd = Input

Portc = &B0000000
Portd = &B00000000

Dim Zmienna As Byte
Motor_lp Alias Portc.0
Motor_lt Alias Portc.1
Motor_pp Alias Portc.2
Motor_pt Alias Portc.3
Sensor_prawy Alias Pind.0
Sensor_srodkowy Alias Pind.1
Sensor_lewy Alias Pind.2


Do
  If Sensor_lewy = 0 And Sensor_srodkowy = 1 And Sensor_prawy = 0 Then       'go along
     Gosub Go

   Elseif Sensor_lewy = 0 And Sensor_srodkowy = 1 And Sensor_prawy = 1 Then       'turn left
     Zmienna = 0
     Gosub Lewt

   Elseif Sensor_lewy = 0 And Sensor_srodkowy = 0 And Sensor_prawy = 1 Then       'turn left
     Gosub Lewt


   Elseif Sensor_lewy = 1 And Sensor_srodkowy = 1 And Sensor_prawy = 0 Then       'turn right
     Zmienna = 1
     Gosub Righ

   Elseif Sensor_lewy = 1 And Sensor_srodkowy = 0 And Sensor_prawy = 0 Then       'turn right
     Gosub Righ

    Elseif Sensor_lewy = 0 And Sensor_srodkowy = 0 And Sensor_prawy = 0 Then
     If Zmienna = 1 Then
     Gosub Righ
     Else
     Gosub Lewt
     End If


  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

Brakowało jednego end if i definicji zmiennej 😉

  • Lubię! 1
  • 1 rok później...

Wiem, że trochę odkopane, ale nie chciałem zakładać nowego tematu. Mam PID'a w linefollowerze sterowanym przez arduino. Nie wiem co dopisać, żeby po zgubieniu linii wykonał ostatnią czynność. Na BASCOMIE się nie znam i nie wiem jak przekształcić to z poprzednich stron. Wiem jak to ma działać ale nie wiem jak to dopisać do kodu. Pomoże ktoś?🙂

W dużym skrócie: musisz jakoś zapamiętać ostatnią pozycję, np w jakiejś zmiennej. Jeśli nie wykryjesz linii, to sprawdzasz tą zmienną i wiesz z której strony ostatnio była linia, czyli z której strony ją zgubiłeś. Wiedząc to przypisujesz dla tego stanu jakąś pozycję (np. taką samą jak waga dla skrajnego czujnika ze strony, po której zgubiłeś linię), dzięki czemu skręcisz w odpowiednią stronę.

Wiem jak to ma działać, ale nie moge tego napisać🙂 Jak zapamiętać ostatnią pozycję w której jeszcze widzi linię? Bo jeśli zrobić tak jak algorytm liczy D, czyli: D=P-last_P, gdzie last_P=P to on zapamięta ostatnią pozycje, a nie ostatnią jeszcze nad linią. Przynajmniej tak mi się wydaje.

matty, logiczne myślenie widzę siada z roku na rok. Wystarczy dodać sprawdzanie czy to co widzą czujniki jest równe przyjętemu 0, czyli sytuacji gdy żaden z czujników nie widzi linii. Zapamiętywanie poprzedniego stanu robi się w warunku, że dopóki widzi którykolwiek z czujników linię to bieżący stan jest zapamiętywany do jakiejś zmiennej.

Czyli:

jeśli stan czujników jest różny od 00000000 (na 8 czujnikach nie ma linii) to

stan bieżący jest zapisywany do stanu poprzedniego

koniec warunku

Wtedy gdy lfr wyjedzie poza linię to nie nadpisuje ostatniego stanu czujników gdy jeszcze był na linii, więc masz zapamiętaną w zmiennej ostatnią pozycję nad linią.

jeśli stan czujników jest różny od 00000000 (na 8 czujnikach nie ma linii) to

stan bieżący jest zapisywany do stanu poprzedniego

Niby oczywiste, a dopiero ta wypowiedź mnie oświeciła:) Zrobiłem, działa, dzięki za pomoc 🙂

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