Помогите с 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

Спасибо!

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

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

/*
 * 文 件 名:RFID.pde
 * 创 建 者:Dr.Leong   ( WWW.B2CQSHOP.COM )
 * 创建日期:2011.09.19
 * 修 改 者:
 * 修改日期:
 * 功能描述:Mifare1 寻卡→防冲突→选卡→读写 接口
 */
 // the sensor communicates using SPI, so include the library:
#include <SPI.h>

#define	uchar	unsigned char
#define	uint	unsigned int

//数组最大长度
#define MAX_LEN 16

/////////////////////////////////////////////////////////////////////
//set the pin
/////////////////////////////////////////////////////////////////////
const int chipSelectPin = 53;
const int NRSTPD = 5;

//MF522命令字
#define PCD_IDLE              0x00               //NO action;取消当前命令
#define PCD_AUTHENT           0x0E               //验证密钥
#define PCD_RECEIVE           0x08               //接收数据
#define PCD_TRANSMIT          0x04               //发送数据
#define PCD_TRANSCEIVE        0x0C               //发送并接收数据
#define PCD_RESETPHASE        0x0F               //复位
#define PCD_CALCCRC           0x03               //CRC计算

//Mifare_One卡片命令字
#define PICC_REQIDL           0x26               //寻天线区内未进入休眠状态
#define PICC_REQALL           0x52               //寻天线区内全部卡
#define PICC_ANTICOLL         0x93               //防冲撞
#define PICC_SElECTTAG        0x93               //选卡
#define PICC_AUTHENT1A        0x60               //验证A密钥
#define PICC_AUTHENT1B        0x61               //验证B密钥
#define PICC_READ             0x30               //读块
#define PICC_WRITE            0xA0               //写块
#define PICC_DECREMENT        0xC0               //扣款
#define PICC_INCREMENT        0xC1               //充值
#define PICC_RESTORE          0xC2               //调块数据到缓冲区
#define PICC_TRANSFER         0xB0               //保存缓冲区中数据
#define PICC_HALT             0x50               //休眠


//和MF522通讯时返回的错误代码
#define MI_OK                 0
#define MI_NOTAGERR           1
#define MI_ERR                2


//------------------MFRC522寄存器---------------
//Page 0:Command and Status
#define     Reserved00            0x00    
#define     CommandReg            0x01    
#define     CommIEnReg            0x02    
#define     DivlEnReg             0x03    
#define     CommIrqReg            0x04    
#define     DivIrqReg             0x05
#define     ErrorReg              0x06    
#define     Status1Reg            0x07    
#define     Status2Reg            0x08    
#define     FIFODataReg           0x09
#define     FIFOLevelReg          0x0A
#define     WaterLevelReg         0x0B
#define     ControlReg            0x0C
#define     BitFramingReg         0x0D
#define     CollReg               0x0E
#define     Reserved01            0x0F
//Page 1:Command     
#define     Reserved10            0x10
#define     ModeReg               0x11
#define     TxModeReg             0x12
#define     RxModeReg             0x13
#define     TxControlReg          0x14
#define     TxAutoReg             0x15
#define     TxSelReg              0x16
#define     RxSelReg              0x17
#define     RxThresholdReg        0x18
#define     DemodReg              0x19
#define     Reserved11            0x1A
#define     Reserved12            0x1B
#define     MifareReg             0x1C
#define     Reserved13            0x1D
#define     Reserved14            0x1E
#define     SerialSpeedReg        0x1F
//Page 2:CFG    
#define     Reserved20            0x20  
#define     CRCResultRegM         0x21
#define     CRCResultRegL         0x22
#define     Reserved21            0x23
#define     ModWidthReg           0x24
#define     Reserved22            0x25
#define     RFCfgReg              0x26
#define     GsNReg                0x27
#define     CWGsPReg	          0x28
#define     ModGsPReg             0x29
#define     TModeReg              0x2A
#define     TPrescalerReg         0x2B
#define     TReloadRegH           0x2C
#define     TReloadRegL           0x2D
#define     TCounterValueRegH     0x2E
#define     TCounterValueRegL     0x2F
//Page 3:TestRegister     
#define     Reserved30            0x30
#define     TestSel1Reg           0x31
#define     TestSel2Reg           0x32
#define     TestPinEnReg          0x33
#define     TestPinValueReg       0x34
#define     TestBusReg            0x35
#define     AutoTestReg           0x36
#define     VersionReg            0x37
#define     AnalogTestReg         0x38
#define     TestDAC1Reg           0x39  
#define     TestDAC2Reg           0x3A   
#define     TestADCReg            0x3B   
#define     Reserved31            0x3C   
#define     Reserved32            0x3D   
#define     Reserved33            0x3E   
#define     Reserved34			  0x3F
//-----------------------------------------------

//4字节卡序列号,第5字节为校验字节
uchar serNum[5];

