From 31bd8f7d72035f0153552d74bce1fd20c8a0b761 Mon Sep 17 00:00:00 2001 From: plane000 Date: Fri, 18 May 2018 12:23:07 +0100 Subject: [PATCH] Started RFID --- .../Joystick Controler/Program.cs | 10 +- C++/Arduino/RFID_RW_Demo/RFID_RW_Demo.ino | 335 ++++++++++++++++++ .../RFID_Reader_Writer/RFID_Reader_Writer.ino | 13 + 3 files changed, 353 insertions(+), 5 deletions(-) create mode 100644 C++/Arduino/RFID_RW_Demo/RFID_RW_Demo.ino create mode 100644 C++/Arduino/RFID_Reader_Writer/RFID_Reader_Writer.ino diff --git a/C++/Arduino/Joystick_Mouse/Joystick Controler/Joystick Controler/Program.cs b/C++/Arduino/Joystick_Mouse/Joystick Controler/Joystick Controler/Program.cs index d6eeaee..f84a889 100644 --- a/C++/Arduino/Joystick_Mouse/Joystick Controler/Joystick Controler/Program.cs +++ b/C++/Arduino/Joystick_Mouse/Joystick Controler/Joystick Controler/Program.cs @@ -33,8 +33,8 @@ namespace Joystick_Controler { private void dataReceived(object s, SerialDataReceivedEventArgs e) { string fromPort = serialPort.ReadLine(); - Console.SetCursorPosition(0, 0); - Console.WriteLine(fromPort); + //Console.SetCursorPosition(0, 0); + //Console.WriteLine(fromPort); int[] XY = parser(fromPort); int x = XY[0]; @@ -43,10 +43,10 @@ namespace Joystick_Controler { bool b = false; if (button == 0) { b = true; - Console.WriteLine("click"); + //Console.WriteLine("click"); } else { b = false; - Console.WriteLine(" "); + //Console.WriteLine(" "); } if (y == -1) { @@ -99,7 +99,7 @@ namespace Joystick_Controler { } private void moveMouse() { - Cursor.Position = new Point(Cursor.Position.X - joyX, Cursor.Position.Y); + Cursor.Position = new Point(Cursor.Position.X - joyX, Cursor.Position.Y - joyY); } private void clickDown() { diff --git a/C++/Arduino/RFID_RW_Demo/RFID_RW_Demo.ino b/C++/Arduino/RFID_RW_Demo/RFID_RW_Demo.ino new file mode 100644 index 0000000..e8d6f6b --- /dev/null +++ b/C++/Arduino/RFID_RW_Demo/RFID_RW_Demo.ino @@ -0,0 +1,335 @@ +/* + + Parallax RFID Read/Write: Basic Demonstration + + Author: Joe Grand [www.grandideastudio.com] + Contact: support@parallax.com + + Program Description: + + This program demonstrates the basic functionality of the Parallax RFID Read/Write + Module (#28440). Data is displayed using the Arduino Serial Monitor. + + The module is compatible with EM Microelectronic EM4x50 1kbit R/W 125kHz tags. + These tags can be used in a number of ways: + 1) Read-only by reading the tag's unique, non-changing serial number + 2) Read/write up to 116 bytes of user data (publicly accessible) + 3) Read/write up to 116 bytes of user data (password protected) + + Please refer to the product manual for full details of module functionality + and capabilities. + + Revisions: + + 1.0 (May 1, 2014): Initial release + +*/ + +// include the SoftwareSerial library so we can use it to talk to the RFID R/W Module +#include + +#define rxPin 11 // Serial input (connects to the RFID's SOUT pin) +#define txPin 10 // Serial output (connects to the RFID's SIN pin) + +#define BUFSIZE 12 // Size of receive buffer (in bytes) for incoming data from the RFID R/W Module (this should be adjusted to be larger than the expected response) + +// RFID R/W Module Commands +// Number of bytes returned in () +#define RFID_Read 0x01 // Read data from specified address, valid locations 1 to 33 (5) +#define RFID_Write 0x02 // Write data to specified address, valid locations 3 to 31 (1) +#define RFID_Login 0x03 // Login to tag with password (1) +#define RFID_SetPass 0x04 // Change tag's password from old to new (1) +#define RFID_Protect 0x05 // Enable/disable password protection (1) +#define RFID_Reset 0x06 // Reset tag (1) +#define RFID_ReadLegacy 0x0F // Read unique ID from EM4102 read-only tag (for backwards compatibility with Parallax RFID Card Reader #28140) (12) + +// Memory map/address locations for EM4x50 tag +// Each address holds/returns a 32-bit (4 byte) value +#define ADDR_Password 0 // Password (not readable) +#define ADDR_Protect 1 // Protection Word +#define ADDR_Control 2 // Control Word +// ADDR 3-31 are User EEPROM area +#define ADDR_Serial 32 // Device Serial Number +#define ADDR_DeviceID 33 // Device Identification + +// Status/error return codes +#define ERR_OK 0x01 // No errors +#define ERR_LIW 0x02 // Did not find a listen window +#define ERR_NAK 0x03 // Received a NAK, could be invalid command +#define ERR_NAK_OLDPW 0x04 // Received a NAK sending old password (RFID_SetPass), could be incorrect password +#define ERR_NAK_NEWPW 0x05 // Received a NAK sending new password (RFID_SetPass) +#define ERR_LIW_NEWPW 0x06 // Did not find a listen window after setting new password (RFID_SetPass) +#define ERR_PARITY 0x07 // Parity error when reading data + +// For use with RFID_ReadLegacy command +#define LEGACY_StartByte 0x0A +#define LEGACY_StopByte 0x0D + + +// set up a new serial port +SoftwareSerial rfidSerial = SoftwareSerial(rxPin, txPin); + +void setup() // Set up code called once on start-up +{ + // define pin modes + pinMode(rxPin, INPUT); + pinMode(txPin, OUTPUT); + + // setup Arduino Serial Monitor + Serial.begin(9600); + while (!Serial); // wait until ready + Serial.println("\n\nParallax RFID Read/Write Module"); + + // set the baud rate for the SoftwareSerial port + rfidSerial.begin(9600); + + Serial.flush(); // wait for all bytes to be transmitted to the Serial Monitor +} + +void loop() // Main code, to run repeatedly +{ + char idx; + uint8_t rfidData[BUFSIZE]; // Buffer for incoming data + + /* + Code blocks can be commented/uncommented/rearranged to experiment with the available + features and operations of the Parallax RFID Read/Write Module + */ + + Serial.print("Reading tag's unique serial number..."); + while (rfidRead(rfidData, ADDR_Serial) != 0); + PrintHex(rfidData, 4); // The rfidData string should now contain the tag's serial number, so display it on the Serial Monitor + Serial.println(); + Serial.flush(); + + Serial.print("Writing and verifying data to tag..."); + while (rfidWrite(3, (uint8_t*)"\xFE\xED\xFA\xCE") != 0); // Write specified bytes into address 3 (user EEPROM area) + Serial.println("Done!"); + Serial.flush(); + + Serial.print("Reading tag's entire memory contents:\n"); + for (idx = 1; idx <= 33; idx++) // For each valid address location + { + while (rfidRead(rfidData, idx) != 0); // Read the data + Serial.print(idx, DEC); + Serial.print(": "); + PrintHex(rfidData, 4); // The rfidData string should now contain the data from the specific address, so display it on the Serial Monitor + Serial.println(); + Serial.flush(); + } + + // Login is only required to take advantage of the password protection features + // For example, to set the tag's password, lock/unlock the tag, or read/write the tag (if the tag is locked) + Serial.print("Logging into the tag..."); + while (rfidLogin((uint8_t*)"\x00\x00\x00\x00") != 0); // Login to tag with default password of 0x00000000 + Serial.println("Done!"); + Serial.flush(); + +/* Serial.print("Changing the tag's password..."); + while (rfidSetPass((uint8_t*)"\x00\x00\x00\x00", (uint8_t*)"\x00\x00\x00\x00") != 0); // Change password from current (0x00000000) to new (0x00000000) + Serial.println("Done!"); + Serial.flush();*/ + + Serial.print("Locking tag..."); + while (rfidProtect(true) != 0); // Enable read/write password protection of the entire tag + Serial.println("Done!"); + Serial.flush(); + + Serial.print("Unlocking tag..."); + while (rfidProtect(false) != 0); // Enable read/write password protection of the entire tag + Serial.println("Done!"); + Serial.flush(); + + Serial.print("Resetting the tag..."); + while (rfidReset() != 0); // Log out and reset the tag (will require a re-login if trying to access a locked tag after this point) + Serial.println("Done!"); + Serial.flush(); + +/* Serial.print("Reading legacy tag's unique serial number..."); // Read unique ID from EM4102 read-only tag (used with the Parallax RFID Card Reader #28140) + while (rfidReadLegacy(rfidData) != 0); + Serial.println((char*)rfidData); // The rfidData string should now contain the tag's unique ID with a null termination, so display it on the Serial Monitor + Serial.flush();*/ + + while(1); // Stay here when the demonstration is over + +} + + +/*** SUPPORTING FUNCTIONS ***/ + +char rfidRead(uint8_t *data, uint8_t address) +{ + char offset; // offset into buffer + + rfidFlush(); // empties any buffered incoming serial data + + rfidSerial.print("!RW"); // header + rfidSerial.write(RFID_Read); // command + rfidSerial.write(address); // address + + while (rfidSerial.available() != 5); // wait until data is received from RFID module + + if (rfidSerial.read() == ERR_OK) // if our status byte is OK + { + for (offset = 0; offset < 4; offset++) + data[offset] = rfidSerial.read(); // get the remaining data + + return 0; // return good + } + + return -1; // return error +} + + +char rfidWrite(uint8_t address, uint8_t *data) +{ + char offset; // offset into buffer + + rfidFlush(); // empties any buffered incoming serial data + + rfidSerial.print("!RW"); // header + rfidSerial.write(RFID_Write); // command + rfidSerial.write(address); // address + for (offset = 0; offset < 4; offset++) + rfidSerial.write(data[offset]); // data (4 bytes) + + while (rfidSerial.available() == 0); // wait until data is received from RFID module + + if (rfidSerial.read() == ERR_OK) // if our status byte is OK + return 0; // return good + + return -1; // return error +} + + +char rfidLogin(uint8_t *password) +{ + char offset; // offset into buffer + + rfidFlush(); // empties any buffered incoming serial data + + rfidSerial.print("!RW"); // header + rfidSerial.write(RFID_Login); // command + for (offset = 0; offset < 4; offset++) + rfidSerial.write(password[offset]); // password (4 bytes) + + while (rfidSerial.available() == 0); // wait until data is received from RFID module + + if (rfidSerial.read() == ERR_OK) // if our status byte is OK + return 0; // return good + + return -1; // return error +} + + +char rfidSetPass(uint8_t *currentpass, uint8_t *newpass) +{ + char offset; // offset into buffer + + rfidFlush(); // empties any buffered incoming serial data + + rfidSerial.print("!RW"); // header + rfidSerial.write(RFID_SetPass); // command + for (offset = 0; offset < 4; offset++) + rfidSerial.write(currentpass[offset]); // current password (4 bytes) + for (offset = 0; offset < 4; offset++) + rfidSerial.write(newpass[offset]); // new password (4 bytes) + + while (rfidSerial.available() == 0); // wait until data is received from RFID module + + if (rfidSerial.read() == ERR_OK) // if our status byte is OK + return 0; // return good + + return -1; // return error +} + + +char rfidProtect(boolean enable) +{ + rfidFlush(); // empties any buffered incoming serial data + + rfidSerial.print("!RW"); // header + rfidSerial.write(RFID_Protect); // command + if (enable == false) // flag + rfidSerial.write((byte)0); + else + rfidSerial.write((byte)1); + + while (rfidSerial.available() == 0); // wait until data is received from RFID module + + if (rfidSerial.read() == ERR_OK) // if our status byte is OK + return 0; // return good + + return -1; // return error +} + + +char rfidReset() +{ + rfidFlush(); // empties any buffered incoming serial data + + rfidSerial.print("!RW"); // header + rfidSerial.write(RFID_Reset); // command + + while (rfidSerial.available() == 0); // wait until data is received from RFID module + + if (rfidSerial.read() == ERR_OK) // if our status byte is OK + return 0; // return good + + return -1; // return error +} + + +char rfidReadLegacy(uint8_t *data) +{ + char offset; // offset into buffer + + rfidFlush(); // empties any buffered incoming serial data + + rfidSerial.print("!RW"); // header + rfidSerial.write(RFID_ReadLegacy); // command + + while (rfidSerial.available() != 12); // wait until data is received from RFID module + + if (rfidSerial.read() == LEGACY_StartByte) // if our start byte is OK + { + for (offset = 0; offset < 10; offset++) + data[offset] = rfidSerial.read(); // get the remaining data + + data[offset] = 0; // null terminate the string of bytes we just received + return 0; // return good + } + + return -1; // return error +} + + +void rfidFlush() // Empties any buffered incoming serial data +{ + while (rfidSerial.available() > 0) + rfidSerial.read(); +} + + +// from http://forum.arduino.cc/index.php?topic=38107#msg282343 +void PrintHex(uint8_t *data, uint8_t length) // prints 8-bit data in hex +{ + char tmp[length*2+1]; + byte first ; + int j=0; + for (uint8_t i=0; i> 4) | 48; + if (first > 57) tmp[j] = first + (byte)39; + else tmp[j] = first ; + j++; + + first = (data[i] & 0x0F) | 48; + if (first > 57) tmp[j] = first + (byte)39; + else tmp[j] = first; + j++; + } + tmp[length*2] = 0; + Serial.print(tmp); +} + diff --git a/C++/Arduino/RFID_Reader_Writer/RFID_Reader_Writer.ino b/C++/Arduino/RFID_Reader_Writer/RFID_Reader_Writer.ino new file mode 100644 index 0000000..5217060 --- /dev/null +++ b/C++/Arduino/RFID_Reader_Writer/RFID_Reader_Writer.ino @@ -0,0 +1,13 @@ + /* ------------------------------------ + * MFRC522 Arduino + * Reader/PCD Uno + * Signal Pin Pin + * ------------------------------------- + * RST/Reset RST 9 + * SPI SS SDA(SS) 10 + * SPI MOSI MOSI 11 / ICSP-4 + * SPI MISO MISO 12 / ICSP-1 + * SPI SCK SCK 13 / ICSP-3 + */ + +