راه اندازی ماژول میکرو sd Card با آردوینو موضوع مقاله امروز ما است که در ادامه بهطور کامل به آن خواهیم پرداخت.
ممکن است برای شما هم پیش آمده باشد که به راهی نیازی داشته باشید تا بتوانید میزان زیادی از دادههای طولانی و اطلاعات دیگر را در پروژه آردوینو خود ذخیره کنید. مانند: GPS logger. اما راه حل این کار چیست؟
برای این کار، باید از ابزاری استفاده کنید که در هر دوربین دیجیتال و پخشکننده فایلهای صوتی وجود دارد. منظورمان کارت حافظه است! به کارت حافظه اغلب SD Card یا Micro SD Card میگویند. قابلیت ذخیرهسازی دادههای گیگابایتی در فضایی کمتر از ابعاد یک سکه کوچک، کارت حافظهها را به یکی از ضروریات زندگی ما تبدیل کرده است.
در بخش بعدی سخت افزار ماژول میکرو sd را بررسی خواهیم کرد.
نگاهی به سختافزار ماژول میکرو sd card
ماژول میکرو SD Card از دو قطعه اصلی تشکیل شده است که بیشک اضافه کردن داده به پروژه آردوینو را برای شما آسان میکند.
![اجزای ماژول میکرو SD Card که شامل ولتاژ عملکرد و آی سی شیفت دهنده سطح منطقی میشود.](https://roboeq.ir/blog/wp-content/uploads/2021/10/Micro-SD-TF-Card-Module-module-contains-level-shifter-and-regulator.png)
- ولتاژ عملکرد هر SD Card Micro برابر 3.3V است. به همین، نمیتوانیم آن را مستقیما به مداری وصل کنیم که از 5V استفاده میکند. در واقع، ولتاژهای بیشتر از 3.6V، آسیب غیرقابل جبرانی به SD Card وارد میکنند. به همین جهت، بر روی ماژول sd card، یک رگولاتور ولتاژ با افت بسیار کم وجود دارد که ولتاژ بین 3.3V تا 6V را به 3.3V کاهش میدهد.
- به علاوه، بر روی ماژول، یک تراشه 74LVC125A نیز قرار گرفته است که منطق 3.3V تا 5V را به 3.3V تبدیل میکند. به این کار، شیفت دهنده سطح منطقی میگویند. به این معنا که شما میتوانید این برد را با میکروکنترلرهای 3.3V و 5V مانند آردوینو بهکار ببرید.
برای ارتباط با ماژول SD Card، دو راه وجود دارد – مد SPI و مد SDIO. روش SDIO mode سریعتر است و در گوشیهای موبایل و دوربینهای دیجیتال استفاده میشود. اما این روش، نسبت مد SPI پیچیدهتر است و نیاز به امضای اسناد محرمانه دارد. از این رو احتمال سر و کار داشتن ما با مد SDIO، کمتر است. اما در عوض، بیشتر با ماژول اس دی کارتی کار خواهیم کرد که براساس مد SPI با سرعت پایینتر و اضافه بار کمتر کار میکند و به همین دلیل به آسانی برای هر میکروکنترلری قابل استفاده است.
پایههای ماژول SD Card Micro
اتصال ماژول SD Card Micro به آردوینو بسیار آسان است. این ماژول 6 پایه دارد:
![پایههای ماژول SD Card Micro](https://roboeq.ir/blog/wp-content/uploads/2021/10/Micro-SD-TF-Card-Module-Pinout-SPI.png)
VCC : تغذیه ماژول را فراهم میکند و باید به پایهی 5V آردوینو وصل شود.
GND : باید به زمین آردوینو وصل شود.
MISO (Master In Slave Out) : خروجی SPI از ماژول SD Card Micro است.
MOSI (Master Out Slave In) : ورودی SPI برای ماژول SD Card Micro است.
SCK (Serial Clock) پالس ساعت را که با انتقال داده تولید شده توسط آردوینو سنکرون است، میپذیرد.
SS (Slave Select) این پایه توسط آردوینو (Master) استفاده میشود تا دستگاههای خاصی را بر روی باس SPI فعال یا غیر فعال نماید.
آمادهسازی ماژول SD Card
پیش از قرار دادن کارت حافظه sd در ماژول و راه اندازی ماژول میکرو SD Card با آردوینو ، باید آن را بهدرستی فرمت نمایید. در ادامه توضیح خواهیم داد که برای کتابخانه آردوینو و تقریباً هر کتابخانه SD دیگری، حتما باید Cardها را با FAT16 یا FAT32 فرمت کنید.
اگر یک SD Card جدید دارید، به احتمال زیاد قبلاً با یک فایل سیستم FAT فرمت شده است. با این حال، ممکن است با نحوهی فرمت کارخانه مشکلاتی داشته باشید، یا یک Card قدیمی داشته باشید، در این صورت، Card نیاز به فرمت مجدد دارد. به هر حال در هر دو مورد، فرمت کردن Card، پیش از استفاده کار خوبی است. حتی اگر Card شما نو باشد!
به شما توصیه میکنیم که از ابزار رسمی فرمت کننده کارت حافظه SD استفاده کنید که بهوسیله SD association نوشته شده و بسیاری از مشکلات ناشی از بد فرمت شدن را حل میکند. formatter را دانلود نموده و آن را بر روی کامپیوتر خود اجرا نمایید. تنها کافی است درایو درست را انتخاب کرده و بر روی FORMAT کلیک نمایید.
![انتخاب درایو و فرمت کارت اس دی توسط ابزار SDFormatter](https://roboeq.ir/blog/wp-content/uploads/2021/10/SD-Formatter-Screenshot.png)
سیمکشی- راه اندازی ماژول میکرو SD Card با آردوینو
اکنون که کارت حافظه SD شما آماده است، میتوانید راه اندازی ماژول SD Card با آردوینو را آغاز کنید.
قطعات لازم:
- ماژول میکرو SD CARD
- ماژول آردوینو UNO
- سیم برای برد بوردی 65 عدد
- مموری توشیبا MICRO SD 8GB یا
- مموری Micro SD 16GB Class 10
برای شروع، ماژول Micro SD Card را در بردبورد قرار دهید. پایه VCC ماژول را به پایه 5V آردوینو و پایه GND را به زمین آردوینو متصل کنید. اکنون پایههای تبادل اطلاعات SPI باقی میماند.
از آنجا که SD Card Microها به انتقال داده بسیار زیادی نیاز دارند، وقتی به پایههای سختافزاری SPI یک میکروکنترلر وصل شوند، بهترین عملکرد را خواهند داشت. پایههای سختافزاری SPI خیلی سریعتر از ‘bit-banging’ است که با استفاده از پایههای دیگری با کد ارتباط برقرار میکند.
به این نکته توجه داشته باشید که هر برد آردوینو پایههای SPI متفاوتی دارد که باید مطابق آن، اتصالات را انجام دهید. این پایهها در بردهای آردوینو UNO/Nano، پایههای دیجیتال 13 (SCK), 12 (MISO) و 11 (MOSI) هستند. علاوه بر این، به پایهی چهارمی برای خط انتخاب (ss) chip/slave نیاز خواهید داشت. معمولاً این پایه، پایهی 10 است، اما میتوانید به دلخواه از هر پایهی دیگری نیز استفاده کنید.
در برد آردوینو Mega نیز، پایهها متفاوت هستند. در این برد، شما باید از پایههای دیجیتال 50 (MISO), 51 (MOSI), 52 (SCK), 53 (SS) استفاده کنید. میتوانید از جدول زیر برای درک بهتر این موضوع استفاده کنید:
CS | SCK | MISO | MOSI | |
10 | 13 | 12 | 11 | Arduino Uno |
10 | 13 | 12 | 11 | Arduino Nano10 |
50 | 52 | 50 | 51 | Arduino Mega |
به طور کلی، اگر از برد آردوینو متفاوتی استفاده میکنید، بهتر است پیش از انجام هر کاری، ابتدا مستندات رسمی آردوینو documentation را مطالعه کنید.
![نحوه سیمکشی ماژول میکرو SD Card به آردوینو](https://roboeq.ir/blog/wp-content/uploads/2021/10/Arduino-Wiring-Fritzing-Connections-with-Micro-SD-TF-Card-Module.png)
کد آردوینو- تست ماژول میکرو SD Card با CardInfo
تبادل اطلاعات با کارت حافظه SD نیازمند اقدامات زیادی است، اما خوشبختانه نرم افزار آردوینو شامل یک کتابخانه بسیار عالی تحت عنوان SD است که خواندن و نوشتن بر روی SD Card را برای ما آسان کرده است.
- برای استفاده از این کتابخانه، ابتدا آن را از زیرمنوی Examples، مشاهده کنید.
- در مرحله بعد، CardInfo را انتخاب نمایید.
![انتخاب CardInfo از زیر منوی Examples در نرمافزار آردوینو](https://roboeq.ir/blog/wp-content/uploads/2021/10/SD-Library-CardInfo-Sketch-in-Arduino-IDE.png)
این دستورات هیچ دادهای را بر روی SD Card نمینویسد و تنها به شما نشان میدهد که آیا SD Card را شناسایی نموده یا نه. به علاوه، اطلاعاتی درباره آن نیز نمایش میدهد. این کد، وقتی بخواهیم بدانیم که آیا از یک SD Card پشتیبانی میشود، بسیار مفید خواهد بود. به شما پیشنهاد میکنیم که پیش از امتحان کردن یک SD Card جدید، این دستورات را یک بار اجرا کنید.
در شروع دستورات مطمئن شوید که chipSelect بهدرستی مقداردهی شده باشد. در این جا، ما از پایه دیجیتال شماره 10 استفاده کردهایم، بنابراین آن را به 10 تغییر دهید!
![تغییر مقدار chipSelect به 10 در نرمافزار آردوینو](https://roboeq.ir/blog/wp-content/uploads/2021/10/Initialising-ChipSelect-CardInfo-Sketch-in-Arduino-IDE.png)
اکنون، کارت حافظه SD را درون ماژول میکرو SD Card قرار دهید و دستورات را بارگذاری نمایید. به محض باز کردن سریال مانیتور، احتمالاً چیزی مانند تصویر زیر را مشاهده خواهید کرد:
![خروجی کد تست ماژول SD Card بر روی سریال مانیتور پس از قرار دادن کارت حافظه SD در ماژول و بارگذاری دستورات](https://roboeq.ir/blog/wp-content/uploads/2021/10/CardInfo-Sketch-Output-in-Arduino-IDE-Working.png)
ممکن است این خروجی برایتان نامفهوم باشد، اما اطلاعات مفیدی درباره SD Card به شما میدهد. این خروجی به شما نشان میدهد که نوع کارت حافظهCard SDHC (SD High Capacity) است یعنی SD با ظرفیت بالا، نوع Volume ،FAT32 و سایز آن حدود 4GB میباشد. اگر شما یک Card بد دارید که به نظر میرسد در نسخههای کپی بیشتر رخ میدهد، خروجی به صورت زیر خواهد بود:
![خروجی کد تست ماژول بر روی سریال مانیتور پس از قرار دادن کارت نسخههای کپی در درون ماژول](https://roboeq.ir/blog/wp-content/uploads/2021/10/CardInfo-Sketch-Output-in-Arduino-IDE-Bad-Corrupt-Card.png)
همانطور که میبینید، Card پاسخ داده است، اما دادهها همگی بد هستند. شناسه کارخانه یا شناسه OEM وجود ندارد و شناسه تولید، ‘N/A’است. این نشان میدهد که Card، برخی از خطاهای SD را برگردانده است. اگر با چنین مشکلی رو به رو شدید، مجددا Card را فرمت کنید. اما اگر همچنان مشکل باقی ماند، Card را دور بیاندازید.
در نهایت، سعی کنید کارت حافظه SD را در آورده و دوباره دستورات را اجرا نمایید. در نتیجه، خروجی زیر را دریافت خواهید کرد:
![خروجی دستورات تست ماژول میکرو اس دی بر روی سریال مانیتور پس از درآوردن کارت SD و اجرای دوباره دستورات](https://roboeq.ir/blog/wp-content/uploads/2021/10/CardInfo-Sketch-Output-in-Arduino-IDE-Initialization-Failed.png)
این دفعه، حتی SD Card هم مقداردهی نشد. این حالت زمانی رخ میدهد که در سیمکشی اشتباهی رخ داده باشد یا Card آسیب جبران ناپذیری دیده باشد. اگر سیمکشی به درستی انجام شده باشد، اما SD Card به درستی فرمت نشود، خروجی زیر را خواهید دید:
![خروجی دستورات تست ماژول بر روی سریال مانیتور در صورتیکه SD Card به درستی فرمت نشده باشد.](https://roboeq.ir/blog/wp-content/uploads/2021/10/CardInfo-Sketch-Output-in-Arduino-IDE-No-Proper-Format.png)
کد آردوینو- نوشتن و خواندن داده بر روی کارت حافظه sd
با فرض اینکه شما SD Card را به درستی مقداردهی کردهاید، وارد پروژه بعدی میشویم. در این بخش، برای راه اندازی ماژول sd card با آردوینو ، میخواهیم به خواندن و نوشتن داده روی کارت حافظه sd بپردازیم.
دستورات زیر نحوهی نوشتن و خواندن از یک فایل را نشان میدهند. پیش از اینکه به جزئیات بیشتری در مورد این دستورات بپردازیم، ابتدا آن را امتحان کنید.
#include <SPI.h>
#include <SD.h>
File myFile;
// change this to match your SD shield or module;
const int chipSelect = 10;
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
}
Serial.print("Initializing SD card...");
if (!SD.begin()) {
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");
}
// re-open the file for reading:
myFile = SD.open("test.txt");
if (myFile) {
Serial.println("test.txt:");
// read from the file until there's nothing else in it:
while (myFile.available()) {
Serial.write(myFile.read());
}
// close the file:
myFile.close();
} else {
// if the file didn't open, print an error:
Serial.println("error opening test.txt");
}
}
void loop()
{
// nothing happens after setup
}
زمانیکه کد را بارگذاری کردید، اگر همه چیز بهدرستی انجام شده باشد، خروجی زیر را در سریال مانیتور میبینید:
![خروجی دستورات تست ماژول میکرو SD Card بر روی سریال مانیتور در صورت اجرای صحیح تمامی موارد لازم](https://roboeq.ir/blog/wp-content/uploads/2021/10/Micro-SD-Card-SD-library-Output-on-Serial-Monitor.png)
اگر آردوینو را ریست نموده و دوباره دستورات را اجرا نمایید، داده جدید، بدون اینکه بر روی داده قبلی نوشته شود، به فایل اضافه خواهد شد.
![خروجی کد تست ماژول SD Card بر روی سریال مانیتور پس از ریست آردوینو و اجرای دوباره دستورات](https://roboeq.ir/blog/wp-content/uploads/2021/10/Micro-SD-Card-SD-library-Second-Output-on-Serial-Monitor.png)
توضیحات کد:
اما بیایید دستورات بالا را بررسی کنیم.
این دستورات با اضافه کردن کتابخانههای داخلی SD و SPI شروع میشود که امکان تبادل آسان اطلاعات با SD Card بر روی واسط SPI را به ما میدهد.
#include <SPI.h>
#include <SD.h>
پس از اینکه کتابخانهها اضافه شدند، پایه آردوینو را که به پایه chipSelect (CS) ماژول SD Card متصل شده است، معرفی میکنیم. پایه CS تنها پایهای است که مانند دیگر پایههای دیجیتال آردوینو ثابت نیست. از آنجاییکه از واسط سختافزاری SPI استفاده میکنیم و این پایهها قبلا در کتابخانه SPI تعریف شده است، نیاز به معرفی سایر پایههای SPI نیست. پس از معرفی پایهها، شئ myFile را برای ذخیره داده بر روی SD Card ایجاد میکنیم.
const int chipSelect = 10;
File myFile;
در قسمت بعد، در بخش ()setup برای نمایش نتایج بر روی سریال مانیتور از تبادل اطلاعات سریال استفاده میشود. به کمک تابع SD.begin() , SD Card را مقداردهی میکنیم. اگر مقداردهی به درستی انجام شده باشد، جمله if مقدار صحیح میگیرد و رشته “initialization done.” بر روی سریال مانیتور چاپ خواهد شد، در غیر این صورت رشته “initialization failed!” بر روی سریال مانیتور چاپ شده و برنامه پایان مییابد.
Serial.begin(9600);
Serial.print("Initializing SD card...");
if (!SD.begin()) {
Serial.println("initialization failed!");
return;
}
Serial.println("initialization done.");
در بخش بعدی، تابع ()SD.open فایلی با نام “test.txt”را باز خواهد کرد. در اینجا، چنین فایلی وجود ندارد، به همین دلیل توسط تابع ایجاد میشود. پارامتر دیگر FILE_WRITE فایل را در مد خواندن-نوشتن باز میکند.
myFile = SD.open("test.txt", FILE_WRITE);
زمانیکه فایل باز شد، پیغام “Writing to test.txt…” را بر روی سریال مانیتور چاپ خواهیم کرد. سپس با استفاده از تابع ()myFile.println، متن “testing 1, 2, 3.” را در فایل مینویسیم. پس از آن لازم است از تابع ()close استفاده کنیم تا مطمئن شویم داده نوشته شده، در فایل ذخیره شده باشد.
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");
}
حالا بیایید برای چک کردن عملیات نوشتن همان فایل را بخوانیم. برای این کار از همان تابع ()SD.open استفاده میکنیم. البته این بار از آنجاییکه فایل “test.txt” از قبل ایجاد شده است، تابع، تنها آن را باز خواهد کرد. سپس، با استفاده از تابع ()myFile.read فایل را میخوانیم و بر روی سریال مانیتور چاپ میکنیم. تابع ()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");
}
ازآنجاییکه این دستورات بهصورت آزمایشی نحوه نوشتن و خواندن فایل را نشان میدهد، دلیلی ندارد که چندین بار آن را اجرا کنیم. به همین دلیل به جای اینکه این دستورات در تابع ()loop قرار بگیرد و چندین بار اجرا شود، در تابع ()setup قرار گرفته و تنها یک بار اجرا خواهد شد.
void loop()
{
}
چند نکتهای که باید به آن توجه کنید
- شما میتوانید از توابع ()print و ()printIn برای نوشتن رشتهها، متغیرها و … استفاده کنید.
- تابع ()Read هر بار تنها یک کاراکتر را برمیگرداند و نمیتواند یک خط یا یک عدد را کامل بخواند.
- باید از تابع ()close برای بستن فایل استفاده کنید تا مطمئن شوید که همه دادهها برای همیشه نوشته شده است! این کار مقدار حافظهی RAM مورد استفاده را کاهش میدهد.
- شما میتوانید فایلها را در یک مسیر باز کنید. به عنوان مثال، اگر بخواهید یک فایل را در یک مسیر باز کنید، میتوانید SD.open(“/myfiles/example.txt”) را فراخوانی نمایید.
- کتابخانه SD Card، فایلهایی با نام طولانی را پشتیبانی نمیکند. در عوض برای کوتاه شدن اسامی فایلها از 3 format for file names استفاده میکند. به همین دلیل، نام کوتاهی برای فایلها انتخاب کنید. برای مثال datalog.txt اسم مناسبی است، اما نام “My Sensor log file.text” مناسب نیست.
- به خاطر داشته باشید که اسم فایل به کوچک یا بزرگ بودن حروف حساس نیست و اسامی datalog.txt و DataLog.Txt و DATALOG.TXT یکساناند.
دیگر توابع مفید در کتابخانه SD
توابعی که با شئ SD بهکار میرود:
تعدادی تابع مفید وجود دارد که میتوانید با شئ SD بهکار ببرید. برخی از آنها به شرح زیر است:
- برای چک کردن وجود یک فایل، از تابع exists(“filename.txt”) استفاده میشود که مقدار true یا false را برمیگرداند.
- برای پاک کردن یک فایل تابع remove(“unwanted.txt”) فراخوانی میشود. به این نکته دقت کنید با این تابع، فایل کاملا پاک میشود و راهی برای برگرداندن آن وجود ندارد.
- شما میتوانید با فراخوانی تابع mkdir(“/mynewdir”) یک مسیر فرعی برای قرار دادن برخی فایلها ایجاد کنید. اگر این مسیر از قبل وجود داشته باشد، هیچ اتفاقی نمیافتد اما همیشه اول تابع ()SD.exists را فراخوانی نمایید.
توابعی که با شئ File بهکار میرود:
توابع دیگری نیز وجود دارد که میتوانید با شئ فایل بهکار ببرید:
- تابع ()seek نشانگر خواندن-نوشتن را به موقعیت جدید میبرد. برای مثال seek(0) شما را به نقطه شروع فایل میبرد که میتواند خیلی کاربردی باشد.
- میتوانید تابع ()position را فراخوانی کنید تا موقعیت شما در فایل را نشان دهد.
- اگر میخواهید سایز یک فایل را بدانید، تابع ()size را فراخوانی کنید تا تعداد بایتهای یک فایل را به دست بیاورید.
- مسیرها و پوشهها، فایلهای خاصی هستند. شما میتوانید با فراخوانی تابع ()isDirectory مشخص کنید که فایل مورد نظر، یک مسیر است یا خیر.
- با فراخوانی تابع ()openNextFile میتوانید با داشتن یک مسیر، همه فایلهای آن مسیر را باز کنید.
- ممکن است بخواهید با فراخونی تابع ()openNextFile در یک مسیر، نام یک فایل را بدانید. در این حالت، تابع ()name را فراخوانی کنید. این تابع، یک اشارهگر را به آرایه کاراکتری با فرمت 8.3 برمیگرداند که میتوانید مستقیما با فراخوانی ()Serial.print آن را چاپ کنید.
خلاصه
همانطور که گفته شد، ماژول میکرو SD Card به شما این امکان را میدهد تا بتوانید اطلاعات مورد نظر خود را بر روی کارت حافظه بنویسید و آن را بخوانید. به همین دلیل، این ماژول گزینهای عالی برای ذخیره اطلاعات در یک پروژه آردوینو است.
در این مقاله نیز با آموزش راه اندازی ماژول میکرو SD Card با آردوینو تلاش کردیم تا این ماژول را بیشتر به شما بشناسانیم. امیدواریم از این مقاله نهایت استفاده را کنید. اگر نظر، سوال یا پیشنهادی دارید، حتما آن را با ما در میان بگذارید.
۶ دیدگاه. Leave new
خیلی عالی بود!
سلام به شما،
ممنون از شما
کامل و عالی توضیح دادید
ممنون از شما
سلاو و درود به شما حسین عزیز
خوشحالیم که این مقاله برای شما مفید واقع شده. 🙂
متشکریم از همراهیتون
سلام و تشکر از این همه توضیحات خوب و مفید و کاربردی. بسیار عالی و کاربردی بود.
ممنونیم از شما دوست عزیز، خوشحالیم که این آموزش مورد رضایت شما قرار گرفته:)