uchar  writeData[16]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100};  //初始化 100元钱
uchar  moneyConsume = 18 ;  //消费18元
uchar  moneyAdd = 10 ;  //充值10元
//扇区A密码,16个扇区,每个扇区密码6Byte
 uchar sectorKeyA[16][16] = {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
                             {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
                             //{0x19, 0x84, 0x07, 0x15, 0x76, 0x14},
                             {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
                            };
 uchar sectorNewKeyA[16][16] = {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
                                {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xff,0x07,0x80,0x69, 0x19,0x84,0x07,0x15,0x76,0x14},
                                 //you can set another ket , such as  " 0x19, 0x84, 0x07, 0x15, 0x76, 0x14 "
                                 //{0x19, 0x84, 0x07, 0x15, 0x76, 0x14, 0xff,0x07,0x80,0x69, 0x19,0x84,0x07,0x15,0x76,0x14},
                                 // but when loop, please set the  sectorKeyA, the same key, so that RFID module can read the card
                                {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xff,0x07,0x80,0x69, 0x19,0x33,0x07,0x15,0x34,0x14},
                               };

void setup() {                
   Serial.begin(9600);                       // RFID reader SOUT pin connected to Serial RX pin at 2400bps 
 // start the SPI library:
  SPI.begin();
  
  pinMode(chipSelectPin,OUTPUT);             // Set digital pin 10 as OUTPUT to connect it to the RFID /ENABLE pin 
    digitalWrite(chipSelectPin, LOW);          // Activate the RFID reader
  pinMode(NRSTPD,OUTPUT);               // Set digital pin 10 , Not Reset and Power-down
    digitalWrite(NRSTPD, HIGH);

  MFRC522_Init();  
}

void loop()
{
  	uchar i,tmp;
	uchar status;
        uchar str[MAX_LEN];
        uchar RC_size;
        uchar blockAddr;	//选择操作的块地址0~63


		//寻卡,返回卡类型	
		status = MFRC522_Request(PICC_REQIDL, str);	
		if (status == MI_OK)
		{
                        Serial.println("Find out a card ");
			Serial.print(str[0],BIN);
                        Serial.print(" , ");
			Serial.print(str[1],BIN);
                        Serial.println(" ");
		}

		//防冲撞,返回卡的序列号 4字节
		status = MFRC522_Anticoll(str);
		memcpy(serNum, str, 5);
		if (status == MI_OK)
		{

                        Serial.println("The card's number is  : ");
			Serial.print(serNum[0],BIN);
                        Serial.print(" , ");
			Serial.print(serNum[1],BIN);
                        Serial.print(" , ");
			Serial.print(serNum[2],BIN);
                        Serial.print(" , ");
			Serial.print(serNum[3],BIN);
                        Serial.print(" , ");
			Serial.print(serNum[4],BIN);
                        Serial.println(" ");
		}

		//选卡,返回卡容量
		RC_size = MFRC522_SelectTag(serNum);
		if (RC_size != 0)

		{
                        Serial.print("The size of the card is  :   ");
			Serial.print(RC_size,DEC);
                        Serial.println(" K bits ");
		}
                
		//注册卡
		blockAddr = 7;		//数据块7		
		status = MFRC522_Auth(PICC_AUTHENT1A, blockAddr, sectorKeyA[blockAddr/4], serNum);	//认证
		if (status == MI_OK)
		{
			//写数据
			status = MFRC522_Write(blockAddr, sectorNewKeyA[blockAddr/4]);
                        Serial.print("set the new card password, and can modify the data of the Sector ");
                        Serial.print(blockAddr/4,DEC);
                        Serial.println(" : ");
			for (i=0; i<6; i++)
		        {
              		    Serial.print(sectorNewKeyA[blockAddr/4][i],HEX);
                            Serial.print(" , ");
		        }
                        Serial.println(" ");
                        blockAddr = blockAddr - 3 ; 
                        status = MFRC522_Write(blockAddr, writeData);
                        if(status == MI_OK)
                        {
                           Serial.println("You are B2CQSHOP VIP Member, The card has  $100 !");
                        }
		}

		//读卡
		blockAddr = 7;		//数据块7		
		status = MFRC522_Auth(PICC_AUTHENT1A, blockAddr, sectorNewKeyA[blockAddr/4], serNum);	//认证
		if (status == MI_OK)
		{
			//读数据
                        blockAddr = blockAddr - 3 ; 
                        status = MFRC522_Read(blockAddr, str);
			if (status == MI_OK)
			{
                                Serial.println("Read from the card ,the data is : ");
				for (i=0; i<16; i++)
				{
              			      Serial.print(str[i],DEC);
                                      Serial.print(" , ");
				}
                                Serial.println(" ");
			}
		}

                //消费	
		blockAddr = 7;		//数据块7		
		status = MFRC522_Auth(PICC_AUTHENT1A, blockAddr, sectorNewKeyA[blockAddr/4], serNum);	//认证
		if (status == MI_OK)
		{
			//读数据
                        blockAddr = blockAddr - 3 ;
			status = MFRC522_Read(blockAddr, str);
			if (status == MI_OK)
			{
                          if( str[15] < moneyConsume )
                          {
                              Serial.println(" The money is not enough !");
                          }
                          else
                          {
                              str[15] = str[15] - moneyConsume;
                              status = MFRC522_Write(blockAddr, str);
                              if(status == MI_OK)
                              {
                                 Serial.print("You pay $18 for items in B2CQSHOP.COM . Now, Your money balance is :   $");
              			 Serial.print(str[15],DEC);
                                 Serial.println(" ");
                              }
                          }
			}
		}

                //充值	
		blockAddr = 7;		//数据块7		
		status = MFRC522_Auth(PICC_AUTHENT1A, blockAddr, sectorNewKeyA[blockAddr/4], serNum);	//认证
		if (status == MI_OK)
		{
			//读数据
                        blockAddr = blockAddr - 3 ;
			status = MFRC522_Read(blockAddr, str);
			if (status == MI_OK)
			{
                          tmp = (int)(str[15] + moneyAdd) ;
                          //Serial.println(tmp,DEC);
                          if( tmp < (char)254 )
                          {
                              Serial.println(" The money of the card can not be more than 255 !");
                          }
                          else
                          {
                              str[15] = str[15] + moneyAdd ;
                              status = MFRC522_Write(blockAddr, str);
                              if(status == MI_OK)
                              {
                                 Serial.print("You add $10 to your card in B2CQSHOP.COM , Your money balance is :  $");
              			 Serial.print(str[15],DEC);
                                 Serial.println(" ");
                              }
                          }
			}
		}
                Serial.println(" ");
		MFRC522_Halt();			//命令卡片进入休眠状态              
          
}

/*
 * 函 数 名:Write_MFRC5200
 * 功能描述:向MFRC522的某一寄存器写一个字节数据
 * 输入参数:addr--寄存器地址;val--要写入的值
 * 返 回 值:无
 */
void Write_MFRC522(uchar addr, uchar val)
{
	digitalWrite(chipSelectPin, LOW);

	//地址格式:0XXXXXX0
	SPI.transfer((addr<<1)&0x7E);	
	SPI.transfer(val);
	
	digitalWrite(chipSelectPin, HIGH);
}


/*
 * 函 数 名:Read_MFRC522
 * 功能描述:从MFRC522的某一寄存器读一个字节数据
 * 输入参数:addr--寄存器地址
 * 返 回 值:返回读取到的一个字节数据
 */
uchar Read_MFRC522(uchar addr)
{
	uchar val;

	digitalWrite(chipSelectPin, LOW);

	//地址格式:1XXXXXX0
	SPI.transfer(((addr<<1)&0x7E) | 0x80);	
	val =SPI.transfer(0x00);
	
	digitalWrite(chipSelectPin, HIGH);
	
	return val;	
}

/*
 * 函 数 名:SetBitMask
 * 功能描述:置RC522寄存器位
 * 输入参数:reg--寄存器地址;mask--置位值
 * 返 回 值:无
 */
void SetBitMask(uchar reg, uchar mask)  
{
    uchar tmp;
    tmp = Read_MFRC522(reg);
    Write_MFRC522(reg, tmp | mask);  // set bit mask
}


/*
 * 函 数 名:ClearBitMask
 * 功能描述:清RC522寄存器位
 * 输入参数:reg--寄存器地址;mask--清位值
 * 返 回 值:无
 */
void ClearBitMask(uchar reg, uchar mask)  
{
    uchar tmp;
    tmp = Read_MFRC522(reg);
    Write_MFRC522(reg, tmp & (~mask));  // clear bit mask
} 


/*
 * 函 数 名:AntennaOn
 * 功能描述:开启天线,每次启动或关闭天险发射之间应至少有1ms的间隔
 * 输入参数:无
 * 返 回 值:无
 */
void AntennaOn(void)
{
	uchar temp;

	temp = Read_MFRC522(TxControlReg);
	if (!(temp & 0x03))
	{
		SetBitMask(TxControlReg, 0x03);
	}
}


/*
 * 函 数 名:AntennaOff
 * 功能描述:关闭天线,每次启动或关闭天险发射之间应至少有1ms的间隔
 * 输入参数:无
 * 返 回 值:无
 */
void AntennaOff(void)
{
	ClearBitMask(TxControlReg, 0x03);
}


/*
 * 函 数 名:ResetMFRC522
 * 功能描述:复位RC522
 * 输入参数:无
 * 返 回 值:无
 */
void MFRC522_Reset(void)
{
    Write_MFRC522(CommandReg, PCD_RESETPHASE);
}


/*
 * 函 数 名:InitMFRC522
 * 功能描述:初始化RC522
 * 输入参数:无
 * 返 回 值:无
 */
void MFRC522_Init(void)
{
	digitalWrite(NRSTPD,HIGH);

	MFRC522_Reset();
	 	
	//Timer: TPrescaler*TreloadVal/6.78MHz = 24ms
    Write_MFRC522(TModeReg, 0x8D);		//Tauto=1; f(Timer) = 6.78MHz/TPreScaler
    Write_MFRC522(TPrescalerReg, 0x3E);	//TModeReg[3..0] + TPrescalerReg
    Write_MFRC522(TReloadRegL, 30);           
    Write_MFRC522(TReloadRegH, 0);
	
	Write_MFRC522(TxAutoReg, 0x40);		//100%ASK
	Write_MFRC522(ModeReg, 0x3D);		//CRC初始值0x6363	???

	//ClearBitMask(Status2Reg, 0x08);		//MFCrypto1On=0
	//Write_MFRC522(RxSelReg, 0x86);		//RxWait = RxSelReg[5..0]
	//Write_MFRC522(RFCfgReg, 0x7F);   		//RxGain = 48dB

	AntennaOn();		//打开天线
}


/*
 * 函 数 名:MFRC522_Request
 * 功能描述:寻卡,读取卡类型号
 * 输入参数:reqMode--寻卡方式,
 *			 TagType--返回卡片类型
 *			 	0x4400 = Mifare_UltraLight
 *				0x0400 = Mifare_One(S50)
 *				0x0200 = Mifare_One(S70)
 *				0x0800 = Mifare_Pro(X)
 *				0x4403 = Mifare_DESFire
 * 返 回 值:成功返回MI_OK
 */
uchar MFRC522_Request(uchar reqMode, uchar *TagType)
{
	uchar status;  
	uint backBits;			//接收到的数据位数

	Write_MFRC522(BitFramingReg, 0x07);		//TxLastBists = BitFramingReg[2..0]	???
	
	TagType[0] = reqMode;
	status = MFRC522_ToCard(PCD_TRANSCEIVE, TagType, 1, TagType, &backBits);

	if ((status != MI_OK) || (backBits != 0x10))
	{    
		status = MI_ERR;
	}
   
	return status;
}


/*
 * 函 数 名:MFRC522_ToCard
 * 功能描述:RC522和ISO14443卡通讯
 * 输入参数:command--MF522命令字,
 *			 sendData--通过RC522发送到卡片的数据, 
 *			 sendLen--发送的数据长度		 
 *			 backData--接收到的卡片返回数据,
 *			 backLen--返回数据的位长度
 * 返 回 值:成功返回MI_OK
 */
uchar MFRC522_ToCard(uchar command, uchar *sendData, uchar sendLen, uchar *backData, uint *backLen)
{
    uchar status = MI_ERR;
    uchar irqEn = 0x00;
    uchar waitIRq = 0x00;
    uchar lastBits;
    uchar n;
    uint i;

    switch (command)
    {
        case PCD_AUTHENT:		//认证卡密
		{
			irqEn = 0x12;
			waitIRq = 0x10;
			break;
		}
		case PCD_TRANSCEIVE:	//发送FIFO中数据
		{
			irqEn = 0x77;
			waitIRq = 0x30;
			break;
		}
		default:
			break;
    }
   
    Write_MFRC522(CommIEnReg, irqEn|0x80);	//允许中断请求
    ClearBitMask(CommIrqReg, 0x80);			//清除所有中断请求位
    SetBitMask(FIFOLevelReg, 0x80);			//FlushBuffer=1, FIFO初始化
    
	Write_MFRC522(CommandReg, PCD_IDLE);	//NO action;取消当前命令	???

	//向FIFO中写入数据
    for (i=0; i<sendLen; i++)
    {   
		Write_MFRC522(FIFODataReg, sendData[i]);    
	}

	//执行命令
	Write_MFRC522(CommandReg, command);
    if (command == PCD_TRANSCEIVE)
    {    
		SetBitMask(BitFramingReg, 0x80);		//StartSend=1,transmission of data starts  
	}   
    
	//等待接收数据完成
	i = 2000;	//i根据时钟频率调整,操作M1卡最大等待时间25ms	???
    do 
    {
		//CommIrqReg[7..0]
		//Set1 TxIRq RxIRq IdleIRq HiAlerIRq LoAlertIRq ErrIRq TimerIRq
        n = Read_MFRC522(CommIrqReg);
        i--;
    }
    while ((i!=0) && !(n&0x01) && !(n&waitIRq));

    ClearBitMask(BitFramingReg, 0x80);			//StartSend=0
	
    if (i != 0)
    {    
        if(!(Read_MFRC522(ErrorReg) & 0x1B))	//BufferOvfl Collerr CRCErr ProtecolErr
        {
            status = MI_OK;
            if (n & irqEn & 0x01)
            {   
				status = MI_NOTAGERR;			//??   
			}

            if (command == PCD_TRANSCEIVE)
            {
               	n = Read_MFRC522(FIFOLevelReg);
              	lastBits = Read_MFRC522(ControlReg) & 0x07;
                if (lastBits)
                {   
					*backLen = (n-1)*8 + lastBits;   
				}
                else
                {   
					*backLen = n*8;   
				}

                if (n == 0)
                {   
					n = 1;    
				}
                if (n > MAX_LEN)
                {   
					n = MAX_LEN;   
				}
				
				//读取FIFO中接收到的数据
                for (i=0; i<n; i++)
                {   
					backData[i] = Read_MFRC522(FIFODataReg);    
				}
            }
        }
        else
        {   
			status = MI_ERR;  
		}
        
    }
	
    //SetBitMask(ControlReg,0x80);           //timer stops
    //Write_MFRC522(CommandReg, PCD_IDLE); 

    return status;
}


/*
 * 函 数 名:MFRC522_Anticoll
 * 功能描述:防冲突检测,读取选中卡片的卡序列号
 * 输入参数:serNum--返回4字节卡序列号,第5字节为校验字节
 * 返 回 值:成功返回MI_OK
 */
uchar MFRC522_Anticoll(uchar *serNum)
{
    uchar status;
    uchar i;
	uchar serNumCheck=0;
    uint unLen;
    

    //ClearBitMask(Status2Reg, 0x08);		//TempSensclear
    //ClearBitMask(CollReg,0x80);			//ValuesAfterColl
	Write_MFRC522(BitFramingReg, 0x00);		//TxLastBists = BitFramingReg[2..0]
 
    serNum[0] = PICC_ANTICOLL;
    serNum[1] = 0x20;
    status = MFRC522_ToCard(PCD_TRANSCEIVE, serNum, 2, serNum, &unLen);

    if (status == MI_OK)
	{
		//校验卡序列号
		for (i=0; i<4; i++)
		{   
		 	serNumCheck ^= serNum[i];
		}
		if (serNumCheck != serNum[i])
		{   
			status = MI_ERR;    
		}
    }

    //SetBitMask(CollReg, 0x80);		//ValuesAfterColl=1

    return status;
} 


/*
 * 函 数 名:CalulateCRC
 * 功能描述:用MF522计算CRC
 * 输入参数:pIndata--要读数CRC的数据,len--数据长度,pOutData--计算的CRC结果
 * 返 回 值:无
 */
void CalulateCRC(uchar *pIndata, uchar len, uchar *pOutData)
{
    uchar i, n;

    ClearBitMask(DivIrqReg, 0x04);			//CRCIrq = 0
    SetBitMask(FIFOLevelReg, 0x80);			//清FIFO指针
    //Write_MFRC522(CommandReg, PCD_IDLE);

	//向FIFO中写入数据	
    for (i=0; i<len; i++)
    {   
		Write_MFRC522(FIFODataReg, *(pIndata+i));   
	}
    Write_MFRC522(CommandReg, PCD_CALCCRC);

	//等待CRC计算完成
    i = 0xFF;
    do 
    {
        n = Read_MFRC522(DivIrqReg);
        i--;
    }
    while ((i!=0) && !(n&0x04));			//CRCIrq = 1

	//读取CRC计算结果
    pOutData[0] = Read_MFRC522(CRCResultRegL);
    pOutData[1] = Read_MFRC522(CRCResultRegM);
}


/*
 * 函 数 名:MFRC522_SelectTag
 * 功能描述:选卡,读取卡存储器容量
 * 输入参数:serNum--传入卡序列号
 * 返 回 值:成功返回卡容量
 */
uchar MFRC522_SelectTag(uchar *serNum)
{
    uchar i;
	uchar status;
	uchar size;
    uint recvBits;
    uchar buffer[9]; 

	//ClearBitMask(Status2Reg, 0x08);			//MFCrypto1On=0

    buffer[0] = PICC_SElECTTAG;
    buffer[1] = 0x70;
    for (i=0; i<5; i++)
    {
    	buffer[i+2] = *(serNum+i);
    }
	CalulateCRC(buffer, 7, &buffer[7]);		//??
    status = MFRC522_ToCard(PCD_TRANSCEIVE, buffer, 9, buffer, &recvBits);
    
    if ((status == MI_OK) && (recvBits == 0x18))
    {   
		size = buffer[0]; 
	}
    else
    {   
		size = 0;    
	}

    return size;
}


/*
 * 函 数 名:MFRC522_Auth
 * 功能描述:验证卡片密码
 * 输入参数:authMode--密码验证模式
                 0x60 = 验证A密钥
                 0x61 = 验证B密钥 
             BlockAddr--块地址
             Sectorkey--扇区密码
             serNum--卡片序列号,4字节
 * 返 回 值:成功返回MI_OK
 */
uchar MFRC522_Auth(uchar authMode, uchar BlockAddr, uchar *Sectorkey, uchar *serNum)
{
    uchar status;
    uint recvBits;
    uchar i;
	uchar buff[12]; 

	//验证指令+块地址+扇区密码+卡序列号
    buff[0] = authMode;
    buff[1] = BlockAddr;
    for (i=0; i<6; i++)
    {    
		buff[i+2] = *(Sectorkey+i);   
	}
    for (i=0; i<4; i++)
    {    
		buff[i+8] = *(serNum+i);   
	}
    status = MFRC522_ToCard(PCD_AUTHENT, buff, 12, buff, &recvBits);

    if ((status != MI_OK) || (!(Read_MFRC522(Status2Reg) & 0x08)))
    {   
		status = MI_ERR;   
	}
    
    return status;
}


/*
 * 函 数 名:MFRC522_Read
 * 功能描述:读块数据
 * 输入参数:blockAddr--块地址;recvData--读出的块数据
 * 返 回 值:成功返回MI_OK
 */
uchar MFRC522_Read(uchar blockAddr, uchar *recvData)
{
    uchar status;
    uint unLen;

    recvData[0] = PICC_READ;
    recvData[1] = blockAddr;
    CalulateCRC(recvData,2, &recvData[2]);
    status = MFRC522_ToCard(PCD_TRANSCEIVE, recvData, 4, recvData, &unLen);

    if ((status != MI_OK) || (unLen != 0x90))
    {
        status = MI_ERR;
    }
    
    return status;
}


/*
 * 函 数 名:MFRC522_Write
 * 功能描述:写块数据
 * 输入参数:blockAddr--块地址;writeData--向块写16字节数据
 * 返 回 值:成功返回MI_OK
 */
uchar MFRC522_Write(uchar blockAddr, uchar *writeData)
{
    uchar status;
    uint recvBits;
    uchar i;
	uchar buff[18]; 
    
    buff[0] = PICC_WRITE;
    buff[1] = blockAddr;
    CalulateCRC(buff, 2, &buff[2]);
    status = MFRC522_ToCard(PCD_TRANSCEIVE, buff, 4, buff, &recvBits);

    if ((status != MI_OK) || (recvBits != 4) || ((buff[0] & 0x0F) != 0x0A))
    {   
		status = MI_ERR;   
	}
        
    if (status == MI_OK)
    {
        for (i=0; i<16; i++)		//向FIFO写16Byte数据
        {    
        	buff[i] = *(writeData+i);   
        }
        CalulateCRC(buff, 16, &buff[16]);
        status = MFRC522_ToCard(PCD_TRANSCEIVE, buff, 18, buff, &recvBits);
        
		if ((status != MI_OK) || (recvBits != 4) || ((buff[0] & 0x0F) != 0x0A))
        {   
			status = MI_ERR;   
		}
    }
    
    return status;
}


/*
 * 函 数 名:MFRC522_Halt
 * 功能描述:命令卡片进入休眠状态
 * 输入参数:无
 * 返 回 值:无
 */
void MFRC522_Halt(void)
{
	uchar status;
    uint unLen;
    uchar buff[4]; 

    buff[0] = PICC_HALT;
    buff[1] = 0;
    CalulateCRC(buff, 2, &buff[2]);
 
    status = MFRC522_ToCard(PCD_TRANSCEIVE, buff, 4, buff,&unLen);
}

Считывает данные с 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

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

#include <SPI.h>
#include <RFID.h>

RFID rfid(53,5); 

void setup()
{ 
  Serial.begin(9600);
  SPI.begin(); 
  rfid.init();
  
}

void loop()
{
    if (rfid.isCard()) {
      
          Serial.println("IS CARD");
          
          if (rfid.readCardSerial()) {
            
                        Serial.println(" ");
                        Serial.println("El numero de serie de la tarjeta es  : ");
			Serial.print(rfid.serNum[0],DEC);
                        Serial.print(" , ");
			Serial.print(rfid.serNum[1],DEC);
                        Serial.print(" , ");
			Serial.print(rfid.serNum[2],DEC);
                        Serial.print(" , ");
			Serial.print(rfid.serNum[3],DEC);
                        Serial.print(" , ");
			Serial.print(rfid.serNum[4],DEC);
                        Serial.println(" ");
                        
                       
            
          }
          
    }
    
    rfid.halt();
}

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

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

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

RFID rfid(53,5);

 

 

Тима
Тима аватар
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
Serial.println(num, НОРМАЛЬНЫЙВИД);

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

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

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

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

int i;
long serial;
for (i=0; i<4; i++){
	serial += rfid.serNum[i]*pow(2,8*i);
}

ссылка в тему 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

 

 

 

 

 

 

 

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

#include <SoftwareSerial.h> 
SoftwareSerial mySerial(2, 3); //pin2 Rx, pin3 Tx  , только нужно заменить наоборот и поставить на ардуине RX-k-TX. a TX-k-RX. 
//в мониторе порта 14400 baud 

int CMD[64];
int comlen =0;
int out_flag =0;

void setup() 
{ 
Serial.begin(9600);
mySerial.listen();
Serial.println("Serial number will be displayed here if a card is detected by the module:\n"); 
// set the data rate for the SoftwareSerial port 
mySerial.begin(9600); 
delay(10);
mySerial.write(0x02); //Send the command to RFID, please refer to RFID manual 
} 
void loop() // run over and over 
{ 

      while (Serial.available()) 
      {
          int a = SerialReadHexDigit();
          //Serial.println(a);
          if(a>=0){
          CMD[comlen] = a;
          comlen++;
          }
          delay(10);
      }
      
      for(int i=0; i<comlen; i+=2){
          int c = mySerial.write( CMD[i]*16 + CMD[i+1]);
        }
      comlen =0;
      
      while (mySerial.available()) {
      byte C = mySerial.read();
      if (C<16) Serial.print("0");
      Serial.print(C ,HEX); //Display the Serial Number in HEX 
      Serial.print(" ");
      out_flag =1;
      }
     if (out_flag >0) {
       Serial.println();
       out_flag = 0;
     }
     
}



int SerialReadHexDigit()
{
    byte c = (byte) Serial.read();
    if (c >= '0' && c <= '9') {
        return c - '0';
    } else if (c >= 'a' && c <= 'f') {
        return c - 'a' + 10;
    } else if (c >= 'A' && c <= 'F') {
        return c - 'A' + 10;
    } else {
        return -1;   // getting here is bad: it means the character was invalid
    }
}

подключил

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

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

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

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

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

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

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

/*Подключаем библиотеки*/
#include <WProgram.h>
#include <Wire.h>
#include <DS1307.h>
#include <RFID.h>
#include <SPI.h>
#include <LiquidCrystal.h>
#define SS_PIN 2 
#define RST_PIN 1
RFID rfid(SS_PIN, RST_PIN); 
int buzzPin = 3;
    int serNum0;
    int serNum1;
    int serNum2;
    int serNum3;
    int serNum4;
/*Выводы дисплея*/
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
/*Инициализация*/
void setup(){
  Serial.begin(9600);
 lcd.begin(16, 2); //Дисплей 16Х2 
 SPI.begin(); 
 rfid.init();
 lcd.setCursor(3, 0); //Установить 3 символ 0 строки
 lcd.print("Wellcome..."); // выводим надпись заставки
 lcd.setCursor(2, 1); //Установить 5 символ 1 строки
 lcd.print("Arduino-Clock"); // выводим надпись заcтавки
 delay(5000); // удерживаем заставку 5 секунд
 lcd.clear(); // Очищаем дисплей

/*
 RTC.stop();
 RTC.set(DS1307_SEC,00); //Установить секунды
 RTC.set(DS1307_MIN,21); //Установить минуты
 RTC.set(DS1307_HR,04); //Установить часы
 RTC.set(DS1307_DOW,07); //Установить день недели
 RTC.set(DS1307_DATE,25); //Установить дату
 RTC.set(DS1307_MTH,8); //Установить месяц
 RTC.set(DS1307_YR,13); //Установить год
 RTC.start();
*/
}
void(* resetFunc) (void) = 0; //Сброс
void loop()
{
  if (rfid.isCard()) 
  {

        if (rfid.readCardSerial()) {
            if (rfid.serNum[0] != serNum0
                && rfid.serNum[1] != serNum1
                && rfid.serNum[2] != serNum2
                && rfid.serNum[3] != serNum3
                && rfid.serNum[4] != serNum4
            ) 
            {
                /* With a new cardnumber, show it. */
                //Serial.println(" ");
                //Serial.println("Card found");
                serNum0 = rfid.serNum[0];
                serNum1 = rfid.serNum[1];
                serNum2 = rfid.serNum[2];
                serNum3 = rfid.serNum[3];
                serNum4 = rfid.serNum[4];
              

               //* В порт ничего не выводим
                //Serial.println(" ");
           //Serial.println("Cardnumber:");
              //Serial.print("Dec: ");
		//Serial.print(rfid.serNum[0],DEC);
               // Serial.print(", ");
		//Serial.print(rfid.serNum[1],DEC);
               //Serial.print(", ");
		//Serial.print(rfid.serNum[2],DEC);
                //Serial.print(", ");
		//Serial.print(rfid.serNum[3],DEC);
               // Serial.print(", ");
		//Serial.print(rfid.serNum[4],DEC);
               // Serial.println(" ");
                    //*   
                //Serial.print("Hex: ");
		//Serial.print(rfid.serNum[0],HEX);
                //Serial.print(", ");
		//Serial.print(rfid.serNum[1],HEX);
                //Serial.print(", ");
		//Serial.print(rfid.serNum[2],HEX);
                //Serial.print(", ");
		//Serial.print(rfid.serNum[3],HEX);
                //Serial.print(", ");
		//Serial.print(rfid.serNum[4],HEX);
                //Serial.println(" ");

                /* Write the HEX code to the display */
                                
                lcd.setCursor(0, 0);
                lcd.print("CardInfo (DEC):");
                lcd.setCursor(0,1);
                lcd.print(rfid.serNum[0], DEC);
                
                lcd.print(rfid.serNum[1], DEC);
                
                lcd.print(rfid.serNum[2], DEC);
                
                lcd.print(rfid.serNum[3], DEC);
                
                lcd.print(rfid.serNum[4], DEC);
                //Буззер, срабатывает если карта считана...
                 analogWrite(3,20);
                delay(500);
                analogWrite(3,0);
                delay(5000);
                lcd.clear();
                resetFunc(); //Относится к сбросу инфы...
             } 
             else 
             {
               /* Выводим, частота карты не совпадает*/
               lcd.print("DETECT ERROR");
             }
          }
    }
    rfid.halt();
 lcd.setCursor(4, 0);
 lcd.print(RTC.get(DS1307_HR,true)); //read the hour and also update all the values by pushing in true
 lcd.print(":");
 lcd.print(RTC.get(DS1307_MIN,false));//read minutes without update (false)
 lcd.print(":");
 lcd.print(RTC.get(DS1307_SEC,false));//read seconds
 lcd.print(" "); // some space for a more happy life
 lcd.setCursor(0, 1);
 lcd.print(RTC.get(DS1307_DATE,false));//read date
 lcd.print("/");
 lcd.print(RTC.get(DS1307_MTH,false));//read month
 lcd.print("/");
 lcd.print(RTC.get(DS1307_YR,false)); //read year 
 lcd.print(" D:");
 lcd.print(RTC.get(DS1307_DOW,false));
}

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

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

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

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

// the sensor communicates using SPI, so include the library:
#include <SPI.h>
#include <RC522.h>

#define RC522_SS 53
#define RC522_NRST 8

RC522 MFRC522(RC522_SS,RC522_NRST);


//4 байта серийный номер карты, первые 5 байтов для контрольной суммы байт
uchar serNum[5];
//Сектор пароль, 16 секторов, каждый сектор 6Byte пароль
 uchar sectorKeyA[16][16] = {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
                             {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
                             //{0x19, 0x84, 0x07, 0x15, 0x76, 0x14},
                             {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
                            };
 
void setup() {                
	Serial.begin(9600);	// RFID reader SOUT pin connected to Serial RX pin at 2400bps 
	SPI.begin();
	MFRC522.begin();
}

void loop()
{
		uchar i,tmp;
		uchar status;
		uchar str[MAX_LEN];
		uchar RC_size;
		uchar blockAddr;	//Выбор операционного блока адресов от 0 до 63
		String mynum = "";
		//Найти карты, тип карты вернуться	
		if (MFRC522.isCard())
		{
			Serial.println("Card detected");
			Serial.print("0x");
			Serial.print(MFRC522.data[0],HEX);
			Serial.print(MFRC522.data[1],HEX);
			Serial.println(" ");
		}
		//Антивирус столкновения, вернуть серийный номер карты 4 байта
		if (MFRC522.readSerial())
		{
			Serial.println("The card's number is  : ");
			Serial.print(MFRC522.data[0],HEX);
			Serial.print(":");
			Serial.print(MFRC522.data[1],HEX);
			Serial.print(":");
			Serial.print(MFRC522.data[2],HEX);
			Serial.print(":");
			Serial.print(MFRC522.data[3],HEX);
			Serial.print(":");
			Serial.print(MFRC522.data[4],HEX);
			Serial.println(" ");
			Serial.print("dec: ");
			Serial.println(MFRC522.data[0]+MFRC522.data[1]*pow(2,8)+MFRC522.data[2]*pow(2,16)+MFRC522.data[3]*pow(2,24));
                        Serial.print("selected size:");
                        Serial.print(MFRC522.SelectTag(MFRC522.data));
                        Serial.println(" K bits");
			// Should really check all pairs, but for now we'll just use the first
			
			//int blockAddr = 2;
                        //uchar str[MAX_LEN];// = "Test 0000000000";
                        //Serial.print("Auth: ");
                        //Serial.println(MFRC522.Auth(PICC_AUTHENT1A,blockAddr,sectorKeyA[blockAddr/4],MFRC522.data));
                        //Serial.print("write key: ");
                        //Serial.println(MFRC522.WriteCard(blockAddr,sectorKeyA[blockAddr/4]));
                        //Serial.print("write data: ");
                        //Serial.println(MFRC522.WriteCard(blockAddr,str));
                        //Serial.print("Auth: ");
                        //Serial.println(MFRC522.Auth(PICC_AUTHENT1A,blockAddr,sectorKeyA[blockAddr/4],MFRC522.data));
                        //Serial.print("write key: ");
                        //Serial.println(MFRC522.WriteCard(blockAddr+3,sectorKeyA[blockAddr/4]));
                        //Serial.print("read card: ");
                        //Serial.println(MFRC522.ReadCard(blockAddr,str));
                        //Serial.println((char*)str);
                        //MFRC522.Halt();
                        //MFRC522.Reset();
                        delay(1000);
                        MFRC522.Halt();
		}
		//Serial.println(" ");
}

Чтение и запись толком не работает - после 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 пишет.

 

/*
 * MFRC522 - Library to use ARDUINO RFID MODULE KIT 13.56 MHZ WITH TAGS SPI W AND R BY COOQROBOT.
 * The library file MFRC522.h has a wealth of useful info. Please read it.
 * The functions are documented in MFRC522.cpp.
 *
 * Based on code Dr.Leong   ( WWW.B2CQSHOP.COM )
 * Created by Miguel Balboa (circuitito.com), Jan, 2012.
 * Rewritten by Søren Thing Andersen (access.thing.dk), fall of 2013 (Translation to English, refactored, comments, anti collision, cascade levels.)
 * Released into the public domain.
 *
 * Sample program showing how to read data from a PICC using a MFRC522 reader on the Arduino SPI interface.
 *----------------------------------------------------------------------------- empty_skull 
 * Aggiunti pin per arduino Mega
 * add pin configuration for arduino mega
 * http://mac86project.altervista.org/
 ----------------------------------------------------------------------------- Nicola Coppola
 * Pin layout should be as follows:
 * Signal     Pin              Pin               Pin
 *            Arduino Uno      Arduino Mega      MFRC522 board
 * ------------------------------------------------------------
 * Reset      9                5                 RST
 * SPI SS     10               53                SDA
 * SPI MOSI   11               52                MOSI
 * SPI MISO   12               51                MISO
 * SPI SCK    13               50                SCK
 *
 * The reader can be found on eBay for around 5 dollars. Search for "mf-rc522" on ebay.com. 
 */

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

#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);	// Create MFRC522 instance.

void setup() {
	Serial.begin(9600);	// Initialize serial communications with the PC
	SPI.begin();			// Init SPI bus
	mfrc522.PCD_Init();	// Init MFRC522 card
	Serial.println("Scan PICC to see UID and type...");
}

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

	// Select one of the cards
	if ( ! mfrc522.PICC_ReadCardSerial()) {
		return;
	}

	// Dump debug info about the card. PICC_HaltA() is automatically called.
	mfrc522.PICC_DumpToSerial(&(mfrc522.uid));
}

 

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 поездок).

 

 

 

/*
 * MFRC522 - Library to use ARDUINO RFID MODULE KIT 13.56 MHZ WITH TAGS SPI W AND R BY COOQROBOT.
 * The library file MFRC522.h has a wealth of useful info. Please read it.
 * The functions are documented in MFRC522.cpp.
 *
 * Based on code Dr.Leong   ( WWW.B2CQSHOP.COM )
 * Created by Miguel Balboa (circuitito.com), Jan, 2012.
 * Rewritten by Søren Thing Andersen (access.thing.dk), fall of 2013 (Translation to English, refactored, comments, anti collision, cascade levels.)
 * 
 * Released into the public domain.
 *
 * This sample shows how to setup a block on a MIFARE Classic PICC to be in "Value Block" mode.
 * In Value Block mode the operations Increment/Decrement/Restore and Transfer can be used.
 * 
 ----------------------------------------------------------------------------- empty_skull 
 
 - Aggiunti pin per arduino Mega
 - Scritto semplice codice per la scrittura e lettura 
 
 - add pin configuration for arduino mega
 - write simple read/write Code for new entry user
 
 http://mac86project.altervista.org/
 
 ----------------------------------------------------------------------------- Nicola Coppola
 * Pin layout should be as follows:
 * Signal     Pin              Pin               Pin
 *            Arduino Uno      Arduino Mega      MFRC522 board
 * ------------------------------------------------------------
 * Reset      9                5                 RST
 * SPI SS     10               53                SDA
 * SPI MOSI   11               52                MOSI
 * SPI MISO   12               51                MISO
 * SPI SCK    13               50                SCK
 *
 * The reader can be found on eBay for around 5 dollars. Search for "mf-rc522" on ebay.com. 
 */

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

#define SS_PIN 53
#define RST_PIN 5
MFRC522 mfrc522(SS_PIN, RST_PIN);        // Create MFRC522 instance.

void setup() {
        Serial.begin(9600);        // Initialize serial communications with the PC
        SPI.begin();                // Init SPI bus
        mfrc522.PCD_Init();        // Init MFRC522 card
        //Serial.println("Scan a MIFARE Classic PICC to demonstrate Value Blocks.");
}

void loop() {
        
        // Prepare key - all keys are set to FFFFFFFFFFFFh at chip delivery from the factory.
        MFRC522::MIFARE_Key key;
        for (byte i = 0; i < 6; i++) {
                key.keyByte[i] = 0xFF;
        }
        // Look for new cards
        if ( ! mfrc522.PICC_IsNewCardPresent()) {
                return;
        }

        // Select one of the cards
        if ( ! mfrc522.PICC_ReadCardSerial()) {
                return;
        }
        // Now a card is selected. The UID and SAK is in mfrc522.uid.
        
        // Dump UID
        Serial.print("Card UID:");
        for (byte i = 0; i < mfrc522.uid.size; i++) {
                Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
                Serial.print(mfrc522.uid.uidByte[i], HEX);
        } 
        Serial.println();

        // Dump PICC type
        byte piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
        Serial.print("PICC type: ");
        Serial.println(mfrc522.PICC_GetTypeName(piccType));
        if (        piccType != MFRC522::PICC_TYPE_MIFARE_MINI 
                &&        piccType != MFRC522::PICC_TYPE_MIFARE_1K
                &&        piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
                //Serial.println("This sample only works with MIFARE Classic cards.");
                return;
        }
               
        // In this sample we use the second sector (ie block 4-7). the first sector is = 0
        // scegliere settore di lettura da 0 = primo settore 
        byte sector         = 1;
        // block sector 0-3(sector0) 4-7(sector1) 8-11(sector2)
        // blocchi di scrittura da 0-3(sector0) 4-7(sector1) 8-11(sector2)
        byte valueBlockA    = 4;
        byte valueBlockB    = 5;
        byte valueBlockC    = 6;
        byte trailerBlock   = 7;
        byte status;
        // Authenticate using key A.
        // avvio l'autentificazione A
        //Serial.println("Authenticating using key A...");
        status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid));
        if (status != MFRC522::STATUS_OK) {
                Serial.print("PCD_Authenticate() failed: ");
                Serial.println(mfrc522.GetStatusCodeName(status));
                return;
        }
        // Authenticate using key B.
        // avvio l'autentificazione B
        //Serial.println("Authenticating again using key B...");
        status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_B, trailerBlock, &key, &(mfrc522.uid));
        if (status != MFRC522::STATUS_OK) {
                Serial.print("PCD_Authenticate() failed: ");
                Serial.println(mfrc522.GetStatusCodeName(status));
                return;
        }
        
        // Writing new value block A
        // Scrivo i valori per il settore A
        Serial.println("Writing new value block A(4) : the first of the sector TWO ");
                byte value1Block[] = { 1,2,3,4,  5,6,7,8, 9,10,255,12,  13,14,15,16,   valueBlockA,~valueBlockA,valueBlockA,~valueBlockA };
                status = mfrc522.MIFARE_Write(valueBlockA, value1Block, 16);
                if (status != MFRC522::STATUS_OK) {
                        Serial.print("MIFARE_Write() failed: ");
                        Serial.println(mfrc522.GetStatusCodeName(status));
                }
        /*
        
        // Writing new value block B
        // Scrivo i valori per il settore B
        Serial.println("Writing new value block B");
                byte value2Block[] = { 255,255,255,255,  0,0,0,0, 0,0,0,0,  255,255,255,255,   valueBlockB,~valueBlockB,valueBlockB,~valueBlockB };
                status = mfrc522.MIFARE_Write(valueBlockB, value2Block, 16);
                if (status != MFRC522::STATUS_OK) {
                        Serial.print("MIFARE_Write() failed: ");
                        Serial.println(mfrc522.GetStatusCodeName(status));
                }
        
        // Writing new value block D
        // Scrivo i valori per il settore C
        Serial.println("Writing new value block C");
                byte value3Block[] = { 255,255,255,255,  0,0,0,0, 0,0,0,0,  255,255,255,255,   valueBlockC,~valueBlockC,valueBlockC,~valueBlockC };
                status = mfrc522.MIFARE_Write(valueBlockC, value3Block, 16);
                if (status != MFRC522::STATUS_OK) {
                        Serial.print("MIFARE_Write() failed: ");
                        Serial.println(mfrc522.GetStatusCodeName(status));
                }
                
        */
        
        
        Serial.println("Read block A(4) : the first of the sector TWO");        
        byte buffer[18];
        byte size = sizeof(buffer);
        // change this: valueBlockA , for read anather block
        // cambiate valueBlockA per leggere un altro blocco
        status = mfrc522.MIFARE_Read(valueBlockA, buffer, &size);
        Serial.print("Settore : 0 Valore :");
        Serial.println(buffer[0]);
        Serial.print("Settore : 1 Valore :");
        Serial.println(buffer[1]);
        Serial.print("Settore : 2 Valore :");
        Serial.println(buffer[2]);
        Serial.print("Settore : 3 Valore :");
        Serial.println(buffer[3]);
        Serial.print("Settore : 4 Valore :");
        Serial.println(buffer[4]);
        Serial.print("Settore : 5 Valore :");
        Serial.println(buffer[5]);
        Serial.print("Settore : 6 Valore :");
        Serial.println(buffer[6]);
        Serial.print("Settore : 7 Valore :");
        Serial.println(buffer[7]);
        Serial.print("Settore : 8 Valore :");
        Serial.println(buffer[8]);
        Serial.print("Settore : 9 Valore :");
        Serial.println(buffer[9]);
        Serial.print("Settore :10 Valore :");
        Serial.println(buffer[10]);
        Serial.print("Settore :11 Valore :");
        Serial.println(buffer[11]);
        Serial.print("Settore :12 Valore :");
        Serial.println(buffer[12]);
        Serial.print("Settore :13 Valore :");
        Serial.println(buffer[13]);
        Serial.print("Settore :14 Valore :");
        Serial.println(buffer[14]);
        Serial.print("Settore :15 Valore :");
        Serial.println(buffer[15]);
        
        
        
        //byte value1Block[] = { 1,2,3,4,  5,6,7,8, 9,10,255,12,  13,14,15,16,   valueBlockA,~valueBlockA,valueBlockA,~valueBlockA };
        if ( 
        buffer[0]  == 1   &&
        buffer[1]  == 2   && 
        buffer[2]  == 3   && 
        buffer[3]  == 4   &&
        buffer[4]  == 5   &&
        buffer[5]  == 6   &&
        buffer[6]  == 7   &&
        buffer[7]  == 8   &&
        buffer[8]  == 9   &&
        buffer[9]  == 10  &&
        buffer[10] == 255 &&
        buffer[11] == 12  &&
        buffer[12] == 13  &&
        buffer[13] == 14  &&
        buffer[14] == 15  &&
        buffer[15] == 16 
        ){
        
        // sel a scrittura è uguale alla lettura allora e stato un successo !!   
        Serial.println("Read block A(4) : the first of the sector TWO : success");  
        Serial.println(":-)");  
          
        }else{
        
         //  scrittura Fallita
        Serial.println("Read block A(4) : the first of the sector TWO : no match - write don't work fine ");
        Serial.println(":-( ");  
        
        }
        
        
        // risponde successo
        //Serial.println(mfrc522.GetStatusCodeName(status));
        
        // Dump the result
        //mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector);
        
        // Halt PICC
        mfrc522.PICC_HaltA();

        // Stop encryption on PCD
        mfrc522.PCD_StopCrypto1();
        
        
}

 

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 пине не мигает,  данные в порт не приходят никакие..

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

 

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

