Ofislerde, alışveriş merkezlerinde ve sadece yetkilendirme kartı olan kişinin odaya girmesine izin verilen diğer birçok yerde biliyoruz. Bu sistemler RFID iletişim sistemini kullanır. RFID, alışveriş merkezlerinde ürünler RFID çip ile etiketlendiğinden hırsızlığı durdurmak için kullanılır ve bir kişi binadan RFID çipi ile çıktığında otomatik olarak alarm verilir. RFID etiketi, kumun bir parçası kadar küçük tasarlanmıştır. RFID kimlik doğrulama sistemlerinin tasarımı kolaydır ve maliyeti ucuzdur. Günümüzde bazı okullar ve kolejler RFID tabanlı devam sistemleri kullanmaktadır.
Bu projede güvenlik amacıyla RFID tabanlı bir geçiş ücreti tahsilat sistemi tasarlayacağız. Yani bu sistem kapıları açar ve insanlara sadece yetkili RFID etiketleri ile izin verir. Yetkili etiket sahibi kimlikleri ATMEGA Mikroişlemciye programlanır ve sadece bu sahiplerin tesislerden çıkmasına veya girmesine izin verilir.
Gerekli Bileşenler
Donanım: ATmega32 mikro denetleyici, güç kaynağı (5v), AVR-ISP Programcı, JHD_162ALCD (16x2 LCD modülü), 100uF kapasitör (güç kaynağına bağlı), düğme, 10KΩ direnç, 100nF kapasitör, LED (iki parça), EM-18 (RFID okuyucu modülü), L293D motor sürücüsü IC, 5V DC motor.
Yazılım: Atmel studio 6.1, progisp veya flash magic.
Devre Şeması ve Çalışma Açıklaması
Olarak RFID otoyol geçiş ücreti ödeme sistemi devresi yukarıda gösterilen ATmega32 Porta LCD veri girişine bağlanır. Burada, PORTC'yi normal bir iletişim portu olarak kullanmak istersek, sigorta baytlarını değiştirerek PORTC'deki JTAG iletişimini ATMEGA'ya devre dışı bırakmayı unutmamalıyız. 16x2 LCD'de arka ışık varsa 16 pim, arka ışık yoksa 14 pim vardır. Arka ışık pimlerine güç verebilir veya bırakabiliriz. Şimdi 14 pimde 8 veri pini (7-14 veya D0-D7), 2 güç kaynağı pini (1 ve 2 veya VSS ve VDD veya gnd ve + 5v), kontrast kontrolü için 3. pim (VEE kontrolleri ne kadar kalın karakterler gösterilmelidir), 3 kontrol pini (RS & RW & E).
Devrede sadece iki kontrol pini aldığımı gözlemleyebilirsiniz. Bu, daha iyi anlama esnekliği verir. Kontrast biti ve READ / WRITE sık kullanılmadığından toprağa kısa devre yapılabilir. Bu, LCD'yi en yüksek kontrast ve okuma moduna getirir. Karakterleri ve verileri buna göre göndermek için sadece ENABLE ve RS pinlerini kontrol etmemiz gerekiyor.
LCD için yapılan bağlantılar aşağıda verilmiştir:
PIN1 veya VSS toprağa
PIN2 veya VDD veya VCC ila + 5v güç
Zemine PIN3 veya VEE (yeni başlayanlar için en iyi maksimum kontrastı verir)
MCU'nun PD6'sına PIN4 veya RS (Kayıt Seçimi)
PIN5 veya RW (Okuma / Yazma) zemine (LCD'yi okuma moduna geçirerek kullanıcı için iletişimi kolaylaştırır)
Mikroişlemcinin PD5'ine PIN6 veya E (Etkinleştir)
PIN7 veya D0 - PA0
PIN8 veya D1 - PA1
PIN9 veya D2 - PA2
PIN10 veya D3 - PA3
PIN11 veya D4 - PA4
PIN12 veya D5 - PA5
PIN13 veya D6 - PA6
PIN14 veya D7 - PA7
Devrede 8bit haberleşme (D0-D7) kullandığımızı görebilirsiniz. Ancak bu zorunlu değildir ve 4 bit iletişim (D4-D7) kullanabiliriz ancak 4 bit iletişim programı ile biraz karmaşıklaştığı için 8 bit iletişimi tercih ettim.
Bu nedenle, yukarıdaki tablonun sadece gözleminden, 10 pin LCD'yi 8 pinin veri pini ve kontrol için 2 pini olan denetleyiciye bağlıyoruz.
Devam etmeden önce, seri iletişimi anlamamız gerekiyor. Buradaki RFID modülü verileri kontrolöre seri olarak gönderir. Başka bir iletişim modu var, ancak kolay iletişim için RS232'yi seçiyoruz. Modülün RS232 pini ATMEGA'nın RXD pinine bağlanır.
RFID modülü tarafından gönderilen veriler şu şekilde gider:
Şimdi RFID modülü arayüzü için aşağıdaki özellikler gereklidir:
1. Denetleyicinin RXD pini (veri alma özelliği) etkinleştirilmelidir.
2. İletişim seri olduğundan, veri baytının ne zaman alındığını bilmemiz gerekir, böylece tam bayt alınana kadar programı durdurabiliriz. Bu, bir verinin tam bir kesinti almasını sağlayarak yapılır.
3. RFID, verileri 8 bit modunda kontrolöre gönderir. Böylece kontrolöre bir seferde iki karakter gönderilecektir. Bu, yukarıdaki şekilde gösterilmektedir.
4. Yukarıdaki şekilde, modül tarafından gönderilen verilerde hiçbir eşlik biti, bir durak biti yoktur.
Yukarıdaki özellikler denetleyici kayıtlarında ayarlanır; kısaca tartışacağız,
KIRMIZI (RXEN): Bu bit, veri alma özelliğini temsil eder. Modülden gelen verilerin kontrolör tarafından alınması için bu bit ayarlanmalıdır. Ayrıca kontrolörün RXD pinini etkinleştirir.
BROWN (RXCIE): Bu bit, başarılı veri alımından sonra bir kesinti almak için ayarlanmalıdır. Bu biti etkinleştirerek, 8 bit veri alımından hemen sonra öğreniriz.
PINK (URSEL): Bu bit, UCSRC'deki diğer bitleri etkinleştirmeden önce ayarlanmalıdır. Ayarlandıktan sonra, UCSRC, URSEL'deki diğer gerekli bitler devre dışı bırakılmalı veya sıfırlanmalıdır.
SARI (UCSZ0, UCSZ1, UCSZ2): Bu üç bit, tek seferde aldığımız veya gönderdiğimiz veri bitlerinin sayısını seçmek için kullanılır.
RFID modülü tarafından gönderilen veri 8bit veri tipi olduğu için UCSZ0, UCSZ1'i bire ve UCSZ2'yi sıfıra ayarlamamız gerekiyor.
TURUNCU (UMSEL): Bu bit, sistemin eşzamansız (her ikisi de farklı saat kullanır) veya eşzamanlı (her ikisi de aynı saati kullanır) iletişim kurup kurmadığına göre ayarlanır.
Modül ve denetleyici farklı saat kullandığından, tümü varsayılan olarak sıfıra ayarlandığından bu bit sıfıra ayarlanmalı veya yalnız bırakılmalıdır.
YEŞİL (UPM1, UPM0): Bu iki bit, iletişimde kullandığımız bit eşliğine göre ayarlanır.
RFID modülü paritesiz veri gönderdiğinden, hem UPM1 hem de UPM0'ı sıfıra ayarladık ya da herhangi bir kayıttaki tüm bitler varsayılan olarak sıfıra ayarlandığından bunlar yalnız bırakılabilir.
MAVİ (USBS): Bu bit, iletişim sırasında kullandığımız durdurma bitlerinin sayısını seçmek için kullanılır.
RFID modülü verileri bir durak biti ile gönderdiğinden, USBS bitini yalnız bırakmamız gerekiyor.
Şimdi nihayet baud hızını ayarlamamız gerekiyor, yukarıdaki şekilden, RFID modülünün verileri denetleyiciye 9600bps (saniyede bit) baud hızında gönderdiği açıktır.
Baud hızı, uygun UBRRH seçilerek denetleyicide ayarlanır.
UBRRH değeri, baud hızı ve CPU kristal frekansı çapraz referans alınarak seçilir, dolayısıyla çapraz referansla UBRR değeri '6' olarak görülür ve böylece baud hızı ayarlanır.
Şimdi şekilde gösterildiği gibi, denetleyiciden gelen iki pin, düşük güçlü DC motorlar için hızı ve dönüş yönünü kontrol etmek için kullanılan bir H-BRIDGE olan L293D'ye gider.
L293D, düşük güçlü DC motorları çalıştırmak için tasarlanmış bir H-BRIDGE IC'dir ve şekilde gösterilmiştir, bu IC iki h-köprüsünden oluşur ve böylece iki DC motoru çalıştırabilir. Bu IC, robot motorlarını mikrodenetleyicinin sinyallerinden sürmek için kullanılabilir.
Şimdi daha önce tartışıldığı gibi, bu IC, DC motorun dönüş yönünü değiştirme yeteneğine sahiptir. Bu, INPUT1 ve INPUT2'deki voltaj seviyelerini kontrol ederek elde edilir.
PIN'i Etkinleştir |
Giriş Pimi 1 |
Giriş Pimi 2 |
Motor Yönü |
Yüksek |
Düşük |
Yüksek |
Sağa dönün |
Yüksek |
Yüksek |
Düşük |
Sola çevirin |
Yüksek |
Düşük |
Düşük |
Dur |
Yüksek |
Yüksek |
Yüksek |
Dur |
Yukarıdaki tabloda gösterildiği gibi, saat yönünde dönüş için 2A yüksek ve 1A düşük olmalıdır. Benzer şekilde saat yönünün tersi için 1A yüksek ve 2A düşük olmalıdır.
Modülün yanına bir yetkili kart getirildiğinde, motor, ücretli geçiş kapısının bir saniye sonra açıldığını gösterecek şekilde bir saniye saat yönünde hareket edecek şekilde programlanır ve gişe kapısının kapandığını belirtir. Ücretli gişenin çalışması en iyi aşağıda verilen C kodu adım adım açıklanmaktadır.
Programlama Açıklaması
RFID Geçiş Ücreti Tahsilat Sistemi kodunun satır satır açıklaması aşağıdadır. Aşağıdaki kodu okuyarak bu projenin konseptini ve çalışmasını anlayabilirsiniz. İndirmek veya kopyalamak için kodun tamamını sayfanın altında bulabilirsiniz.
Pinler üzerinde veri akışı denetimini etkinleştirmek için #include // başlığı
#define F_CPU 1000000 // denetleyiciye bağlı kristal frekansını belirtir
#Dahil etmek
#define E 5 // LCD etkinleştirme pinine bağlı olduğu için PORTD'nin 5. pinine “enable” adını verin
#define RS 6 // 6 isim “registerselection” vererek inci LCD RS bacağına bağlı olduğu için, PORTD ait pimi
void send_a_command (işaretsiz karakter komutu);
void send_a_character (işaretsiz karakter karakteri);
void send_a_string (char * string_of_characters);
int main (void)
{
DDRA = 0xFF; // porta'yı çıkış pinleri olarak koymak
DDRD = 0b11111110;
_delay_ms (50); // 50ms gecikme veriyor
DDRB = 0b11110000; // Giriş olarak bazı portB pinlerini alıyoruz.
UCSRB - = (1 <
UCSRC - = (1 <
UCSRC & = ~ (1 <
UBRRH & = ~ (1 <
UBRRL = 6; // baud hızını ayarlama // Aşağıdakiler etiketlerin kimliğini içerir, bunlar farklı etiketler için değiştirilmelidir, Projenin çalışması için bunların güncellenmesi gerekir
/ * Programın denetleyiciye dökülmesinden sonra yetkili olması gereken kartları alıp etiket kimliğini alması gerekir. Bunlar, etiketin RFID modülünün yanına yerleştirilmesiyle elde edilir ve kimlik ekranda gösterilecektir. ID'ler alındıktan sonra aşağıdaki ID numaraları yeni ID numaraları ile değiştirilerek program güncellenmelidir.
karakter ADMIT = {{(0x97), (0xa1), (0x90), (0x92)}, {(0x97), (0xa1), (0x90), (0x93)}, {(0x97), (0xa1), (0x90), (0x94)}, {(0x97), (0xa1), (0x90), (0x95)}, {(0x97), (0xa1), (0x90), (0x96)}}; |
Şimdi yukarıda sadece beş karta yetki veriyoruz, bunlar herhangi bir sayıya değiştirilebilir.
Örneğin, varsayılan programın denetleyiciye atıldığını düşünün, yetkilendirilmesi gereken kartları alın. Modülün yakınına birbiri ardına yerleştirin, her birinin kimliğini xxxxxxxx (907a4F87) olarak alacaksınız, Elimizde 7 etiket varsa, o zaman 7 sekiz bit kimliğimiz olur. * /
// şimdi yedi kart için şöyle gidiyor // karakter ADMIT = {{(0x90), (0x7a), (0x4F), (0x87)},; // Modüle göre gönderilen kimliği göstermek için bellek ayırma int i = 0; int oy = 0; int k = 0; send_a_command (0x01); // Ekranı Temizle 0x01 = 00000001 _delay_ms (50); send_a_command (0x38); // lcd'ye 8 bit komut / veri modunu kullandığımızı söylüyorum _delay_ms (50); send_a_command (0b00001111); // LCD EKRAN AÇIK ve yarışmacı yanıp sönüyor char MEM; // etiketin tam kimliğini depolamak için bellek ayırma send_a_string ("RFID NUMARASI"); // dizi gönderme send_a_command (0x80 + 0x40 + 0); // yarışmacı ikinci satıra taşınıyor süre (1) { while (! (UCSRA & (1 <
{ } COUNTA = UDR; // UDR, alınan sekiz bitlik verileri depolar ve bir tam sayıya alınır. MEM = COUNTA; // ilk iki karakter hafızaya güncellenir itoa (COUNTA, SHOWA, 16); // LCD'ye değişken sayı koymak için komut (değişken sayı, hangi karakterin değiştirileceği, hangi tabanın değişken olduğu (burada base10'da sayıyı sayarken on)) send_a_string (SHOWA); // ata bineni LCD'ye yerleştirdikten sonra ekrana ikinci kişinin karakterini (değişken sayı ile değiştirildi) göstermesini söylemek while (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // üçüncü ve dördüncü karakterler hafızaya güncellenir while (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // beşinci ve altıncı karakterler belleğe güncellenir while (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // yedinci ve sekiz karakter hafızaya güncellenir send_a_string (""); send_a_command (0x80 + 0x40 + 0); UCSRB & = ~ (1 <
için (i = 0; i <5; i ++) { eğer ((MEM == ADMIT) & (MEM == ADMIT) & (MEM == ADMIT) & (MEM == ADMIT)) {// yetkilendirmeyi kontrol ederek iki karakteri hafızadaki karakterlerle aynı anda karşılaştırarak PORTB - = (1 <
PORTB & = ~ (1 <
_delay_ms (220); // gecikme _delay_ms (220); _delay_ms (220); _delay_ms (220); _delay_ms (220); _delay_ms (220); PORTB - = (1 <
PORTB & = ~ (1 <
_delay_ms (220); _delay_ms (220); _delay_ms (220); _delay_ms (220); _delay_ms (220); _delay_ms (220); PORTB & = ~ (1 <
PORTB - = (1 <
} } UCSRB - = (1 <
} } void send_a_command (işaretsiz karakter komutu) { PORTA = komut; PORTD & = ~ (1 <
PORTD - = 1 <
_delay_ms (50); PORTD & = ~ 1 <
PORTA = 0; } void send_a_character (işaretsiz karakter karakteri) { PORTA = karakter; PORTD - = 1 <
PORTD - = 1 <
_delay_ms (50); PORTD & = ~ 1 <
PORTA = 0; } void send_a_string (char * string_of_characters) { while (* string_of_characters> 0) { send_a_character (* string_of_characters ++); } } |