RFID okuyucu

Başlatan Erhan YILMAZ, 21 Şubat 2009, 22:04:09

Erhan YILMAZ

Selamlar arkadaşlar sizler ile umut arakadaşımında yardımları ile yapmış olduğum RFID okuycu uygulamasını paylaşıyorum devre RFID karttan aldığı 8 byte bilgiyi hex formatında lcd ekranda göstermektedir rf id okuyucu olarak mikroelektronikanın modülünü kullandım pic olarak 18F252 kullanılmıştır proje dosyalarına aşağıdaki linkten ulaşabilirsiniz

dosya şifresi:tekniker_erhan

Dosyalar burdan ulaşabilirsiniz

http://rapidshare.com/files/200960816/RFIDreader_tekniker_erhan.rar










teknikelektronikci

paylasim icin tesekürler bende uzun zamandir rfid ile ugrasiordum para bulup modülü alabilseydim bir tek kod okuma kismi kalcakti bu bana baya bi fikir verecek bu arada bunu hangi derleyici dil ile yazdiniz ?

edit:

bu arada hocam sizin modüldeki 4 uc ne ise yariyor benim almak istedigimde 2 uc vardi ve usart ile haberlesiordu . birde kac paraya aldiniz acaba?
Ey Türk istikbalinin evlâdı! İşte, bu ahval ve şerâit içinde dahi, vazifen; Türk İstiklâl ve Cumhuriyetini kurtarmaktır! Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!

vebsel

rf id  reader i nereden temin ettin

Erhan YILMAZ

modül mikro elektronikanın modülü Türkiyede modul http://www.elektrovadi.com/index.php?do=catalog/product&pid=148 bu sitede satılıyor fiyatı 34$+kdv bana 6 kart ile kargo falan 90 liraya gelşmişti toplam programı mikroelektronikanın sitesinde verilmiş olan mikrobasic uygulamasını derleyerek yaptım mikrobasicte mikroelektronikanın derleyicisi sitesinde kart ile uygulamaları var hatta mikro c mikro pascal dilleri ile yazılmış uygulamlarda var pic ile direk manchester kodlama sistemi ile rf id okuyucu modüldeki em4095 çipinden data alımı yapılıyor senini bahsettiğin iki uçlu okuyucu ccsnin kartı olabilir. araya bir mikrodenetleyici koyarak seri dataya çeviriyor sonra gönderiyor

bymrz

micro basic sanırım...

hoguz

Usart haberleşmeli olarak 125 khz veya 13.56 mhz mifare kart için bizdede var fiyatı 20 usd.

www.petmak.com.tr

teknikelektronikci

Alıntı yapılan: "hoguz"Usart haberleşmeli olarak 125 khz veya 13.56 mhz mifare kart için bizdede var fiyatı 20 usd.

www.petmak.com.tr

benim bahsettigim modülk isde burda petmak da kullanamdim ama cok güzel bi modül