/*
 * MFRC522 - Library to use ARDUINO RFID MODULE KIT 13.56 MHZ WITH TAGS SPI W AND R BY COOQROBOT.
 * The library file MFRC522.h has a wealth of useful info. Please read it.
 * The functions are documented in MFRC522.cpp.
 *
 * Based on code Dr.Leong   ( WWW.B2CQSHOP.COM )
 * Created by Miguel Balboa (circuitito.com), Jan, 2012.
 * Rewritten by Søren Thing Andersen (access.thing.dk), fall of 2013 (Translation to English, refactored, comments, anti collision, cascade levels.)
 * 
 * Released into the public domain.
 *
 * This sample shows how to setup a block on a MIFARE Classic PICC to be in "Value Block" mode.
 * In Value Block mode the operations Increment/Decrement/Restore and Transfer can be used.
 * 
 ----------------------------------------------------------------------------- empty_skull 
 
 - Aggiunti pin per arduino Mega
 - Scritto semplice codice per la scrittura e lettura 
 
 - add pin configuration for arduino mega
 - write simple read/write Code for new entry user
 
 http://mac86project.altervista.org/
 
 ----------------------------------------------------------------------------- Nicola Coppola
 * Pin layout should be as follows:
 * Signal     Pin              Pin               Pin
 *            Arduino Uno      Arduino Mega      MFRC522 board
 * ------------------------------------------------------------
 * Reset      9                5                 RST
 * SPI SS     10               53                SDA
 * SPI MOSI   11               52                MOSI
 * SPI MISO   12               51                MISO
 * SPI SCK    13               50                SCK
 *
 * The reader can be found on eBay for around 5 dollars. Search for "mf-rc522" on ebay.com. 
 */

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

