M.Krysztofiak Pdi

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 52

Rok akademicki 2013/2014

Politechnika Warszawska
Wydział Elektroniki i Technik Informacyjnych
Instytut Informatyki

PRACA DYPLOMOWA INŻYNIERSKA

Maciej Krysztofiak

Robot mobilny typu Line Follower

Opiekun pracy
Dr inż. Kamil Kompa

Ocena: ...................................................

..............................................................
Podpis Przewodniczącego
Komisji Egzaminu Dyplomowego
Kierunek: Informatyka

Specjalność: Inżynieria Systemów Informatycznych

Data urodzenia: 1991.03.06

Data rozpoczęcia studiów: 2010.10.01

Życiorys

Urodziłem się 6 marca 1991 r. w Płocku. Tam też uczęszczałem do Szkoły Podstawowej
nr 10 i nr 3, a następnie do Gimnazjum nr 8. W 2010 r. zakończyłem naukę w Liceum
Ogólnokształcącym im. Marszałka Stanisława Małachowskiego w Płocku - jednej z
najstarszych szkół w Polsce.
Po zdaniu matury rozpocząłem studia na Wydziale Elektroniki i Technik
Informacyjnych Politechniki Warszawskiej na kierunku Informatyka.
Interesuję się elektroniką i robotyką. Poza tym do kręgu moich zainteresowań należy
turystyka piesza oraz kolarstwo.

......................................................
Podpis studenta

EGZAMIN DYPLOMOWY

Złożył egzamin dyplomowy w dniu ...............................................................................20__ r

z wynikiem ..............................................................................................................................

Ogólny wynik studiów: ............................................................................................................

Dodatkowe wnioski i uwagi Komisji: ......................................................................................

.................................................................................................................................................

.................................................................................................................................................
STRESZCZENIE
Streszczenie pracy w języku polskim.

Celem projektu jest budowa mobilnego robota autonomicznego, który będzie podążał trasą
wyznaczoną za pomocą linii. Stąd wzięła się oficjalna nazwa konkurencji - Line Follower.
Budowa robota tego typu łączy w sobie potrzebę zbudowania konstrukcji mechanicznej,
zaprojektowania elektronicznego układu sterowania oraz napisania oprogramowania
sterującego. Robot musi spełniać wymagania regulaminowe amatorskich konkursów
robotycznych. Ostatecznym celem konstrukcji jest zaprezentowanie jej na zawodach oraz
osiągnięcie jak najwyższego miejsca w danej kategorii.

Słowa kluczowe: autonomiczny, robot mobilny, line follower

Mobile robot - Line Follower


Summary in English.

The purpose of this project is construction of an autonomous mobile robot which will follow
the line. That is where official name of competition came from (Line Follower). Construction
of robot of such type requires building mechanical structure, designing electronic control
system and developing control software. Robot has to fulfill requirements imposed by
regulations of amateur robotic contests. The final goal of this project is to take part in amateur
robotic contest and achieve the highest score possible.

Keywords: autonomous, mobile robot, line follower


Moim Rodzicom
Spis treści
1 Wstęp 7
1.1 Wprowadzenie . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.2 Cel pracy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

2 Opis konkurencji Line Follower 7


2.1 Zasady ogólne . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.2 Specyfikacja robota . . . . . . . . . . . . . . . . . . . . . . . . 9
2.3 Trasa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

3 Analiza wymagań 9
3.1 Wykrywanie linii . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.1.1 Kamera . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.1.2 Czujniki odbiciowe . . . . . . . . . . . . . . . . . . . . 10
3.2 Wprowadzanie nastaw . . . . . . . . . . . . . . . . . . . . . . 11
3.2.1 Złącze programowania . . . . . . . . . . . . . . . . . . 11
3.2.2 Moduł bezprzewodowy na płytce . . . . . . . . . . . . 11
3.2.3 Wyświetlacz na płytce głównej . . . . . . . . . . . . . 12
3.2.4 Wyświetlacz jako osobny moduł . . . . . . . . . . . . 12
3.3 Uruchamianie robota . . . . . . . . . . . . . . . . . . . . . . . 12
3.3.1 Przycisk . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.3.2 Radio modelarskie . . . . . . . . . . . . . . . . . . . . 13
3.3.3 Moduł radiowy 315MHz . . . . . . . . . . . . . . . . . 13
3.3.4 Odbiornik podczerwieni . . . . . . . . . . . . . . . . . 13
3.4 Sterowanie silnikami . . . . . . . . . . . . . . . . . . . . . . . 14
3.5 Zasilanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.6 Pomiar napięcia źródła zasilania . . . . . . . . . . . . . . . . 14
3.7 Złącze serwisowe . . . . . . . . . . . . . . . . . . . . . . . . . 14

4 Konstrukcja mechaniczna 14

5 Wybór podzespołów 15
5.1 Czujniki odbiciowe . . . . . . . . . . . . . . . . . . . . . . . . 15
5.2 Napęd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
5.3 Mostek H . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
5.4 Odbiornik podczerwieni . . . . . . . . . . . . . . . . . . . . . 18
5.5 Wyświetlacz LCD . . . . . . . . . . . . . . . . . . . . . . . . 18
5.6 Mikrokontroler . . . . . . . . . . . . . . . . . . . . . . . . . . 18
5.7 Akumulator . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
5.8 Stabilizator . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

5
6 Schemat części elektronicznej 21
6.1 Listwa z czujnikami . . . . . . . . . . . . . . . . . . . . . . . . 21
6.2 Płytka główna . . . . . . . . . . . . . . . . . . . . . . . . . . 24
6.2.1 Podłączenie czujników . . . . . . . . . . . . . . . . . . 24
6.2.2 Mostek H . . . . . . . . . . . . . . . . . . . . . . . . . 26
6.2.3 Odbiornik podczerwieni . . . . . . . . . . . . . . . . . 26
6.2.4 Mikrokontroler . . . . . . . . . . . . . . . . . . . . . . 27
6.2.5 Złącze LCD . . . . . . . . . . . . . . . . . . . . . . . . 29
6.2.6 Diody LED . . . . . . . . . . . . . . . . . . . . . . . . 29
6.2.7 Zasilanie . . . . . . . . . . . . . . . . . . . . . . . . . . 29
6.3 Moduł LCD . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

7 Projekt płytki drukowanej 30


7.1 Listwa z czujnikami . . . . . . . . . . . . . . . . . . . . . . . . 31
7.2 Płytka główna . . . . . . . . . . . . . . . . . . . . . . . . . . 32
7.3 Moduł LCD . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

8 Oprogramowanie 35
8.1 Timery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
8.2 Odczyt stanu czujników . . . . . . . . . . . . . . . . . . . . . 40
8.3 Wyświetlacz LCD . . . . . . . . . . . . . . . . . . . . . . . . 42
8.3.1 Budowa menu . . . . . . . . . . . . . . . . . . . . . . . 43
8.4 Interfejs UART . . . . . . . . . . . . . . . . . . . . . . . . . . 44
8.5 Odbiornik podczerwieni . . . . . . . . . . . . . . . . . . . . . 44
8.6 Algorytm sterowania . . . . . . . . . . . . . . . . . . . . . . . 46

9 Podsumowanie 48
9.1 Wynik projektu . . . . . . . . . . . . . . . . . . . . . . . . . . 48
9.2 Możliwości rozwoju . . . . . . . . . . . . . . . . . . . . . . . . 48

10 Załączniki 49

Spis rysunków 50

Spis tablic 51

Bibliografia 52

6
1 Wstęp
1.1 Wprowadzenie
Wyścigi pojazdów towarzyszą człowiekowi od zarania dziejów. Już w
starożytnej Grecji popularne były wyścigi rydwanów. Wraz z biegiem czasu
i wzrostem możliwości technicznych powstawały kolejne konstrukcje. 28
kwietnia 1887 roku odbył się pierwszy wyścig samochodowy.1 Od tego mo-
mentu lista różnych konkurencji w których celem jest przejechanie wyznaczo-
nej trasy w jak najkrótszym czasie wzrosła dramatycznie. Postęp technolo-
giczny umożliwił zmniejszenie masy pojazdów, zastosowanie wydajniejszych
napędów, zwiększenie bezpieczeństwa kierowcy w razie wypadków oraz prze-
rzucenie części obowiązków z kierowcy do systemu sterującego w pojeździe.
Przykładem takiego rozwiązania jest np. system ABS. Wraz z nadejściem
czasów najnowszych zaczęto budować konstrukcje autonomiczne w których
człowiek nie jest potrzebny do sterowania pojazdem. Nie inaczej niż w przy-
padku wcześniejszych konstrukcji powstały konkurencje których celem jest
zbudowanie pojazdu, który bez pomocy człowieka pokona trasę w jak naj-
krótszym czasie. Dzisiaj zawody robotów autonomicznych stały się bardzo
popularne. Organizowane jest wiele konkursów o skali krajowej jak i mię-
dzynarodowej. Ilość konkurencji w których konstruktorzy mogą rywalizować
cały czas się powiększa.

