Skocz do zawartości

[Bascom] Line Follower algorytm


aixI

Pomocna odpowiedź

Teraz właśnie sprawdzam i co się okazuje nawet przy wypełnieniu PWM = 255 silniki nie ruszają zaraz jak włączę zasilanie dopiero po 2s, przez które mają silniki jechać do przodu - stoją (nie piszczą) jak miną 2s to ma kręcić do tyłu - kręci, potem silniki mają stać 2s i od nowa do przodu, ale tego znowu nie robią tylko stoją tak jak to wyżej opisałem. Nie wiem, czy to wina ustawienia Timera1 w ATmedze16, bo (jak dobrze pamiętam) w ATmedze8 nie miałem (przy tym samym ustawieniu Timera1) takich problemów z tymi silnikami i tym samym mostkiem (do testów).

Ja się trochę poddaje, nich ktoś inny świeżym okiem zerknie w kod i tak już sporo poprawiliśmy.

Dzięki Ci za pomoc, chociaż chciałeś coś poradzić, ale... Może ktoś inny z forum (kto ma do czynienia z lf'ami i Bascom'em) mi zdoła pomóc.

Link do komentarza
Share on other sites

No to może wina wcale nie leży w tym algorytmie skoro normalnie nawet prosto jechać nie możesz. Co się dzieje jak dasz wypełnienie 0?

Link do komentarza
Share on other sites

Ja myślę, że problem może być przez to, że zmienna "Zmiana" jest deklarowana jako Single.

Dim Zmiana As Single

Na naszym forum ktoś już miał podobny problem:https://www.forbot.pl/forum/topics40/bascom-konwersja-integer-na-single-i-odwrotnie-vt5906.htm

Link do komentarza
Share on other sites

Co się dzieje jak dasz wypełnienie 0?

Przy wypełnieniu równym 0 nic się nie dzieje - silniki stoją, nie piszczą.

Ja myślę, że problem może być przez to, że zmienna "Zmiana" jest deklarowana jako Single.

Dim Zmiana As Single

Na naszym forum ktoś już miał podobny problem:https://www.forbot.pl/forum/topics40/bascom-konwersja-integer-na-single-i-odwrotnie-vt5906.htm

Przeczytałem ten wątek, który podałeś (Wojciech) i mam mętlik w głowie :/

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

Przy wypełnieniu równym 0 nic się nie dzieje - silniki stoją, nie piszczą.

Ok, czyli to jednak nie jest "odwrócony PWM" jak czasami Bascom lubi konfigurować te peryferia.

Zostaw teraz cały kod od LFa w spokoju. Najpierw zrób program, który sprawi, że ten robot pojedzie do przodu - nic więcej. Sprawdź osobno lewy i prawy silnik, później oba.

Link do komentarza
Share on other sites

Dobrze, zrobiłem test dla lewego i prawego silnika z osobna, aby się kręcił do przodu do tyłu i stał prze 3s, jak silniki są osobna to działa (wypełnienie 127), a jak są dwa silniki razem, to piszczą i ledwo próbują się ruszyć. Ale jak przy konfiguracji programu dla dwóch silników odłączyłem jeden (tak na żywca) podczas pracy programu (kiedy piszczały), to ten który został podłączony zaczął działać (tak jak konfiguracja dla jednego) i zrobiłem też to samo z drugim i działało (jak w konfiguracji jednego).

Trochę to dziwne.

I jeszcze jedna rzecz. Jak miałem wgrany ten algorytm dla lf'a to aby jechał prosto i aby silnik (powiedzmy lewy) działał jak linia jest po prawej stronie robota i równa go do środkowych czujników, to jak wgrałem (przy tym samym podłączeniu silników) program do kręcenia lewym silnikiem kręcił się prawy...i musiałem zmienić podłączenie silnika/ów - (odwrócić o 180*) płytkę z mostkiem H.

Link do komentarza
Share on other sites

Nie masz przypadkiem pozamienianych w programie wejść sterujących obrotami silników, a może masz odwrotnie przypisane PWMy?

Z czego zasilasz całość?

Link do komentarza
Share on other sites

Nie masz przypadkiem pozamienianych w programie wejść sterujących obrotami silników, a może masz odwrotnie przypisane PWMy?

Wydaje mi się, że nie. Dla lewego "V_l_temp = Tp + Zmiana" i później "Pwm1a = V_l_temp" (bez tego ostatniego robot nie jechał tylko piszczał dlatego zostawiłem to w kodzie) i dla prawego "V_p_temp = Tp - Zmiana", "Pwm1b = V_p_temp".

Z czego zasilasz całość?

Akumulator li-pol 7,4V --> http://botland.com.pl/lipo-dualsky/567-dualsky-300mah-45c-6c-74v.html

