آموزش آردوینوپروژه های آردوینو

آموزش اتصال ماژول کارت حافظه SD به آردوینو

گاهی اوقات ممکن است پروژه‌ای با آردوینو داشته باشید که به ذخیره‌سازی حجم زیادی از داده نیاز دارد. چه در حال ثبت اطلاعات حسگرها باشید، چه ذخیره فایل‌ها یا نگهداری اطلاعات بیشتر از حافظه داخلی آردوینو.

پس چگونه می‌توان همه این داده‌ها را مدیریت کرد؟ راه‌حل احتمالا چیزی است که قبلا در دوربین دیجیتال یا تلفن همراه خود داشته‌اید: کارت‌های microSD. این کارت‌ها (یا رم ها) می‌توانند گیگابایت‌ها داده را در فضایی کوچکتر از یک سکه ذخیره کنند و به همین دلیل جزو اجزای ضروری فناوری روزمره ما محسوب می‌شوند.

ماژول کارت microSD اتصال آردوینو به کارت microSD را بسیار ساده می‌کند و ذخیره‌سازی داده در پروژه بعدی شما را آسان می‌سازد. بیایید نگاهی دقیق‌تر بیندازیم و بررسی کنیم چگونه این کار انجام می‌شود!

مطلب مرتبط: ذخیره اطلاعات در کارت حافظه SD با آردوینو (+اکسل)

مروری بر ماژول کارت حافظه SD

اجزای کلیدی یک ماژول کارت microSD عبارتند از:

رگولاتور 3.3V LDO

کارت microSD استاندارد با ولتاژ 3.3V کار می‌کند، بنابراین نمی‌توان آن را مستقیما به مدارهایی با منطق 5V متصل کرد. در واقع، هر ولتاژی بالاتر از 3.6V ممکن است کارت را به طور دائمی آسیب بزند. برای محافظت از کارت، ماژول دارای یک رگولاتور ولتاژ کم‌افت فشار بسیار کم (ultra-low dropout) داخلی است که یک منبع تغذیه پایدار 3.3V ایجاد می‌کند و کارت microSD شما را در حین کار ایمن نگه می‌دارد.

رگولاتور 3.3V LDO

چیپ Logic Level Shifter

ماژول همچنین شامل یک چیپ 74LVC125A برای تبدیل سطح منطقی است. این چیپ به عنوان پل بین میکروکنترلر شما (که معمولا با 5V کار می‌کند) و کارت microSD (که نیاز به 3.3V دارد) عمل می‌کند. تبدیل سطح منطقی اطمینان حاصل می‌کند که ولتاژها به درستی تبدیل شده و کارت microSD و میکروکنترلر بتوانند به‌طور ایمن و مؤثر با هم ارتباط برقرار کنند.

چیپ Logic Level Shifter

سوکت کارت microSD

در جلوی ماژول، یک سوکت کارت microSD خواهید دید. هر نوع کارت حافظه microSD با این سوکت سازگار است. ماژول معمولا راهنمایی می‌کند که کارت را چگونه وارد کنید، که شروع کار را بسیار ساده می‌کند.

پین‌های ماژول کارت microSD

یک ماژول کارت microSD دارای شش پین است:

پین‌های ماژول کارت microSD

  • VCC: این پین تغذیه ماژول را تامین می‌کند و باید به پین 5V آردوینو متصل شود.
  • GND: پین زمین.
  • MISO (Master In Slave Out): پین خروجی SPI از ماژول کارت microSD که داده‌ها را به آردوینو می‌فرستد.
  • MOSI (Master Out Slave In): پین ورودی SPI به ماژول کارت microSD که داده‌ها را از آردوینو دریافت می‌کند.
  • SCK (Serial Clock): پین دریافت پالس‌های زمان‌بندی از دستگاه اصلی (آردوینو شما) برای هماهنگی انتقال داده‌ها.
  • CS (Chip Select): پین کنترلی که ماژول را روی باس SPI فعال می‌کند و اجازه می‌دهد در زمان نیاز ارتباط برقرار شود.

آماده‌سازی کارت microSD

قبل از قرار دادن کارت microSD در ماژول و اتصال آن به آردوینو، مهم است که مطمئن شوید کارت به درستی با سیستم فایل FAT16 یا FAT32 فرمت شده است.

