25
AKADEMIA GÓRNICZO-HUTNICZA Wydział Elektrotechniki, Automatyki, Informatyki i Elektroniki KATEDRA INFORMATYKI Czołg z działem nakierowywanym na światło, sterowany komputerowo przez moduł bluetooth Kierunek, rok studiów Informatyka, III rok Przedmiot Technika Mikroprocesorowa Zespół autorski Maciej Kruk Przemysław Syktus Prowadzący przedmiot dr inż. Roman Krasowski Rok akademicki 2009/2010

AKADEMIA GÓRNICZO-HUTNICZA - Forbot

Embed Size (px)

Citation preview

AKADEMIA GÓRNICZO-HUTNICZA Wydział Elektrotechniki, Automatyki, Informatyki i Elektroniki

KATEDRA INFORMATYKI

Czołg z działem nakierowywanym na światło, sterowany komputerowo przez moduł bluetooth

Kierunek, rok studiów

Informatyka, III rok

Przedmiot

Technika Mikroprocesorowa Zespół autorski

Maciej Kruk Przemysław Syktus

Prowadzący przedmiot

dr inż. Roman Krasowski Rok akademicki

2009/2010

2

Spis tre ści

Wstęp_____________________________________________________________________ 3

Napęd ____________________________________________________________________ 3

Opis elementu _________________________________________________________________ 3

Lista części ____________________________________________________________________ 4

Opis działania _________________________________________________________________ 4

Kod źródłowy _________________________________________________________________ 4

Moduł komunikacyjny _______________________________________________________ 6

Opis elementu _________________________________________________________________ 6

Lista części ____________________________________________________________________ 7

Opis działania _________________________________________________________________ 7

Kod źródłowy _________________________________________________________________ 8

Działo ____________________________________________________________________ 8

Opis elementu _________________________________________________________________ 8

Lista części ____________________________________________________________________ 9

Opis działania _________________________________________________________________ 9

Kod źródłowy ________________________________________________________________ 10

Interfejs uŜytkownika _______________________________________________________ 12

Czołg ____________________________________________________________________ 12

Lista części ___________________________________________________________________ 14

Kod źródłowy ________________________________________________________________ 14

Zdj ęcia ______________________________________________________________________ 21

Schemat__________________________________________________________________ 24

Bibliografia_______________________________________________________________ 25

3

Wstęp Jako cel postawiliśmy sobie zbudowanie zdalnie sterowanego czołgu. Aby projekt wyróŜniał się spośród zdalnie sterowanych zabawek dostępnych na rynku, do jego konstrukcji wprowadziliśmy element sztucznej inteligencji – działo, wraz z fotorezystorami, automatycznie odszukujące i likwidujące cel emitujący światło widzialne. ZałoŜyliśmy, Ŝe cały projekt wykonamy własnoręcznie, ograniczając się do zakupu jedynie podstawowych układów cyfrowych. Był to plan dość ambitny, zwłaszcza zwaŜywszy na fakt, Ŝe z elektroniką i techniką mikroprocesorową kontakt mieliśmy do tej pory bardzo ograniczony, jedynie podczas wykonywania krótkich ćwiczeń laboratoryjnych w ramach przedmiotów Technika cyfrowa, oraz Technika mikroprocesorowa. Ze względu na spełnianą rolę, moŜna wyraźnie wyróŜnić w nim trzy moduły – napęd, działo, oraz moduł komunikacyjny. Są one połączone i zarządzane przez mikroprocesor ATMEGA16L. Ten ostatni wybraliśmy ze względu na łatwą dostępność, niską cenę, dobrą dokumentację, oraz napięcie równe napięciu układu bluetooth BTM-222. Układ włączany jest za pomocą pojedynczego przełącznika dwustanowego, który spina obwody obu zestawów baterii. Ponadto układ zawiera przycisk reset słuŜący do resetowania głównego mikrokontrolera.

Napęd

Opis elementu

Podstawową funkcją robota jest poruszanie się na dwóch niezaleŜnie obracających się gąsienicach. Jako silniki napędzające czołg, zostały wykorzystane dwa uszkodzone serwomechanizmy o mocy 3 kg, z których usunięto wadliwą elektronikę. Zapewnia to wystarczającą moc aby uciągnąć stalową obudowę, baterie, oraz układy elektroniczne, a jednocześnie umoŜliwia zmianę prędkości przez sterowanie wypełnieniem impulsu (PWM) obecne w układzie ATMEGA16L.

PoniewaŜ napięcie na wyjściu procesora ATMEGA16L jest niewystarczające do poruszania uŜytymi silnikami, zmiana napięcia dokonuje się na mostku L293D. Wszystkie napięcia są dostarczane z 7 baterii AA, poprzez stabilizatory 3,3 V (3 baterie) i bezpośrednio z 4 pozostałych baterii jako zasilanie silników. Stabilizatory zabezpieczone są za pomocą odpowiednio dobranych kondensatorów.

Serwomechanizmy są bezpośrednio połączone z dwoma plastikowymi kołami zębatymi, odpowiedzialnymi za obracanie gąsienic. Dodatkowe koła odpowiadają jedynie za wsparcie i utrzymanie kształtu gąsienic.

Gąsienice są sterowane niezaleŜnie, co pozwala na wiele moŜliwych kombinacji ich wykorzystania. Program wgrany do procesora, pozwala, poprzez wysyłanie dwuznakowych poleceń przez bluetooth lub port COM, na jazdę do przodu, do tyłu, skręt w lewo, skręt w prawo, obrót w lewo, oraz obrót w prawo w 2 prędkościach.

