Arduino - RFID/NFC - Servo Motor

In deze tutorial leert u hoe u een RFID/NFC-tag gebruikt om een servo motor met Arduino aan te sturen. Het werkt als volgt:

Deze toepassing is bijvoorbeeld bruikbaar voor het vergrendelen/ontgrendelen van een kast, lade, deur of het openen/sluiten van een voederautomaat voor huisdieren...

Hardware Vereist

1×Arduino Uno R3
1×USB 2.0 kabel type A/B
1×RFID/NFC RC522 Kit (lezer + tags)
1×RFID Key Fob
1×RFID Kaart
1×Servomotor
1×5V Voedingsadapter
1×DC Voedingsconnector
1×Jumperdraden
1×(Aanbevolen) Schroefklem Block Shield voor Arduino Uno
1×(Aanbevolen) Breadboard-Shield voor Arduino Uno
1×(Aanbevolen) Behuizing voor Arduino Uno
1×(Aanbevolen) Prototyping Basisplaat & Breadboard Kit voor Arduino Uno

Of u kunt de volgende kits kopen:

1×DIYables Sensorkit (30 sensoren/displays)
1×DIYables Sensorkit (18 sensoren/displays)
Openbaarmaking: Sommige van de links in deze sectie zijn Amazon-affiliate links. We kunnen een commissie ontvangen voor aankopen die via deze links worden gedaan, zonder extra kosten voor u. We waarderen uw steun.

Over RFID/NFC RC522 Module en Servo Motor

Als u nog niet bekend bent met de RFID/NFC RC522 Module en Servo Motor (pinout, werking, programmering...), raadpleeg dan de volgende tutorials:

Arduino arduino rfid servo motor component

Hoe Het Werkt

  • De UIDs van een aantal RFID/NFC-tags zijn vooraf ingesteld in de Arduino-code
  • De gebruiker tikt een RFID/NFC-tag op de RFID/NFC-lezer
  • De lezer leest de UID van de tag
  • De Arduino ontvangt de UID van de lezer
  • De Arduino vergelijkt de gelezen UID met de vooraf gedefinieerde UIDs
  • Als de UID overeenkomt met een van de gedefinieerde UIDs, bestuurt Arduino de servo motor naar 90°
  • Als de tag nogmaals wordt aangeraakt, bestuurt Arduino de servo motor terug naar 0°
  • Dit proces wordt oneindig herhaald

Bedradingsschema

Arduino RFID RC522 servo motor bedradingsschema

This image is created using Fritzing. Click to enlarge image

In het bovenstaande bedradingsschema wordt een enkele 5V-adapter gebruikt om direct voeding te leveren aan de Arduino, rechtstreeks aan de servo motor en de RC522-module (indirect via de 3.3V-pin van de Arduino).

Om het proces te vereenvoudigen zijn de pinnen van de RC522-module direct verbonden met de Arduino-pinnen. Dit kan echter ervoor zorgen dat de Arduino in bepaalde gevallen niet correct werkt, omdat de outputpinnen van de Arduino een spanning van 5V leveren, terwijl de pinnen van de RC522-module normaal werken op een spanning van 3.3V. Daarom is het verstandig om de spanning tussen de Arduino-pinnen en de RC522-module te regelen. Raadpleeg voor meer details de Arduino - RFID RC522 tutorial. Hieronder ziet u een voorbeeld hoe u 5V kunt terugbrengen naar 3.3V met weerstanden:

Arduino RFID RC522 met spanningsregeling bedradingsschema

This image is created using Fritzing. Click to enlarge image

※ Notiz:

De volgorde van de pinnen kan verschillen per fabrikant. Gebruik ALTIJD de op het module afgedrukte labels. De bovenstaande afbeelding toont de pinout van modules van fabrikant DIYables.

Bedradingsschema RFID/NFC RC522 Module

RFID/NFC RC522 Arduino
SS → 10
SCK → 13
MOSI → 11
MISO → 12
IRQ (niet verbonden)
GNDGND
RST → 9
VCC → 3.3V

Bedradingsschema Servo Motor

Servo Motor Arduino 5V DC Adapter
VCC (rood) → positieve pool
GND (bruin) → negatieve pool
SIG (geel) → A5

Bedradingsschema 5V DC Voedingsadapter

5V DC Adapter Servo Motor Arduino
PositiefVCC
Positief → Vin
NegatiefGND
NegatiefGND

Arduino Code – Enkele RFID/NFC Tag

/* * Deze Arduino code is ontwikkeld door newbiely.nl * Deze Arduino code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/tutorials/arduino/arduino-rfid-nfc-servo-motor */ #include <SPI.h> #include <MFRC522.h> #include <Servo.h> #define SS_PIN 10 #define RST_PIN 9 #define SERVO_PIN A5 MFRC522 rfid(SS_PIN, RST_PIN); Servo servo; byte authorizedUID[4] = {0xFF, 0xFF, 0xFF, 0xFF}; int angle = 0; // the current angle of servo motor void setup() { Serial.begin(9600); SPI.begin(); // init SPI bus rfid.PCD_Init(); // init MFRC522 servo.attach(SERVO_PIN); servo.write(angle); // rotate servo motor to 0° Serial.println("Tap RFID/NFC Tag on reader"); } void loop() { if (rfid.PICC_IsNewCardPresent()) { // new tag is available if (rfid.PICC_ReadCardSerial()) { // NUID has been readed MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak); if (rfid.uid.uidByte[0] == authorizedUID[0] && rfid.uid.uidByte[1] == authorizedUID[1] && rfid.uid.uidByte[2] == authorizedUID[2] && rfid.uid.uidByte[3] == authorizedUID[3] ) { Serial.println("Authorized Tag"); // change angle of servo motor if (angle == 0) angle = 90; else //if(angle == 90) angle = 0; // control servo motor arccoding to the angle servo.write(angle); Serial.print("Rotate Servo Motor to "); Serial.print(angle); Serial.println("°"); } else { Serial.print("Unauthorized Tag with UID:"); for (int i = 0; i < rfid.uid.size; i++) { Serial.print(rfid.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(rfid.uid.uidByte[i], HEX); } Serial.println(); } rfid.PICC_HaltA(); // halt PICC rfid.PCD_StopCrypto1(); // stop encryption on PCD } } }

Snelle Stappen

  • Ga naar het Libraries-icoon in de linkerzijbalk van de Arduino IDE.
  • Zoek naar “MFRC522” en vind de library van GithubCommunity
  • Klik op de Installeren-knop om de MFRC522-library te installeren.
Arduino MFRC522 library

Omdat de UID meestal niet op de RFID/NFC-tag gedrukt staat, is de eerste stap om de UID van de tag te achterhalen. Dit doet u als volgt:

  • Kopieer bovenstaande code en open deze met de Arduino IDE
  • Klik op de Upload-knop in de Arduino IDE om de code naar de Arduino te uploaden
  • Open de Seriële Monitor
  • Tik een RFID/NFC-tag op de RFID-RC522-module
  • Noteer de UID in de Seriële Monitor
COM6
Send
Tap RFID/NFC tag on reader Unauthorized Tag with UID: 3A C9 6A CB
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Na het verkrijgen van de UID:

  • Werk de UID bij in regel 20 van de bovenstaande code. Bijvoorbeeld, wijzig byte authorizedUID[4] = {0xFF, 0xFF, 0xFF, 0xFF}; naar byte authorizedUID[4] = {0x3A, 0xC9, 0x6A, 0xCB};
  • Upload de code opnieuw naar de Arduino
  • Tik een RFID/NFC-tag op de RFID-RC522-module
  • U ziet dat de servo motor naar 90° draait
  • Bekijk de output in de Seriële Monitor
COM6
Send
Tap RFID/NFC tag on reader Authorized Tag Rotate Servo Motor to 90°
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • Tik opnieuw op dezelfde RFID/NFC-tag op de RFID-RC522-module
  • U ziet dat de servo motor terug draait naar 0°
  • Bekijk de output in de Seriële Monitor
COM6
Send
Tap RFID/NFC tag on reader Authorized Tag Rotate Servo Motor to 90° Authorized Tag Rotate Servo Motor to 0°
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • Tik met een andere RFID/NFC-tag op de RFID-RC522-module
  • Bekijk de output in de Seriële Monitor
COM6
Send
Tap RFID/NFC tag on reader Authorized Tag Rotate Servo Motor to 90° Authorized Tag Rotate Servo Motor to 0° Unauthorized Tag with UID: BD 1E 1D 00
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Arduino Code – Meerdere RFID/NFC Tags

We kunnen meerdere RFID/NFC-tags toestaan om de servo motor te bedienen. De onderstaande code gebruikt twee tags als voorbeeld.

/* * Deze Arduino code is ontwikkeld door newbiely.nl * Deze Arduino code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/tutorials/arduino/arduino-rfid-nfc-servo-motor */ #include <SPI.h> #include <MFRC522.h> #include <Servo.h> #define SS_PIN 10 #define RST_PIN 9 #define SERVO_PIN A5 MFRC522 rfid(SS_PIN, RST_PIN); Servo servo; byte authorizedUID1[4] = {0x3A, 0xC9, 0x6A, 0xCB}; byte authorizedUID2[4] = {0x30, 0x01, 0x8B, 0x15}; int angle = 0; // the current angle of servo motor void setup() { Serial.begin(9600); SPI.begin(); // init SPI bus rfid.PCD_Init(); // init MFRC522 servo.attach(SERVO_PIN); servo.write(angle); // rotate servo motor to 0° Serial.println("Tap RFID/NFC Tag on reader"); } void loop() { if (rfid.PICC_IsNewCardPresent()) { // new tag is available if (rfid.PICC_ReadCardSerial()) { // NUID has been readed MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak); if (rfid.uid.uidByte[0] == authorizedUID1[0] && rfid.uid.uidByte[1] == authorizedUID1[1] && rfid.uid.uidByte[2] == authorizedUID1[2] && rfid.uid.uidByte[3] == authorizedUID1[3] ) { Serial.println("Authorized Tag 1"); changeServo(); } else if (rfid.uid.uidByte[0] == authorizedUID2[0] && rfid.uid.uidByte[1] == authorizedUID2[1] && rfid.uid.uidByte[2] == authorizedUID2[2] && rfid.uid.uidByte[3] == authorizedUID2[3] ) { Serial.println("Authorized Tag 2"); changeServo(); } else { Serial.print("Unauthorized Tag with UID:"); for (int i = 0; i < rfid.uid.size; i++) { Serial.print(rfid.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(rfid.uid.uidByte[i], HEX); } Serial.println(); } rfid.PICC_HaltA(); // halt PICC rfid.PCD_StopCrypto1(); // stop encryption on PCD } } } void changeServo() { // change angle of servo motor if (angle == 0) angle = 90; else //if(angle == 90) angle = 0; // control servo motor arccoding to the angle servo.write(angle); Serial.print("Rotate Servo Motor to "); Serial.print(angle); Serial.println("°"); }

Volg vergelijkbare stappen als hierboven en tik vervolgens één voor één de tags op de RFID-RC522-module. De output in de Seriële Monitor ziet er als volgt uit:

COM6
Send
Tap RFID/NFC tag on reader Authorized Tag 2 Rotate Servo Motor to 90° Authorized Tag 1 Rotate Servo Motor to 0°
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

U kunt bovenstaande code uitbreiden voor drie, vier of meer tags.

Video Tutorial

We overwegen het maken van videotutorials. Als u videotutorials belangrijk vindt, abonneer u dan op ons YouTube-kanaal om ons te motiveren de video's te maken.

Bekijk onze video-tutorial voor een visuele begeleiding bij dit project! De video biedt extra inzichten en helpt bij het snel begrijpen van de implementatie.

※ ONZE BERICHTEN

  • U bent welkom om de link naar deze tutorial te delen. Gebruik onze inhoud echter niet op andere websites. We hebben veel moeite en tijd gestoken in het maken van de inhoud, respecteer alstublieft ons werk!