1.2 Cel pracy


Celem projektu jest budowa robota autonomicznego, który będzie po-
dążał trasą wyznaczoną za pomocą linii. Stąd wzięła się oficjalna nazwa
konkurencji - Line Follower. Budowa robota tego typu łączy w sobie po-
trzebę zbudowania konstrukcji mechanicznej, zaprojektowania elektronicz-
nego układu sterowania oraz napisania oprogramowania sterującego. Robot
musi spełniać wymagania regulaminowe amatorskich konkursów robotycz-
nych. Ostatecznym celem konstrukcji jest zaprezentowanie jej na zawodach
oraz osiągnięcie jak najwyższego miejsca w danej kategorii.

2 Opis konkurencji Line Follower


Celem konkurencji jest zbudowanie robota mobilnego, który przejdzie
wyznaczoną trasę w jak najkrótszym czasie. Zasady konkurencji mogą się
nieznacznie różnić w zależności od organizatorów konkursu. Przedstawione
zostały najpopularniejsze zasady na przykładzie regulaminów zawodów Ro-
bomaticon2 i T-BOT.3

7
Zazwyczaj konstruktorzy mogą startować w dwóch klasach:

• amatorskiej

• profesjonalnej

Przydział do klas następuje na podstawie przejazdu kwalifikacyjnego i


wizualnej oceny robota przez sędziego. Najczęściej do klasy profesjonalnej
kwalifikowane są roboty wyposażone w turbinę przysysającą. Zasady kon-
kurencji w obydwu klasach są takie same. Na prośbę użytkownika robot
może zostać przeniesiony z klasy amatorskiej do klasy profesjonalnej. Na-
grody przynawane są za zdobycie pierwszego, drugiego i trzeciego miejsca
w każdej z klas. W grupie profesjonalnej przyznawane są nagrody główne,
natomiast w klasie amatorskiej - nagrody uznaniowe konkurencji.

2.1 Zasady ogólne


• Przejazd rozpoczyna się po komendzie wydanej przez sędziego.

• Pomiar czasu przejazdu odbywa się za pomocą laserowych bramek


pomiarowych.

• Robot musi przemieszczać się po wyznaczonej trasie. W przypadku


wypadnięcia z trasy musi powrócić do miejsca w którym ją opuścił lub
jej wcześniejszego odcinka.

• Zbytnie upraszczanie trasy jest niedozwolone. Oceny dokonuje sędzia.

Konkurs dzieli się na dwie rundy:

• Kwalifikacyjną

• Finałową

Podczas każdej z rund używana jest inna trasa. Dodatkowo dostępna jest
trasa testowa do której dostęp podczas trwania konkursu jest nieograniczony.
Podczas rundy kwalifikacyjnej wyznaczona część robotów zostaje zakwa-
lifikowana do rundy finałowej na podstawie najkrótszych czasów przejazdu.
Liczba dozwolonych przejazdów eliminacyjnych różni się w zależności od
organizatora. Za ostateczny wynik uważa się czas najkrótszego przejazdu.
Runda finałowa zazwyczaj odbywa się na tych samych zasadach co kwa-
lifikacje. W niektórych konkursach liczba dozwolonych przejazdów podczas
finału zostaje zmniejszona w stosunku do rundy eliminacyjnej.

8
2.2 Specyfikacja robota
• Wymiary robota są ograniczone i zazwyczaj nie mogą przekraczać roz-
miaru kartki formatu A4.

• Waga robota nie jest ograniczona.

• Robot powinien być odporny na zmiany oświetlenia.

• Robot musi być sterowany autonomicznie. Dozwolone jest jedynie


zdalne uruchomienie i zatrzymanie robota.

• Zabronione jest używanie silników spalinowych.

• Sposób detekcji linii nie jest wyspecyfikowany.

2.3 Trasa
• Sposób wykonania trasy, jej parametry oraz szkic poglądowy powinny
być dostępne dla uczestników przed przystąpieniem do konkursu.

• Trasa jest wyznaczona czarną linią o szerokości ok. 19mm na białym


tle.

• Minimalny kąt zakrętu wynosi 90◦ .

• Na trasie mogą występować łuki, prostopadłe skrzyżowania oraz prze-


rwy.

3 Analiza wymagań
3.1 Wykrywanie linii
Podstawową cechą robota typu Line Follower jest wykrywanie linii. Co
prawda w regulaminie nie jest w żaden sposób wyspecyfikowanie, że robot
musi spełniać tę funkcję, jednak trudno sobie wyobrazić aby robot poruszał
się po linii nie mając żadnego mechanizmu jej detekcji.

3.1.1 Kamera
Jednym ze sposobów wykrywania linii może być kamera. Z punktu
widzenia człowieka byłby to najbardziej naturalny mechanizm. Tak jak
podczas jazdy samochodem człowiek kontroluje prędkość biorąc pod uwagę
zbliżający się zakręt, tak samo robot mógłby zastosować ten mechanizm.
Dobrze oświetlona trasa oraz kamera zamocowana pod odpowiednim ką-
tem umożliwiłaby predykcję zakrętów. Wymagałoby to jednak zastosowa-
nia skomplikowanych algorytmów przetwarzania obrazu oraz zastosowania

9
Rysunek 1: Przykładowa trasa z zawodów T-BOT4

odpowiednio szybkiego procesora, który poradziłby sobie z tym zadaniem.


Wadą tego rozwiązania jest również jego cena.

3.1.2 Czujniki odbiciowe


Innym sposobem detekcji linii jest zastosowanie czujników odbiciowych.
Umożliwiają one detekcję linii w punkcie nad którym się znajdują. Zasto-
sowanie kilkunastu takich czujników umożliwiłoby detekcję zakrętów. Takie
czujniki są stosunkowo tanie i łatwe w obsłudze. Zasada ich działania jest do-
syć prosta. Czujnik składa się z dwoch elementów: nadajnika podczerwieni
oraz fototranzystora. Wiązka promieniowania odbija się od powierzchni pod
czujnikiem i pada na fototranzystor. Na wyjściu otrzymujemy sygnał, który
zależy od natężenia odbitego światła. Z tego powodu, że czarna powierzch-
nia pochłania więcej promieniowania świetlnego niż powierzchnia biała moż-
liwa staje się detekcja linii.
W swojej konstrukcji zastosowałem czujniki odbiciowe jako element wy-
krywający linię. Główną przyczyną była cena oraz prostota obsługi.

10
Rysunek 2: Zasada działania czujnika odbiciowego

3.2 Wprowadzanie nastaw


Podczas zawodów może się okazać, że konieczna jest zmiana parametrów
sterowania robotem. Przyczyn może być wiele. Jedną z nich może być na
przykład inny typ podłoża po którym nasz robot się ślizga. W takim wy-
padku dobrze byłoby zmniejszyć maksymalną prędkość robota. Przedstawię
teraz kilka możliwych rozwiązań oraz ich wady i zalety.

3.2.1 Złącze programowania


Zalety:

• Brak dodatkowych elementów i wyjść na płytce. Złącze programowa-


nia i tak musi być na niej obecne.

Wady:

• Konieczność dokonania zmian w kodzie źrodłowym.

• Duża niewygoda - stanowiska serwisowe znajdują sie w pewnej od-


ległości od trasy przejazdu. Konieczność zabrania robota do strefy
serwisowej zabiera cenny czas.

3.2.2 Moduł bezprzewodowy na płytce


Zalety:

• Wygodne wprowadzanie nastaw

Wady:

• Dodatkowy układ na płytce

11
– Wyższa cena
– Większa masa robota
– Zwiększony pobór prądu
– Zwiększony rozmiar płytki

• Potrzebne dodatkowe urządzenie np. laptop, tablet, smarphone

• Konieczność napisania dodatkowej aplikacji

3.2.3 Wyświetlacz na płytce głównej


Zalety:

• Wygodne wprowadzanie nastaw

Wady:

• Większa masa robota

• Zwiększony pobór prądu

• Zwiększony rozmiar płytki

3.2.4 Wyświetlacz jako osobny moduł


Zalety:

• Wygodne wprowadzanie nastaw

• Podłączany tylko w razie konieczności

Wady:

• Dodatkowe złącze na płytce głównej

W swoim robocie zdecydowałem się na zrealizowanie ostatniej propozy-


cji. Przyczyną była najmniejsza ilość wad w stosunku do innych rozwiązań.

3.3 Uruchamianie robota


Jednym z wymagań konkursu jest uruchomienie i zatrzymanie robota na
znak sędziego. Można to zrealizować na kilka sposobów. Przedstawię teraz
kilka możliwych rozwiązań oraz ich wady i zalety.

12
3.3.1 Przycisk
Zalety:
• Prostota implementacji
• Cena
Wady:
• Konieczny fizyczny kontakt

3.3.2 Radio modelarskie


Zalety:
• Prostota implementacji
Wady:
• Cena
• Dodatkowy moduł odbiornika zamontowany na płytce podnosi wagę
robota.