hocam bu arada sizin picproje de hoguz nickli oldugunuzuda bilmiorudm :) hocam bunu gittigidiyor üzerinden satma imkaniniz varmi? güya bu ay alacaktim ama 40 ytl piclere verdim bayri k.karti ile gittigidiordan alayim :(
Ey Türk istikbalinin evlâdı! İşte, bu ahval ve şerâit içinde dahi, vazifen; Türk İstiklâl ve Cumhuriyetini kurtarmaktır! Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!

xoom

dosyalara başka siteden ulaşılıyor fakat hangi dilde yazlmış anlamadım.. sanırım kaynak kodlarda bi eksiklik var.. ne ettiysem bu modül çalışmadı..haberleştiremedim bir türlü..

Erhan YILMAZ

Kodları mikrobasicte yazmıştım bende tam hatırlamıyorum baya oldu yazalı. https://320volt.com/rf-id-uygulamasi-pic16f88-sn75176-ccs/ bu adreste ccs ile yaptığım uygulama var bu daha anlaşılır bunu da kullanabilirsin. Kusura bakmayın cevap bildiri e-postası gelmediği için geç dönüyorum. Tesadüfen gördüm konuyu.


xoom

Modülü elektrovadiden aldım fakat if(read_4102(code)) bu fonksiyon hiçbir zaman true ile dönmediği için kart okuma bilgisini alamıorum... devreyi 10 kere kurdum sonuç elde edemedim.. kart yaklaştırılınca out bacağında 2.4v gibi bir gerilim okuyabiliyorum fakat bu em4102.c fonksiyonundan true olarak dönmesine yetmiyormu anlamış değilim..

Erhan YILMAZ

Fonksiyon true değeri ile dönmüyorsa okuma yapılmıyor demektir. Çok çeşitli nedenleri olabilir. Modül doğru bağlanmamış olabilir, bağlantılar yanlış yapılmış olabilir, rfid kart bozuk olabilir yada okuyucuda sorun olabilir. Tam olarak şundan dolayı olur diyemem yani.

xoom

#12
Şunu sormak istiyorum.. bu modülü bağlarken 16f877 veya sizin kullandıgınız 16f88  için hangi pine hangi ucu bağladığımızın bir önemi varmı ?
yani Out bacağının CCP1 pinine bağlanması gerekiyor gibi..
yoksa em4095'deki pin tanımlamalarına göre bağlıyoruz tabikide.. ama ordaki pin tanımlamaları rastgele boş pinlere mi?
Şimdi yukarida bahsettiğim gibi modüle kartı yaklaştırmazsam out bacağında 0v ölçüyorum ama kart yaklaştırınca out bacağında 2.4v ölçüyorum.. bu kart okuyucunun çalıştığı anlamına gelmez mi ? birde bu voltaj değeri mi true/false oluyor yoksa bu okudugum değer (2.4v) kartın ID'si mi?
em4102.c
/////////////////////////////////////////////////////////////////////////
////                            EM4102.c                             ////
////                                                                 ////
//// This file contains drivers for a 4102 RF transponder            ////
////                                                                 ////
//// int1 read_4102(int8* data)                                      ////
////   - Call this funtion to read a 4102 transponder                ////
////   - Pass in a pointer to a 5 byte array                         ////
////   - The first byte will have the customer code and the last     ////
////     four bytes will contain the ID number                       ////
////                                                                 ////
////   - Returns FALSE if a parity check error occurred              ////
////   - Returns TRUE if a transponder was read successfully         ////
////                                                                 ////
/////////////////////////////////////////////////////////////////////////
////        (C) Copyright 1996,2004 Custom Computer Services         ////
//// This source code may only be used by licensed users of the CCS  ////
//// C compiler.  This source code may only be distributed to other  ////
//// licensed users of the CCS C compiler.  No other use,            ////
//// reproduction or distribution is permitted without written       ////
//// permission.  Derivative programs created using this software    ////
//// in object code form are not restricted in any way.              ////
/////////////////////////////////////////////////////////////////////////


#ifndef TRANSPONDER_4102_DRIVERS
#define TRANSPONDER_4102_DRIVERS

//#define UNIVERSAL_FORMAT

// Function Prototypes
int1 read_4102(int8* data);
int1 header_search_4102();
int1 decode_data_4102(int8* data);


// Purpose:       Reads the ID number and data number
// Inputs:        A pointer to a 5 byte array to fill
//                * The first byte will have the ID
//                * The last 4 bytes will have the data
// Outputs:       TRUE if read successful, FALSE if read failed
int1 read_4102(int8* data)
{
   int8 i;

   RF_get(sizeof(RFbuffer)*8, TRUE);    // Fill the buffer with data

   for(i=0; i<2; ++i)
   {
      while(!END_OF_RFBUFFER)
      {
         if(header_search_4102())       // Try to find 9 consecutive 1s
         {
            if(decode_data_4102(data))  // Try to decode the data after the header
            {
               RFbuffer_fill(0xAA);     // Prevents false detection
               
               #ifdef UNIVERSAL_FORMAT
                  i=data[1];
                  data[1]=data[3];
                  data[3]=i;
                  i=data[0];
                  data[0]=data[4];
                  data[4]=i;
               #endif
               
               return TRUE;             // Return sucessful read
            }
         }
      }
      RFbuffer_invert();                // Invert the buffer because the
   }                                    // Manchester encoded data could have
                                        // been read starting at the wrong edge

   RFbuffer_fill(0xAA);                 // Prevents false detection
   return FALSE;                        // Return error
}


// Purpose:       Search for the header consisting of 9 ones
// Inputs:        None
// Outputs:       TRUE if the header was found, FALSE if it was not found
int1 header_search_4102()
{
   int bitCounter = 0;

   // Loops until 9 consecutive 1s are found
   // or the end of the receive buffer is reached
   while(!END_OF_RFBUFFER)
   {
      if(RFbuffer_getBit() == 1)
      {
         if(++bitCounter == 9)
         {
            return TRUE;
         }
      }
      else
      {
         bitCounter = 0;
      }
   }

   return FALSE;
}


// Purpose:       Decodes the ID number and data number
// Inputs:        A pointer to a 5 byte array to fill
//                * The first byte will have the ID
//                * The last 4 bytes will have the data
// Outputs:       TRUE if read successful, FALSE if read failed
int1 decode_data_4102(int8* data)
{
   int1 bit = 0;
   int8 count = 1;
   int1 parity = 0;
   int1 colParity1 = 0;
   int1 colParity2 = 0;
   int1 colParity3 = 0;
   int1 colParity4 = 0;

   // Loop until 40 bits of data and 10 bits of parity are received
   for(count=1; count <= 50; ++count)
   {
      bit = RFbuffer_getBit();
      if(END_OF_RFBUFFER)
      {
         return FALSE;
      }

      if(count % 5 == 0)
      {
         // Check for row parity
         if(parity != bit)
         {
            return FALSE;
         }
         parity = 0;
      }
      else
      {
         // Store a bit of data
         #ifdef UNIVERSAL_FORMAT
         shift_left(data, 5, bit);
         #else 
         shift_right(data, 5, bit);
         #endif
         
         // Calculate row parity
         parity ^= bit;

         // Calculate column parity
         switch (count % 5)
         {
            case 1: colParity1 ^= bit; break;
            case 2: colParity2 ^= bit; break;
            case 3: colParity3 ^= bit; break;
            case 4: colParity4 ^= bit; break;
         }
      }
   }

   // Check for column parity
   if(colParity1 != RFbuffer_getBit() || colParity2 != RFbuffer_getBit() ||
      colParity3 != RFbuffer_getBit() || colParity4 != RFbuffer_getBit()   )
   {
      return FALSE;
   }

   // Check for stop bit
   if(RFbuffer_getBit() != 0)
   {
      return FALSE;
   }

   // Prevents reading all zeros for customer ID and tag ID
   for(count=0; count<5 && data[count] == 0; ++count);
   if(count == 5)
   {
      return FALSE;
   }

   // Return TRUE if no errors in decoding received transponder data
   return TRUE;
}

#endif

teknikelektronikci

Alıntı yapılan: xoom - 17 Kasım 2012, 13:08:11
Şunu sormak istiyorum.. bu modülü bağlarken 16f877 veya sizin kullandıgınız 16f88  için hangi pine hangi ucu bağladığımızın bir önemi varmı ?
yani Out bacağının CCP1 pinine bağlanması gerekiyor gibi..
yoksa em4095'deki pin tanımlamalarına göre bağlıyoruz tabikide.. ama ordaki pin tanımlamaları rastgele boş pinlere mi?
Şimdi yukarida bahsettiğim gibi modüle kartı yaklaştırmazsam out bacağında 0v ölçüyorum ama kart yaklaştırınca out bacağında 2.4v ölçüyorum.. bu kart okuyucunun çalıştığı anlamına gelmez mi ? birde bu voltaj değeri mi true/false oluyor yoksa bu okudugum değer (2.4v) kartın ID'si mi?
em4102.c
/////////////////////////////////////////////////////////////////////////
////                            EM4102.c                             ////
////                                                                 ////
//// This file contains drivers for a 4102 RF transponder            ////
////                                                                 ////
//// int1 read_4102(int8* data)                                      ////
////   - Call this funtion to read a 4102 transponder                ////
////   - Pass in a pointer to a 5 byte array                         ////
////   - The first byte will have the customer code and the last     ////
////     four bytes will contain the ID number                       ////
////                                                                 ////
////   - Returns FALSE if a parity check error occurred              ////
////   - Returns TRUE if a transponder was read successfully         ////
////                                                                 ////
/////////////////////////////////////////////////////////////////////////
////        (C) Copyright 1996,2004 Custom Computer Services         ////
//// This source code may only be used by licensed users of the CCS  ////
//// C compiler.  This source code may only be distributed to other  ////
//// licensed users of the CCS C compiler.  No other use,            ////
//// reproduction or distribution is permitted without written       ////
//// permission.  Derivative programs created using this software    ////
//// in object code form are not restricted in any way.              ////
/////////////////////////////////////////////////////////////////////////


#ifndef TRANSPONDER_4102_DRIVERS
#define TRANSPONDER_4102_DRIVERS

//#define UNIVERSAL_FORMAT

// Function Prototypes
int1 read_4102(int8* data);
int1 header_search_4102();
int1 decode_data_4102(int8* data);


// Purpose:       Reads the ID number and data number
// Inputs:        A pointer to a 5 byte array to fill
//                * The first byte will have the ID
//                * The last 4 bytes will have the data
// Outputs:       TRUE if read successful, FALSE if read failed
int1 read_4102(int8* data)
{
   int8 i;

   RF_get(sizeof(RFbuffer)*8, TRUE);    // Fill the buffer with data

   for(i=0; i<2; ++i)
   {
      while(!END_OF_RFBUFFER)
      {
         if(header_search_4102())       // Try to find 9 consecutive 1s
         {
            if(decode_data_4102(data))  // Try to decode the data after the header
            {
               RFbuffer_fill(0xAA);     // Prevents false detection
               
               #ifdef UNIVERSAL_FORMAT
                  i=data[1];
                  data[1]=data[3];
                  data[3]=i;
                  i=data[0];
                  data[0]=data[4];
                  data[4]=i;
               #endif
               
               return TRUE;             // Return sucessful read
            }
         }
      }
      RFbuffer_invert();                // Invert the buffer because the
   }                                    // Manchester encoded data could have
                                        // been read starting at the wrong edge

   RFbuffer_fill(0xAA);                 // Prevents false detection
   return FALSE;                        // Return error
}


// Purpose:       Search for the header consisting of 9 ones
// Inputs:        None
// Outputs:       TRUE if the header was found, FALSE if it was not found
int1 header_search_4102()
{
   int bitCounter = 0;

   // Loops until 9 consecutive 1s are found
   // or the end of the receive buffer is reached
   while(!END_OF_RFBUFFER)
   {
      if(RFbuffer_getBit() == 1)
      {
         if(++bitCounter == 9)
         {
            return TRUE;
         }
      }
      else
      {
         bitCounter = 0;
      }
   }

   return FALSE;
}


// Purpose:       Decodes the ID number and data number
// Inputs:        A pointer to a 5 byte array to fill
//                * The first byte will have the ID
//                * The last 4 bytes will have the data
// Outputs:       TRUE if read successful, FALSE if read failed
int1 decode_data_4102(int8* data)
{
   int1 bit = 0;
   int8 count = 1;
   int1 parity = 0;
   int1 colParity1 = 0;
   int1 colParity2 = 0;
   int1 colParity3 = 0;
   int1 colParity4 = 0;

   // Loop until 40 bits of data and 10 bits of parity are received
   for(count=1; count <= 50; ++count)
   {
      bit = RFbuffer_getBit();
      if(END_OF_RFBUFFER)
      {
         return FALSE;
      }

      if(count % 5 == 0)
      {
         // Check for row parity
         if(parity != bit)
         {
            return FALSE;
         }
         parity = 0;
      }
      else
      {
         // Store a bit of data
         #ifdef UNIVERSAL_FORMAT
         shift_left(data, 5, bit);
         #else 
         shift_right(data, 5, bit);
         #endif
         
         // Calculate row parity
         parity ^= bit;

         // Calculate column parity
         switch (count % 5)
         {
            case 1: colParity1 ^= bit; break;
            case 2: colParity2 ^= bit; break;
            case 3: colParity3 ^= bit; break;
            case 4: colParity4 ^= bit; break;
         }
      }
   }

   // Check for column parity
   if(colParity1 != RFbuffer_getBit() || colParity2 != RFbuffer_getBit() ||
      colParity3 != RFbuffer_getBit() || colParity4 != RFbuffer_getBit()   )
   {
      return FALSE;
   }

   // Check for stop bit
   if(RFbuffer_getBit() != 0)
   {
      return FALSE;
   }

   // Prevents reading all zeros for customer ID and tag ID
   for(count=0; count<5 && data[count] == 0; ++count);
   if(count == 5)
   {
      return FALSE;
   }

   // Return TRUE if no errors in decoding received transponder data
   return TRUE;
}

#endif


hocam calismadimi daha :) umarim kisa sürede cözersin ama bu 2.4 V ID olmadigi kesin out bacagi ne ise yarar bilmem ama bu 2.4 V pes pese gelen seri data (ID,protokol) de ollabilir veya sadece flag de ollabilir datasheet de yazmiyormu bu lanet olasi pinin ne yaptigi :D selamlar
Ey Türk istikbalinin evlâdı! İşte, bu ahval ve şerâit içinde dahi, vazifen; Türk İstiklâl ve Cumhuriyetini kurtarmaktır! Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!

Mucit23

belki interrupt çıkışıdır. Herhangi bir kart okunduğunda kesme oluşmasını sağlar. Bu sayede sürekli veri geldimi diye işlemci meşgul olmaz..