اگر از یک کارت SD کاملا جدید استفاده می‌کنید، احتمالاً از قبل با فایل سیستم FAT فرمت شده است. با این حال، این فرمت کارخانه‌ای ممکن است کامل نباشد و مشکلاتی ایجاد کند. اگر از کارت قدیمی استفاده می‌کنید، حتماً نیاز به فرمت مجدد دارد. در هر صورت، بهتر است قبل از استفاده در پروژه کارت را فرمت کنید.

برای بهترین نتیجه، از ابزار رسمی SD card formatter توسعه یافته توسط SD Association استفاده کنید. این ابزار ویژه بسیاری از مشکلات رایج ناشی از فرمت نادرست را پیشگیری می‌کند. کافی است ابزار را روی کامپیوتر خود دانلود و اجرا کنید، درایو کارت SD را انتخاب کرده و دکمه Format را بزنید.

اگر در مورد این مطلب سوالی دارید در قسمت نظرات بپرسید

آماده‌سازی کارت microSD

اتصال ماژول کارت microSD به آردوینو

حال که کارت microSD آماده است، بیایید ماژول را به آردوینو متصل کنیم:

  1. پین VCC ماژول را به پین 5V آردوینو و پین GND را به زمین متصل کنید.
  2. سپس پین‌های مورد استفاده برای ارتباط SPI را تنظیم کنید. از آنجایی که کارت‌های microSD نیاز به انتقال داده سریع دارند، بهترین عملکرد زمانی است که به پین‌های Hardware SPI میکروکنترلر متصل شوند.

به خاطر داشته باشید که چینش پین‌های SPI در آردوینوهای مختلف متفاوت است، بنابراین باید اتصال‌ها را درست برقرار کنید. برای مثال، در بردهای آردوینو مانند UNO یا Nano V3.0، پین‌های SPI به شرح زیر هستند:

  • SCK: دیجیتال 13
  • MISO: دیجیتال 12
  • MOSI: دیجیتال 11
  • CS: دیجیتال 10

جدول مرجع اتصال پین‌ها:

ماژول کارت microSD آردوینو
VCC 5V
GND GND
MISO 12
MOSI 11
SCK 13
CS 10

اتصال ماژول کارت microSD به آردوینو

با اتصال ماژول طبق این راهنما، اکنون آماده هستید که داده‌ها را ثبت و ذخیره کنید.

کد آردوینو تست ماژول کارت microSD با CardInfo

ارتباط با کارت microSD ممکن است کمی پیچیده باشد، اما خوشبختانه Arduino IDE شامل کتابخانه مفیدی به نام SD است که خواندن و نوشتن روی کارت‌های SD را بسیار ساده می‌کند.

بیایید با یک اسکچ نمونه CardInfo شروع کنیم. این اسکچ چیزی روی کارت نمی‌نویسد، بلکه بررسی می‌کند که آیا آردوینو کارت را شناسایی می‌کند یا نه و برخی اطلاعات پایه درباره آن را نمایش می‌دهد. اجرای این اسکچ هنگام تست کارت microSD جدید بسیار مفید است، زیرا به شما کمک می‌کند بفهمید آیا آردوینو شما از کارت پشتیبانی می‌کند یا خیر.

برای پیدا کردن اسکچ نمونه CardInfo، در Arduino IDE مسیر زیر را دنبال کنید:
File > Examples > SD > CardInfo

تست ماژول کارت microSD با CardInfo

قبل از اجرای اسکچ، مطمئن شوید که chipSelect در ابتدای کد درست تنظیم شده است. از آنجایی که در تنظیمات ما از پین دیجیتال #10 استفاده می‌کنیم، باید مقدار آن روی 10 تنظیم شده باشد.

تنظیم پین CS SPI ماژول کارت حافظه رم SD

سپس کارت SD را در ماژول قرار داده و اسکچ را روی آردوینو آپلود کنید. پس از آپلود، Serial Monitor را باز کنید تا نتایج را ببینید. خروجی می‌تواند بسته به شرایط مختلف متفاوت باشد:

سناریو 1: راه‌اندازی موفق کارت