Naturalnym górnym ograniczeniem prędkości jest ograniczenie wynikające z prędkości serwa i małego rozmiaru kół napędowych.

4

Lista cz ęści 1) L293D 2) Silnik elektryczny z duŜym przełoŜeniem x2

Opis działania

Wyjścia OC1 i OC2 Atmegi z włączonym PWMem podłączone są do wejścia ENABLE mostka L293D, który słuŜy do sterowania silnikami prądu stałego. Dzięki zastosowaniu tego mostka, podając odpowiednio stan niski lub wysoki z wyjść ATMEGI, moŜemy sterować kierunkiem ruchu silnika. Dodatkowym efektem jest zwiększenie napięcia z 3,3 V wyjść ATMEGI do 6 V, które dostarczane są na wejścia zasilania mostka, oraz istotne wzmocnienie prądowe umoŜliwiające ruch silnika (prądy wyjścia ATMEGI są bardzo niskie). Sterowanie prędkością odbywa się za pomocą sterowania współczynnikiem wypełnienia na wyjściach PWM - im większe wypełnienie oznacza większą prędkość. Wynika to z duŜej bezwładności silnika i wysokiej częstotliwości zmiany sygnału na wyjściu PWM. PoniewaŜ moc na silniku jest związana z całką z wartości napięcia, fragmenty w którym napięcie przyjmuje stan niski obniŜają wartość tej całki, efektywnie zmniejszając prędkość.

PoniewaŜ układ L293D zawiera dwa mostki H, moŜemy poruszać obydwoma silnikami napędowymi w dowolnym kierunku przy uŜyciu jednego układu. Sterowanie silnikiem prądu stałego, jest typowym zastosowanie dla mostka typu H. Napięcie do mikrokontrolera dostarczane jest z 2 baterii AA, a do mostka z 4 baterii AA. Napięcie z 2 baterii stabilizowane jest stabilizatorem 3,3 V.

Kod źródłowy void forward(char c) if(c == 1) OCR1A = 220; OCR1B = 220; else OCR1A = 255; OCR1B = 255; PORTB = 0xa0; sB('F');sB('O');sB('R');sB('W'); sB('A');sB('R');sB('D');sB(c+'0');sB(0x0A);sB(0x0D ); void lforward(char c) if(c == 1) OCR1A = 220; OCR1B = 205; else OCR1A = 255; OCR1B = 220; PORTB = 0xa0; sB('L');sB('F');sB('O');sB('R');

5

sB('W');sB('A');sB('R');sB('D'); sB(c+'0');sB(0x0A);sB(0x0D); void rforward(char c) if(c == 1) OCR1A = 205; OCR1B = 220; else OCR1A = 220; OCR1B = 255; PORTB = 0xa0; sB('R');sB('F');sB('O');sB('R'); sB('W');sB('A');sB('R');sB('D'); sB(c+'0');sB(0x0A);sB(0x0D); void backward(char c) if(c == 1) OCR1A = 220; OCR1B = 220; else OCR1A = 255; OCR1B = 255; PORTB = 0x50; sB('B');sB('A');sB('C');sB('K'); sB('W');sB('A');sB('R');sB('D'); sB(c+'0');sB(0x0A);sB(0x0D); void lbackward(char c) if(c == 1) OCR1A = 220; OCR1B = 205; else OCR1A = 255; OCR1B = 220; PORTB = 0x50; sB('L');sB('B');sB('A');sB('C'); sB('K');sB('W');sB('A');sB('R'); sB('D');sB(c+'0');sB(0x0A);sB(0x0D); void rbackward(char c) if(c == 1) OCR1A = 205; OCR1B = 220; else OCR1A = 220; OCR1B = 255; PORTB = 0x50; sB('R');sB('B');sB('A'); sB('C');sB('K');sB('W');sB('A'); sB('R');sB('D');sB(c+'0');sB(0x0A);sB(0x0D);

6

void right(char c) if(c == 1) OCR1A = 220; OCR1B = 220; else OCR1A = 255; OCR1B = 255; PORTB = 0x60; sB('R');sB('I');sB('G');sB('H');sB('T');sB(c+'0'); sB(0x0A);sB(0x0D); void left(char c) if(c == 1) OCR1A = 220; OCR1B = 220; else OCR1A = 255; OCR1B = 255; PORTB = 0x90; sB('L');sB('E');sB('F');sB('T');sB(c+'0');sB(0x0A) ;sB(0x0D); void fullStop() OCR1A = 0; OCR1B = 0; PORTB = 0x00; sB('S');sB('T');sB('O');sB('P');sB(0x0A);sB(0x0D);

Moduł komunikacyjny

Opis elementu Moduł komunikacyjny w robocie spełnia 2 podstawowe funkcje. Pierwszą z nich jest moŜliwość programowania mikroprocesora sterującego układem z wykorzystaniem komputera osobistego. Drugą – sterowanie czołgiem. Obie te funkcje moŜna realizować poprzez bluetooth, oraz port COM (RS232). Dodatkowo, port COM spięty z bluetoothem umoŜliwia jego konfigurację. O ile przy wybór portu COM jako medium komunikacyjnego był wyborem oczywistym, ze względu na rozmiar, dobrze opisany standard, prostotę obsługi i szerokie rozpowszechnienie tego rozwiązania, o tyle wybór modułu komunikacji bezprzewodowej nie był taki prosty. Sterowanie na podczerwień nie wchodzi w rachubę, ze względu na niewielki zasięg takiego modułu. Modułów radiowych jest wiele, jednak większość z nich nie tylko nie oferuje Ŝadnej kontroli poprawności przesyłanych danych, ale takŜe cechuje się duŜą podatnością na zakłócenia i duŜą ilością błędów przesyłu danych. Ze względu na wysoką niezawodność, daleki zasięg, kompatybilność z portem COM, oraz szeroką dostępność modułów bluetooth w komputerach przenośnych, wybór padł na moduł BTM-222. PoniewaŜ jest on niewielki, w celu trwałego połączenia modułu z resztą układu, konieczne było przygotowanie i wytrawienie dodatkowej płytki drukowanej.