3.3.3 Moduł radiowy 315MHz


Zalety:
• Prostota implementacji
• Dosyć tani
Wady:
• Dodatkowy moduł odbiornika zamontowany na płytce podnosi wagę
robota.

3.3.4 Odbiornik podczerwieni


Zalety:
• Tani
• Niewielkie rozmiary i waga
• Możliwość zastosowania pilota od telewizora w roli nadajnika
W swoim robocie zdecydowałem się na zastosowanie ostatniego rozwiąza-
nia. Jest ono najtańsze oraz umożliwia zdalne włączenie i wyłączenie robota
co może być przydatne np. gdy robot zboczy z trasy i zacznie podążać w
niepoprawnym kierunku. Jadąc z dużą prędkościa w stronę jakiejś prze-
szkody, na skutek zderzenia robot może się uszkodzić. Możliwość zdalnego
wyłączenia robota będzie w takim przypadku bardzo przydatna.

13
3.4 Sterowanie silnikami
Ważnym zagadnieniem jest sposób sterowania silnikami. Robot powi-
nien mieć możliwość kontroli kierunku obrotu silników. Dodatkowo stero-
wanie prędkością obrotową każdego z silników niezależnie jest niezbędne do
prawidłowej jazdy po torze. Jednym z najbardziej znanych i wygodnych
mechanizmów kontroli prędkości oborotowej silnika jest kontrola za pomocą
sygnału PWM.

3.5 Zasilanie
Źródło zasilania powinno mieć wystarczającą pojemność by umożliwić
2-3 przejazdy z rzędu. Jego masa nie powinna być jednak zbyt duża co zwięk-
szyłoby bezwładność robota. Trzeba również pamiętać o tym by wydajność
prądowa wystarczyła do zasilenia silników na maksymalnych oborotach oraz
reszty elektroniki.

3.6 Pomiar napięcia źródła zasilania


Ważnym zagadnieniem jest rozładowywanie się akumulatora podczas ko-
lejnych przejazdów. Wpływa to nie tylko na prędkość obrotową silników.
Niektóre akumulatory mogą ulec uszkodzeniu przy zbyt dużym rozładowa-
niu. Sygnalizacja przekroczenia dopuszczonego poziomu rozładowania aku-
mulatora będzie bardzo przydatna.

3.7 Złącze serwisowe


Złącze serwisowe będzie bardzo przydatne w początkowej fazie urucha-
miania robota. Umożliwi wyświetlenie parametrów sterowania w wygod-
niejszy sposób. W późniejszym etapie projektu może służyć do przesyłania
danych zebranych podczas przejazdu robota.

4 Konstrukcja mechaniczna
Istotną kwestią podczas projektowania konstrukcji mechanicznej jest masa
robota. Powinna być ona jak najmniejsza. Z tego powodu w większości kon-
strukcji płytka głowna jest jednocześnie podwoziem konstrukcji. Czujniki
są wysunięte do przodu w stosunku do płytki głownej. Dodatkowo listwa
z czujnikami ma kształt łuku. Umożliwia to lepsze pokonywanie ostrych
zakrętów. Listwa połączona jest płytką główną za pomocą lekkich listewek
węglowych. Pod listwą z czujnikami znajdują się ślizgacze, które stanowią
przedni punkt podparcia konstrukcji.

14
5 Wybór podzespołów
5.1 Czujniki odbiciowe
Wybierając konkretny czujnik trzeba mieć na uwadze głównie jego roz-
miary, wagę i cenę. Wybrałem czujnik KTIR0711S, który był sprzedawany
w najniższej cenie spośród czujników w obudowie SMD. Był również najła-
twiej dostępny na polskim rynku.

Rysunek 3: Czujnik odbiciowy KTIR0711S

Czujniki mogą zostać podłączone do mikrokontrolera na dwa sposoby:

• przetwornik analogowo-cyfrowy

• komparatory analogowe

Pierwsze rozwiązanie wymaga odpowiedniej ilości kanałów ADC w mi-


krokontrolerze lub zastosowania dodatkowych multiplekserów analogowych.
Obsługa przetwornika jest również nieznacznie trudniejsza niż komparato-
rów. Te z kolei na wyjściu zapewniają sygnał binarny co jest bardzo łatwe
w obsłudze od strony programowej. Trzeba jednak przewidzieć dla nich
dodatkowe miejsce na płytce drukowanej. Dodatkowo poziom napięcia od-
różniający powierzchnię białą od czarnej musi być ustawiany sprzętowo za
pomocą potencjometru. Układ komparatorów z histerezą wymaga również
sporej ilości dodatkowych elementów pasywnych.

15
5.2 Napęd
Jednym z najważniejszych elementów robota jest jego napęd. Stoso-
wanie silników spalinowych jest zabronione przez regulamin zawodów więc
konstruktorzy muszą ograniczyć się do silników elektrycznych. Te z kolei
dzielą się na dwie zasadnicze grupy.

• Silniki szczotkowe

• Silniki bezszczotkowe

Silniki bezszczotkowe są szeroko stosowane w modelarstwie lotniczym.


Charakteryzują się tym, że magnesy znajdują się w wirniku silnika. Cewki
są nieruchome i ułożone wokół wirnika. W stosunku do silników szczotko-
wych posiadają szereg zalet, między innymi: wyższa trwałość i niezawod-
ność, większa sprawność oraz cichsza praca. Ich wadą jest wyższa cena
oraz konieczność zastosowania specjalnego sterownika który jeszcze dodat-
kowo zwiększa koszt oraz masę robota. Silnik BLDC można wysterować
również bez specjalnego sterownika, jedynie za pomocą mostka H. Wyma-
gałoby to jednak zaimplementowania dodatkowego algorytmu w mikrokon-
trolerze. Ponadto liczba kanałów w mostku H musiałaby być wystarczająca
do implementacji takiego sterowania dla dwóch silników. Dodatkowo silniki
bezczotkowe łatwo dostępne na polskim rynku posiadają mocowania prze-
znaczone do pojazdów latających. Silniki z mocowaniami przeznaczonymi
do pojazdów jeżdżących są trudniej dostępne.
W konstrukcjach typu Line Follower zazwyczaj stosuje się silniki szczot-
kowe. Są tańsze i mogą być w łatwy sposób sterowane sygnałem PWM. Na
polskim rynku łatwo dostępne są mikro silniki ze zintegrowanymi przekład-
niami firmy POLOLU. Dostępne są dwie linie produktów - Low power i High
power. Różnią się one głównie poborem prądu i momentem obrotowym. W
swoim robocie zastosowałem dwa silniki Pololu HP 10:1.
Napięcie zasilania 3V - 9V
Prąd bez obciążenia (6V) 120 mA
Prąd przy zatrzymanym wale (6V) 1600 mA
Prędkość bez obciążenia (6V) 3000 obr/min
Moment obrotowy (6V) 0,3 kg*cm (0,029 Nm)
Przełożenie 10:1
Średnica wału 3 mm
Wymiary korpusu 24 x 10 x 12 mm
Masa 10 g

Tablica 1: Parametry silnika Pololu HP 10:1

Dodatkowym atutem tych silników jest łatwa dostępność mocowań i kół


w różnych rozmiarach.

16
Rysunek 4: Silnik Pololu HP 10:1 wraz z mocowaniem

5.3 Mostek H
Elementem elektronicznym, który pozwala na zmianę kierunku obrotów
silnika oraz sterowanie ich prędkością za pomocą sygnału PWM jest scalony
mostek H. Na rynku możemy znaleźć wiele układów tego typu. Mostek prze-
znaczony do mojego robota musi posiadać conajmniej 2 niezależne kanały.
Dodatkowo wydajność prądowa na kanał musi wystarczyć do wysterowa-
nia wybranych silników. Ostatnim wymaganiem jest dostępność układu w
obudowie SMD.

L298P L293D TB6552FNG TB6612FNG


Liczba kanałów 2 2 2 2
Prąd wyjściowy 2A 0,6A 0,8A 1,2A
na kanał (ciągły)
Prąd wyjściowy 3A 1,2A 1A 3,2A
na kanał (chwi-
lowy)
Cena 22,10 zł 3,50 zł 7,90 zł 9,90 zł

Tablica 2: Porównanie mostków H

Spośród powyższych wybrałem mostek TB6612FNG, który spełniał wszyst-


kie oczekiwania, a dodatkowo oferowany był w atrakcyjnej cenie.

Rysunek 5: Mostek H TB6612FNG

17
5.4 Odbiornik podczerwieni
Scalone odbiorniki podczerwieni dostępne na polskim rynku nie różnią
się za bardzo między sobą ani parametrami ani ceną. Z tego powodu zde-
cydowałem się zastosować w robocie jeden z najpopularnieszych układów -
TSOP2236. Średni prąd pobierany przez odbiornik wynosi 5mA, natomiast
jego częstotliwość pracy to 36kHz. Z taką częstotliwością nadaje większość
uniwersalnych pilotów telewizyjnych.

Rysunek 6: Scalony odbiornik podczerwieni TSOP2236