Link do komentarza
Share on other sites

Dla lewego "V_l_temp = Tp + Zmiana" i później "Pwm1a = V_l_temp" (bez tego ostatniego robot nie jechał tylko piszczał dlatego zostawiłem to w kodzie) i dla prawego "V_p_temp = Tp - Zmiana", "Pwm1b = V_p_temp".

Przecież wypełnienie do PWM podajesz tutaj:

'prawy 
If V_p_temp > 255 Then 
  V_p_temp = 255 
     Set Silnik_prawy_a 
     Reset Silnik_prawy_b 
Elseif V_p_temp < -255 Then                                    'Elseif V_p_temp < 0 Then 
  V_p_temp = -255 
     Reset Silnik_prawy_a 
     Set Silnik_prawy_b 
        Pwm1b = 0 - V_p_temp 
End If 

Skoro nie masz nic zamienione to wytłumacz czemu robot nie jedzie prosto nawet bez algorytmów śledzenia linii. Sprawdź miernikiem jakie masz napięcia na silnikach wtedy.

Link do komentarza
Share on other sites

Pomierzyłem napięcia i wyszło tak:

*Oba silniki odłączone:

-przód:

ok. 0,55V

ok. 7V

-tył:

ok. 7V

ok. 0,55V

-stoi:

ok. 0,2V

ok. 0,2V

*Oba silniki podłączone:

-przód:

ok. 1,2V

ok. 5V

-tył:

ok. 5V

ok. 1,2V

-piszczą:

ok. 2,2V

ok. 2,2V

A jak chodzi o to, że robot nie jedzie prosto posprawdzałem to i aby jechał prosto na algorytmie musiałem zamienić to:

Pwm1a = V_l_temp 'Pwm1a => lewy

Pwm1b = V_p_temp 'Pwm1b => prawy

na to:

Pwm1a = V_p_temp 'Pwm1a => lewy

Pwm1b = V_l_temp 'Pwm1b => prawy

ale nadal nie jedzie prosto, gdy środkowe czujniki są na linii.

Link do komentarza
Share on other sites

*Oba silniki odłączone:

-przód:

ok. 0,55V

ok. 7V

No to znajdź błąd, który to powoduje w podłączeniu lub programie i wtedy wróćmy do tematu.

Ja obstawiam, że masz pomieszane 6 wyprowadzeń uC -> mostek. Pewnie pomylone masz PWMy lub linie sterujące kierunkiem obrotów.

Link do komentarza
Share on other sites

W takim razie będę zmuszony jakoś to sprawdzić. Ale mam jeszcze parę pytań.

1. Jak Ty to robisz w swoich robotach, tzn. ustawienia sterowania silnika (np. lewego) odpowiedzialne są dla lewego, czy prawego silnika, możesz mi to jakoś wytłumaczyć, jak to powinno być, aby było dobrze.

2. Mam też II wersje kodu (gdzie odczyt czujników i przypisywanie wag jest inne) i jest taki sam problem (z jazdą do przodu, gdy środkowe czuj. na linii). To znaczy, że jednak może to być wina pomieszanych wyprowadzeń mostek -> uC?

X = 1
Suma = 0
Black = 0

While X <= 6
     If Czujniki(x) = 1 Then
           Black = Black + 1
           Suma = Suma + Wagi(x)
     End If
X = X + 1
Wend

X = 0

To chyba na tyle.

Link do komentarza
Share on other sites

Wyrzuć wszystko co związane ze śledzeniem linii i spróbuj po prostu w pętli nieskończonej jechać do przodu. Dopiero później wróć do kodu z LFem. Mam zrobione, podobnie jak Ci napisałem. Tyle postów, co tu wymieniliśmy to już byś dawno te połączenia sprawdził. Przecież to max 30 minut ze schematem i kilka testowych programów.

Link do komentarza
Share on other sites

Napisałem sobie wszystkie wyprowadzenia na kartce i w ogóle, zmieniłem połączenia, poprawiłem połączenia, testowałem testowymi programami aby silniki kręciły się do przodu, do tyło - to działa, silniki dobrze kręcą przy wypełnieniu równym 175.

I przyszła pora na implementacje poprawionych wyprowadzeń do algorytmu i...? ...i to samo co przedtem, silniki stoją, gdy śr. czuj. na linii. Nie wiem, czy tak ma być ale jak na obecnym kodzie jest takie coś:

*Jak najeżdżam czujnikami od lewej strony robota, to załącza się lewy silnik, a jak prawą stroną, to prawy silnik.

Sprawdzałem też co się będzie działo jak wypełnienie będzie > 255, to robot próbował naprowadzić się na linię, tzn. kręcił jednym kołem w przód, a drugim w tył.