7

Lista cz ęści 1) MAX3232 2) BTM-220A2 3) Port COM Ŝeński 4) Antena 5) Przełącznik trójstanowy x2 6) Kondensator 100nF x4 7) Dioda LED x2 8) Rezystor 100 Ω x2

Opis działania

Wejścia RX i TX mikrokontrolera połączone są z dwoma przełącznikami, odpowiedzialnymi za ustawienie trybu pracy układu. ZaleŜnie od ich ustawienia, moŜliwe są trzy formy komunikacji poszczególnych modułów:

Przełącznik górny w pozycji środkowej, przełącznik dolny w pozycji zewnętrznej – wejścia modułu BTM-222 połączone są z wejściami modułu MAX3232, który z kolei połączony jest z portem COM. Ustawienie to umoŜliwia programowanie modułu bluetooth poprzez port COM w komputerze.

Przełącznik górny w pozycji zewnętrznej, przełącznik dolny w pozycji środkowej – wejścia mikrokontrolera połączone są z wejściami modułu MAX3232, który z kolei połączony jest z portem COM. Ustawienie to umoŜliwia programowanie Atmegi16L poprzez port COM w komputerze, oraz sterowanie czołgiem w analogiczny sposób.

Oba przełączniki do wewnątrz – wejścia mikrokontrolera połączone są z wejściami modułu BTM-222. Ustawienie to umoŜliwia sterowanie czołgiem poprzez moduł bluetooth (widziany przez inne urządzenia bluetooth jako czolg, hasło do urządzenia to 4321).

Oba przełączniki w pozycji zewnętrznej – układ rozłączony. Podłączone wyjścia układu BTM, to wyjścia RX, TX, antenowe, wyjścia kontrolne

(LINK i POWER) podłączone do diod. BTM został przylutowany do wytrawionej przez nas płytki.

MAX3232 podłączony jest przy uŜyciu 5 kondensatorów 100 nF (jak na schemacie). UŜywamy tylko jednego portu MAXa ze względu na uŜywany przez nas typ SMD i sposób mocowania na płytce.

Port COM podłączony jest bezpośrednio do MAX3232 i do masy układu. Oba układy znajdują się na tej samej płytce uniwersalnej co ATMEGA i podłączenia napędu.

Programowanie układu odbywa się przy uŜyciu wgranego w procesor bootloadera, który przy prędkości 9600 bps korzysta z odpowiedniego programu na komputerze PC, aby wczytać kod właściwego programu do wykonania. JeŜeli przy starcie układu, nie otrzyma instrukcji od bootloadera, przechodzi do wykonania wcześniej załadowanego programu.

Komunikacja z układem bluetooth odbywa się z prędkością 38400 bps, zarówno od strony Atmegi jak i komputera. Do obserwacji jej działania moŜna wykorzystać dwie zamocowane w tym celu diody. Dioda connect miga, gdy urządzenie czeka na połączenie i świeci się gdy to połączenie zostanie ustanowione. Dioda data miga, gdy przesyłane są dane.

8

Kod źródłowy void sB (char c) //sendByte UDR=c; loop_until_bit_is_set(UCSRA,TXC); UCSRA |= (1<<TXC); void UART_init(void) UCSRB = (0<<RXEN)|(0<<TXEN); UBRRL = (unsigned char)12; // 34800, wiecej nie trzeba a takie ma maly b³¹d UCSRB = (1<<RXEN)|(1<<TXEN); char rB() //receiveByte unsigned int i = 0; while((UCSRA&(1<<RXC)) == 0) i++; _delay_ms(10); if(i > 200) return 0; return UDR;

Działo

Opis elementu

Tym, co odróŜnia nasz czołg od większości popularnych robotów jest działo. To ono teŜ przysparzało nam najwięcej trudności przez cały okres trwania projektu. Istnieje wiele moŜliwych metod wyrzucania pocisków – począwszy od mechanicznie naciąganej procy, poprzez butlę z elektrozaworem ze sprzęŜonym gazem, na dziale Gaussa kończąc. KaŜde z tych rozwiązań ma jedną wadę – jest konstrukcyjnie trudne w realizacji, w sklepach brakuje części niezbędnych do jego budowy, lub jest za duŜe i za cięŜkie, aby mogło się znaleźć na małym, poruszanym za pomocą słabych silniczków robocie. Po długim zastanowieniu zdecydowaliśmy się na wykorzystanie mechanizmu AEG (Airsoft Electric Gun), mocowanego w replikach broni i strzelającego niewielkimi plastikowymi kulkami. Mechanizm działania takiego działa jest bardzo prosty, jednak wymaga duŜej precyzji dopasowania poszczególnych elementów. Niewielki silnik, napędzany prądem o napięciu około 5,8 V, za pośrednictwem kilku kół zębatych, naciąga spręŜynę zamocowaną do tłoku, jednocześnie spręŜając powietrze i odsuwając blokadę, pozwalając na wpadnięcie pocisku do lufy. Po odciągnięciu do końca, lufa zostaje zablokowana, a tłok zostaje zwolniony i wystrzeliwuje kulkę. Silnik wewnątrz działa sterowany jest za pomocą tranzystory MOSFET (nie potrzebny jest tutaj mostek H, gdyŜ interesuje nas tylko jeden kierunek obrotu). Bezpośrednie sterowanie wyjściami ATMEGI jest niemoŜliwe ze względu na niskie napięcie i mały prąd wyjściowy. PoniewaŜ zastosowany MOSFET przewodzi wystarczającą ilość prądu gdy napięcie na bramce wynosi ponad 5 V, w celu wzmocnienia napięcia wyjściowego ATMEGI, zastosowaliśmy bramkę NAND z serii 7400 w charakterze bufora.

