Bezpłatna biblioteka techniczna ENCYKLOPEDIA RADIOELEKTRONIKI I INŻYNIERII ELEKTRYCZNEJ Prosty robot. Encyklopedia elektroniki radiowej i elektrotechniki Encyklopedia radioelektroniki i elektrotechniki / Sprzęt do sterowania radiowego W artykule przedstawiono schemat prostego "robota". Idzie do światła, a jeśli nie ma źródła światła, aktywowany jest tryb „Swobodnego wyszukiwania”, tj. robot pojedzie, a w razie kolizji odjedzie i zawróci. Sercem robota jest mikrokontroler firmy ATMEL: AT90S2313, ale można zastosować dowolny inny tej firmy, mikrokontroler ten posiada 2kb pamięci programu, 15 portów I/O, dostępne zasilanie - 4-6V. Silniki będą sterowane przez „sterownik silnika” - mikroukład L293D (analog krajowy - KR1128KT4A). Jako czujnik zdecydowano się zastosować fotorezystory SF3-1. Robot składa się z dwóch silników. Oto jak będą działać w przypadku niektórych działań:
Używane elementy radiowe w obwodzie: Mikrokontroler AT90S2313 Mikroukład L293D (analog domowy - KR1128KT4A) 2 fotorezystor SF3-1 Kwarc przy 4 MHz Kondensatory 22-24pF Stabilizator 7805 (lub KREN5A) Rezystor 100 omów (opcjonalnie) dwa silniki Power Vbat - 4 baterie AA lub 1 korona (9V) Zasilanie Vm - 1 korona (9V) Po złożeniu układu należy wgrać program do mikrokontrolera i robot jest gotowy: /************************************************** **** *** Typ chipa: AT90S2313 Częstotliwość zegara: 4,000000 MHz Model pamięci : Mały Rozmiar zewnętrznej pamięci SRAM: 0 Rozmiar stosu danych: 32 ************************************************** ***** **/#zawiera <90s2313.h> #zawierać #włączać // przypisanie definicji dla wygody pracy z urządzeniami peryferyjnymi #define PORT OUT #definiuj SILNIK_F 7 #define SILNIK_B 6 #zdefiniuj TURN_R 5 #zdefiniuj TURN_L 4 #define W PIND #definiuj ŚWIATŁO_R 0 #define ŚWIATŁO_L 1 #define ZDERZAK_F 2 #define ZDERZAK_B 3 // Możliwe tryby jazdy wyliczenie {STOP, F, FR, FL, B, BR, BL}; //------------------------------------------------ ------------------------------ // Opóźnienie t x 10ms //------------------------------------------------ ------------------------------ void Delay_10ms (niepodpisany wykres) {znak ja; dla(i=0;i // tabela prawdopodobieństw wyboru kierunku ruchu // na podstawie aktualnego kierunku ruchu znak bez znaku p[7][7] = {14, 43, 57, 71, 86, 93, 100, 7, 43, 71, 100, 100, 100, 100, 7, 50, 93, 100, 100, 100, 100, 7, 50, 57, 100, 100, 100, 100, 29, 29, 29, 29, 57, 79, 100, 36, 36, 36, 36, 71, 93, 100, 36, 36, 36, 36, 71, 79, 100}; // aktualny kierunek ruchu unsigned char this_move; //------------------------------------------------ ------------------------------ // Włącz kombinację silników do ruchu w danym kierunku //------------------------------------------------ ------------------------------ void go (kierunek znaków bez znaku){ przełącznik (kierunek) { sprawa STOP: SILNIK_WYJ=0; OUT.SILNIK_B=0; WYJŚCIE.TURN_R=0; WYJŚCIE.TURN_L=0; break; przypadek F: SILNIK_WYJ=1; OUT.SILNIK_B=0; WYJŚCIE.TURN_R=0; WYJŚCIE.TURN_L=0; break; sprawa FR: SILNIK_WYJ=1; OUT.SILNIK_B=0; WYJŚCIE.TURN_R=1; WYJŚCIE.TURN_L=0; break; sprawa FL: SILNIK_WYJ=1; OUT.SILNIK_B=0; WYJŚCIE.TURN_R=0; WYJŚCIE.TURN_L=1; break; przypadek B: SILNIK_WYJ=0; OUT.SILNIK_B=1; WYJŚCIE.TURN_R=0; WYJŚCIE.TURN_L=0; break; sprawa BR: SILNIK_WYJ=0; OUT.SILNIK_B=1; WYJŚCIE.TURN_R=1; WYJŚCIE.TURN_L=0; break; sprawa BL: SILNIK_WYJ=0; OUT.SILNIK_B=1; WYJŚCIE.TURN_R=0; WYJŚCIE.TURN_L=1; break; } } //------------------------------------------------ ------------------------------ // Wybór kierunku ruchu w kolejnym kroku zgodnie z tabelą prawdopodobieństwa //------------------------------------------------ ------------------------------ znak bez znaku next_move(void){ niepodpisany charpp, ja; pp = rand()/327; // pobierz losową liczbę 0..99 for (i=0;i<7;i++){ // wyszukaj dopasowanie w tabeli prawdopodobieństwa if (p[this_move][i] > pp) przerwa; } this_move = i; // zapisz nowy otrzymany kierunek jako bieżący zwrot(i); } //------------------------------------------------ ------------------------------ // Obsługa przerwania przedniego zderzaka (INT0 = PD2) //------------------------------------------------ ------------------------------ przerwanie [EXT_INT0] void ext_int0_isr(void) { if(to_przeniesienie==FR) idź(BL); if(this_move==FL) idź(BR); w przeciwnym razie idź (B); Opóźnienie_10ms(250); // odlot w ciągu 2.5 x 2 sekundy Opóźnienie_10ms(250); this_move=B; } //------------------------------------------------ ------------------------------ // Obsługa przerwania tylnego zderzaka (INT1 = PD3) //------------------------------------------------ ------------------------------ przerwanie [EXT_INT1] void ext_int1_isr(void) { if(this_move==BR) idź(FL); if(this_move==BL) go(FR); w przeciwnym razie idź(F); Opóźnienie_10ms(250); // odlot w ciągu 2.5 x 2 sekundy Opóźnienie_10ms(250); this_move=F; } //------------------------------------------------ ------------------------------ // „Losowy spacer” //------------------------------------------------ ------------------------------ unsigned char walk(void){ // ta pętla organizuje „swobodne poruszanie się” podczas // brak sygnału z żadnego z czujników światła while((IN.LIGHT_R) && (IN.LIGHT_L)){ idź(następny_przesuń()); // uzyskaj następny kierunek ruchu i Opóźnienie_10ms(250); // poruszaj się w tym kierunku przez 2.5 sekundy } // ta pętla organizuje ruch do światła, podczas gdy // jest sygnał z co najmniej jednego z czujników światła podczas((IN.LIGHT_R==0) || (IN.LIGHT_L==0)){ if((IN.LIGHT_R==0) && (IN.LIGHT_L==0)) go(F); w przeciwnym razie if(IN.LIGHT_R==0) go(FR); w przeciwnym razie if(IN.LIGHT_L==0) go(FL); } powrót(0); } //------------------------------------------------ ------------------------------ // Główny program //------------------------------------------------ ------------------------------ void main (void) { DDRB=0xff; // przypisz wszystkie linie portu B do wyjścia PORTB = 0x00; // i ustaw je nisko DDRD=0x00; // przypisz wszystkie linie portu D do wejścia PORTD=0xff; // podłącz wewnętrzne rezystory obciążenia // Inicjalizacja zewnętrznych przerwań // INT0: włączone // Tryb INT0: Opadająca krawędź // INT1: włączone // Tryb INT1: Opadająca krawędź GIMSK=0xC0; MCUCR=0x0A; GIFR=0xC0; // włącz przerwania #asm("sei") // uruchom główną pętlę while(1) spacer(); } Pobierz program, plik oprogramowania układowego i schemat robota w formacie sPlan Publikacja: cxem.net Zobacz inne artykuły Sekcja Sprzęt do sterowania radiowego. Czytaj i pisz przydatne komentarze do tego artykułu. Najnowsze wiadomości o nauce i technologii, nowa elektronika: Nowy sposób kontrolowania i manipulowania sygnałami optycznymi
05.05.2024 Klawiatura Primium Seneca
05.05.2024 Otwarto najwyższe obserwatorium astronomiczne na świecie
04.05.2024
Inne ciekawe wiadomości: ▪ Drewno o dużej wytrzymałości ▪ W Układzie Słonecznym odkryto nową planetę ▪ Rozmrażanie powierzchni w sekundę Wiadomości o nauce i technologii, nowa elektronika
Ciekawe materiały z bezpłatnej biblioteki technicznej: ▪ sekcja serwisu dla lubiących podróżować - wskazówki dla turystów. Wybór artykułów ▪ artykuł Od wielkiego do śmiesznego jeden krok. Popularne wyrażenie ▪ artykuł Jaka jest najlepsza pora dnia na naukę? Szczegółowa odpowiedź ▪ artykuł Lukrecja. Legendy, uprawa, metody aplikacji ▪ przedrostek artykułu - Howler. Encyklopedia elektroniki radiowej i elektrotechniki ▪ artykuł Korektor graficzny w LA3607. Encyklopedia elektroniki radiowej i elektrotechniki
Zostaw swój komentarz do tego artykułu: Wszystkie języki tej strony Strona główna | biblioteka | Artykuły | Mapa stony | Recenzje witryn www.diagram.com.ua |