پروتکل USB یکی از مهم ترین و پرکاربردترین پروتکل ها در زمینه تبادل داده در دستگاه های مختلف الکترونیکی به شمار می رود. به کمک این پروتکل می توان ابزارهای مختلف نظیر موس، USB فلش، هارد و …. را به سیستم های مختلف متصل نمود. از آنجاییکه بردهای آردوینو از پروتکل USB بی بهره هستند، لذا نیاز به ماژول های جانبی جهت ارتباط این بردها با دستگاه های دارای پورت USB، امر ی مهم است. یکی از ماژول های پرکاربرد در زمینه USB، ماژول CH376S است. این ماژول، یک ماژول کاربردی جهت تبدیل پورت USB به پورت های سریال UART و SPI است. در کنار این، این ماژول می تواند پورت USB را به پورت مواری پارالل نیز، تبدیل نماید. جهت راه اندازی و کار با این ماژول، کتابخانه ch376msc.h نیز برای آردوینو توسعه یافته است. به کمک این کتابخانه، می تواینم به سادگی و در کوتاهترین زمان ممکن، بر روی حافظه های فلش USB از طریق آردوینو، داده بنوسیم و بخوانیم. در این آموزش به تحلیل و بررسی توابع کلیدی این کتابخانه می پردازیم. مطابق سایر آموزش ها، ابتدا نحوه نصب این کتابخانه را بررسی می کنیم. سپس در ادامه به الزامات و نکات فنی می پردازیم. پس از آن، توابع کلیدی و کاربردی این کتابخانه را مورد بررسی قرار می دهیم. در نهایت با ارائه مثالی، نحوه استفاده از توابع را در یک برنامع عملی، بررسی خواهیم نمود. در ادامه، با مرجع تخصصی رزبری پای و آردوینو به زبان فارسی، دیجی اسپارک، همراه باشید.
نصب کتابخانه ch376ms.h
به منظور استفاده از کتابخانه Ch376msc.h، ابتدا می بایست آن را نصب کنیم. در این قسمت به نصب کتابخانه سنسور شتاب سنج با جستجو در مخازن آردوینو می پردازیم. به همین منظور، ابتدا در نرم افزار آردوینو بر روی گزینه Tools و سپس Manage Libraries را کلیک کنید. پس از کلیک بر روی این گزینه، با تصویر زیر رو به می شوید. این منو کتابخانه های در دسترس را به شما نشان می دهد. شما نیز می توانید با جستجوی نام کتابخانه مورد نظر خود، آن را در مخازن آردوینو یافته و سپس نصب کنید.
پس از اینکه کادر جستجو ظاهر شد، عبارت ch376s را تایپ کنید. با تایپ این عبارت، تصویر زیر مشاهده می شود. بر روی عبارت install کلیک کنید و کتابخانه را نصب کنید.
پس از نصب کتابخانه، نوبت به بررسی الزامات فنی و نکات آن می رسد. قسمت بعدی به این موضوع می پردازد.
الزامات و نکات فنی کتابخانه Ch376msc.h
پس از نصب کتابخانه، نوبت به بررسی الزامات فنی آن می رسد. این کتابخانه بر روی برد های زیر تست و اجرا شده است. توجه داشته باشید که این کتابخانه هم از سریال سخت افزاری و هم سریال نرم افزاری جهت ارتباط بهره می برد.
برد | SPIپشتیبانی از | HW Serialپشتیبانی از | SW Serialپشتیبانی از |
Arduino (AVR) | OK | OK | OK |
DUE (SAM) | OK(با اتصال پایه int) | OK | NO |
ZERO (SAMD) | OK | تست نشده | NO |
STM32 cores | OK | !NO | NO |
STM32duino | OK | OK | NO |
ESP8266 | OK(با اتصال پایه int) | NO | OK |
ESP32 | OK | تست نشده | تست نشده |
همانطور که پیشتر گفته شد، این مبدل قابلیت تبدیل پروتکل USB به SPI و UART را دارد. برای این مورد می بایست وضعیت جامپر و پایه های ماژول به صورت های زیر تغییر یابد. همچنین در این تصویر باودریت نیز با توجه به وضعیت قرار گیری جامپرها، تعیین شده است.
توجه داشته باشید که این ماژول جهت ذخیره و بازیابی داده ها از FAT12، FAT16 و FAT32 نیز پشتیبانی می کند. پس از بررسی نکات فنی، نوبت به توابع کتابخانه ای می رسد. این مورد را در قسمت بعدی بررسی می کنیم.
توابع کلیدی کتابخانه Ch376msc.h
در این قسمت به بررسی توابع کلیدی و کاربردی کتابخانه مر پردازیم. توجه داشته باشید که ورودی های توابع را از سمت چپ به راست به ترتیب از شماره ۱، ۲ و… شماره گذاری می کنیم.
شرح | ورودی ها | نام تابع |
این تابع در حقیقت تابع سازنده کلاس کتابخانه است. ورودی اول این تابع نام(آدرس) سریال سخت افزاری و ورودی دوم سرعت تبادل داده است. به عنوان مثال در برد آردوینو ورودی نخست به صورت Serial و ورودی دوم ۹۶۰۰ خواهد بود. | ورودی نخست سریال سخت افزاری
ورودی دوم سرعت باودریت |
Ch376msc(HardwareSerial, speed) |
در این حالت فراخوانی می توانید از سریال نرم افزاری هم استفاده کنید. باودریت سریال نرم افزاری پیشتر هنگام فراخوانی تابع begin آن تعیین می شود. | ورودی جهت تعیین سریال نرم افزاری | Ch376msc(SoftwareSerial) |
به کمک این ماژول می توان با کارت های SD نیز ارتباط برقرار نمود. ورودی های این تابع به شکل زیر توضحی داده می شوند.
ورودی اول: تعیین پایه CHIP SELECT جهت ارتباط SPI
ورودی دوم: تعیین پایه وقفه، این ورودی اختیاری است اما اگر از پورت SPI دستگاه دیگری نیز استفاده می شود، این ورودی می بایست تعیین گردد. ورودی سوم: تعیین سرعت ارتباط SPI، این ورودی هم اختیاری استو مقدار پیشفرض ارتباط ۱۲۵ کیلو هرتز است. |
ورودی ها جهت تنظیم پارامترهای ارتباط SPI برای کارت SD | Ch376msc(uint8_t spiSelect, uint8_t intPin, SPISettings speed = SPI_SCK_KHZ(125)); |
به کمک این تابع می توان تشخیص داد که آیا درایو usb به پورت ماژول متصل شده و یا از آن جدا شده است. هر کدام از این اتفاق ها، خروجی این تابع را true می نماید. | بدون ورودی | bool checkIntMessage() |
به کمک این تابع می توانیم از آمادگی درایو متصل به ماژول(فلش) جهت تبادل داده مطمئن شویم. در صورت آمادگی، خروجی true خواهد بود. | بدون ورودی | bool driveReady() |
به کمک این تابع نام فایلی که قرار است عملیات ذخیره و بازیابی صورت گیرد، تعیین می شود. توجه داشته باشید که تعداد کاراکتر های نام فایل ۸ عدد بیشینه است. | ورودی از نوع رشته | void setFileName(const char* filename = “”) |
به کمک این تابع فایل را جهت خواندن و نوشتن باز می کنیم. قبل از انجام هر عملیاتی، فایل می بایست باز شود. | بدون ورودی | void openFile() |
به کمک این تابع فایل باز شده پس از انجام عملیات، بسته می شود. توجه داشته باشید که پس از هر ذخیره و بازیابی، جهت استفاده های بعدی فایل می بایست بسته شود. | بدون ورودی | void closeFile(); |
به کمک این تابع شما می توانید محتویات فایل را بخوانید و در ورودی اول ذخیره کنید. همچنین ورودی دوم سایز داده ها را مشخص می کند. این سایز در حقیقت اندازه ارایه ورودی اول است. روند خواندن داده ها و ذخیره آن در ورودی اول، تا زمانیکه خروجی تابع true باشد، ادامه خواهد یافت. | ورودی اول از نوع آرایه ای از کاراکترها
ورودی دوم سایز آرایه ورودی اول |
uint8_t readFile(char* buffer, uint8_t b_size) |
این تابع مشابه تابع بالا عمل می کند. اما شما می توانید با تعین کاراکتر دلخواه در ورودی اول، تعیین کنید که روند خواندن از فایل تا رسیدن به کاراکتر ورودی نخست ادامه یابد. داده های خوانده شده در ورودی دوم ذخیره شده و ورودی سوم تعیین کننده اندازه ارایه ورودی دوم است. این تابع زمانیکه بافر پر شده باشد و کاراکتر یافت نشده باشد، true خواهد شد. | ورودی اول از نوع کاراکتر جهت تعیین اتمام خواندن
ورودی دوم آرایه ای از کاراکتر ها جهت ذخیره داده ها داده های خوانده شده از فایل ورودی سوم جهت تعیین اندازه آرایه کاراکتری جهت ذخیره فایل
|
bool readFileUntil(char trmChar, char* buffer, uint8_t b_size) |
به کمک این تابع می توانید تعداد عددهای موجود در فایل را به دست آورید.
|
ورودی از نوع کاراکتر جهت اتمام خواندن | int32_t readLong(char trmChar = ‘\n’) |
به کمک این تابع می توانید داده ها را بر روی فلش مموری ذخیره کنید. این داده ها در ورودی اول قرار گرفته و اندازه آن(تعداد کاراکترها) در ورودی دوم قرار می گیرد. | ورودی اول از نوع آرایه از کاراکترها
ورودی دوم اندازه آرایه کاراکتری |
uint8_t writeFile(char* buffer, uint8_t b_size) |
به کمک این تابع نوع ارتباط با دیوایس ذخیره سازی تعیین می گردد. اگر ورودی ۰ تعیین شود درایو فلش و اگر ۱ تعیین شود، درایو sd تعیین می شود. | ورودی از نوع بدون علامت ۸ بیتی جهت تعیین نوع درایو | void setSource(uint8_t inpSource) |
به کمک این تابع می توانیم رسیدن به انتهای فایل را تشخیص دهیم. زمانیکه به انتهای فایل برسیم، خروجی true خواهد شد. | بدون ورودی | bool getEOF() |
این تابع اتصال و جدا شدن فلش usb را به پورت تشخیص می دهد. اگر اتصال صورت گیرد خروجی true و اگر فلش جدا شود خروجی false خواهد بود. | بدون ورودی | bool getDeviceStatus(); |
به کمک این تابع می توانید موقیعت جهت نوشتن در و خواندن از فایل را تعیین کنید. این وقعیت را می توانید به صورت عدد در ورودی قرار دهید. همچنین با قرار دادن عبارت CURSOREND، موقعیت در انتهای فایل قرار می گیرد. | ورودی از نوع بدون علامت ۸ بیتی جهت تعیین موقعیت فایل | uint8_t moveCursor(uint32_t position) |
به کمک این تابع می توان تعداد سکتورهای خالی در حافظه فلش را بدست آورد. این تعداد در خروجی تابع قرار می گیرد. | بدون ورودی | uint32_t getFreeSectors() |
توابع فوق مهم ترین و کلیدی ترین توابع کار با این کتابخانه به شمار می روند. توجه داشته باشید که برای ارتباط با SD، ار توابع کتابخانه SD که پیشتر در این لینک آن را تحلیل کرده ایم، می توانید استفاده نمایید. در ادامه این آموزش به ارائه مثالی جهت ذخیره و بازیابی داده در فلش مموری می پردازیم.
اجرای یک نمونه برنامه
در این قسمت به اجرای یک نمونه برنامه می پردازیم. در این برنامه یک فایل روی فلش مموری ایجاد کرده و یک عبارت متنی را در آن ذخیره می کنیم.
#include <Ch376msc.h> Ch376msc flashDrive(Serial, 9600); // استفاده از پورت سریال سخت افزاری جهت ارتباط با ماژول char data[]={"salam"}; void setup() { Serial.begin(9600); //تعیین باودریت flashDrive.init(); } void loop() { if(flashDrive.checkIntMessage()){ //در صورتیکه فلش متصل شده باشد. if(flashDrive.getDeviceStatus()){ //در صورتیکه فلش با ماژول ارتباط برقرار کرده باشد. Serial.println(F("Flash drive attached!")); flashDrive.setFileName("TEST1.TXT"); //تعیین اسم فایل if(flashDrive.openFile() == ANSW_USB_INT_SUCCESS){ //باز کردن فایل، توجه عبارت قرار گرفته بعد از == به عنوان باز شدن موفق فایل است. flashDrive.moveCursor(CURSOREND); //انتقال cursor به انتهای فایل } for(int a = 0; a < 20; a++){ //برای ۲۰ بار عبارت salam را در فایل می نویسیم. if(flashDrive.getFreeSectors()){ //در صورتیکه فضای خالی وجود داشته باشد داده ها نوشته می شوند. flashDrive.writeFile(data, strlen(data)); //نوشتن در فایل } } flashDrive.closeFile(); //بستن فایل while(1); //توقف برنامه } } }
لوزام متناسب با کتابخانه
جمع بندی
در این آموزش به تحلیل و بررسی کتابخانه msc3h376s پرداختیم. به کمک این کتابخانه شما می توانید به سادگی با ماژول USB کار کنید. ماژول مبدل پورت سریال به USB، یک ماژول کاربردی جهت اتصال فلش های USB به بردهای آردوینو است. به کمک این ماژول شما می توانید به کمک پورت سریال سخت افزاری آردوینو و یا با تعریف پورت سریال نرم افزاری، با این ماژول ارتباط برقرار کرده و داده ها را از فلش مموری خوانده و یا بر روی آن داده ای ذخیره نمایید. در این آموزش به تحلیل و بررسی این کتابخانه کلیدی و کاربردی از حیث نحوه نصب، نکات فنی و تحلیل توابع کلیدی و کاربرد پرداختیم. در نهایت با ارائه مثالی، نحوه استفاده از توابع را در یک برنامه ، مشاهده نمودیم.
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.
سلام وقت شما بخیر.
از بابت این آموزش از شما بسیار ممنونم.
فقط یه سوال خدمتتون داشتم. من برد آردوینو UNO رو میخوام استفاده کنم برای این برنامه. میخواستم بدونم پین های RX و TX ماژول رو به کدوم یکی از پین های آردوینو باید متصل کرد؟
سلام و متشکرم از شما
هم می توانید نرم افزاری تعیین کنید و هم سخت افزاری، اگر RX و TX نرم افزاری تعیین شد، شما به هریک از پایه های GPIO می توانید وصل کنید. اما برای اتصال سخت افزاری(که پیشنهاد می کنم از روش سخت افزاری استفاده کنید) پایه RX ماژول به پایه TX یا شماره ۱ برد اردوینو و پایه TX ماژول به پایه ۰ یا RX برد اردوینو می بایست متصل گردد.
توجه: پیش از آپلود برنامه روی آردوینو UNO، کابل متصل به پایه RX برد آردوینو را جدا کنید، سپس کد را آپلود کرده و پس از آپلود مجددا کابل را متصل کنید.
عرض سلام
من با ماژول ch376s بدون دریافت خطا فایل تولید می کنم. فایلهای تولیدی توسط خود ماژول و Linux بدون مشکل خوانده می شود ولی با windows قابل خواندن نیست. آیا شما هم با این مشکل مواجه شده اید؟ یا راهکاری برای آن می شناسید؟
سلام
من هم متاسفانه این مشکل را با ویندوز دارم. ظاهرا آنطور که لینوکس mount می کند، ویندوز شیوه دیگری را در پیش می گیرد. از دیگر دوستان تقاضا دارم در بحث شرکت کنند.