Skocz do zawartości

[Programowanie] Prezentacja kompletnego kodu programu robota minisumo


staszek

Pomocna odpowiedź

Koło Naukowe Robotyków KoNaR

projekt "Yokozuna"

Prezentacja kompletnego kodu programu prostego robota minisumo

Streszczenie

Artykuł prezentuje przykład prostego programu działającego robota. Proponuje gotowe rozwiązania dla początkujących konstruktorów, kładąc nacisk na realizację strategii i celowo pomijając sferę szczegółów technicznych, związanych programowaniem mikrokontrolerów. Czytając tekst zaleca się wgląd do załączonych plików z kodem źródłowym.

1. Wstęp

Prezentowany program dedykowano robotowi wyposażonemu w mikrokontroler ATmega16 firmy Atmel. Bez wprowadzania większych zmian łatwo przenieść go na inny, podobny układ firmy Atmel (ATmega32, ATmega8 etc.). O wiele większym problemem stojącym przed Czytelnikiem jest implementacja zaprogramowanego, w prezentowany sposób mikrokontrolera, w układzie elektronicznym, sterującym robotem. Realizacja takiego układu może wymagać, gruntownych zmian kodu źródłowego, jeśli peryferia są dla Czytelnika niedostępne, bądź zdecydowano zbudować robota z innych elementów.

Omawiany program napisany został dla robota wykorzystującego następujące urządzenia: dwa dalmierze Sharp GP2Y0A21, cztery czujniki koloru firmy ARE, silniki sterowane przez układ L298. Szczegóły w znaleźć można w [1].

2. Struktura programu

Kod omawianego programu podzielony został na następujące pliki:

  • ➡️ yokozuna_adc.c
  • ➡️ yokozuna_fight.c
  • ➡️ yokozuna_main.c
  • ➡️ yokozuna_motors.c
  • ➡️ yokozuna_other.c
  • ➡️ yokozuna_uart.c

Zostaną one omówione w kolejnych rozdziałach artykułu. Wszystkim wyżej wymienionym plikom, odpowiadają pliki nagłówkowe, które w celu zachowania komplementarności rozważań załączono na końcu dokumentu. Na szczególną uwagę zasługuje jednak niewspomniany dotąd plik yokozuna_defs.h, który powinien wyjaśnić jak mikrokontroler został zaimplementowany w układzie. Ponadto, jego modyfikacja w łatwy sposób dostosuje program do potrzeb Czytelnika.

Znaczenie zmiennych globalnych i definicji omówione zostanie w dalszej części dokumentu.

3. yokozuna_main.c

Ten plik prezentuje całą strategię prowadzonej przez robota walki. W pozostałych plikach znajdują się tylko funkcje realizujące konkretne zadania. Zadania te można podzielić na takie, które dotyczą sfery sprzętowej (np. konfiguracja liczników, przetwornika ADC, etc.), oraz takie które dotyczą technik obrony, ataku i lokalizacji przeciwnika.

Program główny przedstawia poniższy diagram.

Rysunek 1. int main(void).

Można zauważyć iż w programie głównym nie występuje interakcja robota z otoczeniem (pomijając oczekiwanie na sygnał startu). W nieskończonej pętli program ustawia silniki na jazdę do przodu. W istocie, odczytywanie danych z czujników, ich analiza, lokalizowanie przeciwnika i ucieczka w przypadku zagrożenia, zrealizowane zostały w przerwaniu od przepełnienia licznika T1 (Rysunek 2).

Rysunek 2. Przerwanie od przepełnienia licznika T1.

Dzięki takiemu rozwiązaniu, kiedy robot nie jest w niebezpieczeństwie (tzn. nie najechał na białą linię) i widzi przed sobą przeciwnika, przerwanie kończy się bardzo szybko, a w programie głównym silniki zostają ustawione na jazdę do przodu i trwa to do następnego przerwania.

Sytuacja zmienia się gdy robot najedzie na białą linię lub traci kontakt z przeciwnikiem. Wówczas w przerwaniu uruchomiona zostaje funkcja odpowiedzialna za obronę (ucieczkę) i/lub odnalezienie przeciwnika.

Zadanie wspomniane w poprzednim akapicie zrealizowano za pomocą zmiennych globalnych: danger i contact, które ustawione zostają w efekcie działania funkcji check_white_line() i check_contact(), poprzedzonych przez odczytanie wartości z przetwornika, w wyniku działania funkcji check_adc().

4. yokozuna_adc.c

