Skocz do zawartości

program do linefollowera duch


Pomocna odpowiedź

witam

Posiadam przerobiony program linefollowera stąd oraz program ściągnięty od jakiegoś forumowicza. Chciałem sprawdzić, czy wszystko jest napisane poprawnie, oraz czy wszystkie wyprowadzenia zgadzają się z programem. Schemat jest tu , w pcb nic nie zmieniałem, oraz zależy mi na czasie, więc ten kto pierwszy poprawi mój program dostanie punkty pomógł, albo piwo, co kto woli.

program:

$regfile = "m8def.dat"                                      'Atmega8
$crystal = 1000000                                          'taktowanie 1Mhz

Config Portc = Input

Config Portd = Output                                       'PD7 wyjście
Config Portb = Output                                       'PortB-wyjścia

Dim Silnik_l As Byte                                        'silniki zakres 0-255
Dim Silnik_p As Byte                                        'silniki do przodu

A Alias Portc.3                                             'czujnik po lewej
B Alias Portc.4                                             'czujnik środkowy
C Alias Portc.5                                             'czujnik po prawej
Przod_l Alias Portb.0                                       'silniki do przodu
Przod_p Alias Portd.6
Tyl_l Alias Portd.7                                         'silniki do tyłu
Tyl_p Alias Portd.5


Portb.1 = Silnik_l                                          'lewy silnik
Portb.2 = Silnik_p                                          'prawy silnik

Set Portb.2
Reset Portd.7

Do

If A = 1 And B = 1 And C = 0 And D = 1 And E = 1 Then       'jeśli tylko środkowy czujnik będzie na linii
Silnik_l = 255                                              'maks. prędkość lewego silnika
Silnik_p = 255                                              'maks. prędkość prawego silnika
Przod_p = 1
Przod_l = 1
Tyl_p = 0
Tyl_l = 0
End If

If A = 1 And B = 0 And C = 0 And D = 1 And E = 1 Then       'jeśli lewy czujnik będzie wjeżdżał na linię
Silnik_l = 200                                              'lekkie korekty lewy silnik
Silnik_p = 255                                              'maks. prędkość prawy silnik
Przod_p = 1
Przod_l = 1
Tyl_p = 0
Tyl_l = 0
End If

If A = 1 And B = 1 And C = 0 And D = 0 And E = 1 Then       'jeśli prawy czujnik będzie wjeżdżał na linię
Silnik_l = 255                                              'maks. prędkość lewy silnik
Silnik_p = 200                                              'lekkie korekty prawy silnik
Przod_l = 1
Przod_p = 1
Tyl_p = 0
Tyl_l = 0
End If

If A = 1 And B = 0 And C = 1 And D = 1 And E = 1 Then       'jeśli tylko lewy czujnik będzie na linii
Silnik_l = 150                                              'lekki skręt lewysilnik
Silnik_p = 255                                              'maks. prędkość prawy silnik
Przod_p = 1
Przod_l = 1
Tyl_l = 0
Tyl_p = 0
End If

If A = 1 And B = 1 And C = 1 And D = 0 And E = 1 Then       'jeśłi tylko prawy czujnik będzie na linii
Silnik_l = 255
Silnik_p = 150
Przod_l = 1
Przod_p = 1
Tyl_l = 0
Tyl_p = 0
End If


If A = 1 And B = 1 And C = 0 And D = 0 And E = 0 Then       'jeśli będzi zakręt 90 stopni w prawo
Silnik_l = 255                                              'maks. prędkość lewy silnik
Silnik_p = 50                                               'średni zakręt w prawo prawy silnik
Przod_l = 1
Przod_p = 1
Tyl_l = 0
Tyl_p = 0
End If

If A = 0 And B = 0 And C = 0 And D = 1 And E = 1 Then       'jeśli będzie zakręt 90 stopni w lewo
Silnik_l = 50                                               'średni zakręt w lewo lewy silnik
Silnik_p = 255
Przod_l = 1
Przod_p = 1
Tyl_l = 0
Tyl_p = 0
End If

If A = 0 And B = 0 And C = 0 And D = 0 And E = 0 Then       'jeśli będzie skrzyżowanie
Silnik_l = 200                                              'trochę zwolnić lewy silnik
Silnik_l = 200                                              'trochę zwolnić prawy silnik
Przod_l = 1
Przod_p = 1
Tyl_l = 0
Tyl_p = 0
End If

If A = 1 And B = 1 And C = 1 And D = 1 And E = 1 Then
Silnik_l = 1                                                'do tył lewy silnik
Silnik_p = 1                                                'do tył prawy silnik
Przod_l = 0
Przod_p = 0
Tyl_l = 1
Tyl_p = 1
End If