9

Taka konstrukcja pozwala na prostą obsługę działa, jednak pozostaje problem obracania lufy. Funkcję tą realizujemy przy uŜyciu niewielkich silniczków odpowiedzialnych za podnoszenie płyty, oraz przesuwanie lasera w napędzie CD-ROM. Działo umoŜliwia takŜe włączenie trybu Auto-Fire. W trybie tym, działo poszukuje najmocniejszego źródła światła w otoczeniu, po czym zestrzeliwuje je. Funkcja ta opiera się na odczytach danych z dwóch fotorezystorów. Im więcej światła pada na fotorezystor, tym mniejsza jest jego oporność. Tym samy, tym mniejsze jest na nim napięcie, a większe na oporniku stałym podłączonym szeregowo. Napięcie na fotorezystorze odczytywane jest przez ATMEGĘ i konwertowane na postać cyfrową za pomocą konwertera analogowo cyfrowego. Wartości uzyskane w ten sposób na dwóch fotorezystorach znajdujących się po lewej i po prawej stronie działa, są porównywane i działo obraca się w stronę w której stwierdzono większe natęŜenie padającego światła. JeŜeli róŜnica będzie odpowiednio mała, działo przestaje się obracać i rozpoczyna sekwencję strzału. Dane na temat przetworzonych na postać cyfrową wartości napięcia są cały czas podawane przez UART. W podajniku działa mogą znajdować się 3 kulki, jednak przy oddawaniu strzału, w wyniku duŜej siły odrzutu, kulki te zazwyczaj wypadają. Ruchy wieŜyczki na boki ograniczone są przez długość kabla pomiędzy działem a mikrokontrolerem. Ze względu

Lista cz ęści 1) L293D 2) Silnik elektryczny z napędu CD x2 3) MOSFET IRF 520 4) 74LS00P – bramka NAND 5) Działo AEG 6) Fotorezystor x2 7) Rezystor 10 kΩ x2

Opis działania

Strzelanie odbywa się przez dostarczenie napięcie na bit 1 portu C Atmegi. PoniewaŜ wymagany prąd jest duŜo większy niŜ ten dostarczany przez mikrokontroler, odbywa się to przez MOSFET. W przeciwieństwie do sterowania napędem podwozia, poniewaŜ nie ma tu potrzeby sterowania prędkością, nie wykorzystujemy PWMa.

Za obracanie działa w pionie i poziomie odpowiadają dwa silniczki od CD-ROMu. MoŜna nimi sterować poprzez moduł bluetooth, lub z wykorzystaniem informacji dostarczonej przez fototranzystory.

Dwa fototranzystory dostarczają mikroprocesorowi informacji na temat pozycji światła podczerwonego względem działa.

Ze względu na konieczność poprowadzenia kabli pomiędzy działem a mikrokontrolerem, działo nie powinno być obracana wiele razy dookoła własnej osi, aby nie nadwyręŜyć połączeń. W płaszczyźnie pionowej, ruch ten jest ograniczony przez sposób mocowania działa. Tutaj moŜliwość zmiany odchylenia wynosi ~20 stopni. PoniewaŜ działo jest dosyć cięŜkie, dowolny ruch silnika w kierunku dolnym powoduje opadnięcie działa do pozycji minimalnej.

10

Ze względu na rozmiar działa, istnieje moŜliwość odłączenia działa od reszty układu w celach transportowych.

Kod źródłowy void turret(char c) switch(c) case 'y': sB('T');sB('U');sB('R');sB('R'); sB('E');sB('T');sB('U');sB('P'); sB(0x0A);sB(0x0D); PORTC=0x88; _delay_ms(300); PORTC=0x00; break; case 'n': sB('T');sB('U');sB('R'); sB('R');sB('E');sB('T'); sB('D');sB('O');sB('W'); sB('N');sB(0x0A);sB(0x0D); PORTC=0x84; _delay_ms(100); PORTC=0x00; break; case 'g': sB('T');sB('U');sB('R');sB('R'); sB('E');sB('T');sB('L');sB('E'); sB('F');sB('T');sB(0x0A);sB(0x0D); PORTC=0x60; _delay_ms(20); PORTC=0x00; break; case 'j': sB('T');sB('U');sB('R'); sB('R');sB('E');sB('T'); sB('R');sB('I');sB('G'); sB('H');sB('T');sB(0x0A);sB(0x0D); PORTC=0x50; _delay_ms(20); PORTC=0x00; break; case 'h': sB('T');sB('U');sB('R');sB('R'); sB('E');sB('T');sB('F');sB('I'); sB('R');sB('E');sB(0x0A);sB(0x0D); PORTC=0x02; _delay_ms(1000); PORTC=0x00; break; default: break; void initialize_ac(int left) ADMUX |= _BV(REFS0); // Wybranie sposobu zapisu wyniku z wyrównaniem do lewej (osiem starszych) ADMUX |= _BV(ADLAR); // Wybór kanału wej ścia - PC3 (ADC3) if (left) ADMUX &= ~_BV(MUX0); else ADMUX |= _BV(MUX0); // Zezwolenie na konwersj ę ADCSRA |= _BV(ADEN); // Wybranie cz ęstotliwo ści dla taktowania przetwornika

