Разблокировка двери Arduino NFC

Я пытаюсь использовать плату arduino со щитом NFC, чтобы иметь возможность открыть дверь моей машины.

Плата: Arduino UNO Rev 3 NFC Shield: v2.0b от Seeed Studio

Поэтому при наличии метки NFC сервопривод поворачивается на 180 градусов, чтобы открыть дверь. В настоящее время проблема заключается в том, что я хотел бы, чтобы только одна метка NFC могла открывать/запирать дверь, а не любую.

На данный момент любая метка NFC может поворачивать сервопривод.

Кто-нибудь знает, какую функцию вызывать, чтобы возвращать только UID тега NFC, который затем можно сравнить с известным тегом NFC.

http://www.seeedstudio.com/wiki/NFC_Shield_V2.0

#include <SPI.h>
#include "PN532_SPI.h"
#include "PN532.h"
#include "NfcAdapter.h"

String const myUID = "1B B3 C6 EF"; // replace this UID with your NFC tag's UID
int const greenLedPin = 3; // green led used for correct key notification
int const redLedPin = 4; // red led used for incorrect key notification

PN532_SPI interface(SPI, 10); // create a SPI interface for the shield with the SPI CS terminal at digital pin 10
NfcAdapter nfc = NfcAdapter(interface); // create an NFC adapter object

void setup(void) {
    Serial.begin(115200); // start serial comm
    Serial.println("NDEF Reader");
    nfc.begin(); // begin NFC comm

    // make LED pins outputs
    pinMode(greenLedPin,OUTPUT);
    pinMode(redLedPin,OUTPUT);

    // turn off the LEDs
    digitalWrite(greenLedPin,LOW);
    digitalWrite(redLedPin,LOW);
}

void loop(void) {

    Serial.println("Scanning...");
    if (nfc.tagPresent()) // check if an NFC tag is present on the antenna area
    {
        NfcTag tag = nfc.read(); // read the NFC tag
        String scannedUID = tag.getUidString(); // get the NFC tag's UID

        if( myUID.compareTo(scannedUID) == 0) // compare the NFC tag's UID with the correct tag's UID (a match exists when compareTo returns 0)
        {
          // The correct NFC tag was used
          Serial.println("Correct Key");
          // Blink the green LED and make sure the RED led is off
          digitalWrite(greenLedPin,HIGH);
          digitalWrite(redLedPin,LOW);

          delay(500);
          digitalWrite(greenLedPin,LOW);
          delay(500);
          digitalWrite(greenLedPin,HIGH);
          delay(500);
          digitalWrite(greenLedPin,LOW);
          // put your here to trigger the unlocking mechanism (e.g. motor, transducer)
        }else{
          // an incorrect NFC tag was used
          Serial.println("Incorrect key");
          // blink the red LED and make sure the green LED is off
          digitalWrite(greenLedPin,LOW);
          digitalWrite(redLedPin,HIGH);

          delay(500);
          digitalWrite(redLedPin,LOW);
          delay(500);
          digitalWrite(redLedPin,HIGH);
          delay(500);
          digitalWrite(redLedPin,LOW);
          // DO NOT UNLOCK! an incorrect NFC tag was used. 
          // put your code here to trigger an alarm (e.g. buzzard, speaker) or do something else
        }
    }
    delay(2000);
}

Этот код работает.


person user3599457    schedule 03.05.2014    source источник


Ответы (3)


Вы указываете, что вы в настоящее время разблокируете при обнаружении любой метки. Таким образом, вы должны уже опрашивать теги. Если вы используете исходную библиотеку seeedstudio, вы можете либо просто выполнить опрос для любой пассивной цели, используя метод inListPassiveTarget(), либо (как уже указывал коммесан) метод readPassiveTargetID().

В то время как inListPassiveTarget() просто возвращает логическое значение, указывающее, присутствует ли какая-либо цель, метод readPassiveTargetID() предоставляет набор параметров конфигурации, а также позволяет получить идентификатор предотвращения конфликтов (например, UID для ISO 14443). Введите):

bool PN532::readPassiveTargetID(uint8_t cardbaudrate, uint8_t *uid, uint8_t *uidLength, uint16_t timeout);

Вы можете использовать метод следующим образом:

uint8_t uid[16] = { 0 };
uint8_t uidLen = 0;

if (nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, &uid[0], &uidLen)) {
    // uid will now contain uidLen bytes of the anti-collision identifier
}

Если вы хотите опросить другие карты, кроме ISO 14443 Type A, вы можете использовать следующие определения вместо PN532_MIFARE_ISO14443A:

// ISO 14443 Type B
#define PN532_BAUD_ISO14443B   (0x03)
// FeliCa 212 kbps
#define PN532_BAUD_FELICA212   (0x01)
// FeliCa 424 kbps
#define PN532_BAUD_FELICA424   (0x02)
// Jewel Tag (NFC Forum Type 1)
#define PN532_BAUD_JEWEL       (0x04)

Наконец, мое обычное примечание об использовании UID тега для контроля доступа: не делайте этого! Было доказано, что это очень плохая идея во многих существующих системах. См. эти сообщения для получения дополнительной информации:

person Michael Roland    schedule 03.05.2014
comment
Спасибо за информацию и предупреждение. Я понимаю, что метку NFC можно клонировать, однако никто не узнает, что мою машину можно разблокировать таким образом. Это машина 1992 года ;) Завтра попробую код. - person user3599457; 03.05.2014

Я тоже это делаю и, используя пример ReadTag из примеров библиотеки NFC, у меня есть UID с этим:

Serial.println("\nScan electronic key\n");
if (nfc.tagPresent())
{
    NfcTag tag = nfc.read();
    Serial.println(tag.getTagType());
    String idnumber = tag.getUidString();
    Serial.print("UID: ");Serial.println(idnumber);

Это дает, например, 30 5C 6F 80 из тега «таблетка» Mifare Classic. После небольшого анализа это возвращается из библиотеки в виде отформатированной строки символов 11, поэтому я сравниваю ее с

String valid = ("30 5C 6F 80") ;

И это сравнение работает:

 if (valid == idnumber) {
    Serial.println("Yes") ;
    // simulate door open by turning LED on
    digitalWrite(lockopen, HIGH);
    delay(lockopen_interval);
    digitalWrite(lockopen, LOW); 

    } else {
      Serial.println("No") ;
    }  
person Hugh Barnard    schedule 09.07.2014

Я считаю, что вы можете использовать:

readPassiveTargetID(PN532_MIFARE_ISO14443A)

чтобы получить идентификатор.

person commesan    schedule 03.05.2014