Uniwersytet Warszawski Wydział Fizyki sierpień 2015 Projekt Zaliczeniowy przedmiotu Programowanie Mikrokontrolerów Immobilizer samochodowy otwierający dostęp poprzez kod czteroznakowy. Autor: Marcin Cybulski nr albumu 335690 Prowadzący zajęcia: Marcin Polkowski Opisany poniżej projekt to immobilizer samochodowy, który po wpisaniu poprawnej pięcioelementowej kombinacji czterech znaków (realizowanej przez 4 przyciski) wysyła dowolny sygnał elektryczny. W projekcie płytki PCB zostały użyte dwa tranzystory, z czego tylko jeden został wykorzystany. Po wciśnięciu poprawnej kombinacji przycisków mikrokontroler zmienia stan na wyjściu odpowiedniej nóżki połączonej z tranzystorem, który to z kolei przepuszcza prąd do stycznika. Ów stycznik dostając sygnał z tranzystora (mały prąd) przepuszcza oddzielny (większy) prąd uruchamiający pompę paliwa w samochodzie. Drugi, niewykorzystany tranzystor może służyć np. do odcinania stacyjki, ryglowania zamków w drzwiach lub innych zabezpieczeń wg. woli użytkownika. Zabezpieczenie na tym poziomie jest wystarczające, gdyż mamy cztery przyciski i dokonujemy pięciu wciśnięć, co - jak łatwo policzyć - daje nam 4 5 =1024 kombinacji. Zwiększenie ilości kombinacji sprowadza się do prostej modyfikacji kodu źródłowego programu. STRONA ) 1 Z ) 9
Do zbudowania układu wykorzystano następujące elementy przedstawione na zdjęciu: mikroprocesor ATMEGA 16A dwa kondensatory 100nF do filtrowania zasilania dwa kondensatory 22uF do filtrowania zasilania pięć przycisków typu Tact Switch dwa Goldpiny zworka dwupinowa rezystor 330Ohm dioda świecąca czerwona gniazdo do złącza typu KANDA dwa tranzystory bipolarne BC560C buzzer zasilacz sieciowy (230V -> 12V) stabilizator napięcia L7805A (12V->5V) STRONA ) 2 Z ) 9
adapter wtyczki zasilacza do płytki PCB z diodą kontrolną przekaźnik 5V 10A załączany stanem LOW lub HIGH trzy kabelki połączeniowe Cztery przyciski tworzą klawiaturę do wpisywania kodu, piąty zaś służy jako RESET. Cztery kondensatory służą do filtrowania zasilania. Prąd jest pobierany z sieci i transformowany przez zasilacz do napięcia 12V. Docelowo takie właśnie napięcie zasila układ z akumulatora samochodowego. Następnie napięcie 12V jest transformowane na 5V dzięki stabilizatorowi L7805A. Wejście zasilania do płytki jest na standardową wtyczkę dzięki czemu istnieje możliwość wygodnego demontażu urządzenia z samochodu. Dioda świecąca mruga po każdym wciśnięciu przycisku, a po wczytaniu prawidłowego kodu mruga trzy razy. Analogicznie działa buzzer, wydając charakterystyczny dźwięk po odczytaniu kodu. Buzzer jest podłączony przez zworkę, dzięki czemu w dowolnej chwili może zostać odłączony - zależnie od preferencji użytkownika. Schemat układu przedstawiono poniżej: STRONA ) 3 Z ) 9
Do zaprogramowania układu użyto uniwersalnego programatora USBasp. Kod źródłowy został skompilowany przez program WinAVR. Schemat układu oraz poniżej przedstawiony projekt płytki wykonano w programie CadSoft Eagle: Wykonana już płytka PCB wygląda jak poniżej: STRONA ) 4 Z ) 9
Program został napisany w programie Programmers Notepad z pakietu WinAVR: Kod źródłowy, który udostępniam do kopiowania jest przedstawiony poniżej: #include <avr/io.h> #include <util/delay.h> #include <inttypes.h> #define jeden PA0 //jeden jako wejscie PA0 #define dwa PA1 //i dwa jako wejscie PA1 #define trzy PA2 //i trzy jako wejscie PA2 #define cztery PA3 //i cztery jako wejscie PA3 #define ledpin PB1 //dioda na wyjsciu PA4 #define Buzzer PB0 //buzzer na wyjsciu PA5 #define stan(portt,bit) (!(_SFR_BYTE(portt) & _BV(bit))) //----------------------------------konfiguracja przyciskow------------------ void configure_pins(void) DDRB = 1 << ledpin 1 << Buzzer; //wyjscie na diodzie i buzzerze, czyli stan 1 DDRA &= ~( 1 << jeden ); //wejscie na kolejnych przyciskach czyli stan zero DDRA &= ~( 1 << dwa ); DDRA &= ~( 1 << trzy ); DDRA &= ~( 1 << cztery ); PORTA = (1 << jeden ); //stan wysoki na wejsciach (przyciskach) - domyslnie PORTA = ( 1 << dwa ); PORTA = ( 1 << trzy ); PORTA = ( 1 << cztery ); //----------------------------------zmienne globalne------------------------------------- uint8_t i=0; //zmienna okreslajaca stan przyciskow //----------------------------------------obsluga buzzera---------------------------------- void wydajdzwiek(void) PORTB = 1 << Buzzer; _delay_ms(100); PORTB &= ~( 1 << Buzzer ); PORTB = 1 << ledpin; _delay_ms(200); PORTB &= ~( 1 << ledpin ); void wydajdzwiek2(void) PORTB = 1 << Buzzer; _delay_ms(900); PORTB &= ~( 1 << Buzzer ); //----------------------------------------obsluga diody------------------------------------------- void zapaldiode(void) PORTB = 1 << ledpin; _delay_ms(200); PORTB &= ~( 1 << ledpin ); //----------------------------------okreslmy funkcje funkcja_wlasciwa-------------------------- void funkcja_wlasciwa(void) //-------------------------------------------wcisniecie1----------------------------------------- while(i==0) if (stan(pina,trzy) &&!stan(pina,jeden) &&!stan(pina,dwa) &&!stan(pina,cztery)) i=1; //wciskamy pierwszy przycisk, jesli jest to ten zgodny z kodem to przechodzimy dalej else if (stan(pina,jeden) stan(pina,dwa) stan(pina,cztery) ) //jesli przycisk jest niezgodny to i tak wydaj dzwiek STRONA ) 5 Z ) 9
while(i==1) if (stan(pina,trzy) &&!stan(pina,jeden) &&!stan(pina,dwa) &&!stan(pina,cztery) ) i=1; //jesli przycisk nadal jest przytrzymywany to nie dzieje sie nic else if (!stan(pina,trzy) &&!stan(pina,jeden) &&!stan(pina,dwa) &&!stan(pina,cztery) ) i=2; //jesli puszczamy przycisk to przechodzimy dalej, w kolejnej petli //dla 'wciesniecie2' wszystko powtarza sie analogicznie else i=0; //gdy wcisniemy inny (zly) przycisk to kod sie resetuje //-----------------------------------------wcisniecie2-------------------------- while(i==2) if (!stan(pina,trzy) &&!stan(pina,jeden) &&!stan(pina,dwa) &&!stan(pina,cztery)) i=2; else if (!stan(pina,trzy) && stan(pina,jeden) &&!stan(pina,dwa) &&!stan(pina,cztery ) ) i=3; else i=0; while(i==3) if (!stan(pina,trzy) && stan(pina,jeden) &&!stan(pina,dwa) &&!stan(pina,cztery) ) i=3; else if (!stan(pina,trzy) &&!stan(pina,jeden) &&!stan(pina,dwa) &&!stan(pina,cztery)) i=4; else i=0; //----------------------------------------wcisniecie3------------------------------------- while(i==4) if (!stan(pina,trzy) &&!stan(pina,jeden) &&!stan(pina,dwa) &&!stan(pina,cztery)) i=4; else if (!stan(pina,trzy) &&!stan(pina,jeden) &&!stan(pina,dwa) && stan(pina,cztery ) ) i=5; else i=0; while(i==5) if (!stan(pina,trzy) &&!stan(pina,jeden) &&!stan(pina,dwa) && stan(pina,cztery) ) i=5; else if (!stan(pina,trzy) &&!stan(pina,jeden) &&!stan(pina,dwa) &&!stan(pina,cztery)) i=6; else i=0; //----------------------------------------wcisniecie4--------------------------------------- while(i==6) if (!stan(pina,trzy) &&!stan(pina,jeden) &&!stan(pina,dwa) &&!stan(pina,cztery)) i=6; else if (!stan(pina,trzy) &&!stan(pina,jeden) && stan(pina,dwa) &&!stan(pina,cztery )) i=7; else i=0; while(i==7) if (!stan(pina,trzy) &&!stan(pina,jeden) && stan(pina,dwa) &&!stan(pina,cztery) ) i=7; else if (!stan(pina,trzy) &&!stan(pina,jeden) &&!stan(pina,dwa) &&!stan(pina,cztery)) i=8; else i=0; //----------------------------------------wcisniecie5----------------------------------------- while(i==8) if (!stan(pina,trzy) &&!stan(pina,jeden) &&!stan(pina,dwa) &&!stan(pina,cztery) ) i=8; else if (stan(pina,trzy) &&!stan(pina,jeden) &&!stan(pina,dwa) &&!stan(pina,cztery)) i=9; else i=0; while(i==9) if (!stan(pina,trzy) &&!stan(pina,jeden) &&!stan(pina,dwa) &&!stan(pina,cztery)) //jest dostep zapalmy diode PORTB = 1 << ledpin; wydajdzwiek2(); i=0; //resetujemy zmienna kontrolna STRONA ) 6 Z ) 9
else if (stan(pina,trzy) &&!stan(pina,jeden) &&!stan(pina,dwa) &&!stan(pina,cztery)) i=9; else i=0; //zamykam ostatniego whilea //zamykam ostatniego ifa //zamykam funkcja_wlasciwa //----------------------------------glowna czesc programu - main-------------------------------- int main(void) configure_pins(); //przypisz przyciski while (1) return 0; funkcja_wlasciwa(); //wykonuj funkcje funkcja_wlasciwa, ktora jest okreslona ponizej Zdjęcia zlutowanego układu wraz z wyprowadzonym na zewnątrz stycznikiem są przedstawione poniżej: STRONA ) 7 Z ) 9
STRONA ) 8 Z ) 9
Działanie mikrokontrolera można obejrzeć na krótkim filmiku znajdującym się pod adresem: https://www.youtube.com/watch?v=28buit2jqyq STRONA ) 9 Z ) 9