آردوینو Arduinoمطالب آموزشی

راه اندازی SD کارت با آردوینو

اگر لازم باشد تا در پروژه ی خود از ویدیو عکس یا ذخیره ی اطلاعات استفاده کنید. نیاز به حافظه خارجی دارید بسیاری از میکروکنترلر ها دارای حافظه بسایر محدودی هستند به عنوان مثال ATmega2560 فقط دارای 4 کیلوبایت EEPROM داخلی می باشد و استفاده از 256 کیلوبایت حافظه فلش میکرو سختی ها خاص خود را دارد مثلا شما باید مراقب باشید تا اطاعات شما روی برنامه نوشته نشود! اگر به ذخیره اطلاعات یا کار با گرافیک نیاز دارید به چندین مگابایت فضا نیاز دارید راحت ترین و دسترس ترین گزینه موجود استفاده از کارت های SD یا microSD است.

راه اندازی SD کارت با آردوینو
راه اندازی SD کارت با آردوینو

نکاتی در مورد استفاده از SD کارت:

نکته اول SD کارت نسبت به تغذیه حساس هستند ولتاژ تغذیه SD کارت ها 3.3 ولت است و  در هنگام نوشتن اطلاعات روی SD کارت ها می توانند تا 100 میلی آمپر و حتی بیشتر جریان بکشند پس باید از منبع تغذیه مناسب برای این کار استفاده کنید. نکته دیگر این است که PIN های اینترفیس میکرو SD های جدید خیلی حساس هستند و بر روی لبه تریگر می شوند برای داشتن یک ارتباط پر سرعت به انتقال مربعی دقیق نیاز دارید بنابراین نباید از تقسیم مقاومتی برای کاهش ولتاژ از 5 به 3.3 ولت استفاده شود و اتصالات بین آردوینو و SD کارت هرچه کوتاه تر باشد بهتر است. برای تغییر سطح 5 به 3.3 ولت هم باید از IC های level shifter استفاده کنید. به طور مثال IC های HEF4050 ، 74LVX245  و یا74AHC125

نکته ی دوم دو روش برای ارتباط با SD کارت وجود دارد حالت SPI و حالت SDIO، حالت SDIO پر سرعت تر است ولی راه اندازی پیچیده ای دارد و نیاز به مجوز شرکت سازنده برای استفاده از این حالت است بنابراین شما توانایی استفاده از این مود را ندارید SPI به نسبت سرعت کمتری دارد ولی بر روی همه SD کارت ها حواب میدهد و برای استفاده به 4 سیم نیاز دارید میکرو SD با SD کارت ها از لحاظ ساختاری و استفاده هیچ تفاوتی ندارند و تنها تفاوتشان در اندازه آن ها است.

نکته سوم هم کارت های حافظه به صورت خام ارائه می شوند و به هیچ ساختار مشخصی برای استفاده محدود نیستید. برای 99 درصد دستگاه های موجود با فرمت FAT16 یا FAT32 سازگار هستند. برای استفاده از SD کارت با آردوینو نیاز دارید تا SD کارت خود را فرمت کنید SD کارت خود را با برنامه formatter و به صورت FAT32 فرمت کنید.

bk_sdcard

اتصال SD CARD به آردوینو

پایه ها رو به ترتیب زیر وصل کنید :

GND : این پایه از SD CARD را به GND برد آردوینو  وصل کنید.

۳٫۳+ : به ۳٫۳V برد آردوینو وصل کنید.

۵+ : به پایه ۵V برد آردوینوتون وصل کنید.

توجه۱ : برا تغزیه ماژول SD CARD یا باید از ولتاژ ۳٫۳ ولت استفاده کنید و یا ۵ ولت.(نیاید از هر دوش استفاده کنید )

MISO : به پایه ۱۲ برد آردوینو وصل شود.

MOSI : به پایه ۱۱ برد آردوینو وصل شود.

CS : به پایه ۱۰ برد آردوینو وصل شود.

CLK یا SCK : به پایه ۱۳ برد آردوینو وصل شود.

در بردهای mega2560  اتصالات به این صورت می باشد.

CS —-> pin 53
MOSI —-> pin 51
MISO —-> pin 50
CLK or SCK —-> pin 52

sd

تست اولیه بعد از اتصال SD کارت به Arduino

