آموزش اتصال میکرو SD Card به آردوینو

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

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

کارت های حافظه ی SD و MMC ، نوعی حافظه دائمی هستند که تفاوت چندانی با هم ندارند. تنها تفاوت عمده ی اونها در این است که کارت حافظه SD ، یک سیستم حفاظت داده ی  اختیاری داره و از چندین پروتکل (SDIO) پشتیبانی میکنه که حافظه های MMC این قابلیت را ندارند. هردو کارت از استاندارد تبادل داده ی SPI استفاده میکنند که به سادگی میتوان کارت را به تمام ریزپردازنده هایی متصل کرد که ازین استاندارد پشتیبانی می کنند. معمولا بیشترین فرکانس پالس ساعت کارت های SD، 25 مگاهرتز و  و کارت های MMC ، 52 مگاهرتز است.

شکل زیر پایه های کارت SD/MMC برای تبادل داده در حالت SPI را نمایش می دهد:

پایه های کارت SD

توابعی که آردوینو برای تبادل داده با کارت های حافظه داره  از سیستم FAT16 و FAT32 پشتیبانی می کنه.این تابع ها رو برای خوندن و برای نوشتن داده توی کارت های SD و SDHC به کار میبریم. چون کارت های حافظه با ولتاژ 3.3 ولت کار میکنه.باید با یک مدار تقسیم مقاومتی یا استفاده از آی سی 74125 و تغذیه اون تغذیه اون با 3.3 ولت تراشه ی LM317T یا LM1117 ، ولتاژ کاری کارت رو فراهم کرد.

ماژول Micro Sd Card

برای شروع برنامه نویسی باید اول بدونیم که به شکل SPI به میکرو وصل میشه ، پس باید از تابع begin برای spi استفاده کنیم. توجه داشته باشید که پای SS میکرو که به پای ی CS کارت متصل می شه، حتما بایستی به صورت خروجی تعریف بشه. قالب این تابع به صورت زیره:

 

چنانچه بخوایم پایه ی CS کارت رو به پایه ی دیگه ای جز SS وصل کنیم، شکل دوم تابع رو به کار می بریم که پارامتر ورودی این تابع، شماره ی پایه ی آردوینو است که به پایه ی CS کارت متصل میشه. این تابع درصورت اجرای صحیح خروجی ، true و در غیر این صورت false میده.

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

تابع SD.exists

این تابع وجود فایل یا فولدری رو در کارت بررسی میکنه و درصورت وجود داشتن خروجی true و در غیر اینصورت، خروجی false میده.قالب به شکل زیره:

چنانچه بخوایم موجود بودن فولدری رو بررسی کنیم علامت / رو قبل از اسم فولدر استفاده میکنیم.

تابع mkdir

این تابع فولدری  ای دلخواه رو توی کارت ایجاد میکنه و قالب اون به صورت زیره:

اگر بخوایم زیر شاخه هم درست کنیم  ، باید یادمون نره بین فولدر اول و دوم /  بزاریم. مثلا:

 

خروجی تابع هم درصورت درست شدن فولدر ها تابع درست و درغیر اینصورت نادرسته.

تابع open

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

توجه کنید که توی هر زمان،میشه فقط یک فایل رو باز کرد.

ورودی این تابع اسم فایلی هست که میخوایم باز کنیم.اگر فایل توی زیر شاخه باشه با علامت / ، آدرس زیر شاخه رو وارد میکنیم.ورودی mode  هم نوع باز کردن فایل رو به یکی از دو صورت زیر بیان میکنه.

FILE_READ : این حالت فایل رو فقط برای خوندن باز کرده و از ابتدای فایل شروع به خوندن اون میکنه.

FILE _WRITE : این حالت فایل رو برای خوندن و نوشتن آماده می کنه و از انتهای فایل شروع به خوندن اون میکنه

خروجی تابع ، فایل باز شده هستش و اگر قایل باز نشد خروجی نادرسته.

تابع SD.remove(filename)