اگر همه چیز درست باشد، جزئیات مفیدی درباره کارت microSD شما نمایش داده می‌شود. برای مثال، ممکن است نوع کارت شما SDHC (SD High Capacity) باشد، از فرمت FAT32 استفاده کند و ظرفیت آن 4 GB باشد.

سناریو 1: راه‌اندازی موفق کارت

سناریو 2: کارت SD خراب شناسایی شد

اگر کارت شما خراب باشد، ممکن است چیزی شبیه این ببینید:
اطلاعات کارت پاسخ داده اما نادرست هستند. هیچ Manufacturer ID یا OEM ID وجود ندارد و Product ID به صورت ‘N/A’ نشان داده می‌شود. این به معنی وجود خطا در کارت است.

سناریو 2: کارت SD خراب شناسایی شد

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

سناریو 3: مشکل در سیم‌کشی یا آسیب دائمی کارت

اگر مشکلی در سیم‌کشی وجود داشته باشد یا کارت به طور دائمی خراب شده باشد، Serial Monitor به شما نشان می‌دهد که کارت SD نمی‌تواند راه‌اندازی شود.

سناریو 3: مشکل در سیم‌کشی یا آسیب دائمی کارت

در این حالت، همه اتصالات سیم‌ها را با دقت بررسی کرده و اسکچ را دوباره اجرا کنید.

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

اگر سیم‌کشی درست باشد اما کارت SD به درستی فرمت نشده باشد، پیغامی مبنی بر فرمت نادرست کارت دریافت خواهید کرد.

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

در این صورت، کارت را فرمت کرده و سپس اسکچ را دوباره اجرا کنید.

کد آردوینو خواندن و نوشتن داده‌ها روی کارت microSD

با فرض اینکه اسکچ قبلی شما با موفقیت اجرا شد، حالا به اسکچ بعدی می‌پردازیم. این اسکچ نشان می‌دهد چگونه داده‌ای روی یک فایل نوشته شود و سپس با خواندن آن، صحت نوشته‌ها بررسی شود. کد کامل در فایل دانلودی انتهای صفحه قرار داده شده است. در این قسمت بخش های مختلف کد را توضیح میدهیم.

  1. وارد کردن کتابخانه‌ها
    ابتدا کتابخانه‌های SPI و SD را وارد می‌کنیم تا آردوینو بتواند از طریق رابط SPI با کارت SD ارتباط برقرار کند:
#include <SPI.h>
#include <SD.h>
  1. تنظیم پین CS
    با توجه به اینکه اسکچ از Hardware SPI استفاده می‌کند، فقط کافی است پین CS را مشخص کنیم. سایر پین‌های SPI در کتابخانه SD از قبل تعریف شده‌اند:
const int chipSelect = 10;
  1. ایجاد شی فایل
    یک شی به نام myFile ایجاد می‌کنیم که شامل توابعی برای دسترسی و تغییر فایل‌ها روی کارت SD است:
File myFile;
  1. راه‌اندازی و ارتباط سریال
    در تابع setup() ابتدا ارتباط سریال برقرار می‌شود و با فراخوانی SD.begin() کارت SD راه‌اندازی می‌شود. اگر کارت شناسایی شد، پیغام “initialization done.” نمایش داده می‌شود، در غیر این صورت برنامه متوقف می‌شود:
Serial.begin(9600);
Serial.print("Initializing SD card...");
if (!SD.begin()) {
    Serial.println("initialization failed!");
    return;
}
Serial.println("initialization done.");
  1. باز کردن فایل و نوشتن داده
    فایل با استفاده از SD.open() باز می‌شود. اگر فایل موجود نباشد، ایجاد می‌شود. حالت باز کردن فایل می‌تواند FILE_READ برای خواندن یا FILE_WRITE برای خواندن و نوشتن باشد:
myFile = SD.open("test.txt", FILE_WRITE);
if (myFile) {
    Serial.print("Writing to test.txt...");
    myFile.println("testing 1, 2, 3.");
    myFile.close();
    Serial.println("done.");
} else {
    Serial.println("error opening test.txt");
}
  1. خواندن محتویات فایل
    برای بررسی صحت نوشته‌ها، فایل دوباره با حالت خواندن باز می‌شود. با استفاده از myFile.read() که هر بار یک کاراکتر می‌خواند و یک حلقه while با شرط myFile.available()، تمام محتویات فایل نمایش داده می‌شوند:
myFile = SD.open("test.txt");
if (myFile) {
    Serial.println("test.txt:");
    while (myFile.available()) {
        Serial.write(myFile.read());
    }
    myFile.close();
} else {
    Serial.println("error opening test.txt");
}
  1. تابع loop()
    از آنجایی که این اسکچ فقط برای نمایش خواندن و نوشتن فایل است، همه کدها در setup() قرار گرفته‌اند و تابع loop() خالی است:
void loop() {
}

اگر دکمه ریست آردوینو را فشار دهید و اسکچ دوباره اجرا شود، داده جدید به انتهای فایل اضافه می‌شود و جایگزین داده قبلی نمی‌شود.

این روش برای ذخیره داده‌های متوالی روی کارت SD بسیار مفید است.

نکات مهم برای کار با کارت microSD در آردوینو

  • می‌توانید از توابع print() و println() برای نوشتن رشته‌ها، متغیرها و سایر داده‌ها روی فایل‌ها استفاده کنید، درست مانند زمانی که داده‌ها را به Serial Monitor می‌فرستید.
  • تابع read() تنها یک کاراکتر را در هر بار برمی‌گرداند و نمی‌تواند یک خط کامل را به صورت هم‌زمان بخواند.
  • وقتی کارتان با یک فایل تمام شد، همیشه از تابع close() استفاده کنید. این کار تضمین می‌کند که تمام داده‌ها به صورت دائمی ذخیره شده و حافظه آردوینو آزاد شود.
  • می‌توانید با فایل‌ها داخل پوشه‌ها نیز کار کنید. به عنوان مثال، برای باز کردن یک فایل در یک دایرکتوری، می‌توانید از SD.open("/myfiles/example.txt") استفاده کنید. فقط به یاد داشته باشید که مسیر فایل نسبی است.
  • کتابخانه SD تنها از نام فایل‌های کوتاه پشتیبانی می‌کند زیرا از فرمت نام 8.3 استفاده می‌کند. به این معنی که نام فایل‌ها باید کوتاه باشند. برای مثال، datalog.txt مناسب است اما My sensor log file.text طولانی است و به درستی کار نمی‌کند.
  • نام فایل‌ها حساس به حروف بزرگ و کوچک نیستند. بنابراین datalog.txt دقیقاً مانند DataLog.Txt یا DATALOG.TXT است.

توابع مربوط به شی SD

شی SD دارای چندین تابع مفید است:

  • exists(filename): بررسی می‌کند که آیا یک فایل روی کارت SD وجود دارد یا خیر. اگر فایل وجود داشته باشد true و در غیر این صورت false برمی‌گرداند.
  • remove(filename): برای حذف یک فایل استفاده می‌شود. مراقب باشید! پس از حذف فایل به این روش، فایل برای همیشه از بین می‌رود و قابل بازیابی نیست.
  • mkdir(“/mynewdir”): ایجاد پوشه‌های جدید. بسیار مفید است وقتی می‌خواهید فایل‌های زیادی را در یک محل سازمان‌دهی کنید.

توابع مربوط به شی File

شی File نیز دارای توابع مفیدی است:

  • seek(position): مکان‌نمای فایل را به یک موقعیت جدید منتقل می‌کند. برای مثال، seek(0) مکان‌نما را به ابتدای فایل بازمی‌گرداند.
  • position(): موقعیت فعلی مکان‌نما را در فایل نشان می‌دهد.
  • size(): اندازه فایل را بر حسب بایت بازمی‌گرداند.
  • isDirectory(): بررسی می‌کند که آیا شی مورد نظر یک فایل است یا یک پوشه.
  • openNextFile(): به شما اجازه می‌دهد فایل‌ها را در یک پوشه به ترتیب مرور کنید.
  • name(): هنگام مرور فایل‌ها با openNextFile()، این تابع نام فایل فعلی را بازمی‌گرداند. نام فایل به صورت یک آرایه کاراکتری با فرمت 8.3 است و می‌توان آن را به راحتی با Serial.print() نمایش داد.

موارد موجود در فایل : سورس کامل

5 (2 نفر)

برای دریافت مطالب جدید کانال تلگرام یا پیج اینستاگرام ما را دنبال کنید.

محمد رحیمی

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

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

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