11

ADCSRA |= _BV(ADPS0); ADCSRA |= _BV(ADPS1); ADCSRA |= _BV(ADPS2); void autoFire() unsigned int pomiar, pomiar_left, pomiar_right; sB('A');sB('U');sB('T');sB('O'); sB(' ‘);sB('F');sB('I');sB('R');sB('E'); sB(0x0A);sB(0x0D); while(1) initialize_ac(1); ADCSRA |= _BV(ADSC); while( ADCSRA & _BV(ADSC)) ; pomiar_left = ADCH; initialize_ac(0); ADCSRA |= _BV(ADSC); while( ADCSRA & _BV(ADSC)) ; pomiar_right = ADCH; if (pomiar_left > pomiar_right) pomiar = pomiar_left - pomiar_right; else pomiar = pomiar_right - pomiar_left; sB(0x0D); sB('L'); sB('E'); sB('F'); sB('T'); sB(':'); sB((pomiar_left/100)+'0'); sB(((pomiar_left%100)/10)+'0'); sB((pomiar_left%10)+'0'); sB(' '); sB('R'); sB('I'); sB('G'); sB('H'); sB('T'); sB(' :'); sB((pomiar_right/100)+'0'); sB(((pomiar_right%100)/10)+'0'); sB((pomiar_right%10)+'0'); sB(' '); sB('D'); sB('I'); sB('F'); sB('F'); sB(':'); sB((pomiar/100)+'0'); sB(((pomiar%100)/10)+'0'); sB((pomiar%10)+'0'); sB(' '); if (pomiar < 8) turret('h'); break; else if (pomiar_left > pomiar_right) sB('T');sB('U');sB('R');sB('R'); sB('E');sB('T');sB('R');sB('I'); sB('G');sB('H');sB('T'); PORTC=0x62; else sB('T');sB('U');sB('R');sB('R'); sB('E');sB('T');sB('L');sB('E'); sB('F');sB('T');sB(' '); PORTC=0x52; _delay_ms(20); PORTC=0x02; _delay_ms(10);

12

Interfejs uŜytkownika

W celu sterowania czołgiem wykorzystujemy HyperTerminal do nadawania odpowiednich znaków do czołgu. Transmisja moŜe odbywać się poprzez kabel COM lub moduł bluetooth, po wybraniu odpowiedniej opcji za pomocą dwóch przełączników trzystanowych. Transmisja zaczyna się od nadania słowa INIT przez układ, na który naleŜy wysłąć odpowiedź OK. Potwierdzenie otrzymania odpowiedzi następuje poprzez wysłanie słowa RDY. KaŜde wydane polecenie jest potwierdzane przez układ, wysyłaniem odpowiedniego słowa zaleŜnego od otrzymanego polecenia.

Jako najbardziej intuicyjny sposób sterowania, uznaliśmy ten zastosowany w grach wideo. Analogicznie do tego rozwiązania zaprojektowaliśmy komendy rozumiane przez robota. Przy pomocy klawiszy q,w,e,a,s,d,z,x,c moŜna wybrać kierunek jazdy czołgu. Po wyborze kierunku następuje wybór prędkości jazdy poprzez naciśnięcie klawisza 1 lub 2. Przy pomocy klawiszy y,j,g,n następuje ruch działa. Klawisz h powoduje oddanie strzału. Klawisz f powoduje przejście czołgu w tryb auto fire. W trybie tym, następuje zatrzymanie czołgu (podobnie jak w kaŜdym innym związanym z ruchem działa), a działo rozpoczyna skanowanie otoczenia w poszukiwaniu źródła światła. Gdy je znajdzie, następuje pojedynczy strzał.

Czołg

Projekt czołgu, mimo, Ŝe pierwszy jakiego budowy się podjęliśmy, zakończył się sukcesem. Mimo, Ŝe niektóre funkcje nie działają tak dobrze jak planowaliśmy, wszystkie funkcjonalności, jakie planowaliśmy zaimplementować, działają. PoniewaŜ podczas budowy wyniknęło wiele problemów, których istnienia nie byliśmy w stanie przewidzieć podczas fazy planowania, ostateczna forma czołgu jest duŜo bardziej złoŜona niŜ byśmy chcieli. W związku z tym, układy które miały zmieścić się na jednej płytce uniwersalnej wylądowały na 3 płytkach, a wiele połączeń dokonano „na pająka”, przy uŜyciu kabli. Kilka wiszących elementów nie jest dobrze zaizolowana, przez co mogą one w rozmaity sposób zaburzać pracę całego układu. Nie poprawiliśmy tego ze względu na bardzo niewielki stopień ryzyka zajścia takiego zjawiska, a takŜe ze względu na brak miejsca wewnątrz obudowy czołgu.

Napęd urządzenia okazał się najlepiej pracującą częścią czołgu. Mimo stosunkowo duŜego obciąŜenia, nie występują Ŝadne problemy z pracą serwomechanizmów, a ruch jest płynny.

Moduł komunikacyjny takŜe nie sprawiał większych problemów, aczkolwiek przesyłanie danych przez bluetooth nie jest idealne. Buforowanie wiadomości powoduje, Ŝe nie zawsze reakcja na wydane polecenie jest natychmiastowa, ale zapewnia, Ŝe wszystkie informacje dotrą do adresata. Urządzenie było testowane na odległości do 5 metrów i w takim zasięgu działa bez zarzutu. Komunikacja przez port COM jest szybka i bezproblemowa.

Najtrudniejszą w realizacji częścią okazało się działo. Z przyczyn technicznych, mocowania nie są bardzo wytrzymałe, w szczególności mocowanie do układu sterującego ruchem góra-dół. W związku z tym, duŜą wagą działa, oraz niewielką mocą silnika, ruch w górę jest przerywany, a w dół silnik nie jest w stanie utrzymać obciąŜenia i działo opada na sam spód. Metalowa część odpowiedzialna za połączenie działa z zębatkami poruszającymi nim na boki była zamocowana za pomocą kleju dwuskładnikowego, ale ze względu na jego

13

niską wytrzymałość na rozciąganie, po załoŜeniu działa mocowanie puściło. Zostało to naprawione, ale istnieje moŜliwość ponownej awarii w przyszłości. Zamocowane silniki, teoretycznie pozwalają na dowolny ruch działa na boki, jednak ze względu na długość kabli do fotorezystorów i silników działa, ruch ten ograniczony jest do około 270 stopni (ok. 135 stopni odchylenia w dowolną stronę od osi czołgu). W przypadku istnienia wielu źródeł światła (np. lampa lub światło dzienne), istnieje moŜliwość zatrzymania się działa w trybie auto strzału w nieoczekiwanej pozycji. TakŜe w przypadku gdy źródło światłu znajduje się pod duŜym kątem w stosunku do osi lufy (ponad 60 stopni), fotorezystory mogą nie poradzić sobie z jego zlokalizowaniem.

Podajnik na kulki co prawda ma miejsce na więcej niŜ 1 pocisk, jednak siła odrzutu przy wystrzale i luźne mocowanie działa, powoduje, Ŝe pozostałe pociski rozlatują się na boki. MoŜna by to naprawić stosując zabudowanie podajnika. PoniewaŜ oddanie strzału odbywa się poprzez naciągnięcie spręŜyny, czas oddawania strzału moŜe się róŜnić w zaleŜności od czynników zewnętrznych (stanu baterii, temperatury, aktualnego naciągnięcia spręŜyny). PoniewaŜ mikroprocesor zawsze oddaje strzał o tej samej długości, moŜe zaistnieć sytuacja, w której po wydaniu jednego polecenia strzału, nastąpią dwa wystrzału, lub nie nastąpi Ŝaden. Długość strzału została dobrana eksperymentalnie w ten sposób, aby zminimalizować ryzyko zajścia takiej sytuacji.

Część górna obudowy nie została wykonana z powodu braku czasu i środków (dostęp do lasera wypalającego stal). Mocowanie kół ze względów praktycznych nie jest trwałe, w związku z tym moŜe zdarzyć się odczepienie się koła napędowego podczas ruchu.

Teoretyczny ruch skrętny czołgu jest moŜliwy i zaimplementowany, jednak ograniczenia PWMa sprawiają, Ŝe kąt skrętu jest bardzo duŜy i w większości wypadków bardziej opłacalny jest obrót w miejscu.

Ze względu na małe przełoŜenie z serwa na napęd, maksymalna prędkość nie jest duŜa. Jest to model prototypowy. W przypadku tworzenia kolejnych wersji robota,

wprowadzilibyśmy szereg zmian do modelu, z których najwaŜniejszą byłoby zaprojektowanie własnej płytki drukowanej obejmującej całość układów elektronicznych. Ponadto naleŜałoby opracować inny sposób mocowania działa aby poprawić jego ruch w osi pionowej. Zastosowalibyśmy takŜe mikroprocesor ATMEGA16 (zamiast 16L), gdyŜ problemy z niskim napięciem bluetooth moŜna rozwiązać bardzo łatwo, a niskie napięcie mikroprocesora zmusiło nas do wprowadzenia kilku nietypowych i uciąŜliwych rozwiązań, np. konieczności stosowania buforów przed MOSFETem, nietypowego układu MAX3232, zamiast MAX232 (w momencie naszego zakupu dostępny był jedynie układ w wersji SMD, co znacząco utrudniło zamocowanie tego układu). Ponadto istnieje konieczność stosowania dwóch róŜnych źródeł napięcia. Rozwiązalibyśmy równieŜ problem ślepej strefy fotorezystorów z tyłu działa, poprzez dodanie kolejnych dwóch fotooporników z tyłu działa. Ewentualnie moglibyśmy zastosować lepsze silniki (szybsze, lub o większym przełoŜeniu).

Dodatkowym ułatwieniem mógłby być graficzny interfejs uŜytkownika, który ze względu na charakter komunikacji jest dość prosty do zaimplementowania w Javie i mógłby pozwalać na sterowanie czołgiem takŜe przy uŜyciu telefonu komórkowego. Alternatywnie moŜna zmienić sposób przyjmowania komunikatów, aby zapewnić synchronizację i obsługę pada do PlayStation 3, który równieŜ komunikuje się poprzez moduł bluetooth. To rozwiązanie jednak, ze względu na stopień skomplikowania protokołu komunikacji, mogłoby wymagać zastosowania mocniejszego mikrokontrolera jako serce układu.

Mimo wymienionych wcześniej wad, uwaŜamy projekt za udany, spełniający załoŜenia które postawiliśmy sobie na początku projektu i prezentujący duŜe moŜliwości ewentualnego dalszego rozwoju.

14

Lista cz ęści

1) L293D x2 2) ATMEGA16L 3) MOSFET BS170 4) Silnik elektryczny x4 5) Działo AEG 6) MAX3232 7) BTM-220A2 8) Port COM Ŝeński 9) Antena 10) Przełącznik trójstanowy x2 11) Rezystor 100 Ω x5 12) Rezystor 10 kΩ x3 13) Fotorezystor x2 14) Kwarc 8 MHz 15) Kondensatory 22 pF x2 16) Kondensatory 10 µF x2 17) Kondensator 100 nF x7 18) Dioda LED x5 19) Stabilizator napięciowy 3,3 V 20) Koszyk na dwie baterie x2 21) Koszyk na trzy baterie 22) Płytka uniwersalna duŜa 23) Płytka uniwersalna mała 24) Płytka wytrawiana pod BTM-222 25) Złącza goldpin ~x40 26) Blaszki goldpin 27) Korpus złącza goldpin 28) Obudowa stalowa 0,7 mm 29) Kółko zębate x2 30) Kółko tylne duŜe x2 31) Kółko małe podtrzymujące x10 32) Gąsienica gumowa x2 33) Przełącznik dwustanowy podwójny 34) Przycisk 35) Śruby maszynowe 36) Śruby plastikowe 37) Podkładki izolujące 38) Kable róŜnokolorowe 39) Drut

