Enkelt låssystem med NFC Shield för Arduino

Om man vill använda sitt chip till något som det inte finns någon lösning för är det inte omöjligt att man själv kan bygga en lösning för problemet. Har man motivationen och kan lite elektronik och programmering kan man komma ganska långt. Då behöver man bara hårdvaran. Vi kommer skriva om den hårdvara som finns i dagsläget på marknaden och som antingen fungerar bra eller åtminstone hyfsat bra med chippen, och vi börjar med läsaren som kallas för NFC Shield V2.1. Detta är en (som kan tolkas ur namnet på den) en NFC (13,56 MHz) shield för Arduino och har utvecklats av Seeed Studio. Det är open source hårdvara så dokumentationen för läsaren är väldigt bra. Det är en läsare som fungerar ovanligt bra med chippen NTAG216 och Mifare Classic. Eftersom det är en shield finns det inte mycket att tänka på för att komma igång, och en annan bra grej med den här shielden är att själva antennen hänger löst i en tråd, så det är lättare att placera den på ett sätt som passar ens tilltänkta användningsområde bättre. Här visar vi hur du kan använda denna shield för att läsa av ett chip (eller en nyckeltagg/kort) för att sedan tända en LED, baserat på om id-numret på chippet stämmer med det numret som finns sparat i koden. Istället för att tända en LED skulle man självklart kunna låsa upp ett lås istället. Denna applikation finns även beskrivet på dokumentation-sidan för shielden.

NFC shield för Arduino
NFC Shield V2.1 från Seeed Studio.

Hårdvara och material

  • 1 st Arduino (vilken modell som helst, förutom Intel Edison)
  • 1 st NFC Shield V2.0 eller V2.1
  • 1 st Kopplingsplatta
  • 2 st LED (förslagsvis en röd och en grön)
  • 2 st 1kΩ resistor
  • Kopplingstråd

Installera nödvändiga programbibliotek

Innan vi börjar koppla ihop allting behöver vi installera några programbibliotek. Om du inte redan har installerat Arduinos IDE kan du ladda ned det här och installera enligt instruktionerna för ditt operativsystem (det finns även en online-editor, men jag har inte testat den). Sedan behöver vi ladda ned programbiblioteken för att kunna använda NFC shielden.

  1. Stäng ned IDEn om det inte redan är nedstängt
  2. Ladda ned zipfilen för programbiblioteket för PN532 och extrahera filerna.
  3. Kopiera mapparna för PN532, PN532_HSU, PN532_SPI, and PN532_I2C till mappen i din Arduino-mapp som heter libraries.
  4. Ladda ned Dons NDEF programbibliotek och extrahera filerna.
  5. Byt namn på mappen NDEF-master till NDEF och kopiera även denna mapp till mappen libraries i din Arduino-mapp.
  6. Starta nu Arduinos IDE. Nu ska du kunna se NDEF och PN532 som alternativ under File > Examples.

Läsa av ett chip med NFC Shield

Nu kan vi ta reda på vilket id-nummer som ditt chip har, och därefter kan vi spara den i koden och jämföra med det id-numret som vi kommer läsa från ditt chip. Sätt ihop din shield och sätt den på din Arduino, om det inte redan levereras som ett färdigt paket. Kopiera sedan koden nedan till din Arduino IDE och ladda upp koden till din Arduino.

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

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

void setup(void) {
 

Serial.begin(115200); // begin serial communication
    Serial.println("NDEF Reader");
    nfc.begin(); // begin NFC communication
}

void loop(void) {

    Serial.println("\nScan an NFC tag\n");
    if (nfc.tagPresent()) // Do an NFC scan to see if an NFC tag is present
    {
        NfcTag tag = nfc.read(); // read the NFC tag into an object, nfc.read() returns an NfcTag object.
        tag.print(); // prints the NFC tags type, UID, and NDEF message (if available)
    }
    delay(500); // wait half a second (500ms) before scanning again (you may increment or decrement the wait time)
}

Sedan behöver du göra följande:

  1. Öppna Serial monitor-fönstret under Verktyg > Seriell Monitor.
  2. Sätt baudrate till 115200.
  3. Håll nu läsarens antenn mot ditt chip. Id-numret på chippet och annan information kommer läsas av och printas ut i monitorn (se bilden nedan).
  4. Anteckna id-numret på chippet (UID).

Dörrlåssystem med NFC Shield

Nu kan vi fortsätta med att bygga dörrlåssystemet. Det här är ett väldigt enkelt exempel. Systemet kommer läsa av id-numret av ett chip (eller kort) och jämföra det med ett id-numer som finns sparat i en variabel i koden. Om numret i variabeln stämmer överens med numret som finns på chippet kommer den gröna LEDn att blinka. Annars börjar den röda LEDn blinka.

Sätt ihop alla delar på enligt schemat nedan.

Kopplingsschema för Arduino
Kopplingsschema för enkelt dörrlåssystem. Bild från seeedstudio.com

Öppna sedan upp en ny sketch och kopiera in koden nedan:

    #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);
    }

På rad 6 hittar du variabeln myUID. Ändra denna till ditt eget UID som du läste av i första delen. Ladda sedan koden till din Arduino. Öppna Seriell Monitor igen och läs först av ditt eget chip. Den gröna LEDn ska börja blinka. Läs sedan av till exempel ditt busskort. Den röda LEDn ska börja blinka.

Detta går sedan att bygga ut och koppla till exempel diverse lås. Resultatet går se i Youtube-videon nedan.