Kurcze fajnie byłoby, gdyby ktoś mógłby przetestować ten program i sprawdzić, czy są takie same problemy jak u mnie :/

Aktualny kod:

'Program by aixi
'uC: ATmega16 (DIL_40)

$regfile = "m16def.dat"
$crystal = 1000000


'Konfiguracja sterowania sprzętowym PWM
Config Timer1 = Pwm , Pwm = 8 , Prescale = 1 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down


'Mostek
In_1_a Alias Portd.2
In_1_b Alias Portd.6

In_2_a Alias Portd.7
In_2_b Alias Portd.3


Config Pina.0 = Input
Config Pina.1 = Input
Config Pina.2 = Input
Config Pina.3 = Input
Config Pina.4 = Input
Config Pina.5 = Input

Czujnik_1 Alias Pina.0
Czujnik_2 Alias Pina.1
Czujnik_3 Alias Pina.2
Czujnik_4 Alias Pina.3
Czujnik_5 Alias Pina.4
Czujnik_6 Alias Pina.5



Config Portb = Output
Config Portd = Output

Led_blue Alias Portb.0
Led_red Alias Portb.1


Dim V_l_temp As Integer
Dim V_p_temp As Integer
Dim Tp As Byte


Dim X As Byte
Dim Uchyb_regulacji As Integer
Dim Zmiana As Single
Dim Kp As Integer
Dim Black As Byte
Dim Suma As Integer
Dim Aktualna_pozycja As Integer


Dim Czujniki(6) As Byte

Const Pozycja_docelowa = 0

Kp = 10

Tp = 175
V_l_temp = 0
V_p_temp = 0

Zmiana = 0


Set Led_red


Do


'==========================================
If Czujnik_1 = 1 Then                                       '1 czujnik
    Czujniki(1) = 1
Else
    Czujniki(1) = 0
End If

If Czujnik_2 = 1 Then                                       '2 czujnik
    Czujniki(2) = 1
Else
    Czujniki(2) = 0
End If

If Czujnik_3 = 1 Then                                       '3 czujnik
    Czujniki(3) = 1
Else
    Czujniki(3) = 0
End If
'==============================================================================
If Czujnik_4 = 1 Then                                       '4 czujnik
    Czujniki(4) = 1
Else
    Czujniki(4) = 0
End If

If Czujnik_5 = 1 Then                                       '5 czujnik
    Czujniki(5) = 1
Else
    Czujniki(5) = 0
End If

If Czujnik_6 = 1 Then                                       '6 czujnik
    Czujniki(6) = 1
Else
    Czujniki(6) = 0
End If
'============================================


  X = 1
  Black = 0
  Suma = 0

While X <= 6
 If Czujniki(x) = 1 Then
   Black = Black + 1
   Select Case X
   Case 1:
     Suma = Suma - 3
   Case 2:
     Suma = Suma - 2
   Case 3:
     Suma = Suma - 1
   Case 4:
     Suma = Suma + 1
   Case 5:
     Suma = Suma + 2
   Case 6:
     Suma = Suma + 3
   End Select
 End If
X = X + 1
Wend

X = 0


Aktualna_pozycja = Suma / Black
Uchyb_regulacji = Pozycja_docelowa - Aktualna_pozycja
Zmiana = Uchyb_regulacji * Kp



V_l_temp = Tp + Zmiana                                      'lewy
V_p_temp = Tp - Zmiana                                      'prawy


'lewy
If V_l_temp > 255 Then
  V_l_temp = 255
Elseif V_l_temp < -255 Then
  V_l_temp = -255
End If

If V_l_temp >= 0 Then
  Set In_1_a
  Reset In_1_b
     Pwm1a = V_l_temp
Else
  Reset In_1_a
  Set In_1_b
     Pwm1a = 0 - V_l_temp
End If

'==============================================================================

'prawy
If V_p_temp > 255 Then
  V_p_temp = 255
Elseif V_p_temp < -255 Then
  V_p_temp = -255
End If

If V_p_temp >= 0 Then
  Set In_2_a
  Reset In_2_b
     Pwm1b = V_p_temp
Else
  Reset In_2_a
  Set In_2_b
     Pwm1b = 0 - V_p_temp
End If





 Pwm1a = V_l_temp                                          'Pwm1a => lewy
 Pwm1b = V_p_temp                                          'Pwm1b => prawy




Loop
End
Link do komentarza
Share on other sites

Żeby był większy porządek mógłbyś zrobić funkcje do sterowania silnikami (w bascomie się to chyba nazywało procedurami). Nie będziesz musiał wtedy tak często tych setów/resetów wywoływać. Ciężej będzie o błędy.

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.