Go Down

Topic: mfrc522 rfid lezer samen met rf-modules (Read 981 times) previous topic - next topic

MaartenWoutTycho

Dec 10, 2013, 08:51 pm Last Edit: Dec 10, 2013, 09:04 pm by MaartenWoutTycho Reason: 1
Hallo allemaal,
In mijn project probeer ik RFID samen met RF-communicatie tussen twee arduino's toe te voegen. Ik heb een mfrc522 rfid lezer ik gebruik de library MFRC522.h. Voor de rf-communicatie gebruik ik een simpele rf-transmitter en receiver en  de library VirtualWire.h

Beide modules werken helemaal goed als los van elkaar maar als ik de twee programma's bij elkaar voeg gaat er iets fout. Als ik de opdracht vw_setup(300) weghaal dan kan ik in de seriƫle monitor kan de UID nog uitlezen, maar als ik een tag scan met de uid die overeenkomt met die van het programma dan stopt het programma ermee. Hij geeft nog wel de uid weer maar daarna loopt het programma als het ware vast. Ik moet de arduino eerst resetten voordat hij het weer doet. Als ik de vw_setup(300) in het programma zet werkt het hele programma niet meer.

Ik wil ervoor zorgen dat je een tag kan uitlezen met de rfid-lezer en dat hij vervolgens bij 4 verschillende tags 4 verschillende karakters vestuurt naar de tweede arduino. Bij elk karakter voert de Arduino een andere actie uit.

Dit is de code van de transmitter:
Code: [Select]
#include <SPI.h>
#include <MFRC522.h>
#include <VirtualWire.h>
// voor rfid
#define SS_PIN 10
#define RST_PIN 5
MFRC522 mfrc522(SS_PIN, RST_PIN);        // Create MFRC522 instance.
// voor rf
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
const char *on2 = "a";
const char *off2 = "b";
const char *on3 = "c";
const char *off3 = "d";
const char *on4 = "e";
const char *off4 = "f";
/*pinconfiguratie:

MFRC522 ARDUINO
SDA 10
SDK 13
MOSI 11
MISO 12
GND GND
RST 5
3.3V 3V3

*/



void setup() {
        // voor rfid
       Serial.begin(9600);        // Initialize serial communications with the PC
       SPI.begin();                        // Init SPI bus
       mfrc522.PCD_Init();        // Init MFRC522 card
       Serial.println("Scan PICC to see UID and type...");
       pinMode(4, OUTPUT);
       pinMode(5, OUTPUT);
       // voor rf
       vw_set_ptt_inverted(true); // Required for RF Link modules
      // Deze vw_setup(300) zorgt ervoor dat de rest van het programma het dan niet meer doet.
      //vw_setup(300); // set data speed
       vw_set_tx_pin(8);
       
       
 }

void loop() {
       // Look for new cards
       if ( ! mfrc522.PICC_IsNewCardPresent()) {

       delay(500);        
         return;
       }

       // Select one of the cards
       if ( ! mfrc522.PICC_ReadCardSerial()) {
             
         return;
       }
     
       //UID bevind zich nu in mfrc522.uid
       //uid is een structure, die als volgt gedefinieerd is:
       /*
       typedef struct {
               byte            size;                   // Number of bytes in the UID. 4, 7 or 10.
               byte            uidByte[10];
               byte            sak;                    // The SAK (Select acknowledge) byte returned from the PICC after successful selection.
       } Uid;
       */
     
       //Even voor debug, zodat je weet dat die de card detect
       Serial.print("Card UID: ");
       for (byte i = 0; i < mfrc522.uid.size; i++)
               Serial.print(mfrc522.uid.uidByte[i], HEX);
       Serial.println();      
       compare();
     
       mfrc522.PICC_HaltA();
       delay(1000);
}

void compare() {
       //Random uids
       byte uid1[] = { 0x65, 0xF1, 0x7F, 0x2E };
       byte uid2[] = { 0x95, 0xBC, 0x7C, 0xC0 };
       byte uid3[] = { 0x23, 0x2d, 0xa2, 0xff };

     
       if(compare_uid(uid1)) {
               //Actie als er een card met uid1 voor de reader wordt gehouden
               // om aan te geven dat er een kaart is gescant:
               Serial.println("Goede kaart ");
               vw_send((uint8_t *)on2, strlen(on2)); // send the data out to the world
               vw_wait_tx(); // wait a moment
               delay(200);
               
               
                 
             
     
       } else if (compare_uid(uid2)) {
               Serial.println("nog een goede kaart");
               //vw_send((uint8_t *)on3, strlen(on3)); // send the data out to the world
              // vw_wait_tx(); // wait a moment
               //delay(200);
     
       } else if (compare_uid(uid3)) {
              //Actie als er een card met uid3 voor de reader wordt gehouden
              //vw_send((uint8_t *)on4, strlen(on4)); // send the data out to the world
              //vw_wait_tx(); // wait a moment
              //delay(200);
       }
}

//Functie om de uids met elkaar te vergelijken
bool compare_uid(byte uid[]) {
       
      for(byte i = 0; i < mfrc522.uid.size; i++)
               if(uid[i] != mfrc522.uid.uidByte[i])
                      { return false;}
       return true;
}



Dit is de code van de receiver:
Code: [Select]

#include <VirtualWire.h>
#include <Servo.h>

uint8_t buf[VW_MAX_MESSAGE_LEN];

uint8_t buflen = VW_MAX_MESSAGE_LEN;
Servo myservo;

void setup()
{
 vw_set_ptt_inverted(true); // Required for RF link modules
 vw_setup(300);
 vw_set_rx_pin(8);
 vw_rx_start();
 pinMode(6, OUTPUT);
 pinMode(7, OUTPUT);
 pinMode(5, OUTPUT);
 Serial.begin(9600);
myservo.attach(3) ;
}

void loop()

{
if (vw_get_message(buf, &buflen))
 {
   switch(buf[0])

{
 case 'a':
 digitalWrite(6, HIGH);
 myservo.write(90);
 break;
 case 'b':
 digitalWrite(6, LOW);
 break;
 case 'c':
 digitalWrite(7, HIGH);
 break;
 case 'd':
 digitalWrite(7, LOW);
 break;
 case 'e':
 digitalWrite(5, HIGH);
  break;
  case 'f':
 digitalWrite(5, LOW);

break;
}

}

}



Ik hoop dat iemand mij kan helpen dit probleem op te lossen


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 -

Go Up