5.5 Wyświetlacz LCD


Wyświetlacze LCD można podzielić na dwie zasadnicze grupy:

• Wyświetlacze graficzne

• Wyświetlacze tekstowe

Do prezentacji i wprowadzenia nastaw zupełnie wystarczający będzie


wyświetlacz tekstowy. Występują one w kilku konfiguracjach różniących
się liczbą wierszy i znaków w wierszu. Ja wybrałem wyświetlacz 2x16 (co
oznacza 2 rzędy po 16 znaków). Sterownik wyświetlacza jest kompatybilny
ze sterownikiem HD44780 opracowanym przez firmę Hitachi. Sterownik ten
jest jednym z najlepiej udokumentowanych i najchętniej wykorzystywanych
przez elektroników.

5.6 Mikrokontroler
Wymagania stawiane przed mikrokontrolerem przestawiają się następu-
jąco:

1. Odczyt stanu czujników odbiciowych

2. Pomiar napięcia zasilania

• Przetwornik ADC

3. Realizacja algorytmu sterowania

18
4. Sterowanie silnikami

• 2 sprzętowe kanały PWM

5. Komunikacja z modułem nastaw

• Wyjścia i wejścia cyfrowe

6. Odbiór komend z pilota

• Zewnętrzne przerwanie typu input capture

7. Złącze serwisowe

• UART

Podsumowując, wymagania odnośnie mikrokontrolera nie są specjalnie


wysokie. Układ spełniający powyższe wymagania można odnaleźć w ofercie
prawie każdego producenta. W takim wypadku można kierować się innymi
przesłankami odnośnie wyboru układu. Ja zdecydowałem się na mikrokon-
troler ATmega32A z następujących powodów:

• Cena.

• Dostępność układu w sklepach.

• Ogromna ilość literatury omawiającej prawie każdy aspekt programo-


wania mikrokontrolerów tej serii.

• Popularność architektury oraz wsparcie społeczności.

• Posiadałem już programator do układów tej serii. W przypadku innych


producentów koszt podstawowego programatora wynosił nawet do 100
zł.

Robot będzie pracował w dwóch trybach: jazdy i nastaw. W trybie jazdy


maksymalna prędkość robota będzie wynosić około 1, 5 − 2 m s . Częstotliwość
wykonywania algorytmu sterowania to około 200Hz. Zostaną wtedy od-
czytane stany czujników, obliczona nowa wartość regulacji oraz zmieniony
współczynnik wypełnienia sygnału PWM, który bezpośrednio wpływa na
prędkość obortową każdego z silników. Oprócz realizacji algorytmu sterowa-
nia jedynym dodatkowym zadaniem mikrokontrolera podczas trybu jazdy
będzie dekodowanie sygnałów z odbiornika podczerwieni. Taktowanie czę-
stotliwością 16MHz zapewni spory zapas mocy obliczeniowej.

19
Flash 32KB
SRAM 2KB
EEPROM 1KB
Programowanie JTAG, ISP
Timery 2x8bit, 1x16bit
Kanały PWM 4
ADC 10bit, 8 kanałów
Interfejsy UART, SPI, TWI(I 2 C)
Piny I/O 32
Taktowanie 0-16MHz
Obudowa 44-lead TQFP

Tablica 3: Parametry mikrokontrolera ATmega32A

5.7 Akumulator
W amatorskich robotach mobilnych jako źródło zasilania wybierany jest
zazwyczaj pakiet Litowo-Polimerowy. Charakteryzuje się on dobrą pojem-
nością w stosunku do wagi oraz dużym maksymalnym prądem rozładowania.
Napięcie znamionowe pojedyńczego ogniwa wynosi 3,7V. W konstrukcji ro-
bota typu Line Follower pakiet zasilający powieniem posiadać co najmniej
dwa ogniwa, co oznacza że jego napięcie zasilania będzie wynosić 7,4V. Ta-
kie napięcie umożliwi zasilenie elektroniki poprzez stabilizator oraz silników
bezpośrednio z pakietu. Na rynku dostępnych jest wiele pakietów o różnych
pojemnościach.
Wybrany został pakiet Dualsky o pojemności 250mAh. Jego maksy-
malny ciągły prąd rozładowywania wynosi 5A, a waga 18g. Zakładając
maksymalny ciągły pobór prądu przez silniki na poziomie 2A oraz reszty
elektroniki na poziomie 0,5A, pakiet ten wystarczy na około 10 minut jazdy.
Jest to wartość wystarczająca do wykonania 2-3 przejazdów. Ten pakiet to
rozsądny kompromis pomiędzy pojemnością, a masą.

Rysunek 7: Pakiet LiPol Dualsky 250mAh 7,4V

20
5.8 Stabilizator
Napięcie występujące na pakiecie zasilającym jest zbyt wysokie i nie-
stabilne by zasilać inne podzespoły elektroniczne bezpośrednio z pakietu.
Z tego powodu konieczne staje się zastosowanie układu stabilizatora. Inną
możliwością byłoby zastosowanie przetwornicy step-down. W stosunku do
stabilizatora liniowego posiada lepszą sprawność, jednak jej koszt jest znacz-
nie wyższy i wymaga większej ilości elementów pasywnych. Wybrany został
popularny stabilizator liniowy low-dropout LM1117MP-5V. Maksymalny
prąd na wyjściu stabilizatora wynosi 800mA. Jest to wartość w zupełno-
ści wystarczająca do zasilania pozostałej elektroniki.

Czujniki odbiciowe 120mA


LCD 50mA
Mikrokontroler (16MHz) 15mA
Mostek H 3mA
Odbiornik podczerwieni 5mA
Diody LED 10mA
Razem około 210mA

Tablica 4: Bilans prądowy

Maksymalne napięcie na pakiecie może wynosić 8,4V. Moc wydzielana


na stabilizatorze będzie wynosić około 0,7W.

6 Schemat części elektronicznej


6.1 Listwa z czujnikami
W swojej konstrukcji zdecydowałem się na zastosowanie 16. czujników
odbiciowych. Każdy z nich składa się z dwóch elementów: diody emitującej
promieniowanie podczerwone i fototranzystora.
Podstawowa konfiguracja podłączenia czujnika jest bardzo prosta. Emi-
ter fototranzystora zostaje podłączony do masy natomiast kolektor, poprzez
rezystor RL do napięcia zasilania. Na kolektorze możemy obserwować sy-
gnał napięciowy, który w naszym przypadku powienien być bliski wartości
masy gdy pod czujnikiem znajduje się biała powierzchnia oraz znacznie wyż-
szy gdy znajduje się pod nim powierzchnia czarna. Prąd diody musi zostać
ograniczony poprzez rezystor RD . Napięcie przewodzenia diody wynosi ty-
powo 1,2V przy prądzie równym 20mA. Podłączenie diody każdego czujnika
przez osobny rezystor do napięcia zasilania spowodowałoby znaczący wzrost
poboru prądu. W tym wypadku lepiej jest połączyć kilka diod w szereg
i zastosować jeden wspólny rezystor. Teorytycznie można by podłączyć 4
diody w szereg, ale oznaczałoby to, że wartość rezystora wyniesie tylko 10Ω.

21
Rysunek 8: Schemat podłączenia czujnika KTIR0711S

Czujniki zostałyby podzielone wtedy na 4 łańcuchy. Trzeba jednak pamię-


tać, że minimalna i maksymalna wartość napięcia na stabilizatorze liniowym
wynosi odpowiednio 4,8V i 5,2V. Dodatkowo w wyniku wzrostu tempera-
tury czujnika spada napięcie przewodzenia diody. Na jednej diodzie będzie
wydzielać się około 24mW mocy. Zakładając wzrost temperatury o 25◦ C
napięcie przewodzenia pojedynczej diody spadnie do 1,15V. W łańcuchu 4
diod spowoduje to dwukrotny wzrost prądu - do wartości 40mA. Zakładając
taki sam wzrost temperatury przy łańcuchu 3 diod prąd wzrósłby do war-
tości około 23mA. Z tego powodu zmniejszyłem ilość diod w szeregu do 3.
Niestety nie można podzielić bez reszty 16 czujników na 3 czujnikowe łań-
cuchy. Finalnie czujniki zostały podzielone na 4 łańcuchy po 3 czujniki i 2
łańcuchy po 2 czujniki. Wartości rezystorów ograniczających prąd wyniosły
odpowiednio 68Ω i 130Ω.

Rysunek 9: Złącze FFC/FPC

Listwa zostanie połączona z płytką główna za pomoca 18-pinowego złą-


cza FFC/FPC.

22
Rysunek 10: Schemat listwy z czujnikami