Plik yokozuna_adc.c zawiera funkcje obsługujące przetwornik ADC. Funkcja init_adc() służy konfiguracji przetwornika. Funkcja check_adc() zmienia wartości zmiennych globalnych oznaczonych w pliku yokozuna_defs.h dopiskiem w komentarzu "from ADC". Ponadto funkcja umożliwia wysłanie wartości tych zmiennych przez port szeregowy do komputera połączonego z robotem, w celu weryfikacji poprawności działania czujników. Procedury komunikacji (w prezentowanym kodzie) objęto jednak komentarzem, gdyż podczas normalnej pracy robota nie ma potrzeby wysyłania tych informacji. Funkcje realizujące komunikację z komputerem znajdują się w pliku yokozuna_uart.c.

Szczególnego komentarza wymagać może działanie odejmowania, przy odczytywaniu napięć z czujnika koloru. Jest to realizacja tzw. pomiaru różnicowego, którego opis znaleźć można w dokumentacji czujnika [5].

5. yokozuna_fight.c

Po odczytaniu wartości z przetwornika ADC następuje ich analiza i ewentualne podjęcie koniecznych działań, o czym była mowa w punkcie 3.

Analiza danych i wspomniane działania realizuje kod zawarty w pliku yokozuna_fight.c. Funkcja check_white_line() na podstawie zmienny globalnych kol_fl, kol_fr, kol_bl, kol_br (wartości z przetwornika odpowiadające napięciom na wyjściu czujników koloru) wpływa na zmienną globalną danger (danger wynosi 1 wtedy i tylko wtedy gdy robot najechał na białą linię). Analogicznie działa funkcja check_contact(), która na podstawie wartości sharp_l, sharp_r wpływa na zmienną globalną contact (contact wynosi 1 wtedy i tylko wtedy, gdy przeciwnik znajduje się naprzeciwko robota w bliskiej odległości).

Kiedy w przerwaniu od przepełnienia licznika T1 (patrz punkt 3) po analizie wartości z przetwornika, rozpoznano niebezpieczeństwo (biała linia) bądź stracono kontakt z przeciwnikiem, uruchomione zostają odpowiednie procedury, escape() lub hunt().

Szczególnego komentarza wymagać może zastosowanie stałych WL_CONST oraz SHARP_CONST w funkcjach analizujących dane z przetwornika. Są to wartości liczbowe, zdefiniowane w pliku yokozuna_defs.h, oraz dobrane eksperymentalnie. Ich wykorzystanie jest proste, np. gdy wartość zmiennej globalnej odpowiadającej tylnemu lewemu czujnikowi koloru przekroczy dopuszczalną wartość (kol_br > WL_CONST), oznacza to, że czujnik ten znajduje się nad białą linią.

6. yokozuna_motors.c

W pliku yokozuna_motors.c zawarto funkcje do obsługi silników. Szczegóły znaleźć można w [6].

7. yokozuna_uart.c

Plik zawiera funkcje do obsługi komunikacji robota z komputerem, przydatne podczas testowania programu. Szczegóły znaleźć można w [2] i [3].

8. yokozuna_other.c

W pliku umieszczono funkcje odpowiedzialne głównie za konfigurację mikrokontrolera (wyodrębnienie pliku zwiększa czytelności kodu).

9. Pozostałe pliki nagłówkowe

Do kompilacji niezbędnę są poniższe pliki nagłówkowe (w załączniku):

  • ➡️ yokozuna_adc.h
  • ➡️ yokozuna_fight.h
  • ➡️ yokozuna_motors.h
  • ➡️ yokozuna_other.h
  • ➡️ yokozuna_uart.h

10. Kompilacja (Linux)

Przykład kompilacji:

#!/bin/bash
avr-gcc -mmcu=atmega16 -Os -c yokozuna_adc.c -o adc.o
avr-gcc -mmcu=atmega16 -Os -c yokozuna_fight.c -o fight.o
avr-gcc -mmcu=atmega16 -Os -c yokozuna_uart.c -o uart.o
avr-gcc -mmcu=atmega16 -Os -c yokozuna_other.c -o other.o
avr-gcc -mmcu=atmega16 -Os -c yokozuna_motors.c -o motors.o
avr-gcc -mmcu=atmega16 -Os -c yokozuna_main.c -o main.o
avr-gcc adc.o fight.o uart.o other.o motors.o main.o -mmcu=atmega16 -o prog.out
avr-objcopy -R .eeprom -O ihex prog.out prog.hex

Bibliografia

[1] Szymon Gospodarek, Robot klasy Mini-Sumo "Yokozuna", KoNaR, Wrocław 2009.

[2] Wydział Eletroniki, Telekomunikacji i Informatyki Politechniki Gdańskiej, Dokumentacja mikrokontrolera ATmega16 firmy Atmel, Gdańsk 2006.

[3] ATmega16 (dokumentacja), ATMEL, 2006.

[4] GP2Y0A21 (dokumentacja), SHARP Corporation, 2006.

[5] Czujnik koloru ARE0015 (dokumentacja), ARE.

[6] L298 Dual full-bridge driver (dokumentacja), ST, 2000.

yokozuna.rar

  • Lubię! 1
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!

Gość
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.