برای پاک کردن یک فایل از کارت، این تابع رو به کار میبریم .

اگر حذف فایل موفقیت آمیز بود ، خروجی true و اگر نبود خروجی false. درصورت نبود فایل خروجی نامشخصه!

تابع rmdir

این تابع فولدر خالی رو از کارت حذف میکنه.

ورودی تابع نام فولدری ای هستش که قراره حذف بشه.

  • تا اینجا تابع هایی که داشتیم با کلاس SD  تعریف میشدن ، اما توی ادامه دستور هایی رو معرفی می کنیم که کلاسشون File هستش.

تابع available
این تابع بررسی میکنه که بایتی برای خوندن از فایل هست یا نه. خروجی اون تعداد بایت های موجود برای خوندن هستش.قالب اون هم به شکل زیره:

 

file از کلاس FILE هستش که توسط SD.open ایجاد شده. برای خوندن تعداد بایت های یک فایل ، اول باید اون رو با تابع SD.open باز کنیم و خروجی این تابع رو که فایل خوانده شده است (file) ، توی تابع available  به کار ببریم.

تابع read

این تابع کاراکترهای موجود توی کلاس stream رو به بافر منتقل میکنه. خروجی تابع اولین بایت خوانده شده هستش و اگر داده ای وجود نداشته باشه ، خروجی -1 میده، قالب اون هم به صورت زیره:

 

تابع close

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

 

اینجا هم مثل تابع available ، اول باید فایل مدنظر رو با تابع SD.open باز کرده باشیم.این تابع خروجی نداره.

تابع flush

این تابع مطمئن میشه که تمام داده هایی که به کارت منتقل شده ، بصورت فیزیکی ذخیره شده. (این کار به صورت خودکار با تابع close انجام میشه).

قالب تابع بصورت زیره:

file هم مثل تابع SD.open باز میشه. این تابع هم خروجی نداره.

این تابع بایت رو که از فایل داده شده میخونه و قالب اون به صورت زیره:

متغیر file  هم از کلاس stream هستش.

نکته قابل توجه  این تابع اینه که که فراخوانی چندباره ی این تابع بایت هایی یکسان میده، یعنی با فراخوانی دوباره ی تابع ، بایت بعدی فایل خونده نمیشه.

تابع position

این تابع موقعیت بایت بعدی رو برای خوندن و نوشتن درون یک فایل رو میده و قالب اون به شکل زیره:

خروجی این تابع عددی 32بیتی و بدون علامته.

تابع print

این تابع داده رو توی فایل ذخیره میکنه، البته فایل بایستی قبلا توسط تابع SD.open() باز شده باشه. این تابع داده هارو به صورت رشته ای از کد اسکی ذخیره میکنه. مثلا عدد 123 به صورت رشته ای از کدهای ‘1’ , ‘2’ , ‘3’ ذخیره میشه.قالب تابع به صورت زیره:

 

متغیر ورودی داده ای است که می خوایم در فایل ذخیره کنیم و میتوانه 8 یا 16 و یا 32 بیتی یا رشته باشه. متغیر BASE اختیاری بوده و مبنای ذخیره ی داده رو بیان میکنه. این متغیر میتونه BIN برای مبنای 2 و DEC برای 10 ,  OCT برای مبنای 8 و HEX برای مبنای 16 باشد.خروجی تابع از نوع byte بوده و تعداد بایت های نوشته شده رو میده که خوندن اون اختیاریه.

تابع println

این تابع داده ها رو همراه کدهای اسکی 13 و 10 ارسال میکنه. یعنی میره سرخط بعد و تفاوت دیگه ای با print نداره.
تابع seek

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

 

پارامتر ورودی تابع عددی 32 بیتی هستش که مووقعیت درون file رو مشخص میکنه. خروجی تابع هم در صورت عملکرد صحیح تابع true و در غیر اینصورت false هستش.

تابع size

این تابع اندازه ی فایل مدنظر رو میده و قالب اون به صورت زیره:

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