23
6.2 Płytka główna
6.2.1 Podłączenie czujników
Stan czujników będzie odczytywany za pomocą wbudowanego przetwor-
nika analogowo-cyfrowego. Niestety w wybranym mikrokontrolerze dostęp-
nych jest jedynie 8 kanałów, których ilość jest niewystarczająca do ob-
sługi wszystkich czujników i pomiaru napięcia zasilania. Z tego powodu
konieczne okazało się zastosowanie multiplekserów analogowych. Zdecydo-
wałem się na wykorzystanie dwóch podwójnych 4-kanałowych multiplekse-
rów 74HC4052D. Pozwoli to na odczyt stanu czujników za pomocą jedynie
4 wejść analogowych mikrokontrolera. Wejście 5. zostanie wykorzystane
do pomiaru napięcia zasilania. Reszta zostanie wykorzystana jako wejścia
cyfrowe.
Na każdym wyjściu pojedynczego multipleksera został podłączony rezy-
stor podciągający do napięcia zasilania. Zaletą tego rozwiązania jest to że
zamiast 16. dodatkowych rezystorów na listwie z czujnikami mamy 4 re-
zystory na płytce głównej. Niestety po przełączeniu kanału multipleksera
wystąpi konieczność odczekania chwili czasu tak aby napięcie zdążyło się
ustabilizować. Będzie to konieczne jednak tylko 3 razy podczas odczytu
wszystkich wartości czujników (Zakładając, że po ostatnim odczycie kanały
multiplekserów zostaną przestawione z powrotem do wartości początkowej.
W ten sposób przy kolejnym odczycie napięcia bedą już ustabilizowane.).
Pomiędzy wyjście multipleksera, a masę zostały podłączone kondensa-
tory o pojemności 1nF. Zapewnią one szybkie przeładowanie kondesatora
próbkującego ADC podczas fazy sample. Jednocześnie ich wartość jest na
tyle mała, że czas potrzebny do ich przeładowania po zmianie kanału mul-
tipleksera zewnętrznego nie zwiększy się istotnie.

24
Rysunek 11: Schemat podłączenia czujników za pomocą multiplekserów
74HC4052D

25
6.2.2 Mostek H
Układ sterowania napędem jest bardzo prosty. Silniki zostały podłą-
czone do mostka H, a ten z kolei do mikrokontrolera. Dodatkowo przy
pinach będących wejściem zasilania dla silników oprócz kondensatora filtru-
jącego umieszczony został kondensator magazynujący o pojemności 100µF .
Zapewni on zapas energii potrzebny w przypadku gwałtownej zmiany pręd-
kości obrotowej któregoś z silników.

Rysunek 12: Schemat podłączenia mostka H

6.2.3 Odbiornik podczerwieni


Obiornik podczerwieni został podłączony do mikrokontrolera zgodnie z
zaleceniami z noty aplikacyjnej. Zastosowany filtr RC służy do tłumienia
zakłóceń występujących na zasilaniu. Wyjście OUT zostało podciągnięte do
napięcia zasilania za pomocą wewnętrznego rezystora w mikrokontrolerze.

Rysunek 13: Schemat podłączenia odbiornika podczerwieni TSOP2236

26
6.2.4 Mikrokontroler
Podstawowy obwód zasilania mikrokontrolera został zaprojektowany zgod-
nie z zaleceniami z noty aplikacyjnej. Na każdą parę nóżek napięcia zasila-
nia i masy przypada kondensator filtrujący 100nF. Dodatkowo na cały układ
przeznaczony jest jeden kondensator magazynujący o pojemności 10µF . Za-
silanie części analogowej zostało podłączone do napięcia zasilania poprzez
cewkę o indukcyjności 10µH i kondensator filtrujący 100nF podłączony do
masy. Wejście napięcia referencyjnego zostało również podłączone przez
kondensator do masy. Jest to sposób zalecany przez producenta, który za-
pewnia najwyższą precyzję odczytu. Częstym błędem jest podłączanie wej-
ścia napięcia referencyjnego do napięcia zasilania. Jeżeli jest taka potrzeba
powinno być jednak wybrane za pomocą wewnętrznego multipleksera. Wej-
ście RESET zostało podciągniete poprzez rezystor do napięcia zasilania.
Dodatkowo na płytce znalazł się przycisk umożliwiający reset układu.
Do wejścia ADC4 podłączony został dzielnik napięciowy który umożliwi
pomiar napięcia zasilania. Wartości obu rezystorów w dzielniku wynoszą
10kΩ. Oznacza to że na wejściu ADC4 pojawi się napięcie dwa razy niższe
niż to na pakiecie. Biorąc pod uwagę, że maksymalne napięcie na aku-
mulatorze może wynieść 8,4V to maksymalne napięcie które pojawi się na
wejściu ADC4 wyniesie 4,2V. Wybierając jako napięcie odniesienia napięcie
zasilania otrzymamy wystarczająca dokładność pomiaru.
Dobierając wartości rezystorów dla dzielnika wziąłem pod uwagę fakt
iż napięcie pochodzące z dzielnika rezystorowego pojawi się na nóżce mi-
krokontrolera wcześniej niż zostanie on zasilony przez układ stabilizatora.
Każdy pin mikrokontrolera jest zabezpieczony dwiema diodami, które w tym
przypadku przepuszczą wpływający prąd do zasilania układu. Będzie on wy-
nosił maksymalnie 420µA. Maksymalny prąd na nożkę mikrokontrolera jest
określony w nocie katalogowej na 40mA.
Linie SCK i E, które są sygnałami zegarowymi zostały podciągnięte przez
rezystor 10kΩ do masy. Zapewni to lepszy kształt sygnału. Oporniki 100Ω
dopasowują impendancję pinu portu do impendancji taśmy połączeniowej.

Rysunek 14: Schemat bloku pinu I/O

27
Wyprowadzone zostało również złącze programatora oraz osobne złącze
interfejsu UART.

Rysunek 15: Schemat podłączenia mikrokontrolera

28
6.2.5 Złącze LCD
Wyprowadzone zostało złącze LCD. Takie samo znajdzie się również na
płytce z modułem LCD. Warto zaznaczyć że linie RS i RW to również wy-
prowadzenia interfejsu TWI. W przyszłości może to umożliwić podłączenie
innego zewnętrznego czujnika podczas jazdy (akcelerometr, żyroskop).

Rysunek 16: Schemat złącza do modułu LCD

6.2.6 Diody LED


Diody w początkowej fazie projektu będą pomocne przy debugowaniu
układu. Później będą sygnalizowały przekroczenie krytycznego poziomu na-
pięcia zasilania oraz stany w jakich znajduje się robot.

Rysunek 17: Schemat podłączenia diod LED

6.2.7 Zasilanie
Blok zasilania nie wymaga komentarza. Jest to standardowy sposób
wykorzystania stabilizatora liniowego.

Rysunek 18: Schemat bloku zasilania

29
6.3 Moduł LCD
Moduł LCD będzie zasilany ze stabilizatora znajdującego się na płytce
głównej. Oprócz wyświetlacza na płytce znalazły się także 3 przyciski. Bedą
służyły do nawigacji po menu. Sygnał na wyjściu przycisków został podcią-
gnięty do napięcia zasilania poprzez rezystory o wartości 10kΩ. Dodatkowo
zastosowane zostały filtry RC które powinny ograniczyć powstające przepię-
cia.

Rysunek 19: Schemat modułu LCD

7 Projekt płytki drukowanej


Płytki zostały zaprojektowane dwuwarstwowo. Zastosowano elementy
w rozmiarze 0805. Średnica otworów przeznaczoncyh do montażu listewek
węglowych wynosi 2mm, a otworów do montażu silników - 3mm. Płytki zo-
stały zaprojektowane w programie EAGLE, a wykonane w firmie SATLAND
Prototype.

30
7.1 Listwa z czujnikami

Rysunek 20: Listwa z czujnikami - warstwy TOP i BOTTOM

31
7.2 Płytka główna

Rysunek 21: Płytka główna - warstwa TOP

32
Rysunek 22: Płytka główna - warstwa BOTTOM

33
7.3 Moduł LCD

Rysunek 23: Moduł LCD - warstwa TOP

Rysunek 24: Moduł LCD - warstwa BOTTOM

34
8 Oprogramowanie
Program sterujący robotem został napisany w języku C. Składa się on z
następujących plików źródłowych:

• adc.(h,c)

• defines.h

• functions.(h,c)

• ir decode.(h,c)

• lcd.(h,c)

• main.c

• menu.(h,c)

• pid.(h,c)

• timers.(h,c)

• uart.(h,c)

W pliku defines.h zostały zdefiniowane nazwy wyprowadzeń wraz z nu-


merami pinów do których zostały przypisane. Posługiwanie się tymi defini-
cjami znacznie ułatwiło pracę podczas dalszej części projektu.
Pliki functions.(h,c) zawierają deklaracje i definicje funkcji inicjalizują-
cych ustawienia pinów I/O.
Plik main.c zawiera funkcję main() w której znajduje się pętla główna
programu sterującego robotem.
Role innych plików źródłowych zostaną omówione w kolejnych podroz-
działach.

8.1 Timery
Mikrokontroler ATmega32A posiada 2 timery 8-bitowe (Timer 0, Timer
2) oraz jeden timer 16-bitowy (Timer 1). Liczba sprzętowych kanałów PWM
wynosi 4. Dwa z nich są powiązane z 16-bitowym Timerem 1, natomiast
pozostałe dwa z Timerem 0 i 2.

