Kami tahu di pejabat, pusat membeli-belah dan di banyak tempat lain di mana hanya orang yang mempunyai kad kebenaran dibenarkan memasuki bilik. Sistem ini menggunakan sistem komunikasi RFID. RFID digunakan di pusat membeli-belah untuk menghentikan pencurian kerana produk ditandai dengan cip RFID dan ketika seseorang meninggalkan bangunan dengan cip RFID, penggera akan dibunyikan secara automatik. Tag RFID direka sekecil pasir. Sistem pengesahan RFID senang dirancang dan harganya murah. Beberapa sekolah dan kolej kini menggunakan sistem kehadiran berdasarkan RFID.
Dalam projek ini kita akan merancang mesin pengundian yang hanya mengira undi yang disahkan. Ini dilakukan dengan menggunakan tag RFID (Radio Frequency Identification). Di sini kita akan menulis program untuk ATMEGA untuk membenarkan hanya pemegang tag RFID yang sah untuk memilih. (Lihat juga projek mesin undi mudah ini)
Komponen Diperlukan
Perkakasan: ATMEGA32, bekalan kuasa (5v), AVR-ISP PROGRAMMER, JHD_162ALCD (16x2LCD), kapasitor 100uF (disambungkan merentasi bekalan kuasa), butang (lima keping), perintang 10KΩ (lima keping), kapasitor 100nF (lima keping), LED (dua keping), EM-18 (modul pembaca RFID).
Perisian: Atmel studio 6.1, progisp atau flash magic.
Rajah dan Penjelasan Litar
Dalam litar PORTA ATMEGA32 disambungkan ke port data LCD. Di sini seseorang harus ingat untuk mematikan komunikasi JTAG di PORTC ke ATMEGA dengan menukar bait fius, jika seseorang ingin menggunakan PORTC sebagai port komunikasi biasa. Dalam LCD 16x2 terdapat 16 pin secara keseluruhan jika ada lampu hitam, jika tidak ada lampu belakang akan ada 14 pin. Seseorang boleh menghidupkan atau meninggalkan pin lampu belakang. Sekarang dalam 14 pin terdapat 8 data pin (7-14 atau D0-D7), 2 pin bekalan kuasa (1 & 2 atau VSS & VDD atau GND & + 5V), 3 rd pin untuk kawalan kontras (VEE-kawalan berapa tebal watak-watak perlu ditunjukkan), 3 pin kawalan (RS & RW & E)
Di litar, anda dapat melihat bahawa saya hanya mengambil dua pin kawalan, ini memberi fleksibiliti pemahaman yang lebih baik, bit kontras dan BACA / MENULIS tidak sering digunakan sehingga boleh dipendekkan ke tanah. Ini meletakkan LCD dalam mod kontras dan baca tertinggi. Kita hanya perlu mengawal pin ENABLE dan RS untuk menghantar watak dan data yang sesuai.
Sambungan yang dilakukan untuk LCD diberikan di bawah:
PIN1 atau VSS ke pembumian
PIN2 atau VDD atau VCC untuk +5v kuasa
PIN3 atau VEE ke ground (memberikan kontras maksimum terbaik untuk pemula)
PIN4 atau RS (Daftar Pilihan) ke PD6 uC
PIN5 atau RW (Baca / Tulis) ke tanah (meletakkan LCD dalam mod baca memudahkan komunikasi untuk pengguna)
PIN6 atau E (Aktifkan) ke PD5 uC
PIN7 atau D0 hingga PA0 dari uC
PIN8 atau D1 hingga PA1 dari uC
PIN9 atau D2 hingga PA2 dari uC
PIN10 atau D3 hingga PA3 dari uC
PIN11 atau D4 hingga PA4 dari uC
PIN12 atau D5 hingga PA5 dari uC
PIN13 atau D6 hingga PA6 dari uC
PIN14 atau D7 hingga PA7 dari uC
Di litar, anda dapat melihat kami telah menggunakan komunikasi 8bit (D0-D7). Namun ini bukan wajib dan kita boleh menggunakan komunikasi 4bit (D4-D7) tetapi dengan program komunikasi 4 bit menjadi sedikit rumit, jadi saya lebih suka komunikasi 8 bit.
Oleh itu, dari pemerhatian dari jadual di atas, kita menyambungkan 10 pin LCD ke pengawal di mana 8 pin adalah pin data dan 2 pin untuk kawalan.
Sebelum melangkah ke hadapan, kita perlu memahami mengenai komunikasi bersiri. Modul RFID di sini menghantar data ke pengawal secara bersiri. Ia mempunyai mod komunikasi yang lain tetapi untuk komunikasi yang mudah, kita memilih RS232. Pin modul RS232 disambungkan ke pin RXD ATMEGA.
Data yang dihantar oleh modul RFID adalah seperti:
Sekarang untuk antara muka modul RFID, ciri berikut diperlukan:
1. Pin RXD (ciri penerimaan data) pengawal mesti diaktifkan.
2. Oleh kerana komunikasi bersifat bersiri, kita perlu mengetahui setiap kali data selamat diterima, sehingga kita dapat menghentikan program sehingga bait lengkap diterima. Ini dilakukan dengan membolehkan data menerima gangguan sepenuhnya.
3. RFID menghantar data ke pengawal dalam mod 8bit. Oleh itu, dua watak akan dihantar ke pengawal pada satu masa. Ini ditunjukkan dalam blok gambar3
4. Dari gambar3, tidak ada bit pariti, satu bit berhenti dalam data yang dihantar oleh modul.
Ciri-ciri di atas ditetapkan dalam daftar pengawal; kita akan membincangkannya secara ringkas,
MERAH (RXEN): Bit ini mewakili ciri data terima, bit ini mesti ditetapkan agar data dari modul diterima oleh pengawal, ia juga membolehkan pin pengawal RXD.
BROWN (RXCIE): Bit ini mesti ditetapkan untuk mendapat gangguan setelah penerimaan data berjaya. Dengan mengaktifkan bit ini kita dapat mengetahui, tepat setelah data 8 bit diterima.
PINK (URSEL): Bit ini mesti ditetapkan sebelum mengaktifkan bit lain di UCSRC, setelah menetapkan bit lain yang diperlukan di UCSRC; URSEL mesti dilumpuhkan atau dihentikan.
KUNING (UCSZ0, UCSZ1, UCSZ2): Ketiga bit ini digunakan untuk memilih bilangan bit data yang kami terima atau hantar dalam sekali jalan.
Oleh kerana data yang dihantar oleh modul RFID adalah jenis data 8bit (GAMBAR3), kita harus menetapkan UCSZ0, UCSZ1 menjadi satu dan UCSZ2 menjadi sifar.
ORANGE (UMSEL): Bit ini ditetapkan berdasarkan sama ada sistem berkomunikasi secara tidak segerak (kedua-duanya menggunakan jam yang berbeza) atau segerak (kedua-duanya menggunakan jam yang sama),
Oleh kerana modul dan pengawal menggunakan jam yang berbeza, bit ini mesti ditetapkan ke sifar atau dibiarkan sahaja kerana semuanya ditetapkan ke sifar secara lalai.
HIJAU (UPM1, UPM0): Kedua-dua bit ini disesuaikan berdasarkan pariti bit yang kita gunakan dalam komunikasi.
Oleh kerana modul RFID menghantar data tanpa pariti (GAMBAR3), kami telah menetapkan kedua-dua UPM1, UPM0 menjadi sifar atau mereka boleh dibiarkan begitu sahaja kerana semua bit dalam daftar disetel ke nol secara lalai.
BLUE (USBS): Bit ini digunakan untuk memilih bilangan bit berhenti yang kita gunakan semasa komunikasi.
Oleh kerana modul RFID menghantar data dengan satu bit berhenti (gambar3), kita hanya perlu meninggalkan USBS sedikit sahaja.
Akhirnya kita perlu menetapkan kadar baud, dari gambar3 jelas bahawa modul RFID menghantar data ke pengawal dengan kadar baud 9600bps (bit per saat).
Kadar baud ditetapkan dalam pengawal dengan memilih UBRRH yang sesuai,
Nilai UBRRH dipilih dengan kadar baud silang dan frekuensi kristal CPU,
Oleh itu, nilai UBRR rujukan silang dilihat sebagai '6', dan kadar baud ditetapkan.
Terdapat lima butang di sini, empat untuk menambah undi calon dan yang kelima adalah untuk menetapkan semula undi calon menjadi sifar. Kapasitor yang ada di sini adalah untuk membatalkan kesan butang yang memantul. Sekiranya mereka dikeluarkan, pengawal mungkin mengira lebih dari satu setiap kali butang ditekan.
Perintang yang disambungkan untuk pin adalah untuk menghadkan arus, apabila butang ditekan untuk menarik pin ke tanah. Setiap kali butang ditekan, pin pengawal yang sesuai ditarik ke tanah dan oleh itu pengawal menyedari bahawa butang tertentu ditekan dan tindakan yang sesuai yang harus diambil, ia mungkin meningkatkan suara calon atau menetapkan semula suara bergantung pada butang yang ditekan.
Apabila butang yang mewakili orang yang sesuai ditekan, pengawal memilihnya dan menambah nombor orang yang sesuai di dalam ingatannya setelah kenaikan itu menunjukkan skor orang yang sesuai pada paparan LCD 16x2.
Cara kerja mesin pengundian dijelaskan dengan lebih baik dalam langkah demi langkah kod C yang diberikan di bawah:
Penjelasan Kod
#include // header untuk membolehkan kawalan aliran data ke atas pin
#define F_CPU 1000000 // memberitahu frekuensi kristal pengawal dilampirkan
#sertakan
#define E 5 // memberikan nama "aktifkan" ke pin ke- 5 PORTD, kerana disambungkan ke LCD mengaktifkan pin
#definisi RS 6 // memberikan nama "registerelection" ke pin ke- 6 PORTD, kerana disambungkan ke pin LCD RS
batal send_a_command (perintah char yang tidak ditandatangani);
batal send_a_character (watak char yang tidak ditandatangani);
batal send_a_string (char * string_of_characters);
int utama (tidak sah)
{
DDRA = 0xFF; // meletakkan porta sebagai pin output
DDRD = 0b11111110;
_delay_ms (50); // memberikan kelewatan 50ms
DDRB = 0b11110000; // Mengambil beberapa pin portB sebagai input.
UCSRB - = (1 <
// membolehkan data menerima gangguan sepenuhnya, membolehkan data menerima pin
UCSRC - = (1 <
// menukar bit lain dengan menetapkan URSEL terlebih dahulu, menetapkan komunikasi 8 bit
UCSRC & = ~ (1 <
UBRRH & = ~ (1 <
UBRRL = 6; // menetapkan kadar baud
int16_t VOTEA = 0; // orang1 suara menyimpan memori
char A; // orang1 suara memaparkan watak pada LCD
int16_t VOTEB = 0;; // orang2 suara menyimpan memori
char B; // orang2 suara memaparkan watak pada LCD
int16_t VOTEC = 0;; // orang3 suara menyimpan memori
char C; // orang3 suara memaparkan watak pada LCD
int16_t VOTED = 0;; // orang4 suara menyimpan memori
char D; / / orang4 suara yang memaparkan watak pada LCD
// Berikut ini mengandungi ID tag, ini mesti diubah untuk tag yang berbeza, ini mesti dikemas kini agar projek berfungsi
// Setelah membuang program di pengawal, seseorang mesti mengambil kad yang mesti disahkan dan mendapatkan ID kad, ini diperoleh dengan meletakkan tanda di dekat modul RFID dan ID akan ditunjukkan di skrin. Setelah mendapatkan ID, program mesti dikemas kini dengan menggantikan nombor ID di bawah dengan nombor ID baru.
char ADMIT = {{(0x97), (0xa1), (0x90), (0x92)}, {(0x97), (0xa1), (0x90), (0x93)}, {(0x97), (0xa1), (0x90), (0x94)}, {(0x97), (0xa1), (0x90), (0x95)}, {(0x97), (0xa1), (0x90), (0x96)}}; |
Sekarang di atas kita hanya mengizinkan lima kad, kad ini boleh ditukar menjadi nombor apa pun, Sebagai contoh menganggap program lalai dibuang dalam pengawal, dapatkan kad yang seharusnya diberi tempat satu demi satu modul berdekatan yang lain, anda akan mendapat ID untuk setiap kad sebagai xxxxxxxx (907a4F87), Sekiranya ada 7 tag yang kita ada, maka kita akan mempunyai 7 ID 8 bit.
// sekarang untuk tujuh kad ia berlaku // char ADMIT = {{(0x90), (0x7a), (0x4F), (0x87)},; // memperuntukkan memori untuk menunjukkan ID yang dihantar mengikut modul int i = 0; undi int = 0; int k = 0; send_a_command (0x01); // Skrin Kosong 0x01 = 00000001 _delay_ms (50); send_a_command (0x38); // memberitahu lcd bahawa kita menggunakan mod perintah / data 8bit _delay_ms (50); send_a_command (0b00001111); // LAYAR LCD ON dan courser berkelip char MEM; // memperuntukkan memori untuk menyimpan ID lengkap tag send_a_string ("NOMOR RFID"); // rentetan penghantaran send_a_command (0x80 + 0x40 + 0); // memindahkan courser ke baris kedua semasa (1) { sementara (! (UCSRA & (1 <
{ } COUNTA = UDR; // UDR menyimpan data lapan bit yang diterima dan dibawa menjadi bilangan bulat. MEM = COUNTA; // dua watak pertama dikemas kini ke memori itoa (COUNTA, SHOWA, 16); // perintah untuk meletakkan nombor pemboleh ubah dalam LCD (nombor berubah, watak mana yang akan diganti, asas mana yang berubah-ubah (sepuluh di sini kerana kita mengira nombor di pangkalan10)) send_a_string (SHOWA); // memberitahu paparan untuk menunjukkan watak (digantikan oleh pemboleh ubah nombor) orang kedua setelah meletakkan jurulatih pada LCD sementara (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = NEGARA; // watak ketiga dan keempat dikemas kini ke memori sementara (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // aksara kelima dan keenam dikemas kini ke memori sementara (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // ketujuh dan lapan aksara dikemas kini ke memori send_a_string (""); send_a_command (0x80 + 0x40 + 0); UCSRB & = ~ (1 <
untuk (i = 0; i <5; i ++) { jika ((MEM == ADMIT) & (MEM == ADMIT) & (MEM == ADMIT) & (MEM == ADMIT)) {// memeriksa kebenaran membeli membandingkan dua watak pada satu masa dengan watak dalam memori PORTB - = (1 <
undi = 1; // jika dibenarkan menetapkan VOTE } } if (vote == 0) // kebenaran gagal jika undi tidak ditetapkan { UCSRB - = (1 <
} sementara (vote == 1) // lakukan gelung ini sehingga terpilih, jika dibenarkan { send_a_command (0x80 + 0); // pergi ke kedudukan sifar pada baris1 send_a_string ("VOTE SEKARANG"); // memaparkan rentetan if (bit_is_clear (PINB, 0)) // apabila butang ditekan { VOTEA ++; // meningkatkan memori suara orang pertama satu persatu undi = 0; // membiarkan sementara gelung pergi setelah mengundi } jika (bit_is_clear (PINB, 1)) // apabila butang 2 ditekan { VOTEB ++; // kenaikan memori undi daripada 2 nd orang oleh satu undi = 0; } jika (bit_is_clear (PINB, 2)) // apabila butang 3 ditekan { VOTEC ++; // kenaikan memori undi daripada 3 rd orang oleh satu undi = 0; } jika (bit_is_clear (PINB, 3)) // apabila butang 4 ditekan { VOTED ++; // meningkatkan memori undian orang ke- 4 satu persatu undi = 0; } if (vote == 0) // dibersihkan setelah undi diterima { send_a_command (0x80 + 0); // pindah ke kedudukan sifar garis1 send_a_string ("TERIMA KASIH UNTUK VOTE"); // rentetan paparan untuk (k = 0; k <10; k ++) { _delay_ms (220); } PORTB & = ~ (1 <
send_a_command (0x01); send_a_command (0x80 + 0); // menunjukkan suara keempat-empat orang 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 (VOTED, D, 10); send_a_string (D); send_a_command (0x80 + 0x40 + 16); untuk (k = 0; k <25; k ++) { _delay_ms (220); } UCSRB - = (1 <
send_a_command (0x01); send_a_command (0x80 + 0); // bergerak ke kedudukan sifar send_a_string ("NOMOR RFID"); // hantarkan rentetan send_a_command (0x80 + 0x40 + 0); } } batal send_a_command (perintah char yang tidak ditandatangani) { PORTA = arahan; PORTD & = ~ (1 <
PORTD - = 1 <
_delay_ms (50); PORTD & = ~ 1 <
PORTA = 0; } batal send_a_character (watak char yang tidak ditandatangani) { PORTA = watak; PORTD - = 1 <
PORTD - = 1 <
_delay_ms (50); PORTD & = ~ 1 <
PORTA = 0; } batal send_a_string (char * string_of_characters) { sementara (* string_of_characters> 0) { send_a_character (* string_of_characters ++); } } |