#define SS_PIN 53
#define RST_PIN 5
MFRC522 mfrc522(SS_PIN, RST_PIN);        // Create MFRC522 instance.

void setup() {
        Serial.begin(9600);        // Initialize serial communications with the PC
        SPI.begin();                // Init SPI bus
        mfrc522.PCD_Init();        // Init MFRC522 card
        //Serial.println("Scan a MIFARE Classic PICC to demonstrate Value Blocks.");
}

void loop() {
        
        // Prepare key - all keys are set to FFFFFFFFFFFFh at chip delivery from the factory.
        MFRC522::MIFARE_Key key;
        for (byte i = 0; i < 6; i++) {
                key.keyByte[i] = 0xFF;
        }
        // Look for new cards
        if ( ! mfrc522.PICC_IsNewCardPresent()) {
                return;
        }

        // Select one of the cards
        if ( ! mfrc522.PICC_ReadCardSerial()) {
                return;
        }
        // Now a card is selected. The UID and SAK is in mfrc522.uid.
        
        // Dump UID
        Serial.print("Card UID:");
        for (byte i = 0; i < mfrc522.uid.size; i++) {
                Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
                Serial.print(mfrc522.uid.uidByte[i], HEX);
        } 
        Serial.println();

        // Dump PICC type
        byte piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
        Serial.print("PICC type: ");
        Serial.println(mfrc522.PICC_GetTypeName(piccType));
        if (        piccType != MFRC522::PICC_TYPE_MIFARE_MINI 
                &&        piccType != MFRC522::PICC_TYPE_MIFARE_1K
                &&        piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
                //Serial.println("This sample only works with MIFARE Classic cards.");
                return;
        }
               
        // In this sample we use the second sector (ie block 4-7). the first sector is = 0
        // scegliere settore di lettura da 0 = primo settore 
        byte sector         = 1;
        // block sector 0-3(sector0) 4-7(sector1) 8-11(sector2)
        // blocchi di scrittura da 0-3(sector0) 4-7(sector1) 8-11(sector2)
        byte valueBlockA    = 4;
        byte valueBlockB    = 5;
        byte valueBlockC    = 6;
        byte trailerBlock   = 7;
        byte status;
        // Authenticate using key A.
        // avvio l'autentificazione A
        //Serial.println("Authenticating using key A...");
        status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid));
        if (status != MFRC522::STATUS_OK) {
                Serial.print("PCD_Authenticate() failed: ");
                Serial.println(mfrc522.GetStatusCodeName(status));
                return;
        }
        // Authenticate using key B.
        // avvio l'autentificazione B
        //Serial.println("Authenticating again using key B...");
        status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_B, trailerBlock, &key, &(mfrc522.uid));
        if (status != MFRC522::STATUS_OK) {
                Serial.print("PCD_Authenticate() failed: ");
                Serial.println(mfrc522.GetStatusCodeName(status));
                return;
        }
        
        // Writing new value block A
        // Scrivo i valori per il settore A
        Serial.println("Writing new value block A(4) : the first of the sector TWO ");
                byte value1Block[] = { 1,2,3,4,  5,6,7,8, 9,10,255,12,  13,14,15,16,   valueBlockA,~valueBlockA,valueBlockA,~valueBlockA };
                status = mfrc522.MIFARE_Write(valueBlockA, value1Block, 16);
                if (status != MFRC522::STATUS_OK) {
                        Serial.print("MIFARE_Write() failed: ");
                        Serial.println(mfrc522.GetStatusCodeName(status));
                }
        /*
        
        // Writing new value block B
        // Scrivo i valori per il settore B
        Serial.println("Writing new value block B");
                byte value2Block[] = { 255,255,255,255,  0,0,0,0, 0,0,0,0,  255,255,255,255,   valueBlockB,~valueBlockB,valueBlockB,~valueBlockB };
                status = mfrc522.MIFARE_Write(valueBlockB, value2Block, 16);
                if (status != MFRC522::STATUS_OK) {
                        Serial.print("MIFARE_Write() failed: ");
                        Serial.println(mfrc522.GetStatusCodeName(status));
                }
        
        // Writing new value block D
        // Scrivo i valori per il settore C
        Serial.println("Writing new value block C");
                byte value3Block[] = { 255,255,255,255,  0,0,0,0, 0,0,0,0,  255,255,255,255,   valueBlockC,~valueBlockC,valueBlockC,~valueBlockC };
                status = mfrc522.MIFARE_Write(valueBlockC, value3Block, 16);
                if (status != MFRC522::STATUS_OK) {
                        Serial.print("MIFARE_Write() failed: ");
                        Serial.println(mfrc522.GetStatusCodeName(status));
                }
                
        */
        
        
        Serial.println("Read block A(4) : the first of the sector TWO");        
        byte buffer[18];
        byte size = sizeof(buffer);
        // change this: valueBlockA , for read anather block
        // cambiate valueBlockA per leggere un altro blocco
        status = mfrc522.MIFARE_Read(valueBlockA, buffer, &size);
        Serial.print("Settore : 0 Valore :");
        Serial.println(buffer[0]);
        Serial.print("Settore : 1 Valore :");
        Serial.println(buffer[1]);
        Serial.print("Settore : 2 Valore :");
        Serial.println(buffer[2]);
        Serial.print("Settore : 3 Valore :");
        Serial.println(buffer[3]);
        Serial.print("Settore : 4 Valore :");
        Serial.println(buffer[4]);
        Serial.print("Settore : 5 Valore :");
        Serial.println(buffer[5]);
        Serial.print("Settore : 6 Valore :");
        Serial.println(buffer[6]);
        Serial.print("Settore : 7 Valore :");
        Serial.println(buffer[7]);
        Serial.print("Settore : 8 Valore :");
        Serial.println(buffer[8]);
        Serial.print("Settore : 9 Valore :");
        Serial.println(buffer[9]);
        Serial.print("Settore :10 Valore :");
        Serial.println(buffer[10]);
        Serial.print("Settore :11 Valore :");
        Serial.println(buffer[11]);
        Serial.print("Settore :12 Valore :");
        Serial.println(buffer[12]);
        Serial.print("Settore :13 Valore :");
        Serial.println(buffer[13]);
        Serial.print("Settore :14 Valore :");
        Serial.println(buffer[14]);
        Serial.print("Settore :15 Valore :");
        Serial.println(buffer[15]);
        
        
        
        //byte value1Block[] = { 1,2,3,4,  5,6,7,8, 9,10,255,12,  13,14,15,16,   valueBlockA,~valueBlockA,valueBlockA,~valueBlockA };
        if ( 
        buffer[0]  == 1   &&
        buffer[1]  == 2   && 
        buffer[2]  == 3   && 
        buffer[3]  == 4   &&
        buffer[4]  == 5   &&
        buffer[5]  == 6   &&
        buffer[6]  == 7   &&
        buffer[7]  == 8   &&
        buffer[8]  == 9   &&
        buffer[9]  == 10  &&
        buffer[10] == 255 &&
        buffer[11] == 12  &&
        buffer[12] == 13  &&
        buffer[13] == 14  &&
        buffer[14] == 15  &&
        buffer[15] == 16 
        ){
        
        // sel a scrittura è uguale alla lettura allora e stato un successo !!   
        Serial.println("Read block A(4) : the first of the sector TWO : success");  
        Serial.println(":-)");  
          
        }else{
        
         //  scrittura Fallita
        Serial.println("Read block A(4) : the first of the sector TWO : no match - write don't work fine ");
        Serial.println(":-( ");  
        
        }
        
        
        // risponde successo
        //Serial.println(mfrc522.GetStatusCodeName(status));
        
        // Dump the result
        //mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector);
        
        // Halt PICC
        mfrc522.PICC_HaltA();

        // Stop encryption on PCD
        mfrc522.PCD_StopCrypto1();
        
        
}

 

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

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

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

 

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