جلسه بیست و نهم : راه اندازی ماژول کارت خوان با آردوینو

با سلام

مدت زمان بسیار طولانی ای نبودم و نتونستم وبلاگ رو به روز کنم . بابت این قضیه عذر خواهی می کنم و انشاءالله از این به بعد هر هفته آموزش یک قطعه رو براتون قرار میدم.
در ادامه رسالت توضیح پروتکل SPI ، تو این جلسه از راه اندازی ماژول کارت خوان صحبت می کنیم . توی بسیاری از پروژه ها نیاز هست که بتونیم دیتامون رو ذخیره کنیم. برای این کار دو تا راه حل وجود داره . یکی استفاده از یه ماژول کارت خوان و دخیره دیتا تو یه مموری کارته و دومی ذخیره دیتا توی یه دیتابیسه .
برای راه حل اول هیچ نیازی به اینترنت نداریم و فقط با وجود یه ماژول کارت خوان و ولتاژ دادن بهش مشکل حل میشه . اما اگر هدف ذخیره دیتا تو دیتابیس باشه باید حتما به اینترنت کانکت بشیم و برای این کار باید یه ماژول وایفای به پروژمون اضافه کنیم و دسترسی به یه اکسس پوینت داشته باشیم و ……………….
در نهایت چه از لحاظ سخت افزاری و چه از لحاظ نرم افزاری ، استفاده از یه ماژول کارت خوان + یه مموری کارت حتی 1 گیگ میتونه بسیار ساده تر و کم هزینه تر باشه .

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

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

مطابق قبل، اول سیم بندی این ماژول رو برای اتصال به آردوینو توضیح میدم. از اون جایی که پروتکل ارتباطی این ماژول SPI هست باز هم میریم سراغ همون چهار تا پین معروفمون یعنی DS , MISO , MOSI و SCK . سیم بندی به صورت شکل زیر خواهد بود:

باز هم مطابق سایر ماژول های پروتکل SPI در مورد پین CS ، این پین میتونه هر پین دیجیتال دلخواهی باشه که توی این جلسه من از پین دیجیتال شماره 10 استفاده کردم.
و اما بخش کد نویسی این ماژول . هدف از این قرار هست که توی یک فایل تکست به اسم Arduino اعداد 1 تا 100 رو ذخیره کنیم.
خدا رو شکر بعد از چند تا آموزش از استفاده از کتابخونه های خارج از نرم افزار خلاص شدیم و برای راه اندازی کارت خوان از کتابخونه SD خود آردوینو استفاده می کنیم.

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

قسمت 1 : کتابخونه هایی که تو این پروژه قراره استفاده کنیم رو اضافه ( include ) می کنیم . کتابخونه spi به این دلیل هست که داریم از پروتکل ارتباطی SPI استفاده می کنیم. دقت کنید صدا کردن این کتابخونه برای ما خیلی کار کد نویسی رو راحت میکنه چرا که لازم نیست بگیم پین 11 همون Mosi هست ، پین 12 همون Miso هست و پین 13 همون SCK . علاوه بر معرفی پینها باید کلاک و هزار تا مکافات دیگه رو هم کانفیگ کنیم. اما با یه اینکلود ساده این همه دردسر رو از سر خودمون باز کردیم . بنابراین به این کتابخونه احترام بزارید . کتابخونه SD هم که کتابخونه ای هست که تو این پروژه با کمکش با کارت خوانمون قراره دیتا رد و بدل کنیم.

قسمت 2 : این قسمت از کلاس File یه آبجکت به نام myFile می سازیم (برید برنامه نویسی بخونید تا عمق ماجرا رو بفهمید )