Kod źródłowy #define F_CPU 8000000L #include <avr/io.h> #include <util/delay.h> void sB (char c) //sendByte

15

UDR=c; loop_until_bit_is_set(UCSRA,TXC); UCSRA |= (1<<TXC); void UART_init(void) UCSRB = (0<<RXEN)|(0<<TXEN); UBRRL = (unsigned char)12; // 34800, wiecej nie trzeba a takie ma maly b³¹d UCSRB = (1<<RXEN)|(1<<TXEN); char rB() //receiveByte unsigned int i = 0; while((UCSRA&(1<<RXC)) == 0) i++; _delay_ms(10); if(i > 200) return 0; return UDR; void forward(char c) if(c == 1) OCR1A = 220; OCR1B = 220; else OCR1A = 255; OCR1B = 255; PORTB = 0xa0; sB('F');sB('O');sB('R');sB('W'); sB('A');sB('R');sB('D');sB(c+'0');sB(0x0A);sB(0x0D ); void lforward(char c) if(c == 1) OCR1A = 220; OCR1B = 205; else OCR1A = 255; OCR1B = 220; PORTB = 0xa0; sB('L');sB('F');sB('O');sB('R'); sB('W');sB('A');sB('R');sB('D'); sB(c+'0');sB(0x0A);sB(0x0D); void rforward(char c) if(c == 1) OCR1A = 205; OCR1B = 220; else OCR1A = 220; OCR1B = 255; PORTB = 0xa0; sB('R');sB('F');sB('O');sB('R'); sB('W');sB('A');sB('R');sB('D'); sB(c+'0');sB(0x0A);sB(0x0D);