تابع read

این تابع یک بایت از فایل داده شده رو میخونه و قالب اون بصورت زیره:

 

خروجی تابع ، بایت خوانده شده است و چنانچه داده ای برای خوندن نباشه ، خروجی -1 میشه.

تابع write

این تابع داده رو روی فایل ذخیره میکنه و قالب اون به صورت زیره:

 

data داده ی ورودی بوده و میتونه از نوع 8 بیتی با علامت یا بدون علامت یا از نوع رشته باشه. در قالب دوم ، داده ی ورودی به صورت آرایه ای از کاراکترها یا اعداد است که بعد آرایه ، توسط پارامتر len مشخص میشه.خروجی تابع هشت بیتی بدون علامته، تعداد بایت های نوشته شده رو میده  خوندن اون اجباری نیست.

تابع openNextFile

این تابع فایل یا زیر شاخه ی بعدی را در یک شاخه گزارش میکنه و قالب اون بصورت زیره:

 

خروجی این تابع از نوع char (هشت بیتی علامت دار) بوده که فایل زیر شاخه ی بعدی در شاخه ی file رو میده.

تابع isDirectory

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

 

file در این تابع توسط تابع file.open بدست آمده . خروجی اون بصورت شاخه بودن file  درست و در غیر اینصورت نادرست هستش.

تابع rewinDirectory

تابع به اولین فایل شاخه بر میگرده و با تابع openNextfile به کار میره.

 

این ها توابعی بودند که برای اتصال رم sd یا  اتصال SD Card به آردوینو ( همون مموری به آردوینو ) استفاده میشن ، پروژه هایی با این عنوان و با استفاده از این ماژول به زودی در بخش پروژه های آردوینو قرار میگیره.

مطلب طولانی شد و زمان بر بود نوشتنش ، اگر جایی کمبود داشت یا نامفهوم بود بگید تا سریعا اصلاح بشه و اگر سوالی داشتین بپرسید تا پاسخ بدیم . 🙂

حمیدرضا مودت

یک مهندس الکترونیک ، علاقه مند به یاد دادن و یاد گرفتن پیرامون دانش برق و الکترونیک

شما ممکن است این را هم بپسندید

5 پاسخ‌ها

  1. سجاد گفت:

    سلام اقا حمید. میخواستم ببینم یک دوربین که حافظه sd کارت میخوره و موقع فعال بودن ویدیو را در مموری ذخیره میکنه.میشه کاری کرد که تصویر زنده رو با سیم انتقال بدیم و در تلوزیون یا با کابل او تی جی در مبایل ببینیم. ممنون میشم کمکم کنید لطفا در جمیل من جواب رو بفرستید ممنون میشم.

  2. سارا گفت:

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

    • حمید گفت:

      سلام . اگه کد تون درسته ممکنه بخاطر یکی نبودن سرعت ارسال دیتا باشه که توی آردوینو با serial.begin میشه سرعت رو تنظیم کرد و باید حتما توی فرستنده و گیرنده یکی باشه.
      پیشنهاد میکنم هر بخشیو جداگانه اول تست کنید (مثلا ارسال دیتا 2 میکرو بهم – ذخیره در SD – نمایش اطلاعات و .. ) بعد با تلفیقشون خروجی مورد نظر رو بگیرید . اینطوری بهتر متوجه جزئیات میشین

      • سارا گفت:

        ممنون از اینکه پاسخ دادید.همین کار رو انجام دادم.سرعت انتقال هم هر دو 9600 هست.خوندن و نوشتن در کارت حافظه مشکلی نداره موقعی که از سریال خود اردوینو استفاده میکنم ولی موقعی که به سریال میکرو وصل میکنم نمیتونم جواب بگیرم

        • حمید گفت:

          خواهش! خب بدون دیدن کد هاتون واقن نمیدونم مشکل کجاست، بهتره توی انجمن eca مطرح کنید و کدهاتون رو هم قرار بدین 🙂

پاسخ دهید

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