Помогите с RFID Mifare RC522 module

hiallbb
Offline
Зарегистрирован: 21.02.2013

Купил такую штуку на ebay. Может программировать/считывать rfid карты

Не могу разобраться с подключением к arduino uno и не нашел никакого внятного объяснения как заставить эту штуку работать. Может кто из форумчан работал с таким устройством. Помогите, а?

maksim
Offline
Зарегистрирован: 12.02.2012

RC522       UNO
 MISO  -->    12
  SCK   -->    13
   SS    -->    10
 MOSI  -->    11
 GND   -->   GND
 3.3V   -->   3.3V
 RST    -->  RESET

пример кода

http://www.grantgibson.co.uk/blog/2012/04/how-to-get-started-with-the-mifare-mf522-an-and-arduino/

vlkam
Offline
Зарегистрирован: 17.02.2013

Спасибо, работает

Тима
Тима аватар
Offline
Зарегистрирован: 11.04.2013

Доброго времени суток, Господа!

Купил тот же комплект, за исключением того, что у меня мега2560, а не уно! Как его запустить?

Jacks_d
Offline
Зарегистрирован: 31.12.2011

На меге http://arduino.cc/en/Main/arduinoBoardMega2560

RC522       UNO

MISO  -->    50

  SCK   -->    52

   SS    -->    53

 MOSI  -->    51

 GND   -->   GND

 3.3V   -->   3.3V

 RST    -->  RESET

в место 53 любой пин на задать отдельно нужно

Тима
Тима аватар
Offline
Зарегистрирован: 11.04.2013

Спасибо!

Запустил считыватель с стандартным скетчем.

Только все коменты на китайском...

001/*
002 * 文 件 名:RFID.pde
003 * 创 建 者:Dr.Leong   ( <a href="http://WWW.B2CQSHOP.COM" title="WWW.B2CQSHOP.COM" rel="nofollow">WWW.B2CQSHOP.COM</a> )
004 * 创建日期:2011.09.19
005 * 修 改 者:
006 * 修改日期:
007 * 功能描述:Mifare1 寻卡→防冲突→选卡→读写 接口
008 */
009 // the sensor communicates using SPI, so include the library:
010#include <SPI.h>
011 
012#define uchar   unsigned char
013#define uint    unsigned int
014 
015//数组最大长度
016#define MAX_LEN 16
017 
018/////////////////////////////////////////////////////////////////////
019//set the pin
020/////////////////////////////////////////////////////////////////////
021const int chipSelectPin = 53;
022const int NRSTPD = 5;
023 
024//MF522命令字
025#define PCD_IDLE              0x00               //NO action;取消当前命令
026#define PCD_AUTHENT           0x0E               //验证密钥
027#define PCD_RECEIVE           0x08               //接收数据
028#define PCD_TRANSMIT          0x04               //发送数据
029#define PCD_TRANSCEIVE        0x0C               //发送并接收数据
030#define PCD_RESETPHASE        0x0F               //复位
031#define PCD_CALCCRC           0x03               //CRC计算
032 
033//Mifare_One卡片命令字
034#define PICC_REQIDL           0x26               //寻天线区内未进入休眠状态
035#define PICC_REQALL           0x52               //寻天线区内全部卡
036#define PICC_ANTICOLL         0x93               //防冲撞
037#define PICC_SElECTTAG        0x93               //选卡
038#define PICC_AUTHENT1A        0x60               //验证A密钥
039#define PICC_AUTHENT1B        0x61               //验证B密钥
040#define PICC_READ             0x30               //读块
041#define PICC_WRITE            0xA0               //写块
042#define PICC_DECREMENT        0xC0               //扣款
043#define PICC_INCREMENT        0xC1               //充值
044#define PICC_RESTORE          0xC2               //调块数据到缓冲区
045#define PICC_TRANSFER         0xB0               //保存缓冲区中数据
046#define PICC_HALT             0x50               //休眠
047 
048 
049//和MF522通讯时返回的错误代码
050#define MI_OK                 0
051#define MI_NOTAGERR           1
052#define MI_ERR                2
053 
054 
055//------------------MFRC522寄存器---------------
056//Page 0:Command and Status
057#define     Reserved00            0x00   
058#define     CommandReg            0x01   
059#define     CommIEnReg            0x02   
060#define     DivlEnReg             0x03   
061#define     CommIrqReg            0x04   
062#define     DivIrqReg             0x05
063#define     ErrorReg              0x06   
064#define     Status1Reg            0x07   
065#define     Status2Reg            0x08   
066#define     FIFODataReg           0x09
067#define     FIFOLevelReg          0x0A
068#define     WaterLevelReg         0x0B
069#define     ControlReg            0x0C
070#define     BitFramingReg         0x0D
071#define     CollReg               0x0E
072#define     Reserved01            0x0F
073//Page 1:Command    
074#define     Reserved10            0x10
075#define     ModeReg               0x11
076#define     TxModeReg             0x12
077#define     RxModeReg             0x13
078#define     TxControlReg          0x14
079#define     TxAutoReg             0x15
080#define     TxSelReg              0x16
081#define     RxSelReg              0x17
082#define     RxThresholdReg        0x18
083#define     DemodReg              0x19
084#define     Reserved11            0x1A
085#define     Reserved12            0x1B
086#define     MifareReg             0x1C
087#define     Reserved13            0x1D
088#define     Reserved14            0x1E
089#define     SerialSpeedReg        0x1F
090//Page 2:CFG   
091#define     Reserved20            0x20 
092#define     CRCResultRegM         0x21
093#define     CRCResultRegL         0x22
094#define     Reserved21            0x23
095#define     ModWidthReg           0x24
096#define     Reserved22            0x25
097#define     RFCfgReg              0x26
098#define     GsNReg                0x27
099#define     CWGsPReg              0x28
100#define     ModGsPReg             0x29
101#define     TModeReg              0x2A
102#define     TPrescalerReg         0x2B
103#define     TReloadRegH           0x2C
104#define     TReloadRegL           0x2D
105#define     TCounterValueRegH     0x2E
106#define     TCounterValueRegL     0x2F
107//Page 3:TestRegister    
108#define     Reserved30            0x30
109#define     TestSel1Reg           0x31
110#define     TestSel2Reg           0x32
111#define     TestPinEnReg          0x33
112#define     TestPinValueReg       0x34
113#define     TestBusReg            0x35
114#define     AutoTestReg           0x36
115#define     VersionReg            0x37
116#define     AnalogTestReg         0x38
117#define     TestDAC1Reg           0x39 
118#define     TestDAC2Reg           0x3A  
119#define     TestADCReg            0x3B  
120#define     Reserved31            0x3C  
121#define     Reserved32            0x3D  
122#define     Reserved33            0x3E  
123#define     Reserved34            0x3F
124//-----------------------------------------------
125 
126//4字节卡序列号,第5字节为校验字节
127uchar serNum[5];
128 
129uchar  writeData[16]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100};  //初始化 100元钱
130uchar  moneyConsume = 18 ;  //消费18元
131uchar  moneyAdd = 10 ;  //充值10元
132//扇区A密码,16个扇区,每个扇区密码6Byte
133 uchar sectorKeyA[16][16] = {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
134                             {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
135                             //{0x19, 0x84, 0x07, 0x15, 0x76, 0x14},
136                             {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
137                            };
138 uchar sectorNewKeyA[16][16] = {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
139                                {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xff,0x07,0x80,0x69, 0x19,0x84,0x07,0x15,0x76,0x14},
140                                 //you can set another ket , such as  " 0x19, 0x84, 0x07, 0x15, 0x76, 0x14 "
141                                 //{0x19, 0x84, 0x07, 0x15, 0x76, 0x14, 0xff,0x07,0x80,0x69, 0x19,0x84,0x07,0x15,0x76,0x14},
142                                 // but when loop, please set the  sectorKeyA, the same key, so that RFID module can read the card
143                                {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xff,0x07,0x80,0x69, 0x19,0x33,0x07,0x15,0x34,0x14},
144                               };
145 
146void setup() {               
147   Serial.begin(9600);                       // RFID reader SOUT pin connected to Serial RX pin at 2400bps
148 // start the SPI library:
149  SPI.begin();
150   
151  pinMode(chipSelectPin,OUTPUT);             // Set digital pin 10 as OUTPUT to connect it to the RFID /ENABLE pin
152    digitalWrite(chipSelectPin, LOW);          // Activate the RFID reader
153  pinMode(NRSTPD,OUTPUT);               // Set digital pin 10 , Not Reset and Power-down
154    digitalWrite(NRSTPD, HIGH);
155 
156  MFRC522_Init(); 
157}
158 
159void loop()
160{
161    uchar i,tmp;
162    uchar status;
163        uchar str[MAX_LEN];
164        uchar RC_size;
165        uchar blockAddr;    //选择操作的块地址0~63
166 
167 
168        //寻卡,返回卡类型 
169        status = MFRC522_Request(PICC_REQIDL, str);
170        if (status == MI_OK)
171        {
172                        Serial.println("Find out a card ");
173            Serial.print(str[0],BIN);
174                        Serial.print(" , ");
175            Serial.print(str[1],BIN);
176                        Serial.println(" ");
177        }
178 
179        //防冲撞,返回卡的序列号 4字节
180        status = MFRC522_Anticoll(str);
181        memcpy(serNum, str, 5);
182        if (status == MI_OK)
183        {
184 
185                        Serial.println("The card's number is  : ");
186            Serial.print(serNum[0],BIN);
187                        Serial.print(" , ");
188            Serial.print(serNum[1],BIN);
189                        Serial.print(" , ");
190            Serial.print(serNum[2],BIN);
191                        Serial.print(" , ");
192            Serial.print(serNum[3],BIN);
193                        Serial.print(" , ");
194            Serial.print(serNum[4],BIN);
195                        Serial.println(" ");
196        }
197 
198        //选卡,返回卡容量
199        RC_size = MFRC522_SelectTag(serNum);
200        if (RC_size != 0)
201 
202        {
203                        Serial.print("The size of the card is  :   ");
204            Serial.print(RC_size,DEC);
205                        Serial.println(" K bits ");
206        }
207                 
208        //注册卡
209        blockAddr = 7;      //数据块7     
210        status = MFRC522_Auth(PICC_AUTHENT1A, blockAddr, sectorKeyA[blockAddr/4], serNum);  //认证
211        if (status == MI_OK)
212        {
213            //写数据
214            status = MFRC522_Write(blockAddr, sectorNewKeyA[blockAddr/4]);
215                        Serial.print("set the new card password, and can modify the data of the Sector ");
216                        Serial.print(blockAddr/4,DEC);
217                        Serial.println(" : ");
218            for (i=0; i<6; i++)
219                {
220                        Serial.print(sectorNewKeyA[blockAddr/4][i],HEX);
221                            Serial.print(" , ");
222                }
223                        Serial.println(" ");
224                        blockAddr = blockAddr - 3 ;
225                        status = MFRC522_Write(blockAddr, writeData);
226                        if(status == MI_OK)
227                        {
228                           Serial.println("You are B2CQSHOP VIP Member, The card has  $100 !");
229                        }
230        }
231 
232        //读卡
233        blockAddr = 7;      //数据块7     
234        status = MFRC522_Auth(PICC_AUTHENT1A, blockAddr, sectorNewKeyA[blockAddr/4], serNum);   //认证
235        if (status == MI_OK)
236        {
237            //读数据
238                        blockAddr = blockAddr - 3 ;
239                        status = MFRC522_Read(blockAddr, str);
240            if (status == MI_OK)
241            {
242                                Serial.println("Read from the card ,the data is : ");
243                for (i=0; i<16; i++)
244                {
245                              Serial.print(str[i],DEC);
246                                      Serial.print(" , ");
247                }
248                                Serial.println(" ");
249            }
250        }
251 
252                //消费   
253        blockAddr = 7;      //数据块7     
254        status = MFRC522_Auth(PICC_AUTHENT1A, blockAddr, sectorNewKeyA[blockAddr/4], serNum);   //认证
255        if (status == MI_OK)
256        {
257            //读数据
258                        blockAddr = blockAddr - 3 ;
259            status = MFRC522_Read(blockAddr, str);
260            if (status == MI_OK)
261            {
262                          if( str[15] < moneyConsume )
263                          {
264                              Serial.println(" The money is not enough !");
265                          }
266                          else
267                          {
268                              str[15] = str[15] - moneyConsume;
269                              status = MFRC522_Write(blockAddr, str);
270                              if(status == MI_OK)
271                              {
272                                 Serial.print("You pay $18 for items in B2CQSHOP.COM . Now, Your money balance is :   $");
273                         Serial.print(str[15],DEC);
274                                 Serial.println(" ");
275                              }
276                          }
277            }
278        }
279 
280                //充值   
281        blockAddr = 7;      //数据块7     
282        status = MFRC522_Auth(PICC_AUTHENT1A, blockAddr, sectorNewKeyA[blockAddr/4], serNum);   //认证
283        if (status == MI_OK)
284        {
285            //读数据
286                        blockAddr = blockAddr - 3 ;
287            status = MFRC522_Read(blockAddr, str);
288            if (status == MI_OK)
289            {
290                          tmp = (int)(str[15] + moneyAdd) ;
291                          //Serial.println(tmp,DEC);
292                          if( tmp < (char)254 )
293                          {
294                              Serial.println(" The money of the card can not be more than 255 !");
295                          }
296                          else
297                          {
298                              str[15] = str[15] + moneyAdd ;
299                              status = MFRC522_Write(blockAddr, str);
300                              if(status == MI_OK)
301                              {
302                                 Serial.print("You add $10 to your card in B2CQSHOP.COM , Your money balance is :  $");
303                         Serial.print(str[15],DEC);
304                                 Serial.println(" ");
305                              }
306                          }
307            }
308        }
309                Serial.println(" ");
310        MFRC522_Halt();         //命令卡片进入休眠状态             
311           
312}
313 
314/*
315 * 函 数 名:Write_MFRC5200
316 * 功能描述:向MFRC522的某一寄存器写一个字节数据
317 * 输入参数:addr--寄存器地址;val--要写入的值
318 * 返 回 值:无
319 */
320void Write_MFRC522(uchar addr, uchar val)
321{
322    digitalWrite(chipSelectPin, LOW);
323 
324    //地址格式:0XXXXXX0
325    SPI.transfer((addr<<1)&0x7E);
326    SPI.transfer(val);
327     
328    digitalWrite(chipSelectPin, HIGH);
329}
330 
331 
332/*
333 * 函 数 名:Read_MFRC522
334 * 功能描述:从MFRC522的某一寄存器读一个字节数据
335 * 输入参数:addr--寄存器地址
336 * 返 回 值:返回读取到的一个字节数据
337 */
338uchar Read_MFRC522(uchar addr)
339{
340    uchar val;
341 
342    digitalWrite(chipSelectPin, LOW);
343 
344    //地址格式:1XXXXXX0
345    SPI.transfer(((addr<<1)&0x7E) | 0x80);   
346    val =SPI.transfer(0x00);
347     
348    digitalWrite(chipSelectPin, HIGH);
349     
350    return val;
351}
352 
353/*
354 * 函 数 名:SetBitMask
355 * 功能描述:置RC522寄存器位
356 * 输入参数:reg--寄存器地址;mask--置位值
357 * 返 回 值:无
358 */
359void SetBitMask(uchar reg, uchar mask) 
360{
361    uchar tmp;
362    tmp = Read_MFRC522(reg);
363    Write_MFRC522(reg, tmp | mask);  // set bit mask
364}
365 
366 
367/*
368 * 函 数 名:ClearBitMask
369 * 功能描述:清RC522寄存器位
370 * 输入参数:reg--寄存器地址;mask--清位值
371 * 返 回 值:无
372 */
373void ClearBitMask(uchar reg, uchar mask) 
374{
375    uchar tmp;
376    tmp = Read_MFRC522(reg);
377    Write_MFRC522(reg, tmp & (~mask));  // clear bit mask
378}
379 
380 
381/*
382 * 函 数 名:AntennaOn
383 * 功能描述:开启天线,每次启动或关闭天险发射之间应至少有1ms的间隔
384 * 输入参数:无
385 * 返 回 值:无
386 */
387void AntennaOn(void)
388{
389    uchar temp;
390 
391    temp = Read_MFRC522(TxControlReg);
392    if (!(temp & 0x03))
393    {
394        SetBitMask(TxControlReg, 0x03);
395    }
396}
397 
398 
399/*
400 * 函 数 名:AntennaOff
401 * 功能描述:关闭天线,每次启动或关闭天险发射之间应至少有1ms的间隔
402 * 输入参数:无
403 * 返 回 值:无
404 */
405void AntennaOff(void)
406{
407    ClearBitMask(TxControlReg, 0x03);
408}
409 
410 
411/*
412 * 函 数 名:ResetMFRC522
413 * 功能描述:复位RC522
414 * 输入参数:无
415 * 返 回 值:无
416 */
417void MFRC522_Reset(void)
418{
419    Write_MFRC522(CommandReg, PCD_RESETPHASE);
420}
421 
422 
423/*
424 * 函 数 名:InitMFRC522
425 * 功能描述:初始化RC522
426 * 输入参数:无
427 * 返 回 值:无
428 */
429void MFRC522_Init(void)
430{
431    digitalWrite(NRSTPD,HIGH);
432 
433    MFRC522_Reset();
434         
435    //Timer: TPrescaler*TreloadVal/6.78MHz = 24ms
436    Write_MFRC522(TModeReg, 0x8D);      //Tauto=1; f(Timer) = 6.78MHz/TPreScaler
437    Write_MFRC522(TPrescalerReg, 0x3E); //TModeReg[3..0] + TPrescalerReg
438    Write_MFRC522(TReloadRegL, 30);          
439    Write_MFRC522(TReloadRegH, 0);
440     
441    Write_MFRC522(TxAutoReg, 0x40);     //100%ASK
442    Write_MFRC522(ModeReg, 0x3D);       //CRC初始值0x6363  ???
443 
444    //ClearBitMask(Status2Reg, 0x08);       //MFCrypto1On=0
445    //Write_MFRC522(RxSelReg, 0x86);        //RxWait = RxSelReg[5..0]
446    //Write_MFRC522(RFCfgReg, 0x7F);        //RxGain = 48dB
447 
448    AntennaOn();        //打开天线
449}
450 
451 
452/*
453 * 函 数 名:MFRC522_Request
454 * 功能描述:寻卡,读取卡类型号
455 * 输入参数:reqMode--寻卡方式,
456 *           TagType--返回卡片类型
457 *              0x4400 = Mifare_UltraLight
458 *              0x0400 = Mifare_One(S50)
459 *              0x0200 = Mifare_One(S70)
460 *              0x0800 = Mifare_Pro(X)
461 *              0x4403 = Mifare_DESFire
462 * 返 回 值:成功返回MI_OK
463 */
464uchar MFRC522_Request(uchar reqMode, uchar *TagType)
465{
466    uchar status; 
467    uint backBits;          //接收到的数据位数
468 
469    Write_MFRC522(BitFramingReg, 0x07);     //TxLastBists = BitFramingReg[2..0] ???
470     
471    TagType[0] = reqMode;
472    status = MFRC522_ToCard(PCD_TRANSCEIVE, TagType, 1, TagType, &backBits);
473 
474    if ((status != MI_OK) || (backBits != 0x10))
475    {   
476        status = MI_ERR;
477    }
478    
479    return status;
480}
481 
482 
483/*
484 * 函 数 名:MFRC522_ToCard
485 * 功能描述:RC522和ISO14443卡通讯
486 * 输入参数:command--MF522命令字,
487 *           sendData--通过RC522发送到卡片的数据,
488 *           sendLen--发送的数据长度       
489 *           backData--接收到的卡片返回数据,
490 *           backLen--返回数据的位长度
491 * 返 回 值:成功返回MI_OK
492 */
493uchar MFRC522_ToCard(uchar command, uchar *sendData, uchar sendLen, uchar *backData, uint *backLen)
494{
495    uchar status = MI_ERR;
496    uchar irqEn = 0x00;
497    uchar waitIRq = 0x00;
498    uchar lastBits;
499    uchar n;
500    uint i;
501 
502    switch (command)
503    {
504        case PCD_AUTHENT:       //认证卡密
505        {
506            irqEn = 0x12;
507            waitIRq = 0x10;
508            break;
509        }
510        case PCD_TRANSCEIVE:    //发送FIFO中数据
511        {
512            irqEn = 0x77;
513            waitIRq = 0x30;
514            break;
515        }
516        default:
517            break;
518    }
519    
520    Write_MFRC522(CommIEnReg, irqEn|0x80);  //允许中断请求
521    ClearBitMask(CommIrqReg, 0x80);         //清除所有中断请求位
522    SetBitMask(FIFOLevelReg, 0x80);         //FlushBuffer=1, FIFO初始化
523     
524    Write_MFRC522(CommandReg, PCD_IDLE);    //NO action;取消当前命令  ???
525 
526    //向FIFO中写入数据
527    for (i=0; i<sendLen; i++)
528    {  
529        Write_MFRC522(FIFODataReg, sendData[i]);   
530    }
531 
532    //执行命令
533    Write_MFRC522(CommandReg, command);
534    if (command == PCD_TRANSCEIVE)
535    {   
536        SetBitMask(BitFramingReg, 0x80);        //StartSend=1,transmission of data starts 
537    }  
538     
539    //等待接收数据完成
540    i = 2000;   //i根据时钟频率调整,操作M1卡最大等待时间25ms ???
541    do
542    {
543        //CommIrqReg[7..0]
544        //Set1 TxIRq RxIRq IdleIRq HiAlerIRq LoAlertIRq ErrIRq TimerIRq
545        n = Read_MFRC522(CommIrqReg);
546        i--;
547    }
548    while ((i!=0) && !(n&0x01) && !(n&waitIRq));
549 
550    ClearBitMask(BitFramingReg, 0x80);          //StartSend=0
551     
552    if (i != 0)
553    {   
554        if(!(Read_MFRC522(ErrorReg) & 0x1B))    //BufferOvfl Collerr CRCErr ProtecolErr
555        {
556            status = MI_OK;
557            if (n & irqEn & 0x01)
558            {  
559                status = MI_NOTAGERR;           //??  
560            }
561 
562            if (command == PCD_TRANSCEIVE)
563            {
564                n = Read_MFRC522(FIFOLevelReg);
565                lastBits = Read_MFRC522(ControlReg) & 0x07;
566                if (lastBits)
567                {  
568                    *backLen = (n-1)*8 + lastBits;  
569                }
570                else
571                {  
572                    *backLen = n*8;  
573                }
574 
575                if (n == 0)
576                {  
577                    n = 1;   
578                }
579                if (n > MAX_LEN)
580                {  
581                    n = MAX_LEN;  
582                }
583                 
584                //读取FIFO中接收到的数据
585                for (i=0; i<n; i++)
586                {  
587                    backData[i] = Read_MFRC522(FIFODataReg);   
588                }
589            }
590        }
591        else
592        {  
593            status = MI_ERR; 
594        }
595         
596    }
597     
598    //SetBitMask(ControlReg,0x80);           //timer stops
599    //Write_MFRC522(CommandReg, PCD_IDLE);
600 
601    return status;
602}
603 
604 
605/*
606 * 函 数 名:MFRC522_Anticoll
607 * 功能描述:防冲突检测,读取选中卡片的卡序列号
608 * 输入参数:serNum--返回4字节卡序列号,第5字节为校验字节
609 * 返 回 值:成功返回MI_OK
610 */
611uchar MFRC522_Anticoll(uchar *serNum)
612{
613    uchar status;
614    uchar i;
615    uchar serNumCheck=0;
616    uint unLen;
617     
618 
619    //ClearBitMask(Status2Reg, 0x08);       //TempSensclear
620    //ClearBitMask(CollReg,0x80);           //ValuesAfterColl
621    Write_MFRC522(BitFramingReg, 0x00);     //TxLastBists = BitFramingReg[2..0]
622  
623    serNum[0] = PICC_ANTICOLL;
624    serNum[1] = 0x20;
625    status = MFRC522_ToCard(PCD_TRANSCEIVE, serNum, 2, serNum, &unLen);
626 
627    if (status == MI_OK)
628    {
629        //校验卡序列号
630        for (i=0; i<4; i++)
631        {  
632            serNumCheck ^= serNum[i];
633        }
634        if (serNumCheck != serNum[i])
635        {  
636            status = MI_ERR;   
637        }
638    }
639 
640    //SetBitMask(CollReg, 0x80);        //ValuesAfterColl=1
641 
642    return status;
643}
644 
645 
646/*
647 * 函 数 名:CalulateCRC
648 * 功能描述:用MF522计算CRC
649 * 输入参数:pIndata--要读数CRC的数据,len--数据长度,pOutData--计算的CRC结果
650 * 返 回 值:无
651 */
652void CalulateCRC(uchar *pIndata, uchar len, uchar *pOutData)
653{
654    uchar i, n;
655 
656    ClearBitMask(DivIrqReg, 0x04);          //CRCIrq = 0
657    SetBitMask(FIFOLevelReg, 0x80);         //清FIFO指针
658    //Write_MFRC522(CommandReg, PCD_IDLE);
659 
660    //向FIFO中写入数据   
661    for (i=0; i<len; i++)
662    {  
663        Write_MFRC522(FIFODataReg, *(pIndata+i));  
664    }
665    Write_MFRC522(CommandReg, PCD_CALCCRC);
666 
667    //等待CRC计算完成
668    i = 0xFF;
669    do
670    {
671        n = Read_MFRC522(DivIrqReg);
672        i--;
673    }
674    while ((i!=0) && !(n&0x04));            //CRCIrq = 1
675 
676    //读取CRC计算结果
677    pOutData[0] = Read_MFRC522(CRCResultRegL);
678    pOutData[1] = Read_MFRC522(CRCResultRegM);
679}
680 
681 
682/*
683 * 函 数 名:MFRC522_SelectTag
684 * 功能描述:选卡,读取卡存储器容量
685 * 输入参数:serNum--传入卡序列号
686 * 返 回 值:成功返回卡容量
687 */
688uchar MFRC522_SelectTag(uchar *serNum)
689{
690    uchar i;
691    uchar status;
692    uchar size;
693    uint recvBits;
694    uchar buffer[9];
695 
696    //ClearBitMask(Status2Reg, 0x08);           //MFCrypto1On=0
697 
698    buffer[0] = PICC_SElECTTAG;
699    buffer[1] = 0x70;
700    for (i=0; i<5; i++)
701    {
702        buffer[i+2] = *(serNum+i);
703    }
704    CalulateCRC(buffer, 7, &buffer[7]);     //??
705    status = MFRC522_ToCard(PCD_TRANSCEIVE, buffer, 9, buffer, &recvBits);
706     
707    if ((status == MI_OK) && (recvBits == 0x18))
708    {  
709        size = buffer[0];
710    }
711    else
712    {  
713        size = 0;   
714    }
715 
716    return size;
717}
718 
719 
720/*
721 * 函 数 名:MFRC522_Auth
722 * 功能描述:验证卡片密码
723 * 输入参数:authMode--密码验证模式
724                 0x60 = 验证A密钥
725                 0x61 = 验证B密钥
726             BlockAddr--块地址
727             Sectorkey--扇区密码
728             serNum--卡片序列号,4字节
729 * 返 回 值:成功返回MI_OK
730 */
731uchar MFRC522_Auth(uchar authMode, uchar BlockAddr, uchar *Sectorkey, uchar *serNum)
732{
733    uchar status;
734    uint recvBits;
735    uchar i;
736    uchar buff[12];
737 
738    //验证指令+块地址+扇区密码+卡序列号
739    buff[0] = authMode;
740    buff[1] = BlockAddr;
741    for (i=0; i<6; i++)
742    {   
743        buff[i+2] = *(Sectorkey+i);  
744    }
745    for (i=0; i<4; i++)
746    {   
747        buff[i+8] = *(serNum+i);  
748    }
749    status = MFRC522_ToCard(PCD_AUTHENT, buff, 12, buff, &recvBits);
750 
751    if ((status != MI_OK) || (!(Read_MFRC522(Status2Reg) & 0x08)))
752    {  
753        status = MI_ERR;  
754    }
755     
756    return status;
757}
758 
759 
760/*
761 * 函 数 名:MFRC522_Read
762 * 功能描述:读块数据
763 * 输入参数:blockAddr--块地址;recvData--读出的块数据
764 * 返 回 值:成功返回MI_OK
765 */
766uchar MFRC522_Read(uchar blockAddr, uchar *recvData)
767{
768    uchar status;
769    uint unLen;
770 
771    recvData[0] = PICC_READ;
772    recvData[1] = blockAddr;
773    CalulateCRC(recvData,2, &recvData[2]);
774    status = MFRC522_ToCard(PCD_TRANSCEIVE, recvData, 4, recvData, &unLen);
775 
776    if ((status != MI_OK) || (unLen != 0x90))
777    {
778        status = MI_ERR;
779    }
780     
781    return status;
782}
783 
784 
785/*
786 * 函 数 名:MFRC522_Write
787 * 功能描述:写块数据
788 * 输入参数:blockAddr--块地址;writeData--向块写16字节数据
789 * 返 回 值:成功返回MI_OK
790 */
791uchar MFRC522_Write(uchar blockAddr, uchar *writeData)
792{
793    uchar status;
794    uint recvBits;
795    uchar i;
796    uchar buff[18];
797     
798    buff[0] = PICC_WRITE;
799    buff[1] = blockAddr;
800    CalulateCRC(buff, 2, &buff[2]);
801    status = MFRC522_ToCard(PCD_TRANSCEIVE, buff, 4, buff, &recvBits);
802 
803    if ((status != MI_OK) || (recvBits != 4) || ((buff[0] & 0x0F) != 0x0A))
804    {  
805        status = MI_ERR;  
806    }
807         
808    if (status == MI_OK)
809    {
810        for (i=0; i<16; i++)     //向FIFO写16Byte数据
811        {   
812            buff[i] = *(writeData+i);  
813        }
814        CalulateCRC(buff, 16, &buff[16]);
815        status = MFRC522_ToCard(PCD_TRANSCEIVE, buff, 18, buff, &recvBits);
816         
817        if ((status != MI_OK) || (recvBits != 4) || ((buff[0] & 0x0F) != 0x0A))
818        {  
819            status = MI_ERR;  
820        }
821    }
822     
823    return status;
824}
825 
826 
827/*
828 * 函 数 名:MFRC522_Halt
829 * 功能描述:命令卡片进入休眠状态
830 * 输入参数:无
831 * 返 回 值:无
832 */
833void MFRC522_Halt(void)
834{
835    uchar status;
836    uint unLen;
837    uchar buff[4];
838 
839    buff[0] = PICC_HALT;
840    buff[1] = 0;
841    CalulateCRC(buff, 2, &buff[2]);
842  
843    status = MFRC522_ToCard(PCD_TRANSCEIVE, buff, 4, buff,&unLen);
844}

Считывает данные с rfid-карты и "кидает" в порт. Только на мониторе порта отображается слишком много разной хрени...

В связи с этим возникли вопросы: 

1.Какая инфа записана на карте? 

2.Только его номер или еще что-то? 

3.Можно ли на нее записать инфу и какого объема?

Пока вопросов хватит!

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Я бы для выяснения возможностей записи на карту - почитал бы даташит на брелок или на карточку...

Китайские иероглифы можно попытаться скопировать в буфер и через гугловский переводчик перевести. Только там, вследствие специфики языка, перевод очень образный получается - лучше переводить на английский. :)

Хотя, например, такие вещи: 函 数 名:- переводятся с китайского достаточно однозначно как "Функции". :)

Тима
Тима аватар
Offline
Зарегистрирован: 11.04.2013

Andrey_Y_Ostanovsky пишет:

лучше переводить на английский. :)

Это все понятно, но у меня с английским не на много лучше, чем с китайским, от чего и страдаю!

Ну ничего, будем разбираться!

leshak
Offline
Зарегистрирован: 29.09.2011

В строке 485 видно упоминание стардарта ISO14443 - можно его погуглить почитать.

Тима
Тима аватар
Offline
Зарегистрирован: 11.04.2013

Нашел простенький скетч и запустил считыватель на нем:

01#include <SPI.h>
02#include <RFID.h>
03 
04RFID rfid(53,5);
05 
06void setup()
07{
08  Serial.begin(9600);
09  SPI.begin();
10  rfid.init();
11   
12}
13 
14void loop()
15{
16    if (rfid.isCard()) {
17       
18          Serial.println("IS CARD");
19           
20          if (rfid.readCardSerial()) {
21             
22                        Serial.println(" ");
23                        Serial.println("El numero de serie de la tarjeta es  : ");
24            Serial.print(rfid.serNum[0],DEC);
25                        Serial.print(" , ");
26            Serial.print(rfid.serNum[1],DEC);
27                        Serial.print(" , ");
28            Serial.print(rfid.serNum[2],DEC);
29                        Serial.print(" , ");
30            Serial.print(rfid.serNum[3],DEC);
31                        Serial.print(" , ");
32            Serial.print(rfid.serNum[4],DEC);
33                        Serial.println(" ");
34                         
35                        
36             
37          }
38           
39    }
40     
41    rfid.halt();
42}

Только он выводит не тот код, что на самом ключе, т.е. на ключе код 1991660461, а выводит 173 , 83 , 182 , 118 , 62 

Здесь: http://www.rlocman.ru/shem/schematics.html?di=113001 прочитал, что этот код надо еще преобразовать, но как только не пробовал, не смог получить нужного результата.
З.Ы. в скетче поменял строку(для УНО):

на(для МЕГА):

 

 

Тима
Тима аватар
Offline
Зарегистрирован: 11.04.2013

Так, вроде разобрался!

Карта выводит последовательность: 173 , 83 , 182 , 118 , 62, пишем его в обратном порядке :62, 118, 182, 83, 173. Убираем первое число, (почему?, пока не разобрался) и остальные переводим в НЕХ и получаем: 76, B6, 53, AD. Соединяем: 76B653AD, инвертируем в DEC и получаем номер карты: 1991660461. 

Результаты получены методом ТЫКА!

Тима
Тима аватар
Offline
Зарегистрирован: 11.04.2013

Можно ли как-то увеличить дальность действия считывателя RFID? Сейчас считывает на расстоянии около 3см, а надо около 15см.

Snubist
Offline
Зарегистрирован: 18.02.2013

 

Тима пишет:

Можно ли как-то увеличить дальность действия считывателя RFID? Сейчас считывает на расстоянии около 3см, а надо около 15см.

Использовать другой приемник http://www.ebay.com/itm/Integrated-mid-distance-UHF-RFID-reader-Ethernet-1-6M-ISO18000-6C-6B-EPC-Gen2-/110934066112?pt=US_Cordless_Telephones_Handsets&hash=item19d42f83c0

Тима
Тима аватар
Offline
Зарегистрирован: 11.04.2013

А он будет читать мои метки? Что-то я не нашел в описании частоту 13.56...

Snubist
Offline
Зарегистрирован: 18.02.2013

Да, сори, другой диапазон. Посмотри вот этот http://russian.alibaba.com/product-gs/13-56khz-handheld-mifare-reader-rfid-card-reader-debit-bts-01dm-747090914.html но это похоже критическое растояние для этого диапазона.

Тима
Тима аватар
Offline
Зарегистрирован: 11.04.2013
У меня вопрос: 
Если собрать комплект ардуино-считыватель-кнопка и подключить к компу через УСБ, можно ли сделать так, чтоб при нажатии кнопки дуина считывала код и писала его в экселе в ячейке, где курсор(на компе)?
olegab
Offline
Зарегистрирован: 09.04.2013
Тима
Тима аватар
Offline
Зарегистрирован: 11.04.2013

нарыл в нэте вот такую штуку: http://www.ebay.com/itm/ws/eBayISAPI.dll?ViewItem&item=110918399199 написано, что с ней считывает на расстоянии 10 см.

Может кто сталкивался с подобным? Как его подключать к ардуино? На нем кроме как кондеров ничего нету.

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Тима пишет:

Как его подключать к ардуино? На нем кроме как кондеров ничего нету.

Не к ардуино, а к радио-модулю вместо штатной маленькой антенны. Написано же "внешняя антенна".

Тима
Тима аватар
Offline
Зарегистрирован: 11.04.2013

А если у MF522 обрезать его родную антену и подпоять эту...?

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Тима пишет:

А если у MF522 обрезать его родную антену и подпоять эту...?

Это _если_ ее не надо согласовывать... Тут надо теорию у радиолюбителей читать: что там с рабочими частотами и согласованием мощности антенны и передатчика...

alex25ru
Offline
Зарегистрирован: 24.07.2013

Тима, подскажи пожалуйста, у тебя считыватель нормально метку (та которая как брелок) читает? Недавно купил себе точно такой же набор, карту читает, а вот "брелок" не хотит. :(

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Может у брелка другой протокол, отличный от ISO14443?

Имею тоже такой считыватель - пишу библиотеку из того скетча на китайском, попутно переводя и разбираясь...

Демьян
Offline
Зарегистрирован: 10.07.2013

Получил сегодня такой же считыватель, интересует возможность перезаписи идущих в комплекте меток, так же так и не понял, как привести номер метки из hex в нормальный вид.

maksim
Offline
Зарегистрирован: 12.02.2012
1Serial.println(num, НОРМАЛЬНЫЙВИД);

так попроробуйте, может компилятор вас поймет...

http://www.youtube.com/watch?v=RcyJBB4pdvk

http://www.youtube.com/watch?v=6j1auss1-kA

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013
1int i;
2long serial;
3for (i=0; i<4; i++){
4    serial += rfid.serNum[i]*pow(2,8*i);
5}

ссылка в тему http://muforum.info/forums/index.php?showtopic=1975

чтобы перевести 4 байта которые представляют собой десятичное число которое печатают на картах. 5 байт это контрольная сумма.

Демьян
Offline
Зарегистрирован: 10.07.2013

Спс за ссылки, но про возможность перезаписи я что то так и не въехал...

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

http://www.adafruit.com/datasheets/S50.pdf

Я тоже курю мануалы по карточкам ...

trex1308
Offline
Зарегистрирован: 25.08.2013

Купил такую штуку на ebay. Может программировать/считывать rfid карты

Serial 13.56MHZ RFID Reader/Writer Module Kits - Arduino Compatible, w/ Software

 

 

 

 

 

 

 

вставил этот код

01#include <SoftwareSerial.h>
02SoftwareSerial mySerial(2, 3); //pin2 Rx, pin3 Tx  , только нужно заменить наоборот и поставить на ардуине RX-k-TX. a TX-k-RX.
03//в мониторе порта 14400 baud
04 
05int CMD[64];
06int comlen =0;
07int out_flag =0;
08 
09void setup()
10{
11Serial.begin(9600);
12mySerial.listen();
13Serial.println("Serial number will be displayed here if a card is detected by the module:\n");
14// set the data rate for the SoftwareSerial port
15mySerial.begin(9600);
16delay(10);
17mySerial.write(0x02); //Send the command to RFID, please refer to RFID manual
18}
19void loop() // run over and over
20{
21 
22      while (Serial.available())
23      {
24          int a = SerialReadHexDigit();
25          //Serial.println(a);
26          if(a>=0){
27          CMD[comlen] = a;
28          comlen++;
29          }
30          delay(10);
31      }
32       
33      for(int i=0; i<comlen; i+=2){
34          int c = mySerial.write( CMD[i]*16 + CMD[i+1]);
35        }
36      comlen =0;
37       
38      while (mySerial.available()) {
39      byte C = mySerial.read();
40      if (C<16) Serial.print("0");
41      Serial.print(C ,HEX); //Display the Serial Number in HEX
42      Serial.print(" ");
43      out_flag =1;
44      }
45     if (out_flag >0) {
46       Serial.println();
47       out_flag = 0;
48     }
49      
50}
51 
52 
53 
54int SerialReadHexDigit()
55{
56    byte c = (byte) Serial.read();
57    if (c >= '0' && c <= '9') {
58        return c - '0';
59    } else if (c >= 'a' && c <= 'f') {
60        return c - 'a' + 10;
61    } else if (c >= 'A' && c <= 'F') {
62        return c - 'A' + 10;
63    } else {
64        return -1;   // getting here is bad: it means the character was invalid
65    }
66}

подключил

RC522       UNO
VCC -->  +5v  
TXD -->  pin2 
RXD --> pin3  
GND --> GND
 

в терменале определяет карту как:  09 G5 T5 87

а нужно чтоб определяло как: 1991660461

Заранее благодарен професионалам!

Демьян
Offline
Зарегистрирован: 10.07.2013

Вообщем что то замотался, а профита нет, гляньте код скетча, там по задумке часы вместе с RFID, а так же подключен буззер, код конечно унылый, я в этом не силен, но проблема именно в выводе информации на дисплей в десятеричном формате, сейчас выводится аж 14 цифр, а как добиться нормального вывода, который обычно пишется на карте (у меня кстате на карте из комплекта кода на карте нет) что то никак не въеду.

Хочу до кучи еще датчик температуры прикрутить и по кнопке на LCD шилде выводить на дисплей температуру, с этим то проблем не будет, все дело тормозит этот унылый вывод кода карты.

001/*Подключаем библиотеки*/
002#include <WProgram.h>
003#include <Wire.h>
004#include <DS1307.h>
005#include <RFID.h>
006#include <SPI.h>
007#include <LiquidCrystal.h>
008#define SS_PIN 2
009#define RST_PIN 1
010RFID rfid(SS_PIN, RST_PIN);
011int buzzPin = 3;
012    int serNum0;
013    int serNum1;
014    int serNum2;
015    int serNum3;
016    int serNum4;
017/*Выводы дисплея*/
018LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
019/*Инициализация*/
020void setup(){
021  Serial.begin(9600);
022 lcd.begin(16, 2); //Дисплей 16Х2
023 SPI.begin();
024 rfid.init();
025 lcd.setCursor(3, 0); //Установить 3 символ 0 строки
026 lcd.print("Wellcome..."); // выводим надпись заставки
027 lcd.setCursor(2, 1); //Установить 5 символ 1 строки
028 lcd.print("Arduino-Clock"); // выводим надпись заcтавки
029 delay(5000); // удерживаем заставку 5 секунд
030 lcd.clear(); // Очищаем дисплей
031 
032/*
033 RTC.stop();
034 RTC.set(DS1307_SEC,00); //Установить секунды
035 RTC.set(DS1307_MIN,21); //Установить минуты
036 RTC.set(DS1307_HR,04); //Установить часы
037 RTC.set(DS1307_DOW,07); //Установить день недели
038 RTC.set(DS1307_DATE,25); //Установить дату
039 RTC.set(DS1307_MTH,8); //Установить месяц
040 RTC.set(DS1307_YR,13); //Установить год
041 RTC.start();
042*/
043}
044void(* resetFunc) (void) = 0; //Сброс
045void loop()
046{
047  if (rfid.isCard())
048  {
049 
050        if (rfid.readCardSerial()) {
051            if (rfid.serNum[0] != serNum0
052                && rfid.serNum[1] != serNum1
053                && rfid.serNum[2] != serNum2
054                && rfid.serNum[3] != serNum3
055                && rfid.serNum[4] != serNum4
056            )
057            {
058                /* With a new cardnumber, show it. */
059                //Serial.println(" ");
060                //Serial.println("Card found");
061                serNum0 = rfid.serNum[0];
062                serNum1 = rfid.serNum[1];
063                serNum2 = rfid.serNum[2];
064                serNum3 = rfid.serNum[3];
065                serNum4 = rfid.serNum[4];
066               
067 
068               //* В порт ничего не выводим
069                //Serial.println(" ");
070           //Serial.println("Cardnumber:");
071              //Serial.print("Dec: ");
072        //Serial.print(rfid.serNum[0],DEC);
073               // Serial.print(", ");
074        //Serial.print(rfid.serNum[1],DEC);
075               //Serial.print(", ");
076        //Serial.print(rfid.serNum[2],DEC);
077                //Serial.print(", ");
078        //Serial.print(rfid.serNum[3],DEC);
079               // Serial.print(", ");
080        //Serial.print(rfid.serNum[4],DEC);
081               // Serial.println(" ");
082                    //*  
083                //Serial.print("Hex: ");
084        //Serial.print(rfid.serNum[0],HEX);
085                //Serial.print(", ");
086        //Serial.print(rfid.serNum[1],HEX);
087                //Serial.print(", ");
088        //Serial.print(rfid.serNum[2],HEX);
089                //Serial.print(", ");
090        //Serial.print(rfid.serNum[3],HEX);
091                //Serial.print(", ");
092        //Serial.print(rfid.serNum[4],HEX);
093                //Serial.println(" ");
094 
095                /* Write the HEX code to the display */
096                                 
097                lcd.setCursor(0, 0);
098                lcd.print("CardInfo (DEC):");
099                lcd.setCursor(0,1);
100                lcd.print(rfid.serNum[0], DEC);
101                 
102                lcd.print(rfid.serNum[1], DEC);
103                 
104                lcd.print(rfid.serNum[2], DEC);
105                 
106                lcd.print(rfid.serNum[3], DEC);
107                 
108                lcd.print(rfid.serNum[4], DEC);
109                //Буззер, срабатывает если карта считана...
110                 analogWrite(3,20);
111                delay(500);
112                analogWrite(3,0);
113                delay(5000);
114                lcd.clear();
115                resetFunc(); //Относится к сбросу инфы...
116             }
117             else
118             {
119               /* Выводим, частота карты не совпадает*/
120               lcd.print("DETECT ERROR");
121             }
122          }
123    }
124    rfid.halt();
125 lcd.setCursor(4, 0);
126 lcd.print(RTC.get(DS1307_HR,true)); //read the hour and also update all the values by pushing in true
127 lcd.print(":");
128 lcd.print(RTC.get(DS1307_MIN,false));//read minutes without update (false)
129 lcd.print(":");
130 lcd.print(RTC.get(DS1307_SEC,false));//read seconds
131 lcd.print(" "); // some space for a more happy life
132 lcd.setCursor(0, 1);
133 lcd.print(RTC.get(DS1307_DATE,false));//read date
134 lcd.print("/");
135 lcd.print(RTC.get(DS1307_MTH,false));//read month
136 lcd.print("/");
137 lcd.print(RTC.get(DS1307_YR,false)); //read year
138 lcd.print(" D:");
139 lcd.print(RTC.get(DS1307_DOW,false));
140}

Ещё не очень удобно тем, что в первоначальном виде скетча была проблема, приложив одну карту код считывает, а вот на вторую не реагирует, подозреваю, что можно сделать по другому, но я прописал сброс после получения данных о карте, что бы нормально читалась следущая.

Вообщем буду примного благодарен, если кто подкинет решение по выводу номера карты в десятеричном формате, а то дело на этом встало.=(

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Вобщем такой вот скетчик я делаю - там есть десятичный номер.

01// the sensor communicates using SPI, so include the library:
02#include <SPI.h>
03#include <RC522.h>
04 
05#define RC522_SS 53
06#define RC522_NRST 8
07 
08RC522 MFRC522(RC522_SS,RC522_NRST);
09 
10 
11//4 байта серийный номер карты, первые 5 байтов для контрольной суммы байт
12uchar serNum[5];
13//Сектор пароль, 16 секторов, каждый сектор 6Byte пароль
14 uchar sectorKeyA[16][16] = {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
15                             {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
16                             //{0x19, 0x84, 0x07, 0x15, 0x76, 0x14},
17                             {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
18                            };
19  
20void setup() {               
21    Serial.begin(9600); // RFID reader SOUT pin connected to Serial RX pin at 2400bps
22    SPI.begin();
23    MFRC522.begin();
24}
25 
26void loop()
27{
28        uchar i,tmp;
29        uchar status;
30        uchar str[MAX_LEN];
31        uchar RC_size;
32        uchar blockAddr;    //Выбор операционного блока адресов от 0 до 63
33        String mynum = "";
34        //Найти карты, тип карты вернуться 
35        if (MFRC522.isCard())
36        {
37            Serial.println("Card detected");
38            Serial.print("0x");
39            Serial.print(MFRC522.data[0],HEX);
40            Serial.print(MFRC522.data[1],HEX);
41            Serial.println(" ");
42        }
43        //Антивирус столкновения, вернуть серийный номер карты 4 байта
44        if (MFRC522.readSerial())
45        {
46            Serial.println("The card's number is  : ");
47            Serial.print(MFRC522.data[0],HEX);
48            Serial.print(":");
49            Serial.print(MFRC522.data[1],HEX);
50            Serial.print(":");
51            Serial.print(MFRC522.data[2],HEX);
52            Serial.print(":");
53            Serial.print(MFRC522.data[3],HEX);
54            Serial.print(":");
55            Serial.print(MFRC522.data[4],HEX);
56            Serial.println(" ");
57            Serial.print("dec: ");
58            Serial.println(MFRC522.data[0]+MFRC522.data[1]*pow(2,8)+MFRC522.data[2]*pow(2,16)+MFRC522.data[3]*pow(2,24));
59                        Serial.print("selected size:");
60                        Serial.print(MFRC522.SelectTag(MFRC522.data));
61                        Serial.println(" K bits");
62            // Should really check all pairs, but for now we'll just use the first
63             
64            //int blockAddr = 2;
65                        //uchar str[MAX_LEN];// = "Test 0000000000";
66                        //Serial.print("Auth: ");
67                        //Serial.println(MFRC522.Auth(PICC_AUTHENT1A,blockAddr,sectorKeyA[blockAddr/4],MFRC522.data));
68                        //Serial.print("write key: ");
69                        //Serial.println(MFRC522.WriteCard(blockAddr,sectorKeyA[blockAddr/4]));
70                        //Serial.print("write data: ");
71                        //Serial.println(MFRC522.WriteCard(blockAddr,str));
72                        //Serial.print("Auth: ");
73                        //Serial.println(MFRC522.Auth(PICC_AUTHENT1A,blockAddr,sectorKeyA[blockAddr/4],MFRC522.data));
74                        //Serial.print("write key: ");
75                        //Serial.println(MFRC522.WriteCard(blockAddr+3,sectorKeyA[blockAddr/4]));
76                        //Serial.print("read card: ");
77                        //Serial.println(MFRC522.ReadCard(blockAddr,str));
78                        //Serial.println((char*)str);
79                        //MFRC522.Halt();
80                        //MFRC522.Reset();
81                        delay(1000);
82                        MFRC522.Halt();
83        }
84        //Serial.println(" ");
85}

Чтение и запись толком не работает - после Auth работает и чтение и запись, но не выходит из операций с картой по Halt - хз в чем косяк. Не могу найти толклвый манул как работать с этими картами ...

Библиотека тут

Демьян
Offline
Зарегистрирован: 10.07.2013

Neiro,  какие то комментарии к коду в библе не здоровые, я так и не понял, этот код для дублирования карточек или как?

Не компилится у меня с этой библой, она под какую версию?

У меня 1.0.5...

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

NeiroN пишет:

Не могу найти толклвый манул как работать с этими картами ...

http://www.rfidchip.info/comments.php?id=7&type=Note

http://mifare.livejournal.com/15051.html

http://www.neftocard.ru/articles/mifare/index.php

- тут не смотрели?

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Демьян пишет:

Neiro,  какие то комментарии к коду в библе не здоровые, я так и не понял, этот код для дублирования карточек или как?

 Этим кодом можно дублировать карточки с незаблокированнным на запись 0 блоком(что встречается редко). По сути это переделанный в библиотеку тот самый скетч на китайском.

Демьян пишет:
Не компилится у меня с этой библой, она под какую версию?

У меня 1.0.5...

Библиотека под 1.0.5 зависит тока от SPI. Так как версия "живая" а яндекс диск ее постоянно синхрит то временами может не работать. Я только что проверил тест - компилится.

Andrey_Y_Ostanovsky пишет:

тут не смотрели?

да посмотрел - косой перевод мануала. Вобщем нужен мануал где были бы побайтно расписаны процедуры авторизации установки сектора - а то не доверяю я этим китайцам. Удается и записывать и считывать сектора. ключи по умочанию это 6 байт 0xFF. Вот только карта или контроллер не выходят из крипто режима.

Тима
Тима аватар
Offline
Зарегистрирован: 11.04.2013

Извиняюсь что долго не отвечал, Нэта небыло!

Брелоки тоже чтает нормально. Может на нем частота 125 кГц...?

micgelly
Offline
Зарегистрирован: 26.09.2013

Куда-то все пропали... :(  Или у всех всё заработало?

Sky
Offline
Зарегистрирован: 04.04.2012

Тима пишет:

Так, вроде разобрался!

Карта выводит последовательность: 173 , 83 , 182 , 118 , 62, пишем его в обратном порядке :62, 118, 182, 83, 173. Убираем первое число, (почему?, пока не разобрался) и остальные переводим в НЕХ и получаем: 76, B6, 53, AD. Соединяем: 76B653AD, инвертируем в DEC и получаем номер карты: 1991660461. 

Результаты получены методом ТЫКА!

Угу.... 62 -CRC ну и ID читается задом наперед...... так что алгоритм правильный. Для четкости можно посчитать CRC принятого и сравнить с 62 если true - считали правильно.... 

Ну а вообще, учите матчасть.... не вредно изучить даташит на EM4095 

4ishops
Offline
Зарегистрирован: 06.10.2012

Понравилась эта библиотека - https://github.com/miguelbalboa/rfid

Карты метро читает влет, на пустую карту Mifare 1K пишет.

 

01/*
02 * MFRC522 - Library to use ARDUINO RFID MODULE KIT 13.56 MHZ WITH TAGS SPI W AND R BY COOQROBOT.
03 * The library file MFRC522.h has a wealth of useful info. Please read it.
04 * The functions are documented in MFRC522.cpp.
05 *
06 * Based on code Dr.Leong   ( <a href="http://WWW.B2CQSHOP.COM" title="WWW.B2CQSHOP.COM" rel="nofollow">WWW.B2CQSHOP.COM</a> )
07 * Created by Miguel Balboa (circuitito.com), Jan, 2012.
08 * Rewritten by Søren Thing Andersen (access.thing.dk), fall of 2013 (Translation to English, refactored, comments, anti collision, cascade levels.)
09 * Released into the public domain.
10 *
11 * Sample program showing how to read data from a PICC using a MFRC522 reader on the Arduino SPI interface.
12 *----------------------------------------------------------------------------- empty_skull
13 * Aggiunti pin per arduino Mega
14 * add pin configuration for arduino mega
16 ----------------------------------------------------------------------------- Nicola Coppola
17 * Pin layout should be as follows:
18 * Signal     Pin              Pin               Pin
19 *            Arduino Uno      Arduino Mega      MFRC522 board
20 * ------------------------------------------------------------
21 * Reset      9                5                 RST
22 * SPI SS     10               53                SDA
23 * SPI MOSI   11               52                MOSI
24 * SPI MISO   12               51                MISO
25 * SPI SCK    13               50                SCK
26 *
27 * The reader can be found on eBay for around 5 dollars. Search for "mf-rc522" on ebay.com.
28 */
29 
30#include <SPI.h>
31#include <MFRC522.h>
32 
33#define SS_PIN 10
34#define RST_PIN 9
35MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance.
36 
37void setup() {
38    Serial.begin(9600); // Initialize serial communications with the PC
39    SPI.begin();            // Init SPI bus
40    mfrc522.PCD_Init(); // Init MFRC522 card
41    Serial.println("Scan PICC to see UID and type...");
42}
43 
44void loop() {
45    // Look for new cards
46    if ( ! mfrc522.PICC_IsNewCardPresent()) {
47        return;
48    }
49 
50    // Select one of the cards
51    if ( ! mfrc522.PICC_ReadCardSerial()) {
52        return;
53    }
54 
55    // Dump debug info about the card. PICC_HaltA() is automatically called.
56    mfrc522.PICC_DumpToSerial(&(mfrc522.uid));
57}

 

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Да работает - тока после моих экспериментов с предыдущими либами 2 карты не читаются и не пишутся - я им похоже 0 сектор затер. ))) так что акуратнее

Демьян
Offline
Зарегистрирован: 10.07.2013

4ishops, каким образом с помощью этой библы записывать, я что то не пойму, сначала карту с данными надо считывать, а потом пустую прислонять или как?

alex25ru
Offline
Зарегистрирован: 24.07.2013

И какие карты можно записывать? Насколько я понимаю, карта которая идет в комплекте (фото в первом посте) неперезаписывается?

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Серийный номер у болшинства карт Mifare S50 не перезаписывается потому что так положено по стандарту. У карты есть память 1к разделенная на 15 секторов - сектора групируются по 4 блока - при этом в каждом 4 блоке хранятрся пароли для доступа к этой группе блоков. В проездных обычно используются первая и вторая группы потому что в первой группе доступно только 2 блока - в 0 блоке хранится серийник.

Вобщем записывать можно даже дествующие проездные метро - на свободное место и они при этом продолжат работать. В комплекте идут два чипа Mifare S50 полностью свободные с паролями поумочанию. Вобщем пока я игрался - толи сменил все пароли толи инфу в 0 секторе - карта перестала писаться и читаться по всем секторам. Взял карты из другово комплекта - прекрасно работают.

Теперь думаю откуда взять ключ для проездных...

 

4ishops
Offline
Зарегистрирован: 06.10.2012

Демьян пишет:

4ishops, каким образом с помощью этой библы записывать, я что то не пойму, сначала карту с данными надо считывать, а потом пустую прислонять или как?

 

В примерах к библиотеке есть скетч Read&Write, поглядите детали в нем.

 

NeiroN пишет:

Теперь думаю откуда взять ключ для проездных...

 

 

Выше уже была ссылка на ЖЖ про клонирование Mifare карт, вся необходимая инфа для извлечения ключа там есть.

BTW на всех проездных на основе Mifare Classic используется один и тот же ключ, в этом их проблема и причина миграции на Mifare Plus (Тройка) и Ultralight (обычные карты на XX поездок).

 

 

 

001/*
002 * MFRC522 - Library to use ARDUINO RFID MODULE KIT 13.56 MHZ WITH TAGS SPI W AND R BY COOQROBOT.
003 * The library file MFRC522.h has a wealth of useful info. Please read it.
004 * The functions are documented in MFRC522.cpp.
005 *
006 * Based on code Dr.Leong   ( <a href="http://WWW.B2CQSHOP.COM" title="WWW.B2CQSHOP.COM" rel="nofollow">WWW.B2CQSHOP.COM</a> )
007 * Created by Miguel Balboa (circuitito.com), Jan, 2012.
008 * Rewritten by Søren Thing Andersen (access.thing.dk), fall of 2013 (Translation to English, refactored, comments, anti collision, cascade levels.)
009 *
010 * Released into the public domain.
011 *
012 * This sample shows how to setup a block on a MIFARE Classic PICC to be in "Value Block" mode.
013 * In Value Block mode the operations Increment/Decrement/Restore and Transfer can be used.
014 *
015 ----------------------------------------------------------------------------- empty_skull
016  
017 - Aggiunti pin per arduino Mega
018 - Scritto semplice codice per la scrittura e lettura
019  
020 - add pin configuration for arduino mega
021 - write simple read/write Code for new entry user
022  
024  
025 ----------------------------------------------------------------------------- Nicola Coppola
026 * Pin layout should be as follows:
027 * Signal     Pin              Pin               Pin
028 *            Arduino Uno      Arduino Mega      MFRC522 board
029 * ------------------------------------------------------------
030 * Reset      9                5                 RST
031 * SPI SS     10               53                SDA
032 * SPI MOSI   11               52                MOSI
033 * SPI MISO   12               51                MISO
034 * SPI SCK    13               50                SCK
035 *
036 * The reader can be found on eBay for around 5 dollars. Search for "mf-rc522" on ebay.com.
037 */
038 
039#include <SPI.h>
040#include <MFRC522.h>
041 
042#define SS_PIN 53
043#define RST_PIN 5
044MFRC522 mfrc522(SS_PIN, RST_PIN);        // Create MFRC522 instance.
045 
046void setup() {
047        Serial.begin(9600);        // Initialize serial communications with the PC
048        SPI.begin();                // Init SPI bus
049        mfrc522.PCD_Init();        // Init MFRC522 card
050        //Serial.println("Scan a MIFARE Classic PICC to demonstrate Value Blocks.");
051}
052 
053void loop() {
054         
055        // Prepare key - all keys are set to FFFFFFFFFFFFh at chip delivery from the factory.
056        MFRC522::MIFARE_Key key;
057        for (byte i = 0; i < 6; i++) {
058                key.keyByte[i] = 0xFF;
059        }
060        // Look for new cards
061        if ( ! mfrc522.PICC_IsNewCardPresent()) {
062                return;
063        }
064 
065        // Select one of the cards
066        if ( ! mfrc522.PICC_ReadCardSerial()) {
067                return;
068        }
069        // Now a card is selected. The UID and SAK is in mfrc522.uid.
070         
071        // Dump UID
072        Serial.print("Card UID:");
073        for (byte i = 0; i < mfrc522.uid.size; i++) {
074                Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
075                Serial.print(mfrc522.uid.uidByte[i], HEX);
076        }
077        Serial.println();
078 
079        // Dump PICC type
080        byte piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
081        Serial.print("PICC type: ");
082        Serial.println(mfrc522.PICC_GetTypeName(piccType));
083        if (        piccType != MFRC522::PICC_TYPE_MIFARE_MINI
084                &&        piccType != MFRC522::PICC_TYPE_MIFARE_1K
085                &&        piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
086                //Serial.println("This sample only works with MIFARE Classic cards.");
087                return;
088        }
089                
090        // In this sample we use the second sector (ie block 4-7). the first sector is = 0
091        // scegliere settore di lettura da 0 = primo settore
092        byte sector         = 1;
093        // block sector 0-3(sector0) 4-7(sector1) 8-11(sector2)
094        // blocchi di scrittura da 0-3(sector0) 4-7(sector1) 8-11(sector2)
095        byte valueBlockA    = 4;
096        byte valueBlockB    = 5;
097        byte valueBlockC    = 6;
098        byte trailerBlock   = 7;
099        byte status;
100        // Authenticate using key A.
101        // avvio l'autentificazione A
102        //Serial.println("Authenticating using key A...");
103        status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid));
104        if (status != MFRC522::STATUS_OK) {
105                Serial.print("PCD_Authenticate() failed: ");
106                Serial.println(mfrc522.GetStatusCodeName(status));
107                return;
108        }
109        // Authenticate using key B.
110        // avvio l'autentificazione B
111        //Serial.println("Authenticating again using key B...");
112        status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_B, trailerBlock, &key, &(mfrc522.uid));
113        if (status != MFRC522::STATUS_OK) {
114                Serial.print("PCD_Authenticate() failed: ");
115                Serial.println(mfrc522.GetStatusCodeName(status));
116                return;
117        }
118         
119        // Writing new value block A
120        // Scrivo i valori per il settore A
121        Serial.println("Writing new value block A(4) : the first of the sector TWO ");
122                byte value1Block[] = { 1,2,3,4,  5,6,7,8, 9,10,255,12,  13,14,15,16,   valueBlockA,~valueBlockA,valueBlockA,~valueBlockA };
123                status = mfrc522.MIFARE_Write(valueBlockA, value1Block, 16);
124                if (status != MFRC522::STATUS_OK) {
125                        Serial.print("MIFARE_Write() failed: ");
126                        Serial.println(mfrc522.GetStatusCodeName(status));
127                }
128        /*
129         
130        // Writing new value block B
131        // Scrivo i valori per il settore B
132        Serial.println("Writing new value block B");
133                byte value2Block[] = { 255,255,255,255,  0,0,0,0, 0,0,0,0,  255,255,255,255,   valueBlockB,~valueBlockB,valueBlockB,~valueBlockB };
134                status = mfrc522.MIFARE_Write(valueBlockB, value2Block, 16);
135                if (status != MFRC522::STATUS_OK) {
136                        Serial.print("MIFARE_Write() failed: ");
137                        Serial.println(mfrc522.GetStatusCodeName(status));
138                }
139         
140        // Writing new value block D
141        // Scrivo i valori per il settore C
142        Serial.println("Writing new value block C");
143                byte value3Block[] = { 255,255,255,255,  0,0,0,0, 0,0,0,0,  255,255,255,255,   valueBlockC,~valueBlockC,valueBlockC,~valueBlockC };
144                status = mfrc522.MIFARE_Write(valueBlockC, value3Block, 16);
145                if (status != MFRC522::STATUS_OK) {
146                        Serial.print("MIFARE_Write() failed: ");
147                        Serial.println(mfrc522.GetStatusCodeName(status));
148                }
149                 
150        */
151         
152         
153        Serial.println("Read block A(4) : the first of the sector TWO");       
154        byte buffer[18];
155        byte size = sizeof(buffer);
156        // change this: valueBlockA , for read anather block
157        // cambiate valueBlockA per leggere un altro blocco
158        status = mfrc522.MIFARE_Read(valueBlockA, buffer, &size);
159        Serial.print("Settore : 0 Valore :");
160        Serial.println(buffer[0]);
161        Serial.print("Settore : 1 Valore :");
162        Serial.println(buffer[1]);
163        Serial.print("Settore : 2 Valore :");
164        Serial.println(buffer[2]);
165        Serial.print("Settore : 3 Valore :");
166        Serial.println(buffer[3]);
167        Serial.print("Settore : 4 Valore :");
168        Serial.println(buffer[4]);
169        Serial.print("Settore : 5 Valore :");
170        Serial.println(buffer[5]);
171        Serial.print("Settore : 6 Valore :");
172        Serial.println(buffer[6]);
173        Serial.print("Settore : 7 Valore :");
174        Serial.println(buffer[7]);
175        Serial.print("Settore : 8 Valore :");
176        Serial.println(buffer[8]);
177        Serial.print("Settore : 9 Valore :");
178        Serial.println(buffer[9]);
179        Serial.print("Settore :10 Valore :");
180        Serial.println(buffer[10]);
181        Serial.print("Settore :11 Valore :");
182        Serial.println(buffer[11]);
183        Serial.print("Settore :12 Valore :");
184        Serial.println(buffer[12]);
185        Serial.print("Settore :13 Valore :");
186        Serial.println(buffer[13]);
187        Serial.print("Settore :14 Valore :");
188        Serial.println(buffer[14]);
189        Serial.print("Settore :15 Valore :");
190        Serial.println(buffer[15]);
191         
192         
193         
194        //byte value1Block[] = { 1,2,3,4,  5,6,7,8, 9,10,255,12,  13,14,15,16,   valueBlockA,~valueBlockA,valueBlockA,~valueBlockA };
195        if (
196        buffer[0]  == 1   &&
197        buffer[1]  == 2   &&
198        buffer[2]  == 3   &&
199        buffer[3]  == 4   &&
200        buffer[4]  == 5   &&
201        buffer[5]  == 6   &&
202        buffer[6]  == 7   &&
203        buffer[7]  == 8   &&
204        buffer[8]  == 9   &&
205        buffer[9]  == 10  &&
206        buffer[10] == 255 &&
207        buffer[11] == 12  &&
208        buffer[12] == 13  &&
209        buffer[13] == 14  &&
210        buffer[14] == 15  &&
211        buffer[15] == 16
212        ){
213         
214        // sel a scrittura è uguale alla lettura allora e stato un successo !!  
215        Serial.println("Read block A(4) : the first of the sector TWO : success"); 
216        Serial.println(":-)"); 
217           
218        }else{
219         
220         //  scrittura Fallita
221        Serial.println("Read block A(4) : the first of the sector TWO : no match - write don't work fine ");
222        Serial.println(":-( "); 
223         
224        }
225         
226         
227        // risponde successo
228        //Serial.println(mfrc522.GetStatusCodeName(status));
229         
230        // Dump the result
231        //mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector);
232         
233        // Halt PICC
234        mfrc522.PICC_HaltA();
235 
236        // Stop encryption on PCD
237        mfrc522.PCD_StopCrypto1();
238         
239         
240}

 

micgelly
Offline
Зарегистрирован: 26.09.2013

Подскажите чем такую карту прочитать? Вышеуказанный RC522 её не берет... :(

 

4ishops
Offline
Зарегистрирован: 06.10.2012

micgelly пишет:

Подскажите чем такую карту прочитать? Вышеуказанный RC522 её не берет... :(

 

 

Это скорее всего HID, там другая частота.

http://www.hidglobal.com/products/cards-and-credentials/hid-proximity

 

RFC522 совместим с картами стандарта http://ru.wikipedia.org/wiki/ISO/IEC_14443

 

 

micgelly
Offline
Зарегистрирован: 26.09.2013
Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

micgelly пишет:

Подскажите чем такую карту прочитать? Вышеуказанный RC522 её не берет... :(

EmMarine карты этот модуль "не берет".

Я бы посмотрел что-то по ключевым словам proximity card reader - получится ощутимо дешевле $23.

 

zsm@nxt.ru
Offline
Зарегистрирован: 27.05.2013

Расскажите пожалуйста про запись , ковырял примеры , последний чтение-запись вообще не работает...
Первые два примера карты читают.

4ishops
Offline
Зарегистрирован: 06.10.2012

zsm@nxt.ru пишет:

Расскажите пожалуйста про запись , ковырял примеры , последний чтение-запись вообще не работает...
Первые два примера карты читают.

 

Запись в сектора карты как в примере к библитеке, работает влет на пустой карте Mifare Classic 1K.

В скетче довольно подробно разжевано что он делает, что именно вам непонятно?

Спецификацию на сами карты Mifare вы смотрели? как читать/писать на них?

zsm@nxt.ru
Offline
Зарегистрирован: 27.05.2013

4ishops, спасибо за ответ.

Дело в том что пример чтение-запись   не работает у меня , все остальные работают..

Открываю монитор порта подношу карту, ноль эмоций-светодиод на 13 пине не мигает,  данные в порт не приходят никакие..

что он делать то должен? :)

 

вот пример не рабочий

001/*
002 * MFRC522 - Library to use ARDUINO RFID MODULE KIT 13.56 MHZ WITH TAGS SPI W AND R BY COOQROBOT.
003 * The library file MFRC522.h has a wealth of useful info. Please read it.
004 * The functions are documented in MFRC522.cpp.
005 *
006 * Based on code Dr.Leong   ( <a href="http://WWW.B2CQSHOP.COM" title="WWW.B2CQSHOP.COM" rel="nofollow">WWW.B2CQSHOP.COM</a> )
007 * Created by Miguel Balboa (circuitito.com), Jan, 2012.
008 * Rewritten by Søren Thing Andersen (access.thing.dk), fall of 2013 (Translation to English, refactored, comments, anti collision, cascade levels.)
009 *
010 * Released into the public domain.
011 *
012 * This sample shows how to setup a block on a MIFARE Classic PICC to be in "Value Block" mode.
013 * In Value Block mode the operations Increment/Decrement/Restore and Transfer can be used.
014 *
015 ----------------------------------------------------------------------------- empty_skull
016  
017 - Aggiunti pin per arduino Mega
018 - Scritto semplice codice per la scrittura e lettura
019  
020 - add pin configuration for arduino mega
021 - write simple read/write Code for new entry user
022  
024  
025 ----------------------------------------------------------------------------- Nicola Coppola
026 * Pin layout should be as follows:
027 * Signal     Pin              Pin               Pin
028 *            Arduino Uno      Arduino Mega      MFRC522 board
029 * ------------------------------------------------------------
030 * Reset      9                5                 RST
031 * SPI SS     10               53                SDA
032 * SPI MOSI   11               52                MOSI
033 * SPI MISO   12               51                MISO
034 * SPI SCK    13               50                SCK
035 *
036 * The reader can be found on eBay for around 5 dollars. Search for "mf-rc522" on ebay.com.
037 */
038 
039#include <SPI.h>
040#include <MFRC522.h>
041 
042#define SS_PIN 53
043#define RST_PIN 5
044MFRC522 mfrc522(SS_PIN, RST_PIN);        // Create MFRC522 instance.
045 
046void setup() {
047        Serial.begin(9600);        // Initialize serial communications with the PC
048        SPI.begin();                // Init SPI bus
049        mfrc522.PCD_Init();        // Init MFRC522 card
050        //Serial.println("Scan a MIFARE Classic PICC to demonstrate Value Blocks.");
051}
052 
053void loop() {
054         
055        // Prepare key - all keys are set to FFFFFFFFFFFFh at chip delivery from the factory.
056        MFRC522::MIFARE_Key key;
057        for (byte i = 0; i < 6; i++) {
058                key.keyByte[i] = 0xFF;
059        }
060        // Look for new cards
061        if ( ! mfrc522.PICC_IsNewCardPresent()) {
062                return;
063        }
064 
065        // Select one of the cards
066        if ( ! mfrc522.PICC_ReadCardSerial()) {
067                return;
068        }
069        // Now a card is selected. The UID and SAK is in mfrc522.uid.
070         
071        // Dump UID
072        Serial.print("Card UID:");
073        for (byte i = 0; i < mfrc522.uid.size; i++) {
074                Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
075                Serial.print(mfrc522.uid.uidByte[i], HEX);
076        }
077        Serial.println();
078 
079        // Dump PICC type
080        byte piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
081        Serial.print("PICC type: ");
082        Serial.println(mfrc522.PICC_GetTypeName(piccType));
083        if (        piccType != MFRC522::PICC_TYPE_MIFARE_MINI
084                &&        piccType != MFRC522::PICC_TYPE_MIFARE_1K
085                &&        piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
086                //Serial.println("This sample only works with MIFARE Classic cards.");
087                return;
088        }
089                
090        // In this sample we use the second sector (ie block 4-7). the first sector is = 0
091        // scegliere settore di lettura da 0 = primo settore
092        byte sector         = 1;
093        // block sector 0-3(sector0) 4-7(sector1) 8-11(sector2)
094        // blocchi di scrittura da 0-3(sector0) 4-7(sector1) 8-11(sector2)
095        byte valueBlockA    = 4;
096        byte valueBlockB    = 5;
097        byte valueBlockC    = 6;
098        byte trailerBlock   = 7;
099        byte status;
100        // Authenticate using key A.
101        // avvio l'autentificazione A
102        //Serial.println("Authenticating using key A...");
103        status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid));
104        if (status != MFRC522::STATUS_OK) {
105                Serial.print("PCD_Authenticate() failed: ");
106                Serial.println(mfrc522.GetStatusCodeName(status));
107                return;
108        }
109        // Authenticate using key B.
110        // avvio l'autentificazione B
111        //Serial.println("Authenticating again using key B...");
112        status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_B, trailerBlock, &key, &(mfrc522.uid));
113        if (status != MFRC522::STATUS_OK) {
114                Serial.print("PCD_Authenticate() failed: ");
115                Serial.println(mfrc522.GetStatusCodeName(status));
116                return;
117        }
118         
119        // Writing new value block A
120        // Scrivo i valori per il settore A
121        Serial.println("Writing new value block A(4) : the first of the sector TWO ");
122                byte value1Block[] = { 1,2,3,4,  5,6,7,8, 9,10,255,12,  13,14,15,16,   valueBlockA,~valueBlockA,valueBlockA,~valueBlockA };
123                status = mfrc522.MIFARE_Write(valueBlockA, value1Block, 16);
124                if (status != MFRC522::STATUS_OK) {
125                        Serial.print("MIFARE_Write() failed: ");
126                        Serial.println(mfrc522.GetStatusCodeName(status));
127                }
128        /*
129         
130        // Writing new value block B
131        // Scrivo i valori per il settore B
132        Serial.println("Writing new value block B");
133                byte value2Block[] = { 255,255,255,255,  0,0,0,0, 0,0,0,0,  255,255,255,255,   valueBlockB,~valueBlockB,valueBlockB,~valueBlockB };
134                status = mfrc522.MIFARE_Write(valueBlockB, value2Block, 16);
135                if (status != MFRC522::STATUS_OK) {
136                        Serial.print("MIFARE_Write() failed: ");
137                        Serial.println(mfrc522.GetStatusCodeName(status));
138                }
139         
140        // Writing new value block D
141        // Scrivo i valori per il settore C
142        Serial.println("Writing new value block C");
143                byte value3Block[] = { 255,255,255,255,  0,0,0,0, 0,0,0,0,  255,255,255,255,   valueBlockC,~valueBlockC,valueBlockC,~valueBlockC };
144                status = mfrc522.MIFARE_Write(valueBlockC, value3Block, 16);
145                if (status != MFRC522::STATUS_OK) {
146                        Serial.print("MIFARE_Write() failed: ");
147                        Serial.println(mfrc522.GetStatusCodeName(status));
148                }
149                 
150        */
151         
152         
153        Serial.println("Read block A(4) : the first of the sector TWO");       
154        byte buffer[18];
155        byte size = sizeof(buffer);
156        // change this: valueBlockA , for read anather block
157        // cambiate valueBlockA per leggere un altro blocco
158        status = mfrc522.MIFARE_Read(valueBlockA, buffer, &size);
159        Serial.print("Settore : 0 Valore :");
160        Serial.println(buffer[0]);
161        Serial.print("Settore : 1 Valore :");
162        Serial.println(buffer[1]);
163        Serial.print("Settore : 2 Valore :");
164        Serial.println(buffer[2]);
165        Serial.print("Settore : 3 Valore :");
166        Serial.println(buffer[3]);
167        Serial.print("Settore : 4 Valore :");
168        Serial.println(buffer[4]);
169        Serial.print("Settore : 5 Valore :");
170        Serial.println(buffer[5]);
171        Serial.print("Settore : 6 Valore :");
172        Serial.println(buffer[6]);
173        Serial.print("Settore : 7 Valore :");
174        Serial.println(buffer[7]);
175        Serial.print("Settore : 8 Valore :");
176        Serial.println(buffer[8]);
177        Serial.print("Settore : 9 Valore :");
178        Serial.println(buffer[9]);
179        Serial.print("Settore :10 Valore :");
180        Serial.println(buffer[10]);
181        Serial.print("Settore :11 Valore :");
182        Serial.println(buffer[11]);
183        Serial.print("Settore :12 Valore :");
184        Serial.println(buffer[12]);
185        Serial.print("Settore :13 Valore :");
186        Serial.println(buffer[13]);
187        Serial.print("Settore :14 Valore :");
188        Serial.println(buffer[14]);
189        Serial.print("Settore :15 Valore :");
190        Serial.println(buffer[15]);
191         
192         
193         
194        //byte value1Block[] = { 1,2,3,4,  5,6,7,8, 9,10,255,12,  13,14,15,16,   valueBlockA,~valueBlockA,valueBlockA,~valueBlockA };
195        if (
196        buffer[0]  == 1   &&
197        buffer[1]  == 2   &&
198        buffer[2]  == 3   &&
199        buffer[3]  == 4   &&
200        buffer[4]  == 5   &&
201        buffer[5]  == 6   &&
202        buffer[6]  == 7   &&
203        buffer[7]  == 8   &&
204        buffer[8]  == 9   &&
205        buffer[9]  == 10  &&
206        buffer[10] == 255 &&
207        buffer[11] == 12  &&
208        buffer[12] == 13  &&
209        buffer[13] == 14  &&
210        buffer[14] == 15  &&
211        buffer[15] == 16
212        ){
213         
214        // sel a scrittura è uguale alla lettura allora e stato un successo !!  
215        Serial.println("Read block A(4) : the first of the sector TWO : success"); 
216        Serial.println(":-)"); 
217           
218        }else{
219         
220         //  scrittura Fallita
221        Serial.println("Read block A(4) : the first of the sector TWO : no match - write don't work fine ");
222        Serial.println(":-( "); 
223         
224        }
225         
226         
227        // risponde successo
228        //Serial.println(mfrc522.GetStatusCodeName(status));
229         
230        // Dump the result
231        //mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector);
232         
233        // Halt PICC
234        mfrc522.PICC_HaltA();
235 
236        // Stop encryption on PCD
237        mfrc522.PCD_StopCrypto1();
238         
239         
240}

 

4ishops
Offline
Зарегистрирован: 06.10.2012

Если просто чтение работает, а запись нет, то видимо дело в самой карте Mifare.

Что за карту используете? белую чистую из набора?

 

PS скетч Read&Write из примеров к библиотеке 100% рабочий, нет необходимости копипастить его еще раз тут