16

void backward(char c) if(c == 1) OCR1A = 220; OCR1B = 220; else OCR1A = 255; OCR1B = 255; PORTB = 0x50; sB('B');sB('A');sB('C');sB('K'); sB('W');sB('A');sB('R');sB('D'); sB(c+'0');sB(0x0A);sB(0x0D); void lbackward(char c) if(c == 1) OCR1A = 220; OCR1B = 205; else OCR1A = 255; OCR1B = 220; PORTB = 0x50; sB('L');sB('B');sB('A');sB('C'); sB('K');sB('W');sB('A');sB('R'); sB('D');sB(c+'0');sB(0x0A);sB(0x0D); void rbackward(char c) if(c == 1) OCR1A = 205; OCR1B = 220; else OCR1A = 220; OCR1B = 255; PORTB = 0x50; sB('R');sB('B');sB('A'); sB('C');sB('K');sB('W');sB('A'); sB('R');sB('D');sB(c+'0');sB(0x0A);sB(0x0D); void right(char c) if(c == 1) OCR1A = 220; OCR1B = 220; else OCR1A = 255; OCR1B = 255; PORTB = 0x60; sB('R');sB('I');sB('G');sB('H');sB('T');sB(c+'0'); sB(0x0A);sB(0x0D); void left(char c) if(c == 1) OCR1A = 220; OCR1B = 220;

17

else OCR1A = 255; OCR1B = 255; PORTB = 0x90; sB('L');sB('E');sB('F');sB('T');sB(c+'0');sB(0x0A) ;sB(0x0D); void fullStop() OCR1A = 0; OCR1B = 0; PORTB = 0x00; sB('S');sB('T');sB('O');sB('P');sB(0x0A);sB(0x0D); void error() OCR1A = 0; OCR1B = 0; PORTB = 0x00; sB('E');sB('R');sB('R');sB('O');sB('R');sB(0x0A);s B(0x0D); void turret(char c) switch(c) case 'y': sB('T');sB('U');sB('R');sB('R'); sB('E');sB('T');sB('U');sB('P'); sB(0x0A);sB(0x0D); PORTC=0x88; _delay_ms(300); PORTC=0x00; break; case 'n': sB('T');sB('U');sB('R'); sB('R');sB('E');sB('T'); sB('D');sB('O');sB('W'); sB('N');sB(0x0A);sB(0x0D); PORTC=0x84; _delay_ms(100); PORTC=0x00; break; case 'g': sB('T');sB('U');sB('R');sB('R'); sB('E');sB('T');sB('L');sB('E'); sB('F');sB('T');sB(0x0A);sB(0x0D); PORTC=0x60; _delay_ms(20); PORTC=0x00; break; case 'j': sB('T');sB('U');sB('R'); sB('R');sB('E');sB('T'); sB('R');sB('I');sB('G'); sB('H');sB('T');sB(0x0A);sB(0x0D); PORTC=0x50; _delay_ms(20); PORTC=0x00; break; case 'h': sB('T');sB('U');sB('R');sB('R'); sB('E');sB('T');sB('F');sB('I'); sB('R');sB('E');sB(0x0A);sB(0x0D); PORTC=0x02; _delay_ms(1000); PORTC=0x00; break; default: break;

