Baca Kartu RFID Terjaring Jaringan dengan Arduino, ENC28J60, dan MFRC522
Komponen dan perlengkapan
Mifare MFRC522
Tipe pembaca RFID SPI apa pun sudah cukup
×
1
Arduino UNO
Tipe Arduino apa pun sudah cukup
×
1
enc28j60
Anda harus memodifikasi kode untuk apa pun yang tidak menggunakan ENC28J60
×
1
Kabel jumper (umum)
×
1
Breadboard (umum)
×
1
Komputer
Komputer apa pun yang terhubung ke internet
×
1
Alat dan mesin yang diperlukan
Gunting
ATAU pelapis kabel
Aplikasi dan layanan online
Pycharm
Arduino IDE
Tentang proyek ini
Apakah Anda pernah memikirkan untuk menambahkan sistem keamanan atau pemantauan tag/kartu RFID di rumah dan/atau kantor Anda. Nah jika Anda sampai di sini, saya yakin Anda sudah mencari tahu betapa mahalnya sistem tersebut yang berkisar dari $200 hingga $2000, TERLALU MAHAL KANA!? Nah, seorang teman dan saya telah memutuskan untuk membuat sistem yang akan berkurang dari $100 dan dapat melakukan lebih dari sekadar membuka pintu, jadi inilah yang kami buat. Pembaca tag RFID Arduino yang terhubung internet. yang dengan $20 tambahan dapat membuka pintu. Sistem ini dirancang untuk melacak siswa di SMA kami dan kami berharap sekolah menyetujui.
Ini adalah prototipe:
Anda mungkin berpikir ini akan memakan waktu lama, yatta yatta yatta. Namun hal ini hanya memakan waktu sekitar 6 jam (karena saya memiliki masalah daya), namun ini bisa memakan waktu sekitar 30 menit untuk diatur seperti contoh di atas. Semua kode dan gambar ada di bawah, jadi jika Anda bingung di langkah berikutnya, silakan lihat gambar/kode di bawah.
Berikut adalah semua langkahnya:
Sebelum Memulai (Diperlukan)
Sebelum kita dapat memulai memindai kartu dan mengirimkannya ke server Telnet/TCP kita, kita memerlukan beberapa library. Dapatkan UIPEthernet di sini https://github.com/ntruchsess/arduino_uip
dapatkan MFRC522 di sini https://github.com/miguelbalboa/rfid
Masukkan kedua library ini ke Program Files(x86)/Arduino/Libraries/ Restart arduino
Hardware
Arduino Nano (Anda selalu dapat memodifikasi kode Anda agar sesuai dengan perangkat Anda)
MFRC522 dengan kartu MAIFARE
Kabel jumper (Male to Male) (Male to Female)
modul/sheld ethernet enc28j60
LED RGB
Konverter AC-DC 3V atau 5V lebih dari 700 mA
Setup
Pasang arduino ke breadboard (jika nano atau micro)
Cari online pinout papan Anda untuk menemukan pengaturan SPI (Ubah nilai di bawah)
Hubungkan pin arduino 10 (SS) ke ss atau CS modul ethernet
Hubungkan pin arduino 12 (MISO) ke rfid MISO dan ethernet SO
Hubungkan pin arduino 11 (MOSI) ke rfid MOSI dan ethernet SI
Hubungkan pin arduino 13 (SCK) ke rfid SCK dan ethernet SCK
Hubungkan pin arduino 9 ke pin RST rfid
Hubungkan pin arduino 8 ke rfid SSN
Hubungkan pin arduino 5 ke LED hijau, 4 ke biru dan 3 ke merah
Hubungkan AC ke DC ke + dan - pada breadboard Anda
Ground arduino Anda ke ac ke dc
Hubungkan VCC dan GND pada rfid dan ethernet ke ac-dc (INGAT PERANGKAT INI HANYA 3V!!!!!! jangan menyuplai 5V) Jika masalah gunakan resistor untuk menurunkan tegangan ke 3v
Wire pin VCC pada LED ke arduino 3v atau ac-dc 3v
Hubungkan kabel ethernet ke modul dan pastikan itu berada di jaringan yang sama dengan komputer Anda
Colok kabel USB dari komputer ke arduino
Hubungkan komputer ke jaringan yang sama
Modifikasi kode agar sesuai dengan kebutuhan Anda
Kode cukup baik dikomentari jadi Anda bisa langsung masuk dan memodifikasi bagian tertentu tapi satu hal yang pasti adalah modul ethernet
Alamat MAC dapat tetap sama (Kecuali Anda berencana untuk membuat beberapa dari ini)
Jika Anda menggunakan jaringan ip basis 192.168. Anda dapat menjaga ip
Lagi Anda dapat menjaga dns, waktu yang harus diubah adalah ke 8.8.4.4
jalankan ipconfig untuk menemukan gateway Anda, defaultnya adalah 192.168.1.1 (jika Anda tidak mengetahuinya) (Kode saat ini adalah 192.168.1.5)
jalankan command prompt dan ketik ipconfig untuk mencari tahu alamat IP komputer Anda
gulir ke bawah untuk menemukan SEND TO SERVER, dan masukkan IP komputer Anda atau jika Anda meneruskan port router Anda ke alamat IP publik Anda
PASTIKAN ANDA MILIK PYTHON DAN MENJALANKAN SERVER (Ingat ini hanyalah contoh kode yang kami gunakan untuk presentasi kami ke sekolah, jadi server Python sudah dibuat sebelumnya dan hampir tidak dimodifikasi Anda dapat menggunakan server Telnet/TCP apa pun)
Dan kode lain yang mungkin perlu Anda modifikasi:
Menjalankan kode
Colok AC-DC power ke dinding
Pastikan arduino Anda saat ini terhubung ke komputer
Pastikan kedua perangkat berada di jaringan yang sama
Flash kode arduino yang telah dimodifikasi atau jika yang saya miliki bekerja untuk Anda maka bagus (Hampir tidak ada kemungkinan Anda akan perlu memodifikasinya)
Mulai skrip Python, C++ Anda atau server Telnet/TCP apa pun di jaringan Anda
Restart arduino Anda untuk jaga-jaga
Tunggu sampai lampu menjadi biru dan coba memindai kartu, jika server Anda mendapatkan ID kartu maka Anda siap
Ingat lampu berarti apa Ungu/merah pudar berarti booting up
Merah berarti ada kesalahan seperti kartu berada di sudut yang aneh dan/atau server tidak merespons tepat waktu
Hijau berarti lulus jadi server merespons dengan go dan Anda dapat membaca kartu berikutnya
Biru berarti menunggu/memuat menunggu kartu atau respons
Jika arduino Anda mulai lag dan memakan waktu lebih dari 30 detik untuk menunjukkan lampu merah berarti modul ethernet arduino tidak dapat terhubung ke server sama sekali. Ini bisa disebabkan oleh beberapa hal pertama arduino Anda tidak memiliki daya yang cukup dan modul ethernet arduino kesulitan mengirim paket atau bahwa server komputer Anda tidak berjalan atau bahwa arduino dan komputer Anda tidak berada di jaringan yang sama.
Jika arduino Anda terus lag maka coba trik ini untuk memperbaikinya
Matikan firewall windows
masuk ke pengaturan firewall lanjutan dan izinkan port inbound/outbound 23
port forward router Anda ke komputer Anda dengan port 23
Jika Anda nirkabel hubungkan arduino langsung ke router dan komputer Anda ke yang sama
Beli adaptor AC-DC yang lebih tahan lama
Else maybe you input your ip address or connecting address wrong
Entah itu hubungi saya di smerkousdavid@gmail.com jika ada masalah
ANDA SUDAH SIAP!!!
Ingat tidak ada kode untuk sistem kunci pintu, karena saya tidak memilikinya, ini berarti Anda akan perlu menambahkan beberapa kode jika Anda ingin menggunakan ini tidak hanya sebagai sistem pelacakan tetapi sebagai sistem pelacakan kunci pintu.
Silakan baca di bawah:
Kode
Kode Arduino
Contoh kode server
Kode ArduinoC/C++
/* * ---------------------------------- * MFRC522 Arduino * Reader/PCD Nano v3 * Signal Pin Pin * ---------------------------------- * RST/Reset RST D9 * SPI SS NSS D10 * SPI MOSI MOSI D11 * SPI MISO MISO D12 * SPI SCK SCK D13 */ // THE FIRST LIBRARY THAT NEEDS TO BE INSTALLED IS UIP ETHERNET SECOND IS MFRC522 BOTH ARE ON GITHUB #include <UIPEthernet.h> #include <SPI.h> //For the selection of the key #include <MFRC522.h> //The RFID key library #define RST_PIN 9 // Configurable, see typical pin layout above - This is for the Arduino Nano - For RFID #define SS_PIN 8 //WE ARE USING 8 FOR RFID BECAUSE THE ETHERNET MODULE USES 10 byte sector = 0; byte blockAddr = 0; ////////Access certain sector/blocks in the card, trailer block is the last block byte trailerBlock = 1; int red = 3; int blue = 4; //Pins for RGB LED int green = 5; EthernetClient client; //ETHERNET INSTANCE MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance. MFRC522::MIFARE_Key key; //Set key instance signed long timeout; //TIMEOUT SO IT DOESN'T SIT THERE FOREVER void setup() { //UI BEGIN pinMode(red, OUTPUT); pinMode(blue, OUTPUT); //Init the RGB LED pinMode(green, OUTPUT); Reset(); //Start with leds off Serial.begin(9600); //Start computer connection with a rate of 9600 bits per second //UI END //ETHERNET MODULE INITIAL SPI.begin(); // Init SPI bus uint8_t mac[6] = {0x00,0x01,0x02,0x03,0x04,0x05}; //MAC = 000102030405 IPAddress mip(192,168,1,160); //IP = 192.168.1.160 IPAddress mdns(8,8,8,8); //DNS = 8.8.8.8 IPAddress mgate(192,168,1,5); //GATEWAY = 192.168.1.5 IPAddress msubnet(255,255,255,0); //SUBNET = 255.255.255.0 Ethernet.begin(mac, mip, mdns, mgate , msubnet); //CONNECT USING ABOVE Serial.println("Succesful connection"); // END OF ETHERNET for(int t = 255; t > 0; t--) { analogWrite(red, t); ////More of show but let at least a second between the SPI of the ethernet and RFID delay(10); } //RFID INITIAL mfrc522.PCD_Init(); // Init MFRC522 card for (byte i = 0; i < 6; i++) { // Prepare the key (used both as key A and as key B) key.keyByte[i] = 0xFF; // using FFFFFFFFFFFFh which is the default at chip delivery from the factory } Serial.println(F("Scan a Card")); dump_byte_array(key.keyByte, MFRC522::MF_KEY_SIZE); //Get key byte size timeout = 0; delay(2000); Reset(); } //END RFID INITIAL void loop() //Run forever { // Look for new cards if ( ! mfrc522.PICC_IsNewCardPresent()) { digitalWrite(blue, LOW); return; } // Select one of the cards if ( ! mfrc522.PICC_ReadCardSerial()) return; digitalWrite(blue, HIGH); //Show user that card has been read byte piccType = mfrc522.PICC_GetType(mfrc522.uid.sak); // Check for compatibility with Mifare card if ( piccType != MFRC522::PICC_TYPE_MIFARE_MINI && piccType != MFRC522::PICC_TYPE_MIFARE_1K && piccType != MFRC522::PICC_TYPE_MIFARE_4K) { Error(); return; } byte status; byte buffer[18]; byte size = sizeof(buffer); status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid)); if (status != MFRC522::STATUS_OK) { Serial.print(F("PCD_Authenticate() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); Error(); return; } // Read data from the block status = mfrc522.MIFARE_Read(blockAddr, buffer, &size); if (status != MFRC522::STATUS_OK) { Serial.print(F("MIFARE_Read() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); Error(); } // Halt PICC mfrc522.PICC_HaltA(); // Stop encryption on PCD mfrc522.PCD_StopCrypto1(); // AFTER DONE READING CARD SEND TO SERVER if (client.connect(IPAddress(192,168,1,100),23)) { timeout = millis()+1000; Serial.println("Client connected"); const String ID = dump_byte_array(buffer, size); client.println(ID); Serial.println("sent :" + ID); delay(10); while(client.available()==0) { if (timeout - millis() < 0) goto close; } int size; while((size = client.available()) > 0) { uint8_t* msg = (uint8_t*)malloc(size); size = client.read(msg,size); Serial.write(msg,size); if(size == sizeof("g") - 1) { Pass(); } else { Error(); } free(msg); } close: client.stop(); } else { Serial.println("Couldn't connect to Server"); Error(); } //END OF SENDING TO SERVER Reset(); //RESTART LOOP WITH NO LEDS ON } // TURN THE BUFFER ARRAY INTO A SINGLE STRING THAT IS UPPERCASE WHICH EQUALS OUR ID OF THE SECTOR AND BLOCK String dump_byte_array(byte *buffer, byte bufferSize) { String out = ""; for (byte i = 0; i < bufferSize; i++) { //Serial.print(buffer[i] < 0x10 ? " 0" : " "); //Serial.print(buffer[i], HEX); out += String(buffer[i] < 0x10 ? " 0" : " ") + String(buffer[i], HEX); } out.toUpperCase(); out.replace(" ", ""); return out; } //END DUMP_BYTE_ARRAY //BELOW ARE THE LED METHODS void Error() { digitalWrite(red, LOW); delay(700); digitalWrite(red, HIGH); } void Pass() { digitalWrite(green, LOW); delay(700); digitalWrite(green, HIGH); } void Reset() { digitalWrite(red, HIGH); digitalWrite(blue, HIGH); digitalWrite(green, HIGH); } //END OF FILE
Contoh kode serverPython
Berikut adalah contoh lengkap cara menggunakan server
import SocketServer class MyTCPHandler(SocketServer.BaseRequestHandler): def handle(self): # self.request is the TCP socket connected to the client self.data = self.request.recv(1024).strip() print "{} wrote:".format(self.client_address[0]) print self.data """ SQL STUFF HERE if(self.data == SQL NAME or something) { self.request.sendall("g")//send good //INSERT TIME AND LOCATION INTO SQL HERE { else { self.request.sendall("bb")//send bad //DO NOTHING just send to arduino bad data } """ self.request.sendall("g") if __name__ == "__main__": HOST, PORT = "", 23 server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler) server.serve_forever()
Kode terbaru di GitHub
Di sini Anda dapat mendapatkan kode terbaruhttps://github.com/smerkousdavid/InternetRFIDTags
Skematik
Rangkaiannya sederhana jadi saya hanya membuat foto dengan pemasangan kabel