35
Rysunek 25: Schemat układu Timera 0

Rysunek 26: Schemat układu Timera 1

36
Przerwania związane z timerami mogą być generowane w przypadku
przepełnienia licznika timera oraz w przypadku wystąpienia zdarzenia typu
Compare Match. Każdy z timerów posiada rejestr OCR którego zawar-
tość jest stale porównywana z wartością licznika. Timer 1 posiada jeszcze
możliwość wygenerowania przerwania w przypadku wystąpienia zdarzenia
typu Input Capture. Aktualna wartość licznika zostaje wtedy zapisana w
rejestrze ICR. Dodatkowo warto nadmienić, że Timer 0 i Timer 1 posia-
dają wspólny układ preskalera, natomist Timer 2 posiada swój oddzielny i
niezależny preskaler. Prescaler Timerów 0 i 1 może być taktowany jedynie
głównym zegarem mikrokontrolera. W przypadku prescalera Timera 2 jest
możliwość taktowania oddzielnym, zewnętrznym sygnałem zegarowym. Jest
to właściwie jedyna różnica między Timerem 0 i 2.

Rysunek 27: Schemat układu prescalera Timera 0 i 1

Rysunek 28: Schemat układu prescalera Timera 2

37
Każdy z Timerów posiada cztery podstawowe tryby pracy:

• Normal

• CTC

• Fast PWM

• PWM Phase Correct

Timer 1 posiada dodatkowy tryb PWM Phase and Frequency Correct.


W trybie Normal wartość licznika jest inkrementowana o jeden w każ-
dym cyklu zegarowym. Po osiągnięciu wartości maksymalnej licznik jest
zerowany i ustawiona zostaje flaga przepełnienia. Ten tryb nie jest zalecany
do generowania sygnału PWM.
W trybie CTC licznik jest zerowany gdy jego wartość będzie równa war-
tości zapisanej w rejestrze OCR. W tym momencie jest zmieniany również
poziom sygnału PWM. Ten tryb jest zalecany jeżeli chcemy łatwo modyfi-
kować częstotliwość sprżetowo generowanego sygnału PWM.

Rysunek 29: Tryb CTC - diagram czasowy

W trybie Fast PWM licznik jest zerowany gdy jego wartość osiągnie
wartość maksymalną. Zdarzenie Compare Match umożliwia zmianę poziomu
sygnału PWM na wyjściu układu. W tym trybie można łatwo zmieniać
współczynnik wypełnienia sygnału przy zachowniu stałej częstotliwości.
Tryb PWM Phase Correct przeznaczony jest do sytuacji kiedy zmiana
wspołczynnika wypełnienia nie powinna zmieniać fazy sygnału. Różni się
tym od trybu Fast PWM, że po osiągnięciu wartości maksymalnej licznik
zaczyna odliczanie w dół.
Tryb PWM Phase and Frequency Correct jest prawie identyczny jak tryb
PWM Phase Correct. Różni się tylko momentem w którym uaktualniony
zostaje rejestr OCR.
Powróćmy do zadań jakie mają realizować Timery w robocie. Jest to
generacja sprzętowego sygnału PWM dla dwóch niezależnych silników. Do-
datkowo niezbędny okaże się timer generujący tik systemowy.

38
Rysunek 30: Tryb Fast PWM - diagram czasowy

Rysunek 31: Tryb PWM Phase Correct - diagram czasowy

Do generacji sygnału PWM dla silników został wybrany Timer 1. Nadaje


się on idealnie do tego zadania ponieważ posiada dwa sprzętowe kanały
PWM. Wybrany został tryb Fast PWM 10 bit. Sygnał taktujący licznik
został podzielony przez 8 w stosunku do głównego zegara. Oznacza to, że
częstotliowść generowanego sygnału PWM wyniosła 2kHz.
Tik systemowy będzie generowany poprzez Timer 0. Do realizacji tego
zadania wybrany został tryb CTC. Prescaler i wartość rejestru OCR zostały
dobrane tak by tik był generowany co około 1ms.
Timer 2 wykorzystany został do precyzyjnego pomiaru czasu podczas
przełączania kanałów multiplekserów analogowych. Umożliwił to oddzielny
prescaler, który można wyzerować programowo. Takie rozwiązanie zapewnia
bardzo precyzyjny pomiar odcinka czasu w stosunku do wykorzystania tiku
systemowego z Timera 0. Timer 2 działa w trybie CTC.
W pliku timers.c umieszczone zostały następujące funkcje:

39
• void init timers(void)

• start timer2(unsigned char ocr val, unsigned int counter max)

• void motor right setpwm(unsigned int val)

• void motor left setpwm(unsigned int val)

Za pomocą funkcji init timers() dokonywana jest inicjalizacja timerów.


Funkcja start timer2() rozpoczyna nowy pomiar czasu za pomocą Timera
2. Upłynięcie czasu jest sygnalizowane za pomocą flagi t2 flag. Funkcje
motor right setpwm i motor left setpwm służą do ustawienia wypełnienia
sygnału PWM. Dodatkowo zostało zdefiniowane kilka makrodefinicji, które
umożliwiają zmianę kierunku obrotu silników oraz ich zatrzymanie:

• motors enable()

• motors disable()

• motor right forward()

• motor right back()

• motor right stop()

• motor left forward()

• motor left back()

• motor left stop()

8.2 Odczyt stanu czujników


Stany czujników są odczytywane za pomocą wbudowanego przetwornika
analogowo-cyfrowego. Rozdzielczość przetwornika wynosi 10 bitów. Często-
tliwość taktowania powinna zawierać się w przedziale 50-200kHz dla uzy-
skania 10-bitowej precyzji. Jeżeli tak duża rozdzielczość nie jest potrzebna
można taktować przetwornik z większą częstoliwością. Blok przetwornika
analogowo-cyfrowego może wygenerować przerwanie po skończonej konwer-
sji.
Stan czujników jest odczytywany w następującej kolejności (czujniki nu-
merowane od 0, od lewej do prawej) - 0, 4, 8, 12, 1, 5, 9, 13, 2, 6, 10, 14, 3,
7, 11, 15. Dzieje się tak dlatego, że po wybraniu nowego ustawienia kana-
łów na zewnętrznych multiplekserach i ustabilizowaniu się poziomów napięć,
zmiana kanału na wewnętrznym multiplekserze ADC nie wymaga odczeki-
wania dodatkowego czasu. Tymczasem przy zmianie ustawienia kanałów
zewnętrznych multiplekserów trzeba odczekać około 300µs na stabilizację

40
Rysunek 32: Schemat bloku konwertera analogowo-cyfrowego

napięć. Czas ten został dobrany empirycznie, tak aby był możliwie najkrót-
szy i jednocześnie umożliwił wystarczające naładowanie kondensatorów. Z
tego powodu szybciej uda się dokonać odczytu czujników w takiej kolejności
niż gdyby chciano to zrobić np. w kolejności rosnącej.
Alogorytm realizujący odczyt stanu czujników przedstawia się następu-
jąco:
1. Zainicjuj konwersję ADC.

2. Konwersja ADC zostaje zakończona. Wywołana zostaje procedura ob-


sługi przerwania. Jeżeli odczytano stan wszytkich czujników to ustaw
kanały zewnętrznych multiplekserów tak aby następny pomiar zaczął
się od czujnika o numerze 0, ustaw wewnętrzny multiplekser ADC na
kanał 0 i zakończ algorytm. Jeżeli w aktualnym ustawieniu kanałów ze-
wnętrznych multiplekserów nie oczytano stanu wszytkich czujników to
zmień ustawienie wewnętrznego multipleksera ADC na następny kanał

41
i zainicjuj konwersję ADC. W przeciwnym wypadku zmień ustawienia
kanałów zewnętrznych multiplekserów, ustaw wewnętrzny multiplek-
ser ADC na kanał 0 i zainicjuj pomiar czasu za pomocą Timera 2.

3. Pomiar czasu się zakończył. Timer 2 zgłasza przerwanie Compare


Match. Zatrzymaj Timer 2 i zainicjuj konwersję ADC. Idź do punktu
2.

Podczas realizacji tego algorytmu wymagane jest trzykrotne odczekanie


około 300µs na ustabilizowanie się poziomu napięć. Do obliczeń wykorzy-
stywane jest tylko 8 najbardziej znaczących bitów z danego pomiaru. Z
tego powodu przetwornik ADC jest taktowany z częstotliwościa 250kHz.
Czas pojedynczej konwersji wynosi 13 cykli zegarowych czyli 52µs (pierw-
szy pomiar za pomocą ADC wynosi 25 cykli, przyczyną jest konieczność
inicjalizacji obwodów analogowych). Łącznie czas przeznaczony na odczyt
czujników wynosi 1732µs. Pojedyńczy przebieg algorytmu sterowania (wraz
z odczytem czujników) następuje co 5ms.
Kod odpowiedzialny za obsługę przetwornika analogowo-cyfrowego znaj-
duje się w plikach adc.(h,c). Oprócz procedury obsługi przerwania ADC
znajdują się tam dwie inne funkcje:

• void start adc(void) - funkcja inicjująca odczyt stanu czujników

• void adc init(void) - funkcja inicjalizująca - ustawia prescaler oraz źró-


dło odniesienia

Dodatkowo zmienna adc status określa stan w jakim aktualnie znajduje


się przetwornik ADC. Jest to typ wyliczeniowy o następujących możliwych
wartościach:

• IN PROGRESS - trwa odczyt stanu czujników

• DONE - odczyt stanu czujników został zakończony

• FREE - przetworinik aktualnie nie wykonuje żadnej konwersji

Tak zdefiniowany stan przetwornika ADC umożliwi w łatwy sposób do-


danie pomiaru źródła napięcia odniesienia, którego z braku czasu nie udało
się zrealizować od strony programowej.

8.3 Wyświetlacz LCD


Do obsługi wyświetlacza LCD skorzystałem z biblioteki Peter’a Fleury
udostępnionej na licencji GNU GPL.5 Skorzystanie z gotowej biblioteki skró-
ciło czas potrzebny do ukończenia projektu oraz uchroniło przed popełnie-
niem błędów. W swoim projekcie wykorzystuję tylko kilka funkcji z całej
bilbioteki:

42
• void lcd init(uint8 t dispAttr) - funkcja inicjalizująca wyświetlacz LCD,
jako argument przyjmuje zmienną która określa sposób wyświetlania
kursora

• lcd puts P( s) - makrodefinicja umożliwiająca wyświetlenie ciągu zna-


ków zapisanych w pamięci FLASH

• void lcd clrscr(void) - funkcja czyści wyświetlacz i ustawia kursor w


pozycji początkowej

• void lcd puts(const char *s) - funkcja umożliwiająca wyświetlenie ciągu


znaków zapisanych w pamięci RAM

8.3.1 Budowa menu


Delaracje i definicje zmiennych związanych z obsługą menu znajdują
się w plikach menu.(h,c). Zaprojektowany moduł LCD posiada 3 przyciski,
które służą do nawigacji po menu. Ich funkcje przedstawiają się następująco:

• Przycisk lewy - cofnij/zmniejsz wartość

• Przycisk środkowy - edytuj/zatwierdź

• Przycisk prawy - dalej/zwiększ wartość

Menu zostało zrealizowane w reprezentacji dwupoziomowej. Nawiga-


cja po ekranach menu odbywa się za pomocą lewego i prawego przyci-
sku, które powodują wyświetlenie odpowiednio poprzedniego i następnego
ekranu. Przycisk środkowy służy do aktywacji funkcji związanej z ekranem.
W chwili ukończenia tej pracy za pomocą modułu LCD można zmienić na-
stawy regulatora PD. Wprowadzone nastawy są zapamiętywane w pamięci
EEPROM mikrokontrolera (nie zostają utracone po odłączeniu zasilania).
Organizacja menu została zaprojektowana w taki sposób by dodawanie ko-
lejnych ekranów było jak najłatwiejsze.
Deklaracja struktury reprezentującej jeden ekran przedstawia się nastę-
pująco:
typedef struct {
const char * first_line ;
void (* handler ) () ;
} menu_item ;

• Pole first line przechowuje wskaźnik do ciągu znaków zapisanego w


pamięci FLASH, który ma być wyświetlony przed wykonaniem innych
akcji. Standardowo powinien znaleźć się tam opis danego ekranu.

• Pole handler przechowuje wskaźnik do funkcji, która implementuje


logikę danego ekranu.

43
Programowa eliminacja drgań styków przycisków została zrealizowana za
pomocą funkcji debounce(). Funkcja ta próbkuje każdy z przycisków co tik
systemowy. Jeżeli dany przycisk jest wciśnięty (pin jest zwarty do masy) in-
krementowana jest wartość w polu, które odpowiada danemu przyciskowi w
tablicy key tics[3]. Tablica ta przechowuje wartości oznaczające ilość ostat-
nich tików systemowych kiedy stan danego przycisku został odczytany jako
wciśnięty. Jeżeli dany przycisk był wciśnięty przez ilość tików odpowiada-
jących wartości zdefiniowanej jako TICKS TO DEBOUNCE uznaje się go
za wciśnięty i zostaje zapalony odpowiadający mu bit we fladze key flag.
Jednocześnie dalsze zliczanie tików dla przycisku który został uznany za
wciśnięty zostaje przerwane. Jeżeli w którymkolwiek momencie dany przy-
cisk zostanie spróbkowany jako niewciśnięty zerowana jest odpowiadająca
mu wartość w tablicy key ticks[].

8.4 Interfejs UART


Do obsługi interfejsu UART skorzystałem z biblioteki Peter’a Fleury
udostępnionej na licencji GNU GPL.6 Skorzystanie z gotowej biblioteki skró-
ciło czas potrzebny do ukończenia projektu oraz uchroniło przed popełnie-
niem blędów. W bibliotece zostały zaimplementowane nadawczy i odbiorczy
bufor cykliczny oraz funkcje, które w łatwy sposób umożliwiają wysyłanie
i odbieranie danych. Z interfejsu UART korzystałem głównie w celu de-
bugowania podczas uruchamiania projektu. W przyszłości za pomocą tego
interfejsu będzie można połączyć się z aplikacją serwisową na komputerze.

8.5 Odbiornik podczerwieni


Standardów przesyłu danych pomiędzy pilotem, a odbiornikiem podczer-
wieni jest bardzo wiele. W swoim robocie zdecydowałem się na zastosowanie
pilota nadającego w standardzie RC5. Jest to protokół opracowany przez
firmę Phillips w latach osiemdziesiątych. Wybór ten był podyktowany bar-
dzo prostym i dobrze udokumentowanym protokołem transmisji, dostępno-
ścią gotowych bibliotek oraz dostępnością i ceną samych pilotów nadających
w standardzie RC5. Uniwersalny pilot nadający w standardzie RC5 można
nabyć już za około 5 zł.
Protokół RC5 przekazuje dane za pomocą wiązki podczerwieni modu-
lowanej częstotliwością 36 kHz z wykorzystaniem kodowania Manchester.
Ramka protokołu przedstawia się następująco:

• 2 bity startu - zawsze 1

• 1 bit przełącznikowy - zmienia stan na przeciwny po naciśnieciu przy-


cisku na pilocie, umożliwia wykrycie kilkukrotnego wciśnięcia tego sa-
mego przycisku

44
Rysunek 33: Ramka protokołu RC5

• 5 bitów adresu - wybiera jeden z 32 systemów do którego kierowany


jest rozkaz

• 6 bitów rozkazu - wybiera jeden z 64 dostępnych rozkazów

W projekcie do obsługi protokołu RC5 użyto biblioteki Mirosława Kar-


dasia opisanej w książce ”Mikrokontrolery AVR Język C Podstawy pro-
gramowania”.7 Biblioteka korzysta z jednostki Input Capture Timera 1.
Biblioteka wymagała dostosowania do moich potrzeb. W moim robocie Ti-
mer 1 jest taktowany z częstotliwością 2MHz w 10-bitowym trybie PWM.
Oznacza to że licznik timera przepełnia się co 512µs, tymczasem czas trans-
misji połówki jednego bitu wynosi 889µs. Z tego powodu w przerwaniu wy-
woływanym podczas przepełnienia Timera 1 inkrementowana jest zmienna
umożliwiająca obliczenie prawidłowej szerokości impulsu.
Kod odpowiedzialny za dekodowanie protokołu RC5 znajduje sie w pli-
kach ir decode.(h,c)

45
8.6 Algorytm sterowania
Sterowanie robotem zostało zrealizowane za pomocą regulatora PID. W
fazie testów okazało się, że człon całkujący nie wprowadzał znaczącej po-
prawy jazdy robota. Dzieje się tak dlatego, że człon całkujący służy do
likwidacji stałych lub małych wolnozmiennych uchybów. Robot porusza się
na tyle szybko oraz trasa zazwyczaj jest na tyle kręta, że nie można zauważyć
wyniku działania tego członu podczas jazdy robota. Finalnie zastosowany
został regulator PD. Działanie członu różniczkującego staje się widoczne
gdy uchyb regulacji zaczyna szybko narastać. W przypadku robota dzieje
się tak przy ostrych zakrętach.
Ogólne równanie regulatora PID przedstawia się następująco:

Zt
 
1 dε(t) 
u(t) = kr ε(t) + ε(τ )dτ + Td (1)
Ti dt
0

gdzie u(t) to wartość regulacji, ε(t) - uchyb regulacji, kr - wzmocnienie


regulatora, Ti - czas zdwojenia, Td - czas wyprzedzenia.
Po przekształceniu otrzymujemy następującą postać równania:

Zt
dε(t)
u(t) = Kp ε(t) + Ki ε(τ )dτ + Kd (2)
dt
0

