Go Down

Topic: [OPGELOST] Arduino RFID vraagje  (Read 2559 times) previous topic - next topic

akatchi

Dec 02, 2016, 04:40 pm Last Edit: Dec 14, 2016, 08:14 pm by akatchi
Hey,

Ik ben bezig met een project waarvoor ik een RFID gebruik.
Zie meer hierover in dit filmpje: https://www.youtube.com/watch?v=23aMjljCLZI
De code in dit filmpje is de code die in gebruik, en op het moment dat ik een pasje scan of iets dergelijks zie je veel informatie maar vooral belangrijk een 'Card UID: ....'
Nu vraag ik me af hoe ik in die code het zo kan krijgen dat bij een bepaald Card UID er iets gebeurt, een if-statement dus. Maar hoe krijg ik het zo dat die if-statement runt bij die Card UID..?

(Hij gebruikt deze libraries:
#include <SPI.h>
#include <MFRC522.h>)

Zie bijlage voor code en screenshot hoe het er in de Serial console uit ziet.

Alvast bedankt.

nicoverduin

Met een gewoon if statement kom je er niet mee weg. Er is als het goed is in de library een voorbeeld om de Uid te veranderen. dit is de sketch:
Code: [Select]

/*
 * --------------------------------------------------------------------------------------------------------------------
 * Example to change UID of changeable MIFARE card.
 * --------------------------------------------------------------------------------------------------------------------
 * This is a MFRC522 library example; for further details and other examples see: https://github.com/miguelbalboa/rfid
 * 
 * This sample shows how to set the UID on a UID changeable MIFARE card.
 * NOTE: for more informations read the README.rst
 * 
 * @author Tom Clement
 * @license Released into the public domain.
 *
 * Typical pin layout used:
 * -----------------------------------------------------------------------------------------
 *             MFRC522      Arduino       Arduino   Arduino    Arduino          Arduino
 *             Reader/PCD   Uno/101       Mega      Nano v3    Leonardo/Micro   Pro Micro
 * Signal      Pin          Pin           Pin       Pin        Pin              Pin
 * -----------------------------------------------------------------------------------------
 * RST/Reset   RST          9             5         D9         RESET/ICSP-5     RST
 * SPI SS      SDA(SS)      10            53        D10        10               10
 * SPI MOSI    MOSI         11 / ICSP-4   51        D11        ICSP-4           16
 * SPI MISO    MISO         12 / ICSP-1   50        D12        ICSP-1           14
 * SPI SCK     SCK          13 / ICSP-3   52        D13        ICSP-3           15
 */

#include <SPI.h>
#include <MFRC522.h>

#define RST_PIN   9     // Configurable, see typical pin layout above
#define SS_PIN    10    // Configurable, see typical pin layout above

MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance

/* Set your new UID here! */
#define NEW_UID {0xDE, 0xAD, 0xBE, 0xEF}

MFRC522::MIFARE_Key key;

void setup() {
  Serial.begin(9600);  // Initialize serial communications with the PC
  while (!Serial);     // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
  SPI.begin();         // Init SPI bus
  mfrc522.PCD_Init();  // Init MFRC522 card
  Serial.println(F("Warning: this example overwrites the UID of your UID changeable card, use with care!"));
  
  // Prepare key - all keys are set to FFFFFFFFFFFFh at chip delivery from the factory.
  for (byte i = 0; i < 6; i++) {
    key.keyByte[i] = 0xFF;
  }
}

// Setting the UID can be as simple as this:
//void loop() {
//  byte newUid[] = NEW_UID;
//  if ( mfrc522.MIFARE_SetUid(newUid, (byte)4, true) ) {
//    Serial.println("Wrote new UID to card.");
//  }
//  delay(1000);
//}

// But of course this is a more proper approach
void loop() {
  
  // Look for new cards, and select one if present
  if ( ! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial() ) {
    delay(50);
    return;
  }
  
  // Now a card is selected. The UID and SAK is in mfrc522.uid.
  
  // Dump UID
  Serial.print(F("Card UID:"));
  for (byte i = 0; i < mfrc522.uid.size; i++) {
    Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
    Serial.print(mfrc522.uid.uidByte[i], HEX);
  } 
  Serial.println();

  // Dump PICC type
//  MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
//  Serial.print(F("PICC type: "));
//  Serial.print(mfrc522.PICC_GetTypeName(piccType));
//  Serial.print(F(" (SAK "));
//  Serial.print(mfrc522.uid.sak);
//  Serial.print(")\r\n");
//  if (  piccType != MFRC522::PICC_TYPE_MIFARE_MINI 
//    &&  piccType != MFRC522::PICC_TYPE_MIFARE_1K
//    &&  piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
//    Serial.println(F("This sample only works with MIFARE Classic cards."));
//    return;
//  }
  
  // Set new UID
  byte newUid[] = NEW_UID;
  if ( mfrc522.MIFARE_SetUid(newUid, (byte)4, true) ) {
    Serial.println(F("Wrote new UID to card."));
  }
  
  // Halt PICC and re-select it so DumpToSerial doesn't get confused
  mfrc522.PICC_HaltA();
  if ( ! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial() ) {
    return;
  }
  
  // Dump the new memory contents
  Serial.println(F("New UID and contents:"));
  mfrc522.PICC_DumpToSerial(&(mfrc522.uid));
  
  delay(2000);
}


Daarvan is dus dit stukje code van belang
Code: [Select]

// Dump UID
  Serial.print(F("Card UID:"));
  for (byte i = 0; i < mfrc522.uid.size; i++) {
    Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
    Serial.print(mfrc522.uid.uidByte[i], HEX);
  } 
  Serial.println();

Dit print de Uid uit.  Je zult dus een array moeten maken waarin de Uid staat die je wilt testen. Dan een boolean vooraf zetten op bijv. 
Code: [Select]

boolean gevonden = true;


Dan vergelijk je de gelezen Uid met de Uid die je in het geheugen hebt en zodra er een byte een verschil heeft zet je gevonden op false en doe je een break; verder zoeken in de loop is weinig zinvol omdat hij toch al ongelijk is.

Met vriendelijke groet / kindest regards
Nico Verduin
www.verelec.nl
Do not PM me for personal consultancy unless you are willing to pay for it.

akatchi

Harstikke bedankt Nico, maar bedoel je nu dat ik de UID van zo'n chip/pasje overwrite met een nieuwe?

Want ik bedoel gewoon dat bij een bepaald UID die ik eerder in mijn serial monitor heb afgelezen dat er dan bijvoorbeeld een lampje gaat branden, niet dat ik het UID verander van zo'n chip of iets.

Sorry als je het wel zo hebt gedaan, ben nog beginner.

spirit

#3
Dec 03, 2016, 05:50 am Last Edit: Dec 03, 2016, 05:51 am by spirit
goeiedag.

van vele RFID Chip/pasjes kan je de UID helemaal niet! veranderen.

ik heb ook ooit een projectje gemaakt met deze library.
maar in deze variable/array
Code: [Select]
mfrc522.uid.uidByte[i]
 staat dus de UID van de tag die hij heeft gelezen.


en je kan dus UID vergelijken met de UID die jij in je code hebt staan. (hard coded)
of zo als ik heb gedaan is om de UID op teslaan in de EEPROM, doormiddel van een "Learn Mode"
zo dat als de Arduino stroom verliest alle UID's in de EEPROM staan opgeslagen.

nicoverduin

Het voorbeeld was niet om aan te geven hoe je hem moest veranderen maar hoe je hem moet lezen om daarna te vergelijken.
Met vriendelijke groet / kindest regards
Nico Verduin
www.verelec.nl
Do not PM me for personal consultancy unless you are willing to pay for it.

akatchi

Ohh maar kijk ik bedoel het heel simpel.
1. Ik scan zo'n pasje en ik krijg in mijn Serial het UID te zien.
2. Deze UID wil ik nu gaan gebruiken als in een if-statement.
3. Ongeveer zo, 'if (cardUID = 8DENFQ) {
                           digitalWrite(lampje, HIGH);
                            }