برای تست SD کارت از برنامه زیر استفاده کنید این برنامه مشخصات کارت SD شما را به همراه فایل های درون SD کارت نشان میدهد. برای استفاده از این نمونه برنامه از طبق تصویر عمل کنید.

adafruit_products_opencardinfo

در صورت صحیح بودن اتصال آردوینو به SD کارت با نتیجه ای مثل تصویر پایین روی پورت سریال مواجه می شوید.

adafruit_products_cardinfook

و در صورت موفقیت آمیز نبودن تست با پیام زیر مواجه می شوید.

adafruit_products_cardinfonone

توابع اتصال SD کارت به آردوینو

begin: به وسیله‌ی این تابع ماژول SD card فعال می‌شود.به جای آرگمان cspin باید شماره پینی از آردوینو که پین cs آردوینو متصل می‌شود را وارد کنیم.

SD.begin();
SD.begin(pin);

card.init:

این تابع نیز سرعت ماژول و همچنین شماره پینی از آردوینو که به پین CS متصل شده است را مشخص می‌کند.

card.init(SPEED, chipSelect_PIN);

به جای آرگمان SPEED می‌توان مقادیر زیر را قرار داد:

  • SPI_FULL_SPEED : از تمام سرعت ماژول استفاده می‌کند
  • SPI_HALF_SPEED : از نیمی از سرعت ماژول استفاده می‌کند
  • SPI_QUARTER_SPEED :یک چهارم از سرعن ماژول استفاده می‌کند

به جای آرگمان chipSelect_PIN نیز شماره پینی از آردوینو که به CS ماژول متصل می‌شود را وارد می‌کنیم.

Exists :

بررسی این که فایل یا دایرکتوری مورد نظر در SD کارت وجود دارد یا نه؛ به جای filename نام فایل یا دایرکتوری تون رو قرار بدین؛ اگه موجود بود true وگرنه false رو برمیگرداند.

SD.exists(filename);

mkdir :

ایجاد یه دایرکتوری در SD کارت؛ به جای DirectoryName نام دایرکتوری مورد نظر را قرار بدید.(اگه فایل رو ایجاد شود true   در غیر این صورت false برگردانده میشود)

SD.mkdir(DirectoryName);

rmdir :

پاک کردن  دایرکتوری، دایرکتوری که قراره پاک بشه باید خالی باشد، به جای DirectoryName نام دایرکتوری مورد نظر رو قرار بدید.(اگه پاک شود true   در غیر این صورت false برگردانده میشود)

SD.rmdir(DirectoryName);

open :

باز کردن یک فایل موجود در  sd card؛ اگه فایل موجود نباشد یک فایل با همون نام ساخته میشود و باز می شود، البته دایرکتوری که این فایل داخلش قرار دارد باید از قبل وجود داشته باشد

SD.open(filepath);
SD.open(filepath, mode);

Mode : توسط این قسمت نحوه باز شدن فایل رو تعیین میکنیم، حالت فقط خواندنی(FILE_READ) و حالت فقط نوشتنی(FILE_WRITE) ، که حالت دیفالتش رو “حالت باز کردن فقط خواندنی” است، لذا از تابع اولی وقتی استفاده میشود که فقط خواندنی باشد و از تابع دوم برای  هر دو حالت کاربرد داره.

remove :

پاک کردن یک فایل؛ به جای filename نام فایلی که میخواهید پاک کنید رو قرار بدید.(نام به صورت کامل و فرمت فایل هم باشه)؛ تابع اگر کارش رو درست انجام بده true و در غیر این صورت false رو برمیگرداند.

SD.remove(filename);

close :

بستن فایل مورد نظر و مطلئن شدن از این که اطلاعات داخلش ذخیره شده است.

file.close();

print : نوشتن اطلاعات درون فایل(قبلا باید فایل را باز کرده باشیم.)،این تابع تعداد بایت های ارسالی را بر می گرداند. این تابع رو به دو صورت زیرنوشته میشود :

file.print(data);
file.print(data, BASE);

Data: اطلاعاتی است که میخواهیم داخل فایل بنویسیم

Base : فرمت اطلاعات را تعیین میکند؛ که حالت پیشفرض دسیمال(۱۰ دهی) است، ولی می توان از مقادیر زیر نیز استفاده کرد :