gdzie Kp wzmocnienie członu proporcjonalnego, Ki - wzmocnienie członu


całkującego, Kd - wzmocnienie członu różniczkującego.
Jak już wspomniałem wcześniej, w robocie zastosowano regulator PD.
Można uznać, że jest to regulator PID gdzie Ki = 0. Wzór regulatora PD
w dziedzinie czasu dyskretnego przedstawia się następująco:

u(k) = Kp ε(k) + Kd (ε(k) − ε(k − 1)) (3)


Uchyb regulacji jest obliczany w następujący sposób. Każdy z czujników
ma przypisaną wagę. Zaczynając od najbardziej skrajnego, lewego czujnika
są to kolejno -70,-60,-50,-40,-30,-20,-10,-1,1,10,20,30,40,50,60,70. Wagi czuj-
ników które wykryły linię są sumowe, a następnie jest obliczana ich średnia
wartość.
Po obliczeniu wartości regulacji, nowa wartość wypełnienia sygnałów
PWM zostaje ustawiona w następujący sposób.
motor_left_setpwm ( BASE_PWM + reg ) ;
motor_right_setpwm ( BASE_PWM - reg ) ;

Przy zerowym uchybie wartość wypełnienia sygnału PWM dla obu sil-
ników jest równa wartości określonej przez definicję BASE PWM. Zmiana
tej wartości powoduje zmianę prędkości poruszania się robota.

46
Rysunek 34: Algorytm sterowania

Implementacja algorytmu sterowania znajduje się w plikach pid.(h,c).


Znajdują się tam również funkcje opowiadające za zapis i odczyt wspoł-
czynników Kp i Kd .

47
9 Podsumowanie
9.1 Wynik projektu
Cel pracy został osiągnięty. Robot został zmontowany i oprogramowany
w stopniu umożliwiającym wykonanie postawionego przed nim zadania -
wystartowania w amatorskim konkursie robotycznym w konkurencji Line
Follower.

9.2 Możliwości rozwoju


• Autokalibracja - ze względu na różnice w oświetleniu jak i sam typ
podłoża, poziom odróżniający czarną linię od białego podłoża może
być inny w zależności od miejsca odbywania się konkursu. W tej
chwili poziom ten jest zdefiniowany na stałe w kodzie źródłowym
jako MAX WHITE ADC VAL. Mechanizm autkalibracji umożliwiłby
zmianę tej wartości w zależności od warunków panujących podczas
konkursu. Wymagałoby to ustawienia konkretnego czujnika nad białą
powierzchnią, a następnie nad czarną linią i dokonania pomiarów.
Wartość progowa mogłaby być średnią tych pomiarów.

• Aplikacja serwisowa - za pomocą wyprowadzonego złącza UART można


połączyć się z komputerem. Aplikacja serwisowa umożliwiłaby łatwiej-
sze zmiany parametrów konfiguracyjnych oraz prezentację danych ze-
branych podczas przejazdu.

• I 2 C - linie RS i RW wyprowadzone na złącze modułu LCD są jed-


nocześnie liniami SDA i SCL interfejsu TWI. Umożliwia to podpięcie
dowolnego innego sensora z którym można komunikować się za pomocą
magistrali I 2 C.

48
10 Załączniki
1. Schematy i projekty płytek utworzone w programie EAGLE

• Listwa z czujnikami - czujniki.sch, czujniki.brd


• Płytka główna - glowna.sch, glowna.brd
• Moduł LCD - lcd.sch, lcd.brd

2. Program mikrokontrolera - projekt środowiska Eclipse

• headers/adc.h
• headers/defines.h
• headers/functions.h
• headers/ir decode.h
• headers/lcd.h
• headers/menu.h
• headers/pid.h
• headers/timers.h
• headers/uart.h
• adc.c
• functions.c
• ir decode.c
• lcd.c
• main.c
• menu.c
• pid.c
• timers.c
• uart.c

49
Spis rysunków
1 Przykładowa trasa z zawodów T-BOT4 . . . . . . . . . . . . . 10
2 Zasada działania czujnika odbiciowego . . . . . . . . . . . . . 11
3 Czujnik odbiciowy KTIR0711S . . . . . . . . . . . . . . . . . 15
4 Silnik Pololu HP 10:1 wraz z mocowaniem . . . . . . . . . . . 17
5 Mostek H TB6612FNG . . . . . . . . . . . . . . . . . . . . . 17
6 Scalony odbiornik podczerwieni TSOP2236 . . . . . . . . . . 18
7 Pakiet LiPol Dualsky 250mAh 7,4V . . . . . . . . . . . . . . 20
8 Schemat podłączenia czujnika KTIR0711S . . . . . . . . . . . 22
9 Złącze FFC/FPC . . . . . . . . . . . . . . . . . . . . . . . . . 22
10 Schemat listwy z czujnikami . . . . . . . . . . . . . . . . . . . 23
11 Schemat podłączenia czujników za pomocą multiplekserów
74HC4052D . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
12 Schemat podłączenia mostka H . . . . . . . . . . . . . . . . . 26
13 Schemat podłączenia odbiornika podczerwieni TSOP2236 . . 26
14 Schemat bloku pinu I/O . . . . . . . . . . . . . . . . . . . . . 27
15 Schemat podłączenia mikrokontrolera . . . . . . . . . . . . . 28
16 Schemat złącza do modułu LCD . . . . . . . . . . . . . . . . 29
17 Schemat podłączenia diod LED . . . . . . . . . . . . . . . . . 29
18 Schemat bloku zasilania . . . . . . . . . . . . . . . . . . . . . 29
19 Schemat modułu LCD . . . . . . . . . . . . . . . . . . . . . . 30
20 Listwa z czujnikami - warstwy TOP i BOTTOM . . . . . . . 31
21 Płytka główna - warstwa TOP . . . . . . . . . . . . . . . . . 32
22 Płytka główna - warstwa BOTTOM . . . . . . . . . . . . . . 33
23 Moduł LCD - warstwa TOP . . . . . . . . . . . . . . . . . . . 34
24 Moduł LCD - warstwa BOTTOM . . . . . . . . . . . . . . . . 34
25 Schemat układu Timera 0 . . . . . . . . . . . . . . . . . . . . 36
26 Schemat układu Timera 1 . . . . . . . . . . . . . . . . . . . . 36
27 Schemat układu prescalera Timera 0 i 1 . . . . . . . . . . . . 37
28 Schemat układu prescalera Timera 2 . . . . . . . . . . . . . . 37
29 Tryb CTC - diagram czasowy . . . . . . . . . . . . . . . . . . 38
30 Tryb Fast PWM - diagram czasowy . . . . . . . . . . . . . . 39
31 Tryb PWM Phase Correct - diagram czasowy . . . . . . . . . 39
32 Schemat bloku konwertera analogowo-cyfrowego . . . . . . . . 41
33 Ramka protokołu RC5 . . . . . . . . . . . . . . . . . . . . . . 45
34 Algorytm sterowania . . . . . . . . . . . . . . . . . . . . . . . 47

50
Spis tablic
1 Parametry silnika Pololu HP 10:1 . . . . . . . . . . . . . . . . 16
2 Porównanie mostków H . . . . . . . . . . . . . . . . . . . . . 17
3 Parametry mikrokontrolera ATmega32A . . . . . . . . . . . . 20
4 Bilans prądowy . . . . . . . . . . . . . . . . . . . . . . . . . . 21

51
Bibliografia
[1] R. Paolozzi, “The cradle of motorsport.” http://forix.autosport.
com/8w/bdb.html, May 2008.

[2] Robomaticon, “Regulamin zawodów.” http://robomaticon.pl/


files/rules/pl/linefollower.pdf, 2014.

[3] T-BOT, “Regulamin zawodów.” http://www.t-bot.hb.pl/files/


regulaminy/lf.pdf, 2014.

[4] T-BOT, “Trasy konkurencji LineFollower.” http://www.t-bot.hb.


pl/?s=info, 2014.

[5] P. Fleury, “LCD library for HD44870 based LCD’s.” http:


//homepage.hispeed.ch/peterfleury/group__pfleury__lcd.html,
2006.

[6] P. Fleury, “UART library.” http://homepage.hispeed.ch/


peterfleury/group__pfleury__uart.html, 2012.

[7] M. Kardaś, Mikrokontrolery AVR Język C Podstawy Programowania.


Wydawnictwo Atnel, 2011.

[8] Atmel, “AVR ATmega32A Datasheet,” 2014.

[9] NXP, “74HC4052 Dual 4-channel analog multiplexer/demultiplexer


Product data sheet,” 2010.

[10] Kingbright, “KTIR0711S data sheet,” 2001.

[11] N. Semiconductor, “LM1117 800mA Low-Dropout Linear Regulator,”


2004.

[12] Toshiba, “TB6612FNG Driver IC for Dual DC motor,” 2007.

[13] Vishay, “TSOP22.. IR Receiver Modules for Remote Control Systems,”


2005.

52

You might also like