Kita tahu di kantor, pusat perbelanjaan, dan di banyak tempat lain di mana hanya orang dengan kartu otorisasi yang diperbolehkan memasuki ruangan. Sistem ini menggunakan sistem komunikasi RFID. RFID digunakan di pusat perbelanjaan untuk menghentikan pencurian karena produk ditandai dengan chip RFID dan ketika seseorang meninggalkan gedung dengan chip RFID, alarm dibunyikan secara otomatis. Tag RFID dirancang sekecil bagian pasir. Sistem otentikasi RFID mudah dirancang dan harganya murah. Beberapa sekolah dan perguruan tinggi saat ini menggunakan sistem absensi berbasis RFID.
Dalam proyek ini kita akan merancang mesin pemungutan suara yang hanya menghitung suara yang diautentikasi. Ini dilakukan dengan menggunakan tag RFID (Radio Frequency Identification). Di sini kita akan menulis program untuk ATMEGA untuk hanya mengizinkan pemegang tag RFID yang berwenang untuk memilih. (Juga periksa proyek mesin pemungutan suara sederhana ini)
Komponen Diperlukan
Perangkat keras: ATMEGA32, power supply (5v), AVR-ISP PROGRAMMER, JHD_162ALCD (16x2LCD), kapasitor 100uF (terhubung melalui catu daya), tombol (lima buah), resistor 10KΩ (lima buah), kapasitor 100nF (lima buah), LED (dua bagian), EM-18 (modul pembaca RFID).
Perangkat lunak: Atmel studio 6.1, progisp atau flash magic.
Diagram Sirkuit dan Penjelasannya
Pada rangkaian PORTA ATMEGA32 dihubungkan ke port data LCD. Di sini orang harus ingat untuk menonaktifkan komunikasi JTAG di PORTC ke ATMEGA dengan mengubah byte sekering, jika seseorang ingin menggunakan PORTC sebagai port komunikasi normal. Pada LCD 16x2 keseluruhan terdapat 16 pin jika ada lampu hitam, jika tidak ada lampu belakang akan ada 14 pin. Satu dapat memberi daya atau meninggalkan pin lampu belakang. Sekarang di 14 pin ada 8 data pin (7-14 atau D0-D7), 2 pin power supply (1 & 2 atau VSS & Vdd atau gnd & + 5V), 3 rd pin untuk kontrol kontras (VEE-kontrol seberapa tebal karakter harus ditampilkan), 3 pin kontrol (RS & RW & E)
Di sirkuit, Anda dapat mengamati bahwa saya hanya mengambil dua pin kontrol, ini memberikan fleksibilitas pemahaman yang lebih baik, bit kontras dan READ / WRITE tidak sering digunakan sehingga dapat disingkat ke ground. Ini menempatkan LCD dalam kontras tertinggi dan mode baca. Kita hanya perlu mengontrol pin ENABLE dan RS untuk mengirim karakter dan data yang sesuai.
Koneksi yang dilakukan untuk LCD diberikan di bawah ini:
PIN1 atau VSS ke ground
PIN2 atau VDD atau VCC ke daya + 5v
PIN3 atau VEE ke ground (memberikan kontras maksimum yang terbaik untuk pemula)
PIN4 atau RS (Daftar Pilihan) ke PD6 dari UC
PIN5 atau RW (Baca / Tulis) ke ground (menempatkan LCD dalam mode baca memudahkan komunikasi untuk pengguna)
PIN6 atau E (Enable) ke PD5 dari UC
PIN7 atau D0 sampai PA0 dari UC
PIN8 atau D1 ke PA1 dari UC
PIN9 atau D2 ke PA2 dari UC
PIN10 atau D3 ke PA3 dari UC
PIN11 atau D4 ke PA4 dari UC
PIN12 atau D5 ke PA5 dari UC
PIN13 atau D6 ke PA6 dari UC
PIN14 atau D7 ke PA7 dari UC
Di sirkuit, Anda dapat melihat kami telah menggunakan komunikasi 8bit (D0-D7). Namun ini tidak wajib dan kita dapat menggunakan komunikasi 4bit (D4-D7) tetapi dengan program komunikasi 4 bit menjadi agak rumit, jadi saya lebih suka komunikasi 8 bit.
Jadi dari pengamatan tabel di atas kita menghubungkan 10 pin LCD ke controller dimana 8 pin adalah pin data dan 2 pin untuk kontrol.
Sebelum melangkah ke depan, kita perlu memahami tentang komunikasi serial. Modul RFID disini mengirimkan data ke controller secara serial. Ini memiliki mode komunikasi lain tetapi untuk komunikasi mudah kami memilih RS232. Pin RS232 modul terhubung ke pin RXD ATMEGA.
Data yang dikirim oleh modul RFID adalah:
Sekarang untuk antarmuka modul RFID, diperlukan fitur-fitur berikut:
1. Pin RXD (fitur penerimaan data) pengontrol harus diaktifkan.
2. Karena komunikasi serial kita perlu mengetahui kapan data bye diterima, sehingga kita dapat menghentikan program sampai byte lengkap diterima. Ini dilakukan dengan memungkinkan data menerima interupsi lengkap.
3. RFID mengirimkan data ke pengontrol dalam mode 8bit. Jadi dua karakter akan dikirim ke pengontrol sekaligus. Ini ditunjukkan pada blok gambar3
4. Dari gambar 3, tidak terdapat bit paritas, bit one stop pada data yang dikirim oleh modul.
Fitur-fitur di atas diatur dalam register pengontrol; kita akan membahasnya secara singkat,
RED (RXEN): Bit ini mewakili fitur penerimaan data, bit ini harus diatur agar data dari modul dapat diterima oleh pengontrol, ini juga memungkinkan pin RXD pengontrol.
BROWN (RXCIE): Bit ini harus disetel untuk mendapatkan interupsi setelah penerimaan data berhasil. Dengan mengaktifkan bit ini kita mengetahui, tepat setelah data 8 bit diterima.
PINK (URSEL): Bit ini harus disetel sebelum mengaktifkan bit lain di UCSRC, setelah menyetel bit lain yang diperlukan di UCSRC; URSEL harus dinonaktifkan atau ditiadakan.
KUNING (UCSZ0, UCSZ1, UCSZ2): Ketiga bit ini digunakan untuk memilih jumlah bit data yang kami terima atau kirim dalam sekali jalan.
Karena data yang dikirim modul RFID adalah tipe data 8bit (GAMBAR3), maka UCSZ0, UCSZ1 menjadi satu dan UCSZ2 menjadi nol.
ORANGE (UMSEL): Bit ini diatur berdasarkan apakah sistem berkomunikasi secara asynchronous (keduanya menggunakan jam yang berbeda) atau sinkron (keduanya menggunakan jam yang sama),
Karena modul dan pengontrol menggunakan jam yang berbeda, bit ini harus disetel ke nol atau dibiarkan sendiri karena semuanya disetel ke nol secara default.
HIJAU (UPM1, UPM0): Kedua bit ini disesuaikan berdasarkan paritas bit yang kami gunakan dalam komunikasi.
Karena modul RFID mengirimkan data tanpa paritas (Gbr. 3), kami telah menyetel UPM1, UPM0 ke nol atau keduanya dapat dibiarkan sendiri karena semua bit dalam register mana pun disetel ke nol secara default.
BLUE (USBS): Bit ini digunakan untuk memilih jumlah stop bits yang kita gunakan selama komunikasi.
Karena modul RFID mengirimkan data dengan bit one stop (gambar3), kita hanya perlu membiarkan bit USBS saja.
Sekarang akhirnya kita perlu mengatur baud rate, dari gambar3 terlihat jelas bahwa modul RFID mengirimkan data ke controller dengan baud rate 9600bps (bits per second).
Tingkat baud diatur dalam pengontrol dengan memilih UBRRH yang sesuai,
Nilai UBRRH dipilih dengan referensi silang baud rate dan frekuensi kristal CPU,
Jadi dengan referensi silang nilai UBRR dilihat sebagai '6', dan baud rate ditetapkan.
Ada lima tombol di sini, empat untuk menaikkan suara calon dan kelima untuk mengatur ulang suara calon menjadi nol. Kapasitor yang ada di sini adalah untuk meniadakan efek pantulan tombol. Jika mereka dilepaskan, pengontrol mungkin menghitung lebih dari satu setiap kali tombol ditekan.
Resistor yang dihubungkan ke pin digunakan untuk membatasi arus, ketika tombol ditekan untuk menarik pin ke tanah. Setiap kali tombol ditekan, pin pengontrol yang sesuai ditarik ke bawah dan dengan demikian pengontrol mengenali bahwa tombol tertentu ditekan dan tindakan terkait yang harus diambil, itu mungkin menambah suara kandidat atau mengatur ulang suara tergantung pada tombol yang ditekan.
Ketika tombol yang mewakili orang yang sesuai ditekan, pengontrol mengambilnya dan menambah nomor orang yang sesuai di dalam memorinya setelah kenaikan itu menunjukkan skor orang yang sesuai pada layar LCD 16x2.
Cara kerja mesin pemungutan suara paling baik dijelaskan dalam langkah demi langkah kode C yang diberikan di bawah ini:
Penjelasan Kode
#include // header untuk mengaktifkan kontrol aliran data pada pin
#define F_CPU 1000000 // memberi tahu frekuensi kristal pengontrol terpasang
#include
#define E 5 // memberi nama "enable" pada pin ke 5 PORTD, karena terhubung ke pin pengaktifan LCD
#define RS 6 // memberi nama “registerselection” pada pin ke 6 PORTD, karena terhubung ke pin LCD RS
void send_a_command (perintah char unsigned);
void send_a_character (karakter karakter tidak bertanda);
batal send_a_string (char * string_of_characters);
int utama (kosong)
{
DDRA = 0xFF; // menempatkan porta sebagai pin keluaran
DDRD = 0b11111110;
_delay_ms (50); // memberikan penundaan 50ms
DDRB = 0b11110000; // Mengambil beberapa pin portB sebagai input.
UCSRB - = (1 <
// memungkinkan data menerima interupsi lengkap, memungkinkan data menerima pin
UCSRC - = (1 <
// mengubah bit lain dengan terlebih dahulu menyetel URSEL, menyetel komunikasi 8 bit
UCSRC & = ~ (1 <
UBRRH & = ~ (1 <
UBRRL = 6; // mengatur baud rate
int16_t VOTEA = 0; // person1 suara menyimpan memori
char A; // orang1 suara menampilkan karakter di LCD
int16_t VOTEB = 0;; // person2 suara menyimpan memori
char B; // orang2 suara menampilkan karakter di LCD
int16_t VOTEC = 0;; // person3 suara menyimpan memori
char C; // person3 suara menampilkan karakter di LCD
int16_t DIPILIH = 0;; // person4 suara menyimpan memori
char D; / / person4 vote menampilkan karakter di LCD
// Berikut ini berisi ID tag, ini harus diubah untuk tag yang berbeda, Ini harus diperbarui agar proyek dapat bekerja
// Setelah membuang program ke dalam pengontrol, seseorang harus mengambil kartu yang harus diotorisasi dan mendapatkan ID tag, ini diperoleh dengan menempatkan tag di dekat modul RFID dan ID akan ditampilkan di layar. Setelah mendapatkan ID, program harus diupdate dengan mengganti nomor ID di bawah ini dengan nomor 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 kami hanya mengotorisasi lima kartu, ini dapat diubah menjadi nomor apa pun, Misalnya pertimbangkan program default dibuang ke pengontrol, dapatkan kartu yang harus diotorisasi tempat satu demi satu di dekat modul, Anda akan mendapatkan ID untuk masing-masing sebagai xxxxxxxx (907a4F87), Jika ada 7 tag yang kita miliki, maka kita akan memiliki 7 8 bit ID.
// sekarang untuk tujuh kartu // char ADMIT = {{(0x90), (0x7a), (0x4F), (0x87)},; // mengalokasikan memori untuk menampilkan ID yang dikirim oleh modul int i = 0; int suara = 0; int k = 0; send_a_command (0x01); // Bersihkan Layar 0x01 = 00000001 _delay_ms (50); send_a_command (0x38); // memberitahu lcd kita menggunakan perintah 8bit / mode data _delay_ms (50); send_a_command (0b00001111); // LAYAR LCD ON dan courser berkedip char MEM; // mengalokasikan memori untuk menyimpan ID lengkap dari tag send_a_string ("RFID NUMBER"); // mengirim string send_a_command (0x80 + 0x40 + 0); // memindahkan courser ke baris kedua sementara (1) { sementara (! (UCSRA & (1 <
{ } COUNTA = UDR; // UDR menyimpan data delapan bit yang diterima dan diambil menjadi integer. MEM = COUNTA; // dua karakter pertama diperbarui ke memori itoa (COUNTA, SHOWA, 16); // perintah untuk meletakkan nomor variabel di LCD (nomor variabel, di mana karakter yang akan diganti, yang basis adalah variabel (sepuluh di sini saat kita menghitung angka di base10)) send_a_string (SHOWA); // memberi tahu layar untuk menampilkan karakter (diganti dengan nomor variabel) orang kedua setelah memposisikan kurser pada LCD sementara (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // karakter ketiga dan keempat diperbarui ke memori sementara (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // karakter kelima dan keenam diperbarui ke memori sementara (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // karakter ketujuh dan delapan diperbarui ke memori send_a_string (""); send_a_command (0x80 + 0x40 + 0); UCSRB & = ~ (1 <
untuk (i = 0; i <5; i ++) { if ((MEM == ADMIT) & (MEM == ADMIT) & (MEM == ADMIT) & (MEM == ADMIT)) {// memeriksa otorisasi membeli membandingkan dua karakter sekaligus dengan karakter di memori PORTB - = (1 <
vote = 1; // jika diotorisasi set VOTE } } if (vote == 0) // otorisasi gagal jika voting tidak diatur { UCSRB - = (1 <
} while (vote == 1) // lakukan pengulangan ini sampai terpilih, jika diotorisasi { send_a_command (0x80 + 0); // pindah ke posisi nol pada baris1 send_a_string ("VOTE NOW"); // menampilkan string if (bit_is_clear (PINB, 0)) // ketika tombol satu ditekan { SUARA ++; // tingkatkan memori suara orang pertama per satu vote = 0; // lepaskan while loop setelah voting } if (bit_is_clear (PINB, 1)) // saat tombol 2 ditekan { VOTEB ++; // kenaikan memori suara 2 nd orang per satu suara = 0; } if (bit_is_clear (PINB, 2)) // saat tombol 3 ditekan { VOTEC ++; // kenaikan memori suara 3 rd orang per satu suara = 0; } if (bit_is_clear (PINB, 3)) // saat tombol 4 ditekan { VOTED ++; // menambah memori suara orang ke- 4 per satu suara = 0; } if (vote == 0) // dihapus setelah suara diterima { send_a_command (0x80 + 0); // pindah ke posisi nol dari baris1 send_a_string ("THANK U FOR VOTE"); // tampilkan string untuk (k = 0; k <10; k ++) { _delay_ms (220); } PORTB & = ~ (1 <
send_a_command (0x01); send_a_command (0x80 + 0); // menampilkan suara dari keempat 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); // pindah ke posisi nol send_a_string ("RFID NUMBER"); // kirim string send_a_command (0x80 + 0x40 + 0); } } void send_a_command (perintah char unsigned) { PORTA = perintah; PORTD & = ~ (1 <
PORTD - = 1 <
_delay_ms (50); PORTD & = ~ 1 <
PORTA = 0; } batal send_a_character (karakter unsigned char) { PORTA = karakter; PORTD - = 1 <
PORTD - = 1 <
_delay_ms (50); PORTD & = ~ 1 <
PORTA = 0; } batal send_a_string (karakter * string_of_characters) { sementara (* string_of_characters> 0) { send_a_character (* string_of_characters ++); } } |