نمایش نتایج: از 1 به 7 از 7
Like Tree7 لایک
  • 4 Post By magmagmary
  • 1 Post By SAADATMAND
  • 1 Post By mr.ansaripour
  • 1 Post By mr.ansaripour

موضوع: RFID logger ( ارتباط سریال بین دو ماژول SPI )

  1. #1
    مدیر گروه
    تاریخ عضویت
    Nov 2013
    محل سکونت
    ایران
    نوشته ها
    3,919

    RFID logger ( ارتباط سریال بین دو ماژول SPI )

    در ساخت این پروژه اولین مشکل وجود دو deviceبا ارتباط spi می باشد .به نظر می رسد که شاید نتوان هر دو این قطعه ها را به یک arduino اتصال داد .ولی با کمک یک تغییر نرم افزاری میتوان این اشکال سخت افزاری را حل نمود .به شکل زیر دقت کنید:
    2.jpg
    در حقیقت میتوان برای هر chip select یک پایه دلخواه دیجیتال آزاد را انتخاب نمود .و در بحث نرم افزاری همان طور که خواهیم دید تغییرات مورد نظررا اعمال کنیم .یکی از نتایج بسیار مهم در این پروژه این است که میتوان چندین SPI را به یک ARDUINO متصل نمود.
    در این پروژه هدف این است که از RFID اطلاعات را خوانده و آن ها را به یک SD CARD بفرستد .
    اتصالات سخت افزاری آن در شکل زیر مشاهده می شود .

    rfid-sd-card_bb.jpg
    در مورد مباحث نرم افزاری در این پروژه روند جدیدی برای برنامه نویسی ارائه می شود.همانطور که می دانیم در استفاده از قطعات جدید باید 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);
    
    }
    فایل های پیوست شده فایل های پیوست شده
    • نوع فایل: zip MFRC522.zip (31.7 کیلو بایت, 115 مشاهده)
    ویرایش توسط magmagmary : 12-01-2013 در ساعت 01:00 PM

  2. #2
    Member
    تاریخ عضویت
    Sep 2013
    نوشته ها
    78
    واي خداي من . اينقدر سخت نوشتيد و اينقدر مطالب سخت كه ياد كه نگرفتم هيچي سوال خودمم يادم رفت .

  3. #3
    Member
    تاریخ عضویت
    Sep 2013
    نوشته ها
    78
    ببخشيد بنده فكر كنم مشكلم رو درست نگفتم
    من يك پروژه دارم كه وقتي اس ام اس مي فرسته درست كار مي كنه خروجي در موبايلم مي آيد و رله ايي كه دارم فرمان مي گيره و سنسور جريان هم درست جواب مي ده و همچي خوب و خوش هستش . از طرفي يك پروژه ديگري روي آن كار مي كردم اين بود كه با sd كارد هم جواب گرفتم تقريبا كاري كه شما كرديد در پروژه ايي كه زحمت كشيديد من هم از توابع flush استفاده كردم و مشكل حل شد
    حالا مشكل از آنجايي شروع شد (هموني كه جايزه داره ) وقتي مي خوام از هر دو پروژه با هم استفاده كنم يعني يك برد uno هست و مي خوام پيامهايي كه به موبايلم مي رود را توي sd card هم باشه ولي جواب نمي ده وقتي sd را جدا مي كنم سيمهاشو و كدهاي آنرا هم غير فعال مي كنم كار مي كنه (به تنهايي ) و قتي هم كه بصورت جداگانه سيمها و كدهاي gsm را جدا مي كنم آن يكي درست كار مي كنه
    فكر كنم sd.h با wire.h تداخل دارن اين سوال هم به شكل ديگري پرسيدم ولي جواب نداديد و اين سوالي است كه خارجي ها هم توش موندند .
    با تشكر كه سرتان را درد آوردم .

  4. #4
    Member
    تاریخ عضویت
    Sep 2013
    نوشته ها
    78
    با سلام
    بنده جواب گرفتم البته برام خيلي گرون تمام شد و آن زمان بود بله مشكل حل شد توضيح اينكه بايستي از مدار مگا استفاده مي كردم بجاي uno توصيه به همه آنهايي كه مي خوان شروع كنن اينكه uno نخريد mega بخريد چرا كه بعدا مي فهميد كه حافظه براي مدارهايي كه sd مي خواهيد بعدا استفاده كنيد كم مي آريد و مثل من بعد از يك ماه و كلي تحقيق و سعي و خطا و تست كردن به جوابي كه راحت بنده نوشتم مي رسيد .
    با تشكر
    لایک کردن

  5. #5
    Member
    تاریخ عضویت
    Feb 2016
    نوشته ها
    54
    سلام ببخشید بنده یه ماژول TFT 2.2 اینچ همراه با یک SC-card که هردو روی هم در یک ماژول اند دارم و فعلا تونستم نمایشگرشو راه بندازم البته با ولتاژی که از منبع تغذیه به اندازه 5 ولت به برد UNO دادم ولی نمی دونم همزمان چطوری می تونم هم از کارت حافظه اش استفاده کنم و ضمنا مثلا بتونم مقدار چند متغیر رو که از سنسورهای مختلف گرفتم بتونم در آنها ثبت کنم و ذخیره کنم و ضمنا نمایش هم بدم ؟ کسی کمکی از دستش ساختس ممنونم
    لایک کردن

  6. #6
    Senior Member
    تاریخ عضویت
    Dec 2013
    محل سکونت
    ایران - شیراز
    نوشته ها
    213
    این ماژول تو سطح منطقی 3.3 ولت کار می کنه ولی Uno تو سطح منتطقی 5 ولت کار می کنه پس شما مستقیم نمی تونید به برد Uno وصلش کنید باید از level shifters استفاده کنید.
    https://forum.arduino.cc/index.php?topic=181679.90

  7. #7
    Member
    تاریخ عضویت
    Feb 2016
    نوشته ها
    54
    آقا من با 2 مقاومت سری و ولتاژ خروجی گرفتن از بین آنها و اتصال آن به rx دیجیتال باز هم نتونستم راهش بندازم ولی با دادن ولتاژ منبع تغذیه 5 ولتی نمایشگرش راه افتاد شاید به خاطر جریان بیشتر منبع تغذیه بوده ؟
    لایک کردن

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •  

SEO by vBSEO