BIN : باینری(مبنای ۲)

DEC : دسیمال یا همون ۱۰ دهی(مبنای ۱۰)

OCT : اکتال (مبنای ۸)

HEX : هگزا دسیمال(مبنای ۱۶)

Println :

این تابع هم مثل تابع بالا است، فقط تنها فرق این است که وقتی اطلاعات رو ارسال کرد، دستور رفتن به خط بعدی رو هم ارسال میکند و به ۳ صورت نوشته میشود؛ که در تابع اول اگر چیزی به عنوان اطلاعات به تابع داده نوشد، تابع فقط دستور رفتن به خط بعد را ارسال میکند؛ این تابع تعداد بایت ارسالی رو برمیگرداند :

file.println();
file.println(data);
file.print(data, BASE);

size : اندازه فایل مورد نظر ما رو بهمون میده(تعداد کاراکتر توی فایل)؛ البته قبلش باس فایل باز شده باشه.

file.size();

Write : نوشتن اطلاعات درون فایل باز شده، این تابع تعداد بایت نوشته شده رو برمیگرداند، این تابع به ۲ صورت زیر نوشته میشود :

file.write(data);
file.write(buf, len);

data : اطلاعاتی که قراره نمایش داده بشه(char)

Buf : یه آرایه از نوع char

Len : تعداد خانه های آرایه که داخل فایل نوشته میشود.

name : نام فایل یا دایرکتوری رو برمیگرداند.

file.name();

نمونه کد برای نوشتن و خواندن از روی SD کارت:

    #include <SD.h>
     
    File myFile;
     
    void setup()
    {
      Serial.begin(9600);
      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. 
       pinMode(10, OUTPUT);
     
      if (!SD.begin(10)) {
        Serial.println("initialization failed!");
        return;
      }
      Serial.println("initialization done.");
     
      // open the file. note that only one file can be open at a time,
      // so you have to close this one before opening another.
      myFile = SD.open("test.txt", FILE_WRITE);
     
      // if the file opened okay, write to it:
      if (myFile) {
        Serial.print("Writing to test.txt...");
        myFile.println("testing 1, 2, 3.");
    	// close the file:
        myFile.close();
        Serial.println("done.");
      } else {
        // if the file didn't open, print an error:
        Serial.println("error opening test.txt");
      }
    }
     
    void loop()
    {
    	// nothing happens after setup
    }

بعد از پروگرام کردن برنامه بر روی برد آردوینو اطلاعات زیر بر روری پورت سریال را می توانید ببینید.

adafruit_products_writetest

و در صورت باز کردن فایل ایجاد شده بر روی کامپیوتر باید محتویات فایل مثل عکس زیر باشد.

adafruit_products_writtentest

نوشته های مشابه

8 دیدگاه

  1. با سلام و خسته نباشید

    از شروع بخش علمی سایت بسیار سپاس گذارم
    این آموزش برای من بسیار مفید بود ولی در قسمتی از این متن اشتباه تایپی وجود داشت که ممکن است باعث به اشتباه انداختن سایرین گردد
    لطف کنید این اشتباه تایپی را تصحیح فرمایید
    در قسمت اتصال پایه ها پایه CS مربوط به SD CArd را به اشتباه 10 نوشتن که پایه 4 در آردینو صحیح می باشد که این مورد در عکس مربوطه نیز به درستی رعایت شده است.
    با تشکر

  2. سلام
    وقتی روی فایلی مینویسیم اطلاعات قبلی پاک میشه؟
    اگه اینطوره برای این که در ادامه اطلاعت قبلی که روی فایل هست چی کار باید کرد؟

  3. سلام
    ممنون بابت آموزش

    من وقتی وصل می کنم ماژول sd رو به آردویینو و تست رو اجرا می کنم، موفقیت آمیز نیست و sd رو نمیشناسه، اتصالات رو هم چک کردم درست بودند. میشه راهنمایی کنید چه مشکلی ممکنه وجود داشته باشه؟

  4. سلام و عرض ادب
    با این کارت حافظه میشه دوربین VO7670 رو به برد آردوینو Uno R3 دارای پردازنده ATmega328 وصل کرد و فیلم برداری رو انجام داد؟

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا