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, yalnızca onaylanmış oyları sayan bir oylama makinesi tasarlayacağız. Bu, RFID (Radyo Frekansı Tanımlama) etiketleri kullanılarak yapılır. Burada ATMEGA için sadece yetkili RFID etiket sahiplerinin oy kullanmasına izin veren bir program yazacağız. (Bu basit oylama makinesi projesini de kontrol edin)
Gerekli Bileşenler
Donanım: ATMEGA32, güç kaynağı (5v), AVR-ISP PROGRAMMER, JHD_162ALCD (16x2LCD), 100uF kapasitör (güç kaynağına bağlı), düğme (beş parça), 10KΩ direnç (beş parça), 100nF kapasitör (beş parça), LED (iki parça), EM-18 (RFID okuyucu modülü).
Yazılım: Atmel studio 6.1, progisp veya flash magic.
Devre Şeması ve Açıklama
ATMEGA32'nin PORTA devresinde LCD'nin veri portuna bağlanır. Burada, PORTC'yi normal bir iletişim portu olarak kullanmak istiyorsa, sigorta baytlarını değiştirerek PORTC'den ATMEGA'ya JTAG iletişimini devre dışı bırakmayı unutmamak gerekir. 16x2 LCD'de siyah ışık varsa toplam 16 pim vardır, arka ışık yoksa 14 pim olacaktır. Arka ışık pimlerine güç verebilir veya bırakabilirsiniz. Ş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. pin (VEE-karakterlerin ne kadar kalın olması gerektiğini kontrol eder) gösterilen), 3 kontrol pini (RS & RW & E)
Devrede, sadece iki kontrol pini aldığımı gözlemleyebilirsiniz, bu daha iyi anlama esnekliği sağlar, 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)
PIN4 veya RS (Kayıt Seçimi) uC'nin PD6'sına
PIN5 veya RW (Okuma / Yazma) zemine (LCD'yi okuma moduna geçirerek kullanıcı için iletişimi kolaylaştırır)
UC'nin PD5'ine PIN6 veya E (Etkinleştir)
UC'nin PIN7 veya D0 ila PA0'ı
UC'nin PIN8 veya D1 ila PA1'i
UC'nin PIN9 veya D2 ila PA2'si
UC'nin PIN10 veya D3 ila PA3'ü
UC'nin PIN11 veya D4 ila PA4'ü
UC'nin PIN12 veya D5 ila PA5'i
UC'nin PIN13 veya D6 ila PA6'sı
UC'nin PIN14 veya D7 ila PA7'si
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, Figure3 bloğunda gösterilmiştir.
4. Şekil 3'te, modül tarafından gönderilen verilerde hiçbir eşlik biti, bir durdurma 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, bu bit, modülden gelen verilerin kontrolör tarafından alınması için 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'de diğer gerekli bitleri ayarladıktan sonra UCSRC'de diğer bitleri etkinleştirmeden önce ayarlanmalıdır; URSEL 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 (FIGURE3) UCSZ0, UCSZ1'i bire ve UCSZ2'yi sıfıra ayarlamamız gerekir.
TURUNCU (UMSEL): Bu bit, sistemin asenkron (her ikisi de farklı saat kullanır) veya senkronize (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 (FIGURE3), hem UPM1 hem de UPM0'ı sıfıra ayarladık veya herhangi bir yazmaçtaki 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 durma biti ile gönderdiğinden (şekil 3), USBS bitini yalnız bırakmamız gerekiyor.
Şimdi nihayet baud hızını ayarlamamız gerekiyor, şekil 3'ten 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.
Burada beş düğme var, dördü adayların oylarını artırmak için ve beşincisi adayların oylarını sıfırlamak içindir. Burada bulunan kapasitörler, düğmelerin sıçrama etkisini geçersiz kılmak içindir. Çıkarılırlarsa, düğmeye her basıldığında denetleyici birden fazla sayabilir.
Pimler için bağlanan dirençler, pimi yere çekmek için düğmeye basıldığında akımı sınırlamak içindir. Bir düğmeye her basıldığında, denetleyicinin ilgili pimi yere çekilir ve böylece denetleyici, belirli bir düğmeye basıldığını ve buna karşılık gelen eylemin yapılacağını fark eder, basılan düğmeye bağlı olarak aday oyları artırabilir veya oyları sıfırlayabilir.
Karşılık gelen bir kişiyi temsil eden düğmeye basıldığında, kontrolör onu seçer ve arttıktan sonra belleğindeki karşılık gelen kişi numarasını artırır, 16x2 LCD ekranda karşılık gelen kişi puanını gösterir.
Oylama makinesinin çalışması en iyi aşağıda verilen C kodunun adım adım açıklanmasıdır:
Kod Açıklama
Pinler üzerinde veri akışı denetimini etkinleştirmek için #include // başlığı
#define F_CPU 1000000 // denetleyiciye bağlı kristal frekansını anlatmak
#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 pinleri alıyoruz.
UCSRB - = (1 <
// verilerin tam kesinti almasını sağlamak, veri alma pinini etkinleştirmek
UCSRC - = (1 <
// ilk olarak URSEL'i ayarlayarak diğer bitleri değiştirme, 8 bit iletişim için ayarlama
UCSRC & = ~ (1 <
UBRRH & = ~ (1 <
UBRRL = 6; // baud hızını ayarlama
int16_t VOTEA = 0; // kişi1 bellek depolamaya oy verir
char A; // LCD'de karakter görüntüleyen kişi1 oy
int16_t VOTEB = 0;; // kişi2 bellek depolayarak oy verir
char B; // LCD'de karakter görüntüleyen kişi2 oy
int16_t VOTEC = 0;; // hafızayı depolayan kişi3 oy
char C; // LCD'de karakter görüntüleyen kişi3 oy
int16_t OY VERİLEN = 0;; // bellek depolayan kişi4 oy
karakter D; / / person4 oy karakteri LCD'de görüntüleniyor
// 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 yetkilendirilmesi gereken kartların alınması ve etiket kimliğinin alınması gerekir, bunlar etiket RFID modülünün yanına yerleştirilerek elde edilir ve ekranda ID 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ı birbiri ardına modülün yanına yerleştirin, her biri için xxxxxxxx (907a4F87) olarak kimlik alacaksınız
Elimizde 7 etiket varsa, o zaman 7 sekiz bit kimliğimiz olur.
// şimdi yedi kart için şöyle gidiyor // char ADMIT = {{(0x90), (0x7a), (0x4F), (0x87)}, // modül tarafından 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 modu kullandığımızı söylüyorum _delay_ms (50); send_a_command (0b00001111); // LCD EKRAN AÇIK ve kursiyer yanıp sönüyor char MEM; // etiketin tam kimliğini saklamak için bellek ayırma send_a_string ("RFID NUMBER"); // dizge gönderme send_a_command (0x80 + 0x40 + 0); // kursiyerin ikinci satıra taşınması süre (1) { while (! (UCSRA & (1 <
{ } COUNTA = UDR; // UDR, alınan sekiz bitlik veriyi depolar ve bir tamsayı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); // yarışmacıyı LCD'ye yerleştirdikten sonra ekrana ikinci kişinin karakterini (değişken sayı ile değiştirildi) göstermesini söyleme 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 <
oy = 1; // yetkilendirilmişse OY VER } } eğer (oy == 0) // oylama yapılmadıysa yetkilendirme başarısız oldu { UCSRB - = (1 <
} while (vot == 1) // yetkilendirildiyse oylanana kadar bu döngüyü yapın { send_a_command (0x80 + 0); // 1. satırda sıfır konumuna git send_a_string ("ŞİMDİ OY VER"); // dizge görüntüleniyor if (bit_is_clear (PINB, 0)) // birinci düğmeye basıldığında { VOTEA ++; // birinci kişinin oy hafızasını bir artır vot = 0; // oylamadan sonra döngü devam ederken izin verme } if (bit_is_clear (PINB, 1)) // düğme 2'ye basıldığında { VOTEB ++; // 2. kişinin oy hafızasını birer birer artır oy = 0; } eğer (bit_is_clear (PINB, 2)) // 3. butona basıldığında { VOTEC ++; // 3. kişinin oy hafızasını birer birer artır oy = 0; } if (bit_is_clear (PINB, 3)) // düğme 4'e basıldığında { VOTED ++; // 4. kişinin oy hafızasını birer birer artır oy = 0; } eğer (oy == 0) // oy alındıktan sonra onaylanır { send_a_command (0x80 + 0); // 1. satırın sıfır konumuna git send_a_string ("OY İÇİN TEŞEKKÜRLER"); // dizeyi göster için (k = 0; k <10; k ++) { _delay_ms (220); } PORTB & = ~ (1 <
send_a_command (0x01); send_a_command (0x80 + 0); // dört kişinin tümünün oylarını gösteriyor send_a_string ("A ="); send_a_command (0x80 + 2); itoa (VOTEA, A, 10); send_a_string (A); send_a_command (0x80 + 8); send_a_string ("B ="); send_a_command (0x80 + 10); itoa (VOTEB, B, 10); send_a_string (B); send_a_command (0x80 + 0x40 + 0); send_a_string ("C ="); send_a_command (0x80 + 0x40 + 2); itoa (VOTEC, C, 10); send_a_string (C); send_a_command (0x80 + 0x40 + 8); send_a_string ("D ="); send_a_command (0x80 + 0x40 + 10); itoa (OY VERİLEN, D, 10); send_a_string (D); send_a_command (0x80 + 0x40 + 16); için (k = 0; k <25; k ++) { _delay_ms (220); } UCSRB - = (1 <
send_a_command (0x01); send_a_command (0x80 + 0); // sıfır konumuna gidiyoruz send_a_string ("RFID NUMARASI"); // bir dizi gönder send_a_command (0x80 + 0x40 + 0); } } 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 ++); } } |