Maar mijn punt is nu dat dat 'cardUID = ....' natuurlijk helemaal niet zo werkt, maar hoe kan ik het dan toch zo krijgen dat het wel werkt bij bepaalde pasjes zeg maar.

nicoverduin

Je kan het wel willen maar dat wil nog niet zeggen dat het zo gaat gebeuren. Ik weet niet uit hoeveel cijfers het nummer bestaat, maar een int32 getal gaat niet verder dan 10 cijfers decimaal en 8 cijfers in hex. In het voorbeeld staat hoe je een uid kan printen. Als je dat doet weet je hoe groot die is. 
Ik heb je ook een voorbeeld gegeven om te toetsen of de UID gelijk is aan een opgeslagen UID. De uitkomst is de boolean. Die kan je gebruiken in een if statement.
Als dit nog een brug te ver is, zou het zomaar eens kunnen dat je nog niet voldoende kennis en ervaring hebt om dit project te moeten uitvoer en zou je kunnen overwegen een stapje terug te doen en eerst meer ervaring op te doen.
'Dus je hebt het basis materiaal bovenstaand. Nu is het jouw beurt.
Met vriendelijke groet / kindest regards
Nico Verduin
www.verelec.nl
Do not PM me for personal consultancy unless you are willing to pay for it.

akatchi

