در ساخت این پروژه اولین مشکل وجود دو deviceبا ارتباط spi می باشد .به نظر می رسد که شاید نتوان هر دو این قطعه ها را به یک arduino اتصال داد .ولی با کمک یک تغییر نرم افزاری میتوان این اشکال سخت افزاری را حل نمود .به شکل زیر دقت کنید:
در حقیقت میتوان برای هر chip select یک پایه دلخواه دیجیتال آزاد را انتخاب نمود .و در بحث نرم افزاری همان طور که خواهیم دید تغییرات مورد نظررا اعمال کنیم .یکی از نتایج بسیار مهم در این پروژه این است که میتوان چندین SPI را به یک ARDUINO متصل نمود.
در این پروژه هدف این است که از RFID اطلاعات را خوانده و آن ها را به یک SD CARD بفرستد .
اتصالات سخت افزاری آن در شکل زیر مشاهده می شود .
در مورد مباحث نرم افزاری در این پروژه روند جدیدی برای برنامه نویسی ارائه می شود.همانطور که می دانیم در استفاده از قطعات جدید باید LIBRARARY مخصوص آن قطعه را اضافه کنیم . LIBRARARY مربوط به RFID را اضافه می کنیم .و اسم آن را به MFRC522 تغییر میدهیم .وارد این کتابخانه می شویم .فایلی با پسوند CCP را انتخاب می کنیم .در این فایل تابع هایی را که در طول برنامه های مختلف استفاده می کنیم تعریف شده اند.و تغییر این تابع ها به هر صورت دلخواه برای ما میسر خوهد بود .
در این کتابخانه تابع MFRC522::PICC_GetUID وجود دارد .از این تابع در روند برنامه نویسی در محیط SKETCH استفاده شده است . ولی فرم برنامه نویسی آن مناسب این سطح از پروژه نبود لذا آن را تغییر دادیم .فرم تغییر یافته آن در زیر مشاهده می شود .
کد:
char* MFRC522::PICC_GetUID(Uid *uid )///< Pointer to Uid struct returned from a successful PICC_Select().
{
MIFARE_Key key;
char Code[15];
int j=-1;
int num=0;
int index=0;
for (byte i = 0; i < uid->size; i++) {
for(byte c=0 ;c<3 ;c++){
j++;
Code[j]='0';
}
index=j;
num=uid->uidByte[i];
while(num>10){
Code[index]=(num%10)+48;
index--;
num=num/10;
}
Code[index]=num+48;
}
Code[index+1]='\0';
PICC_HaltA(); // Already done if it was a MIFARE Classic PICC.
return Code;
} // End PICC_GetUID()
در تایع اولیه آن خروجی void بود ولی در تابع جدید تعریف شده خروجی از نوع آرایه کاراکتری است .در خود کتابخانه فایل با پسوند h را انتخاب میکنیم و خروجی تابع مذکور را به char* تغییر میدهیم .
هدف کلی این تغییر این بود که وقتی داده های rfid را بایت بایت از کارت خواندیم آن ها را به صورت کاراکتر رشته ای تبدیل کنیم
در قسمت زیر کد اصلی پروژه دیده می شود. برای درک بهتر این پروژه پیشنهاد میشود که اول خود rfid را به تنهایی با مثال های موجود در خود arduino پروگرم کنید .
File > example > mfrc522 >dumpinfo
کد اصلی پروژه:
کد:
#include <SD.h>
#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 9
#define RST_PIN 3
MFRC522 mfrc522(SS_PIN, RST_PIN);
void setup()
{
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
SPI.begin(); // Init SPI bus
mfrc522.PCD_Init();
Serial.print("Initializing SD card...");
// On the Ethernet Shield, CS is pin 4. It's set as an output by default.
// Note that even if it's not used as the CS pin, the hardware SS pin
// (10 on most Arduino boards, 53 on the Mega) must be left as an output
// or the SD library functions will not work.
if (!SD.begin(10)) {
Serial.println("initialization failed!");
return;
}
Serial.println("initialization done.");
}
void loop()
{
rfidData();
}
void rfidData(){
char Code[100];
if ( ! mfrc522.PICC_IsNewCardPresent()) {
return;
}
if ( mfrc522.PICC_ReadCardSerial()) {
strcpy(Code ,mfrc522.PICC_GetUID(&(mfrc522.uid)));
// Serial.println(Code);
writeFile(Code);
}
}
void writeFile(char* data){
File myFile;
Serial.print("Saving data: ");
myFile = SD.open("data2.txt", FILE_WRITE);
// Serial.println(data);
myFile.println(data);
delay(50);
myFile.close();
Serial.println(data);
}