18

void initialize_ac(int left) ADMUX |= _BV(REFS0); // Wybranie sposobu zapisu wyniku z wyrównaniem do lewej (osiem starszych) ADMUX |= _BV(ADLAR); // Wybór kanału wej ścia - PC3 (ADC3) if (left) ADMUX &= ~_BV(MUX0); else ADMUX |= _BV(MUX0); // Zezwolenie na konwersj ę ADCSRA |= _BV(ADEN); // Wybranie cz ęstotliwo ści dla taktowania przetwornika ADCSRA |= _BV(ADPS0); ADCSRA |= _BV(ADPS1); ADCSRA |= _BV(ADPS2); void autoFire() unsigned int pomiar, pomiar_left, pomiar_right; sB('A');sB('U');sB('T');sB('O'); sB(' ‘);sB('F');sB('I');sB('R');sB('E'); sB(0x0A);sB(0x0D); while(1) initialize_ac(1); ADCSRA |= _BV(ADSC); while( ADCSRA & _BV(ADSC)) ; pomiar_left = ADCH; initialize_ac(0); ADCSRA |= _BV(ADSC); while( ADCSRA & _BV(ADSC)) ; pomiar_right = ADCH; if (pomiar_left > pomiar_right) pomiar = pomiar_left - pomiar_right; else pomiar = pomiar_right - pomiar_left; sB(0x0D); sB('L'); sB('E'); sB('F'); sB('T'); sB(':'); sB((pomiar_left/100)+'0'); sB(((pomiar_left%100)/10)+'0'); sB((pomiar_left%10)+'0'); sB(' '); sB('R'); sB('I'); sB('G'); sB('H'); sB('T'); sB(' :'); sB((pomiar_right/100)+'0'); sB(((pomiar_right%100)/10)+'0'); sB((pomiar_right%10)+'0'); sB(' '); sB('D'); sB('I'); sB('F'); sB('F'); sB(':'); sB((pomiar/100)+'0'); sB(((pomiar%100)/10)+'0'); sB((pomiar%10)+'0'); sB(' '); if (pomiar < 8) turret('h'); break; else if (pomiar_left > pomiar_right) sB('T');sB('U');sB('R');sB('R');

19

sB('E');sB('T');sB('R');sB('I'); sB('G');sB('H');sB('T'); PORTC=0x62; else sB('T');sB('U');sB('R');sB('R'); sB('E');sB('T');sB('L');sB('E'); sB('F');sB('T');sB(' '); PORTC=0x52; _delay_ms(20); PORTC=0x02; _delay_ms(10); int main(void) char c,c2=0; UART_init(); DDRB = 0xff; DDRC = 0xff; PORTC = 0x00; TCCR1A = (1<<COM1A1)|(1<<COM1B1)|(1<<WGM10); TCCR1B = (1<<CS10)|(1<<WGM12); DDRD |= 0xf0; _delay_ms(200); while(1) sB('I'); sB('N'); sB('I'); sB('T'); sB(0x0A); sB(0x0D); c = rB(); if(c == 'O') c = rB(); if(c == 'K') sB('R');sB('D');sB('Y');sB(0x0A);sB(0x0D); while(1) c = rB(); if(c == 's' || c == 0) c2 = 0; fullStop(); continue; else if(c == 'y' || c == 'j' || c == 'n' || c == 'g' || c == 'h') c2 = 0; fullStop(); turret(c); continue; else if(c == 'f') c2 = 0; fullStop(); autoFire(); continue; else if(c == 'a' || c == 'w' || c == 'd' || c == 'x' || c == 'q' || c == 'e' || c == 'c' || c == 'z ') c2 = c; continue;

20

else if(c == '1' || c == '2') switch(c2) case 'w': forward(c-'0'); break; case 'd': right(c-'0'); break; case 'x': backward(c-'0'); break; case 'a': left(c-'0'); break; case 'q': lforward(c-'0'); break; case 'e': rforward(c-'0'); break; case 'c': rbackward(c-'0'); break; case 'z': lbackward(c-'0'); break; default: error(); break; c2 = 0; else c2 = 0; error();

21

Zdjęcia

Zdj ęcie 1 Moduł komunikacyjny

Zdj ęcie 2 Podwozie

22

Zdj ęcie 3 Napęd działa

Zdj ęcie 4 Działo

23

Zdj ęcie 5 Czołg

Zdj ęcie 6 Czołg

24

Schemat

25

Bibliografia [1] Nota katalogowa MAX3232 http://www.datasheetcatalog.org/datasheet/texasinstruments/max3232.pdf [2] Nota katalogowa BTM-222 http://zefiryn.tme.pl/dok/a04/btm222_datasheet.pdf [3] Nota katalogowa ATMEGA16L http://www.atmel.com/dyn/resources/prod_documents/doc2466.pdf [4] Nota katalogowa mostka L293D http://www.datasheetcatalog.org/datasheet/texasinstruments/l293d.pdf [5] Opis standardu RS-232 http://pl.wikipedia.org/wiki/RS-232 [6] Opis działania modulacji szerokości impulsu http://pl.wikipedia.org/wiki/Pulse_Width_Modulation