Oke bedankt Nico, maar ik heb nog een vraagje, want in dat voorbeeld met 'ChangeUID', in die code staat toch : 
Code: [Select]
byte newUid[] = NEW_UID;
  if ( mfrc522.MIFARE_SetUid(newUid, (byte)4, true) ) {
    Serial.println(F("Wrote new UID to card."));

Bedoelen ze daar niet mee dat ze dan een nieuwe UID op de card hebben gezet?

Maar ik ben nog niet echt de slimste met Bytes, maar als ik dus een pasje hebt en ik wil daarvan de Card UID zo hebben dat de code hem herkent moet ik heb ongeveer zo doen.

Code: [Select]
byte HerkanNaam1 = ...

Ik had zoiets ook nog op internet gevonden:

Code: [Select]
if(str[0] == 56)

Ik snap dat er echt niks van klopt, maar ik snap dit gedeelte niet hoe ik het zo in mijn code kan opslaan, ja misschien is het iets te moeilijk maar ik zou het wel echt willen weten..

akatchi

Oke Nico, mede dankzij je tips ben ik hier nu gekomen, kun je me vertellen of dit klopt en of het gaat werken?
Kun je me ook vertellen of het met het 'Dumpen' ook goed gaat.

Code: [Select]

byte Bram[] = {0xEE,0x29,0x43,0x14};   //Pasje Henk
byte Henk[] = {0xF6, 0x9D, 0xF7, 0x30}; // Blauwe Tag
int successRead;     

byte dummy = 0x00;

byte readCard[4]; 

..............

  while (!successRead);    //Communicatie met kaart
 
  if (readCard[0] == Bram[0] && readCard[1] == Bram[1]
  && readCard[2] == Bram[2] && readCard[3] == Bram[3])              //checking for blue card
  {   
   
    Serial.println("Welkom Bram");
   
   SuccesBram();
   
   for(int i = 0; i<4; i++) dummy = readCard[i];   // removing previous stored value from the readCard variable
   
   successRead = 0;


Ik heb nu meerdere if statements met de verschillende bytes, ik heb nu niet de initaliazes en de setup in de code gedaan, maar het gaat even om dit gedeelte?
Klopt dit zo :D?

nicoverduin

Weet ik ik niet. Dat ga jij beantwoorden.... Ik vind nu eenmaal dat men veel meer eerst zelf moet proberen dan weer aan een ander vragen of iets werkt..... Je kan niets stuk maken. Dus wat houdt je tegen om ons te vertellen dat het werkt?
Initiatief.... en zo....ontdekken.....
Met vriendelijke groet / kindest regards
Nico Verduin
www.verelec.nl
Do not PM me for personal consultancy unless you are willing to pay for it.

Jantje

Weet ik ik niet. Dat ga jij beantwoorden.... Ik vind nu eenmaal dat men veel meer eerst zelf moet proberen dan weer aan een ander vragen of iets werkt..... Je kan niets stuk maken. Dus wat houdt je tegen om ons te vertellen dat het werkt?
Initiatief.... en zo....ontdekken.....
@akatchi
Dat is de geest van dit forum. Geef de mensen een vis en ze hebben eten voor 1 dag, leer de mensen vissen en ze hebben eten voor de rest van hun leven.
Wil je gewoon een oplossing dan moet je maar iemand zoeken die het voor je doet tegen betaling.

De moderator
Jantje
Do not PM me a question unless you are prepared to pay for consultancy.
Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -

akatchi

@akatchi
Dat is de geest van dit forum. Geef de mensen een vis en ze hebben eten voor 1 dag, leer de mensen vissen en ze hebben eten voor de rest van hun leven.
Wil je gewoon een oplossing dan moet je maar iemand zoeken die het voor je doet tegen betaling.

De moderator
Jantje
Lol, een forum is er toch gewoon om vragen te stellen, als je ze niet wilt beantwoorden dan hoeft dat niet hoor...

MAS3

Heb je het al geprobeerd dan ?

Gewoon die code die je nu hebt naar je Arduino, shields en zo er aan en kijken wat er gebeurt.
Als je niet kunt bijhouden wat er gebeurt, bouw je een paar delay()s in op strategische plaatsen.
Voor debugging kan dat helpen.
Net zoals de seriƫle verbinding en / of een display je kunnen helpen.

Echt daar leer je pas serieus van.
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

akatchi

Jahoor hij werkte, maar ik kan pas om de zoveel dagen hij die scanner omdat ik het niet hier thuis heb :)!
Maar het werkte prima, nu loop ik weer tegen een nieuwe probleem aan; het clonen van een tag.
Wordt nog wat haha.

nicoverduin

We horen wel wanneer je het opgelost hebt...
Met vriendelijke groet / kindest regards
Nico Verduin
www.verelec.nl
Do not PM me for personal consultancy unless you are willing to pay for it.

Go Up