کارت های حافظه SD، یکی از ابزاهای پرکاربرد ذخیره سازی جانبی به شمار می روند. به کمک این حافظه ها می توان داده بی شماری از فایل های متنی، فایل های اکسل و حتی فیلم و عکس را نگه داری نمود. یکی از ویژگی های کلیدی آردوینو، قابلیت برقراری ارتباط با کارت های حافظه SD است. به کمک این قابلیت شما قادر هستید تا داده های مختلف را بر روی کارت ذخیره نمایید. این داده می توانند شامل مقادیر خوانده شده از ورودی آنالوگ، سنسورهای مختلف، زمان و حتی عکس های گرفته شده با دوربین ها باشد. جهت راه اندازی و کارت با کارت های SD، ماژول مخصوص وجود دارد. همچنین برای ذخیره و بازیابی داده بر روی کارت خواندن اطلاعات کارت و…، کتابخانه جامعی تحت آردوینو توسعه یافته است. پیشتر در آموزشی به بررسی نحوه ساخت یک دستگاه دیتالاگر با قابلیت ذخیره داده بر روی کارت SD، پرداختیم. با کلیک بر روی این لینک، می توانید این آموزش را مشاهده نمایید. در این آموزش به بررسی و تحلیل کتابخانه SD.h می پردازیم. طبق روال سلسله آموزش های کتابخانه، ابتدا به نحوه نصب آن می پردازیم. سپس به بررسی بردهای مورد پشتیبانی پرداخته می شود. در ادامه به تحلیل و بررسی توابع کلیدی می پردازیم. در نهایت با ارائه مثالی از کاربرد، به بحث خاتمه می دهیم. در ادامه با مرجع تخصصی آردوینو به زبان فارسی ، دیجی اسپارک همراه باشید.
نصب کتابخانه SD.h
پیش از ادامه بحث، ابتدا می بایست از نصب کتابخانه در محیط آردوینو، مطمئن شویم. این کتابخانه به صورت پیشفرض در محیط آردوینو نصب است. اما جهت اطمینان بیشتر، در منوی Tools آردوینو، مطابق تصویر زیر بر روی گزینه Manage Libraries کلیک کنید.
پس از کلیک بر روی گزینه مدیریت کتابخانه ها، با تصویر زیر رو به رو می شوید. منوی زیر کتابخانه های در دسترس را به شما نشان می دهد.
مطابق تصویر فوق، در قسمت کادر جستجو، می توانید نام کتابخانه مورد نظر خود را تایپ و آن را بیابید. ما در این قسمت، عبارت SD را تایپ می کنیم. پس از چند لحظه ،تعداد زیادی کتابخانه ظاهر می شوند. در این جا با توجه به کادر قرمز رنگ، کتابخانه SD را انتخاب می کنیم. چنانچه این کتابخانه نصب نیست، با کلیک بر روی گزینه install، آن را نصب کنید. همچنین در صورت تمایل، می توانید با کلیک بر روی گزینه update، کتابخانه را بروز رسانی کنید.
توجه: ورژن کتابخانه SD استفاده شده در این آموزش، ۱٫۲٫۲ است.
الزامات فنی و بردهای مورد پشتیبانی
پس از طی مرحله نصب کتابخانه SD.h، نوبت به بررسی الزامات و بردهای مورد پشتیبانی می رسد. ابتدا توجه داشته باشید که ماژول کارت SD، از پروتکل SPI جهت ارتباط با آردوینو استفاده می کند. در اکثر بردهای آردوینو نظیر UNO پایه های ۱۱، ۱۲ و ۱۳ برای ارتباط SPI هستند. در برد آردوینو MEGA، پایه های ۵۰،۵۱ و ۵۲ جهت پورت SPI به کار می روند. توجه داشته باشید که برای ارتباط با ماژول SD، می بایست یک پایه را جهت پایه (CS(Chip Select اختصاص دهید. این پایه در اکثر بردهای آردوینو، پایه شماره ۱۰ و در آردوینو مگا پایه شماره ۵۳ است.
توجه: شما می توانید از هر پایه دیگری به عنوان پایه CS استفاده کنید، اما در این حالت پایه CS سخت افزاری می بایست بدون اتصال باقی بماند.
از آنجاییکه بردهای ESP8266 از پروتکل SPI پشتیبانی می کنند، شما می توانید از این کتابخانه جهت ارتباط با بردهای ESP استفاده نمایید. ارتباط بین بردهای ESP با ماژول SD کارت، به صورت زیر برقرار می شود.
توابع کلیدی کتابخانه
در این قسمت به بررسی توابع کلیدی کتابخانه SD می پردازیم. در رابطه با توابع، در نظر بگیرید که ورودی ها از سمت چپ به راست، به ترتیب شماره های یک، دو، سه و… را به خود اختصاص می دهند. به عبارت دیگر، منظور از ورودی اول سمت چپ ترین ورودی بوده و سایر ورودی ها از ۲ به بعد، به خود شماره اختصاص می دهند.
تابع | ورودی ها | شرح |
boolean begin(uint8_t csPin) | ورودی از نوع بدون علامت ۸ بیتی | به کمک این تابع و با قرار گرفتن پایه مخصوص CS، کتابخانه راه اندازی می شود. در صورت موفقتی آمیز بودن راه اندازی خروجی true و در غیر اینصورت false خواهد شد. |
void end() | بدون ورودی | پس از خارج سازی کارت SD از ماژول، می بایست این تابع را فراخوانی کنید تا بتوتنیدد کارت جدید را درون شیار قرار دهید. |
boolean exists(const char *filepath) | ورودی از نوع اشاره گر رشته ای(آرایه ای از کاراکترها) | با قرار دادن مسیر یک فایل خاص در ورودی، چنانچه این فایل موجود باشد خروجی trueو در غیر اینصورت، false خواهد شد. |
boolean mkdir(const char *filepath) | ورودی از نوع اشاره گر رشته ای(آرایه ای از کاراکترها) | به کمک این تابع با قرار دادن مسیر درورودی، می توانید یک دایرکتوری مطابق مسیر ورودی بسازید. |
boolean rmdir(const char *filepath) | ورودی از نوع اشاره گر رشته ای(آرایه ای از کاراکترها) | به کمک این تابع می توانید دایرکتوری قرار گرفته در ورودی را حذف کنید. |
boolean remove(const char *filepath) | ورودی از نوع اشاره گر رشته ای(آرایه ای از کاراکترها) | به کمک این تابع می توانید فایل قرار گرفته در مسیر رورودی را حذف کنید.
توجه: در ورودی این تابع می توانید رشته (String) نیز قرار دهید. |
File open(const char *filename, uint8_t mode = FILE_READ) | ورودی اول: نام فایل از نوع آرایه کاراکتری
ورودی دوم از نوع بدون علامت ۸ بیتی جهت تعیین نوع باز کردن فایل |
به کمک این تابع، می توانید فایل را جهت خواندن یا نوشتن باز کنید. به همین منظور، نام فایل در ورودی اول از نوع آرایه کاراکتری و فرمت باز کردن آن در ورودی دوم قرار می گیرد. این تابع همواره پیش از نوشتن و یا خواندن می بایست فراخوانی شود.
توجه۱: برای ورودی اول می توانید رشته نیز استفاده کنید. توجه ۲: در صورتیکه ورودی دوم را خالی بگذارید، فایل به صورت خواندنی باز خواهد شد. توجه ۳: برای ورودی دم مقادیر زیر متصور است: FILE_WRITE: نوشتن FILE_READ: خواندن |
size_t write(uint8_t) | ورودی از نوع بدن علامت ۸ بیتی | به کمک این تابع می توانید داده در فایل ذخیره کنید. داده جهت ذخیره در ورودی تابع قرار می گیرد. این تابع جهت ذخیره سازی داده ها از نوع بایت که اسکی نیستند، مناسب است. |
size_t write(const uint8_t *buf, size_t size); | ورودی اول آرایه از نوع بدون علامت ۸ بیتی
ورودی دم سایز ارایه |
به کمک این تابع می توانید آرایه ای را در فایل ذخیره کنید. این آرایه در ورودی اول و اندازه آن در ورودی دوم قرار می گیرد. این تابع مناسب ذخیره داده ها از نوع بایت که اسکی نیستند، مناسب است. به عنوان نمونه، این تابع برای ذخیره عکس، مناسب است. |
int read() | بدون ورودی | به کمک این تابع می توانید داده ها را از فایل به صورت کاراکتر به کاراکتر بخوانید. |
int available() | بدون ورودی | این تابع تعداد کاراکترهایی از فایل را که هنوز نخوانده اید، محاسبه کرده و در خروجی قرار می دهد. |
boolean seek(uint32_t pos) | ورودی از نوع بدون علامت ۳۲ بیتی | به کمک این تابع می توانید موقعیت را در فایل تعیین کنید. این موقعیت در ورودی قرار می گیرد. خورجی این تابع در صورت موفقیت true ودر غیر اینصورت، false خواهد بود. |
uint32_t position() | بدون ورودی | این تابع موقعیت فعلی در فایل را نشان می دهد. این تابع در خروجی خود موقعیت فایل را قرار می دهد. |
println() | ورودی این تابع رشته و عدد است. | به کمک این تابع داده ها در فایل نوشته می شود. این تابع موقعیت نوشتن فایل را پس از نوشتن، یک خط به پایین می برد. این داده ها به صورت اسکی)رشته و عدد) خواهند بود. |
print() | ورودی این تابع رشته و عدد است. | به کمک این تابع داده ها در فایل نوشته می شود. این داده ها به صورت اسکی خواهند بود(رشته و عدد). |
uint32_t size() | بدون ورودی | این تابع سایز فایل باز شده را در خروجی خود قرار می دهد. خروجی از نوع بدون علامت ۳۲ بیتی است. |
close() | بدون ورودی | این تابع فایل را می بندد. همچنین از ذخیره داده ها در فایل، اطمینان حاصل می کند. توجه داشته باشید که برای استفاده فایل در دفعات بعدی، می بایست فایل را ببندید. |
پس از معرفی توابع کلیدی، نوبت به اجرای نمونه برنامه می رسد. در قسمت بعدی نمونه برنامه جهت ذخیره و بازیابی داده بر روی کارت SD را مشاهده می نمایید.
اجرای نمونه برنامه
پس از معرفی و شناخت توابع کلیدی کتابخانه SD.h، به اجرای نمونه برنامه می پردازیم. در نمونه برنامه زیر، فایلی را ایجاد کرده و اطلاعاتی را در آن ذخیره می کنیم. سپس این فایل را مجدد باز کرده و اطلاعات ذخیره شده را در سریال مانیتور نمایش می دهیم.
/* در این برنامه نحوه ذخیره و بازیابی داده را مشاهده می کنید. برای برد اردوینو، ااتصالات را به شرح زیر برقرار کنید: ** MOSI - pin 11 ** MISO - pin 12 ** CLK - pin 13 ** CS - pin 4 */ //فراخوانی کتباخانه های SPI و SD #include <SPI.h> #include <SD.h> File myFile; //ایجاد یک نمونه شی از کتابخانه SD void setup() { Serial.begin(9600); while (!Serial) { //انتظار برای فعال سازی سریال مانیتور } Serial.print("Initializing SD card..."); //راه اندازی کارت SD if (!SD.begin(4)) { //در صورتیکه کارت SD راه اندازی نشد.... Serial.println("initialization failed!"); while (1); } Serial.println("initialization done."); //باز کردن فایل برای نوشتن در صورتیکه فایل از قبل موجود نباشد، ایجاد می گردد 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"); } //باز کردن فایل برای خواندن اطلاعات توجه داشته باشید که با خالی قرار دادن پارامتر دوم تابع باز کردن فایل، فایل به صورت خواندنی باز می شود. myFile = SD.open("test.txt"); if (myFile) { Serial.println("test.txt:"); //تا زمانیکه داده در فایل موجود برای خواندن است: while (myFile.available()) { Serial.write(myFile.read()); //خواندن داده های فایل } // close the file: myFile.close(); //بستن فایل } else { //خطا در صورت عدم باز شدن صحیح فایل Serial.println("error opening test.txt"); } } void loop() { }
جمع بندی
در این آموزش به تحلیل و بررسی کتابخانه SD آردوینو پرداختیم. از آنجاییکه کارت های حافظه SD یکی از مهم ترین منابع ذخیره سازی جانبی به شمار می روند، برای کار و توسعه پروژه ها با این حافظه ها، کتابخانه جامعی تحت آردوینو توسعه یافته است. در این آموزش به تحلیل و بررسی کتابخانه SD پرداختیم. در ابتدا به نحوه نصب و برزرو رسانی آن اشاره شد. در ادامه بردها و ماژول های مورد پشتیبانی و نحوه برقراری اتصالات آن را بررسی کردیم. پس از این مرحله، به معرفی توابع کلیدی و کاربردی این کتابخانه اشاره نمودیم. در نهایت با ارائه مثالی، کاربرد توابع را در یک برنامه، مورد بررسی قرار دادیم.
لوازم متناسب با کتابخانه
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.
سلام ممنون از مطلب خوبتون
من وقتی کتابخانه sd را به کدم اضافه میکنم ارور حافظه میده. دلیلش چیه ؟
میخوام یکی سنسور spi رو در کارت بریزم.
سلام
لطفا متن ارور را قرار دهید.
سلام با توجه به پایه های روی شیلد ، بنظر میرسد برای راه اندازی تاچ ، نیاز به آی سی تاچ نیز میباشد
که بایستی بیرون از شیلد نصب گردد
چون پایه های کنترلی برای تاچ دیده نمیشود. صحیح است ؟ لطفا راهنمایی بفرمایید ممنون
سلام
خیر
پایه های تاچ روی شیلد تعبیه شده و نیازی به نام خارجی نیست.