Irodákban, bevásárlóközpontokban és sok más helyen tudjuk, hogy csak az engedélykártyával rendelkező személy léphet be a szobába. Ezek a rendszerek RFID kommunikációs rendszert használnak. Az RFID-t bevásárlóközpontokban használják a lopás megakadályozására, mivel a termékeket RFID-chipkel látják el, és amikor egy személy elhagyja az épületet az RFID-chipdel, automatikusan riasztást ad ki. Az RFID címkét olyan kicsire tervezték, mint a homok. Az RFID-hitelesítési rendszereket könnyű megtervezni és olcsóak. Néhány iskola és főiskola manapság RFID-alapú látogatási rendszereket használ.
Ebben a projektben RFID alapú útdíjszedési rendszert tervezünk biztonsági célokra. Tehát ez a rendszer megnyitja a kapukat, és csak az engedélyezett RFID-címkék használatával engedi be az embereket. Az engedélyezett címkebirtokosok azonosítói be vannak programozva az ATMEGA mikrokontrollerbe, és csak azok jogosultak távozni vagy belépni a telephelyről.
Szükséges alkatrészek
Hardver: ATmega32 mikrovezérlő, tápegység (5v), AVR-ISP programozó, JHD_162ALCD (16x2 LCD modul), 100uF kondenzátor (a tápegységen keresztül csatlakozik), gomb, 10KΩ ellenállás, 100nF kondenzátor, LED (két darab), EM-18 (RFID olvasó modul), L293D motor meghajtó IC, 5 V DC motor.
Szoftver: Atmel studio 6.1, progisp vagy flash magic.
Áramköri ábra és működési magyarázat
A fent bemutatott RFID-díjbeszedő rendszer áramkörében az ATMEGA32 PORTA csatlakozik az LCD adatportjához. Itt arra kell emlékeznünk, hogy a biztosíték byte-ok megváltoztatásával tiltsa le a JTAG kommunikációt a PORTC-ben ATMEGA-ra, ha a PORTC-ot normál kommunikációs portként akarjuk használni. A 16x2 LCD-ben 16 érintkező van, ha van háttérvilágítás, ha nincs háttérvilágítás, akkor 14 tű lesz. Bekapcsolhatjuk vagy elhagyhatjuk a háttérvilágítás csapjait. Most a 14 csapok vannak 8 adatok csapok (7-14 vagy D0-D7), 2 tápegység csapok (1 & 2 vagy VSS & VDD vagy GND & + 5V), 3 rd pin kontraszt vezérlő (VEE-kontrollok milyen vastag a karaktereket kell megjeleníteni), 3 vezérlőcsap (RS & RW & E).
Az áramkörben megfigyelheti, hogy csak két vezérlőtűt vettem. Ez biztosítja a jobb megértés rugalmasságát. A kontrasztbitet és a READ / WRITE-t nem használják gyakran, így testzárlat lehet. Ez az LCD-t a legnagyobb kontrasztú és olvasási módba helyezi. Csak az ENABLE és RS csapokat kell vezérelnünk, hogy a karaktereket és az adatokat ennek megfelelően küldhessük el.
Az LCD-hez készített csatlakozások az alábbiak:
PIN1 vagy VSS a földre
PIN2 vagy VDD vagy VCC + 5v teljesítményig
PIN3 vagy VEE földelés (a legjobb kontrasztot nyújtja a kezdőknek)
PIN4 vagy RS (Register Selection) az MCU PD6-hoz
PIN5 vagy RW (olvasás / írás) a földre (az LCD-t olvasási módba állítja, megkönnyíti a kommunikációt a felhasználó számára)
PIN6 vagy E (engedélyezés) a mikrovezérlő PD5-hez
PIN7 vagy D0 - PA0
PIN8 vagy D1 - PA1
PIN9 vagy D2 - PA2
PIN10 vagy D3 - PA3
PIN11 vagy D4 - PA4
PIN12 vagy D5 - PA5
PIN13 vagy D6 - PA6
PIN14 vagy D7 - PA7
Az áramkörben látható, hogy 8 bites kommunikációt használtunk (D0-D7). Ez azonban nem kötelező, és használhatunk 4 bites kommunikációt (D4-D7), de a 4 bites kommunikációs program kissé bonyolulttá válik, ezért inkább a 8 bites kommunikációt választottam.
Tehát a fenti táblázat puszta megfigyelésétől kezdve 10 érintkezős LCD-t csatlakoztatunk a vezérlőhöz, amelyben 8 érintkező adat és 2 vezérlő érintkező.
Mielőtt továbblépnénk, meg kell értenünk a soros kommunikációt. Az RFID modul itt soros módon küldi az adatokat a vezérlőnek. Más kommunikációs módja van, de az egyszerű kommunikáció érdekében az RS232-et választjuk. A modul RS232 tűje csatlakozik az ATMEGA RXD tűjéhez.
Az RFID modul által küldött adatok a következők:
Az RFID modul interfészéhez a következő tulajdonságokra van szükség:
1. Engedélyezni kell a vezérlő RXD tűjét (adatfogadási funkcióját).
2. Mivel a kommunikáció soros, tudnunk kell, ha az adat bye beérkezik, hogy a teljes byte beérkezéséig le tudjuk állítani a programot. Ez az adatfogadás teljes megszakításának engedélyezésével történik.
3. Az RFID adatokat küld a vezérlőnek 8 bites módban. Tehát egyszerre két karakter kerül elküldésre a vezérlőnek. Ezt mutatja a fenti ábra.
4. A fenti ábra alapján nincsenek paritásbitek, egy stopbit a modul által küldött adatokban.
A fenti jellemzők a vezérlő regiszterekben vannak beállítva; röviden megvitatjuk őket,
VÖRÖS (RXEN): Ez a bit a fogadási adatok funkciót jelöli. Ezt a bitet úgy kell beállítani, hogy a modulból származó adatokat a vezérlő fogadja. Ez lehetővé teszi a vezérlő RXD tűjét is.
BROWN (RXCIE): Ezt a bitet úgy kell beállítani, hogy sikeres adatvétel után megszakítást kapjon. Ennek a bitnek az engedélyezésével megismerjük, közvetlenül a 8 bites adatok fogadása után.
PINK (URSEL): Ezt a bitet be kell állítani, mielőtt engedélyezné az UCSRC többi bitjét. Beállítás után az UCSRC, URSEL többi szükséges bitjét le kell tiltani vagy nullára kell állítani.
SÁRGA (UCSZ0, UCSZ1, UCSZ2): Ez a három bit arra szolgál, hogy kiválasszuk az egyszerre fogadott vagy küldött adatbitek számát.
Mivel az RFID modul által küldött adatok 8 bites típusúak, az UCSZ0-t, az UCSZ1-et egyre, az UCSZ2-t pedig nullára kell állítanunk.
ORANGE (UMSEL): Ezt a bitet annak alapján állítják be, hogy a rendszer aszinkron (mindkettő eltérő órát használ) vagy szinkron (mindkettő ugyanazt az órát) kommunikál.
Mivel a modul és a vezérlő különböző órát használ, ezt a bitet nullára kell állítani, vagy egyedül kell hagyni, mivel alapértelmezés szerint mind nullára vannak állítva.
ZÖLD (UPM1, UPM0): Ezt a két bitet a kommunikáció során használt bitparitás alapján állítjuk be.
Mivel az RFID modul paritás nélkül küld adatokat, mind az UPM1-et, mind az UPM0-t nullára állítottuk, vagy békén hagyhatók, mivel a regiszterek összes bitje alapértelmezés szerint nulla.
KÉK (USBS): Ez a bit arra szolgál, hogy kiválassza a stop bitek számát, amelyet a kommunikáció során használunk.
Mivel az RFID modul egy stop bittel küld adatokat, csak magunkra kell hagynunk az USBS bitet.
Most végre be kell állítanunk az adatátviteli sebességet, a fenti ábra alapján egyértelmű, hogy az RFID modul 9600 bps (bit / másodperc) sebességgel küld adatokat a vezérlőnek.
Az adatátviteli sebességet a vezérlő állítja be a megfelelő UBRRH kiválasztásával.
Az UBRRH értéket az átviteli sebesség és a CPU kristályfrekvenciájának keresztreferenciájával választjuk meg, tehát keresztreferenciával az UBRR értékét „6” -nak tekintjük, és így az átviteli sebességet beállítjuk.
Ahogy az ábra mutatja, a vezérlő két csapja az L293D-hez kerül, amely egy H-HÍD, amelyet kis teljesítményű egyenáramú motorok sebességének és forgásirányának szabályozására használnak.
Az L293D egy H-BRIDGE IC, amelyet kis teljesítményű egyenáramú motorok hajtására terveztek, és az ábrán látható, ez az IC két h-hidat tartalmaz, és így két egyenáramú motort képes meghajtani. Tehát ez az IC használható robotmotorok meghajtására a mikrovezérlő jeleiből.
Amint azt korábban megbeszéltük, ez az IC képes megváltoztatni az egyenáramú motor forgásirányát. Ez az INPUT1 és INPUT2 feszültségszintjének szabályozásával érhető el.
PIN engedélyezése |
1. bemeneti tű |
2. bemeneti tű |
Motor iránya |
Magas |
Alacsony |
Magas |
Jobbra |
Magas |
Magas |
Alacsony |
Forduljon balra |
Magas |
Alacsony |
Alacsony |
Álljon meg |
Magas |
Magas |
Magas |
Álljon meg |
Tehát, amint azt a fenti táblázat mutatja, az óra bölcs forgatásához a 2A-nak magasnak és az 1A-nak alacsonynak kell lennie. Hasonlóan az óramutató járásával ellentétes irányban az 1A-nak magasnak és a 2A-nak alacsonynak kell lennie.
Amikor engedélyezett kártyát viszünk a modul közelébe, a motort beprogramozzuk egy másodpercre az óramutató járásával megegyező irányba mozogni, hogy megmutassuk az autópálya-kaput egy másodperc múlva, amikor visszajön, jelezve, hogy az autópálya-kapu zárva van. A fizetős pláza működését az alábbiakban részletesen a C kód lépésről lépésre magyarázhatja.
Programozási magyarázat
Az alábbiakban olvasható az RFID Toll Collection rendszer kódjának sorról a sorra adott magyarázata. Az alábbi kód elolvasásával megértheti a projekt koncepcióját és működését. Letöltéshez vagy másoláshoz a teljes kódot az oldal alján találja meg.
#include // header az adatfolyam irányításának engedélyezéséhez a csapok felett
#define F_CPU 1000000 // a vezérlő kristály frekvenciája mellékelve
#include
#define E 5 // az „engedélyezés” név megadása a PORTD ötödik tűjéhez, mivel az LCD engedélyező tűhöz csatlakozik
#define RS 6 // adó neve „registerselection” 6 th csapját PORTD, mivel van kötve LCD RS pin
void send_a_command (aláíratlan char parancs);
void send_a_character (aláíratlan karakter);
void send_a_string (char * karakterlánc_ karakterei);
int main (érvénytelen)
{
DDRA = 0xFF; // a porta kimeneti csapokként való elhelyezése
DDRD = 0b11111110;
_delay_ms (50); // 50ms késleltetést ad
DDRB = 0b11110000; // Egyes portB csapok bevitele.
UCSRB - = (1 <
UCSRC - = (1 <
UCSRC & = ~ (1 <
UBRRH & = ~ (1 <
UBRRL = 6; // az adatátviteli sebesség beállítása // A következők tartalmazzák a címkék azonosítóját, ezeket meg kell változtatni a különböző címkéknél, ezeket frissíteni kell a projekt működéséhez
/ * A program vezérlőbe dobása után el kell venni a hitelesített kártyákat, és meg kell szereznie a tagek azonosítóját. Ezeket úgy kapjuk meg, hogy a címkét az RFID modul közelébe helyezzük, és az azonosító megjelenik a képernyőn. Az azonosítók megszerzése után frissíteni kell a programot úgy, hogy az alábbi azonosítószámokat új azonosítószámokkal helyettesíti.
char ADMIT = {{(0x97), (0xa1), (0x90), (0x92)}, {(0x97), (0xa1), (0x90), (0x93)}, {(0x97), (0xa1), (0x90), (0x94)}, {(0x97), (0xa1), (0x90), (0x95)}, {(0x97), (0xa1), (0x90), (0x96)}}; |
Most fent csak öt kártyát engedélyezünk, ezek tetszőleges számra módosíthatók.
Például vegye figyelembe, hogy az alapértelmezett program a vezérlőbe kerül, szerezze be azokat a kártyákat, amelyeket engedélyezni kell. Helyezzen egymás után a modul közelében, mindegyikhez megkapja az azonosítót xxxxxxxx (907a4F87) néven, Ha 7 címkénk van, akkor 7 nyolc bites azonosítónk lesz. * /
// most hét kártya esetén úgy megy // char ADMIT = {{(0x90), (0x7a), (0x4F), (0x87)},; // memória allokálása a modul által küldött azonosító megjelenítéséhez int i = 0; int szavazás = 0; int k = 0; send_a_command (0x01); // Képernyő törlése 0x01 = 00000001 késedelem_ms (50); send_a_command (0x38); // elmondja az LCD-nek, hogy 8 bites parancs / adat módot használunk késedelem_ms (50); send_a_command (0b00001111); // LCD KÉPERNYŐ BE és a futár villog char MEM; // memória allokálása a címke teljes azonosítójának tárolásához send_a_string ("RFID-SZÁM"); // karakterlánc küldése send_a_command (0x80 + 0x40 + 0); // futóprogram áthelyezése a második sorba míg (1) { míg (! (UCSRA & (1 <
{ } COUNTA = UDR; // Az UDR tárolja a kapott nyolc bites adatot, és egész számba veszi. MEM = COUNTA; // az első két karakter frissül a memóriába itoa (COUNTA, SHOWA, 16); // parancs a változó szám LCD-be helyezéséhez (változó szám, melyik karakterben cseréljük le, melyik alap változó (itt tíz, mivel a base10-ben számoljuk) send_a_string (SHOWA); // a kijelző utasítása, hogy mutassa meg a második személy karakterét (változó számmal helyettesítve), miután a futárt az LCD-re helyezte míg (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // a harmadik és negyedik karakter frissül a memóriába míg (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // az ötödik és a hatodik karakter frissül a memóriába míg (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // hetedik és nyolc karakter frissül a memóriába send_a_string (""); send_a_command (0x80 + 0x40 + 0); UCSRB & = ~ (1 <
esetén (i = 0; i <5; i ++) { ha ((MEM == ADMIT) & (MEM == ADMIT) & (MEM == ADMIT) & (MEM == ADMIT) {// A jogosultság ellenőrzése vásárol, ha egyszerre két karaktert hasonlít össze a memóriában lévő karakterekkel PORTB - = (1 <
PORTB & = ~ (1 <
_delay_ms (220); // késleltetés késedelem_ms (220); késedelem_ms (220); késedelem_ms (220); késedelem_ms (220); késedelem_ms (220); PORTB - = (1 <
PORTB & = ~ (1 <
késedelem_ms (220); késedelem_ms (220); késedelem_ms (220); késedelem_ms (220); késedelem_ms (220); késedelem_ms (220); PORTB & = ~ (1 <
PORTB - = (1 <
} } UCSRB - = (1 <
} } void send_a_command (aláíratlan karakterparancs) { PORTA = parancs; PORTD & = ~ (1 <
PORTD - = 1 <
késedelem_ms (50); PORTD & = ~ 1 <
PORTA = 0; } void send_a_character (aláíratlan karakter) { PORTA = karakter; PORTD - = 1 <
PORTD - = 1 <
késedelem_ms (50); PORTD & = ~ 1 <
PORTA = 0; } void send_a_string (char * string_of_characters) { while (* karakterláncok_0> 0) { send_a_character (* karakter_lánc_figurája ++); } } |