قسمت 3 : قدم اول میایم بادریت ارتباط سریال بین کامپیوتر و آردوینومون رو روی 9600 تعریف می کنیم. شاید همین جا یه سوال تو ذهنتون پیش بیاد که مگه پروتکل ارتباطی کارت خوان SPI نبود حالا چرا سر و کله ارتباط سریال پیدا شد؟ این سریال همونطور که گفتم بین کامپیوتر و آردوینو برقرار میشه و هیچ ربطی به راه اندازی کارت خوان نداره . ما به کمک این ارتباط دیتا یا اطلاعاتی که می خوایم رو تو کنسول چاپ می کنیم. مثلا به همین قسمتی که شماره گذاری کردم دقت کنید. کل کاری که توی این قسمت میخوایم انجام بدیم اینه که ببینیم آیا ماژول کارت خوان رو از لحاظ سخت افزاری درست به آردوینو وصل کردیم یا نه . حالا چجوری بفهمیم ؟ به زبون دیگه آردوینو چجوری به ما بگه آره درست وصل کردی یا نه ؟ با استفاده از همین کنسول این کار رو انجام میده . در واقع آردوینو به کامپیوتر میگه ، کامپیوتر از طریق همین کنسول آردوینو به ما میگه . حالا ما تو این قسمت یه سریال پرینت می کنیم تحت عنوان Initializing SD card یعنی میخوایم پروسه چک کردن ارتباط سخت افزاری رو شروع کنیم . بعد یه if داریم که میگه آیا کارت خوان با پین CS شماره 10 ، فعال هست یا نه ؟ دستور begin در واقع میره ماژول کارت خوان رو با پین CS شماره گذاری شده فعال می کنه ، اگر ماژول فعال بشه و همه چیز اوکی باشه پیغام initialization done تو کنسول نمایش داده میشه اما اگر از لحاظ سخت افزاری یه جای کار بلنگه پیغام initialization failed!نمایش داده میشه . از این به بعد به جای این که یک کیلومتر توضیحات بنویسم که چرا این سریال پرینتا رو میزاریم و … به زبون علمی با هم حرف میزنیم . میگیم برای دیباگ کد نویسی و ارتباط سخت افزاریمون از این پیغام ها استفاده می کنیم.

قسمت 4 : این خط از برنامه میره توی کارت حافظه یه فایل تکست (.txt) به نام Arduino تشکیل میده . به جای این Arduino میتونه هر اسم دیگه ای جایگزین بشه . همچینین به جای فایل تکست میتونه هر فرمت دیگه ای هم به وجود آورد برای این کافیه به جای .txt فرمت مطلوب تایپ بشه .

قسمت 5 و 6 : این قسمت با یه if شروع میشه. میاد بررسی می کنه آیا فایلی که مد نظر ماست باز شده یا نه اگر فایل سالم و سلامت باز شده باشه ، از این if رد میشه و میره کاری که باید انجام بده رو انجام میده. اگر شرایط if نقض بشه به عبارتی فایل Arduino تشکیل شده باز نشه میره تو قسمت 6 و Else رو اجرا می کنه . اجرا شدن else یعنی نمایش پیغام error opening test.txt ( این جا من تو کپی کردن کد یه سوتی دادم فهمیدین ؟؟؟؟؟؟) بنابراین اگر فایل سالم باشه و بتونه باز بشه وارد if میشه ، حالا فایل باز شده و قراره توی فایل اعداد 1 تا 100 نوشته بشه . برای دیباگ اولش یه پیغام می نویسیم که بدونیم از این if رد شدیم و آماده دیتا نوشتنیم ( پیغام Writing to Arduino.txt ) . بعد یه حلقه for داریم که قراره 100 بار تکرار بشه ، در هر بار انجام شدن حلقه for شماره حلقه ( همون i ) توسط دستور myFile.println ریخته میشه توی فایل Arduino . به جای این i هم میشه هر چیز دیگه ای ریخت توی اون فایل مثلا میتونین یه استرینگ مثل salam رو بریزید :(“myFile.println(“salam
دقت کنید که از myFile.println نه myFile.print . درست مثل دستور سریال ٰ‌پرینت این جا هم اگر ln بزاری میره خط بعد توی فایل txt چاپ می کنه. وقتی عملیات نوشتن توی فایل تمام شد با دستور myFile.close فایل رو میبنده . بستن فایل بسیار کار واجبی هست . بسیار. چرا که تا زمانی که این فایل رو نبندید روی هیچ فایل دیگه ای نمیتونید رایت کنید. در واقع با این کتابخونه امکان نوشتن همزمان روی دو تا فایل رو ندارید. باید یکی رو باز بکنید بنویسید ببندید بعد برید سراغ یه فایل دیگه .

قسمت 7 : دوستان آیا دقت کردید که قسمت 5 و 6 توی ستاپ انجام شده ؟ و تابع loop خالیه خالیه . دلیلش کاملا روشنه . چون من میخواستم عملیات نوشتن روی کارت حافظم فقط یک بار انجام بشه بنابراین توی ستاپ گذاشتمش. و از اون جایی که درد و دل دیگه ای نداشتم که با مموری بکنم تابع loop رو خالی رها کردم.

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


برای دانلود عکس ها و کد به این لینک انجمن سر بزنید.