Loop
Link to post
Share on other sites

A schemat w większej rozdzielczości można prosić ?

Program mało optymalny, ale będzie działać o ile wyprowadzenia się zgadzają.

Link to post
Share on other sites

Masz okropnie złożone warunki. Nie będzie na tym dobrze jeździł. Nie dawaj warunków z stanami 5 czujników. Zostaw tylko te których stanu wysokiego oczekujesz. Bo przy takim jeździł by dobrze tylko jak by był super wolny.

Link to post
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

Pomijając już te straszne IFy, to twój program albo jest niekompletny, albo ma sporo błędów ?

Bo o ile masz zdefiniowane A, B, C, to co w IF-ach oznaczają D i E ? do czego sie odnoszą ?

Z drugiej strony używając cyfrowej interpretacji z czujników, czyli świeci nie świeci, lepszym rozwiązaniem jest zastosowanie tablicy, ze zdefiniowanymi wartościami sterującymi, dla poszczególnych możliwych wariacji sygnałów z czujników.

Dla 4 czujników taka tablica będzie miała 16 elementów, dla 6 - 64 elementy, a szybkość działania będzie nie proporcjonalnie większa, niż takiego IFoflawera.

Wynika z tego też ciekawy wniosek do zbudowania sterowania takim robotem wg. twojej idei, wcale nie trzeba mikroprocesora, wystarczy pamięć EPROM o pojemności równej 2™ gdzie TM to ilość czujników, czyli linii adresowych.

Dane zapisane w tej pamięci stworzą swego rodzaju sprzętową sieć neuronową, której wejściami będą linie adresowe A0-An, a wyjściami linie danych D0-D7.

Link to post
Share on other sites

Tzn. w najprostszej formie nie miał byś PWMa, miałbyś tylko sygnały do mostka jedz, nie jedz.

Biorąc pod uwagę ze czas dostępu do pamięci jest stosunkowo krótki standardowo 70ns, to czas reakcji silnika byłby też stosunkowo szybki, co mogło by nawet zaowocować złudzeniem płynnej jazdy ?.

Oczywiście należało by taka idę przetestować, ale EPROM nie wyklucza wcale zastosowania PWMa, tylko należało by już zastosować jakiś układ dodatkowy najlepiej CPLD w którym upchnięto by prosty np. 4 bitowy (8bitowa pamięć / 2 kanały(silniki)) PWM, sterowany z takiego EPROMu. Ale wtedy należało by już wprowadzić próbkowanie czujników i prosty automat sekwencyjny, do sterowania EPROMem i PWMem.

Ogólnie jak znajdę 4 czujniki, i 2 małe silniczki z kołami to spróbuje z ciekawości to zrobić. najprostszy układ powinien się zmieścić w GAL16V8 (układ PLD) + jakiś mostek H.

Na XC9536 można by się pokusić już o tą wersję z PWM. Co ciekawe wtedy sam ten układ robiły by jako EPROM i sterownik (ma dosyć zasobów 36 makrocel i 800 bramek przeliczeniowych, aby pomieścić transkoder i 2 kanały PWM).

A tak wracając do tematu oto idea programowego sterowania za pomocą wzorca, bez PWMa, ale go łatwo dodać, modyfikując nieco kod.


'*    Mega8 Line Fllower Logic matrix Beta test    *'
'* Ogólna idea sterowania za pomocą tablicy wzorca *'
$regfile = "m8def.dat"

Config Portc = Input
Config Portb = Output
Config Portd = Output

Dim Czujniki As Byte
Dim Temp As Byte

Set Portb.1
Set Portb.2
Do
 Czujniki = Portc            'odczytujemy czujniki
 Shift Czujniki , Left , 3   ' składamy to do kupy, aby zadresowac pamięć wzorca
 Czujniki = Czujniki And &B00000111  'korekta aby nie zaadresować przypadkiem czegoś więcej niż chcemy.
 Readeeprom Temp , Czujniki  'odczytujemy dane sterujace z tablicy wzorca
 Portc = Temp                ' i wysyłamy do mostka sterujacego silnikiem.
 Waitms 5                    ' chwila zwłoki, niech też silnik zdąży ruszyć z miejsca
Loop
' Pamieć wzorca sterujacego.
$eeprom
Data &B00000010               'poz 1 z 8 np. ostro w lewo
Data &B00000010               'poz 2 z 8
Data &B00001010               'poz 3 z 8 itd do 8.

PS. program sklecony w 5 minut, więc nie jest kompletny, nie miałem czasu obliczać dokładnych danych tablicy wzorca, ale po obliczeniu wartości dla 8 argumentów w tablicy data, powinien wystartować.

Link to post
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.