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

سلام
این جلسه و چند جلسه آینده قصد دارم در مورد پروتکل ارتباطی i2c صحبت کنم. سنسورها و محرک های زیادی هستن که با این پروتکل کار می کنن و بنابراین اطلاع از نحوه کار این پروتکل لازمه .

برای شروع از یه ماژول ساده شروع می کنیم : ماژول نمایشگر OLED . این ماژول رو می تونید از اینجا ببینید:

جلسه های اول همین وبلاگ در مورد یه نمایشگر دیگه هم صحبت کردیم . نمایشگر کاراکتری 1602 . و این دومین نمایشگری هست که قصد داریم روش تمرکز کنیم و راه بندازیم .
از ضرورت های استفاده از نمایشگر که قائدتا مجددا حرفی نمی زنم چرا که بر هیچکس پوشیده نیست توی پروژه ها چقدر می تونه کار رو زیبا کنه و البته کار رو راه بندازه .
یه جاهایی که دسترسی مون به کامپیوتر قطع میشه میتونیم طوری کد نویسی کنیم که از LCD برای دیباگ برناممون استفاده کنیم . اما این که OLED دیگه چه جور نمایشگریه و فرقش با LCD چی هست رو خیلی ریز و بازاریابانه از اینجا بخونید.

و اما مثل همیشه اول میریم سراغ ارتباطات سخت افزاری . قدم اول باید بریم اسم پینهای روی OLED رو بخونیم. اسم پینها به این صورت هست : GND VCC SCL SDA .
تکلیف GND و VCC که معلومه میمونه اون دو تا پین دیگه . یه سرچ کوچیک نشون میده که این دوتا پین مربوط به ارتباط I2C هستن .
سیم بندی ارتباط این نمایشگر با آردوینو به صورت زیر هست :

همونطور که میبینید SCL وصل شده به پین آنالوگ شماره 4 و پین SDA وصل شده به پین آنالوگ شماره 5 آردوینو . و اما سوال همیشگی : آیا میشه به جای A4 و A5 آردوینو از پینهای دیگه ای استفاده کرد ؟
جواب اینه که خیر. به جای این دو تا پین از هیچ دو پین دیگه ای نمیشه استفاده کرد. یعنی نمیتونی بری سمت پین های دیجیتال یا حتی بقیه پین های آنالوگ . توی هر برد آردوینویی اعم از UNO ، مگا ، DUE و …. پینهای مشخصی برای ارتباط I2C استفاده میشن که جدولشو میتونین اینجا ببینین:

چون ما برد پایه ای که تو وبلاگ استفاده می کنیم UNO هست بنابراین از پینهای آنالوگ شماره 4 و 5 استفاده می کنیم.

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

قسمت 1 : این قسمت مثه همیشه میام کتابخونه هایی که استفاده کردیم رو معرفی می کینم . اول کتابخونه Wire معرفی شده . یادتونه وقتی از پروتکل SPI استفاده میکردیم کتابخونه SPI رو اینکلود میکردیم . تو ارتباط I2C همیشه کتابخونه Wire رو اینکلود می کنیم. با استفاده از این کتابخونه میگیم پین شماره 4 و 5 آنالوگ آردوینو دارن به عنوان پین های ارتباط I2C استفاده میشن. دو تا کتابخونه دیگه ای هم که اینکلود کردیم و میتونین از اینجا دانلودشون کنین کتابخونه هایی هستن که تو این پروژه ازشون استفاده می کنیم .
با استفاده از این کتابخونه ها خیلی راحت تر می تونیم به OLED مون فرمان بدیم. یعنی به جای این که مستقیم با خود OLED بخوایم سر و کله بزنیم میریم سراغ دستورهایی که این کتابخونه ها دارن . واضح تر بگم ما با کتابخونه و دستورهای آدمیزادیش سر و کله میزنیم ، کتابخونه با OLED و تنظیمات غیر آدمیزادیش سر و کله میزنه. بنابراین تاکید میکنم به کتابخونه ها احترام بزارید.

قسمت 2 : به ما چه. واقعا به ما چه. یه قسمت از کد نویسی ای که توی کتابخونه های اینکلود شده انجام شده بر اساس ارتباط SPI هست . از اونجایی که تو ارتباط SPI پین ریست پین مهمی هست تو کد نویسی صدا شده  و روش هم پردازش هایی انجام شده اما نمایشگری که ما باهاش کار میکنیم I2C هست و پین ریست به ما چه . مهم ترین چیزی که از این بخش به ما مربوطه آبجکت display هست که ساخته شده و ما توی تمام بخش های کد نویسی از این آبجکت استفاده می کنیم.

قسمت 3 : مهم ترین بخش راه اندازی یه قطعه با ارتباط I2C همین قسمت هست. فک کنید یه پست چی یه نامه داره که باید به مقصد برسونه . مهم ترین بخش آدرس کد پستی هست . در واقع هر خونه با کد پستیش شناسایی میشه . اگر پست چی اون کد پستی رو نداشته باشه عملا نامه به مقصد نمیرسه . تمامی قطعات I2C هم درست مثه خونه ها یه آدرس دارن . داده ای که قراره از آردوینو به اون قطعه I2C منتقل بشه باید مشخص بشه کجا میره . در واقع ما باید به آردوینو بگیم اگه قراره واسه OLED ما دیتا بفرستی اون رو بفرست به فلان آدرس . این خط کد رو ببیند. دو تا ارگومان داره . آرگومان اولش رو بعدا توضیح میدم ، آرگومان دوم نوشته 0x3C . این 3C همون آدرس این قطعه I2C ما هست . دقت کنید که آدرس به شکل هگز نوشته شده . حالا این که این آدرس چطوری پیدا میشه و به دست میاد رو تو جلسه بعدی صحبت می کنیم.
اما در مورد آرگومان اول که نوشته SSD1306_SWITCHCAPVCC . یه قانون ثابت در مورد راه اندازی تمام LCD ها و OLED ها وجود داره و اون هم اینه که چیپ درایور اونها معیار راه اندازیشون هست. الان این SSD1306 که نوشته چیپ درایور این OLED ای هست که ما داریم باهاش پروژمون رو انجام میدیم. خیلی خیلی مهمه که بدونیم LCD یا OLED ای که میخوایم راهش بندازیم چیپ درایورش چی هست. تو بعضی موارد وقتی چیپ درایور عوض میشه کافیه یه تغییر کوچیک توی کد بدیم تا با درایور جدید هم سازگار بشه اما تو بعضی موارد انقدر کانفیگ و رجیسترهای داخلی چیپ های درایور متفاوته که کلا کتابخونه رو عوض می کنیم. دقت کنید که این begin ای که نوشته شده میره توی کتابخونه Adafruit_SSD1306 و یه سری دستورها رو مربوط به این چیپ اجرا می کنه.

قسمت 4 : یادتونه تو قسمت 3 گفتم begin یه سری دستور رو اجرا میکنه . یکی از اون دستورها اینه که لوگو ادافروت رو نشون میده . فک کنید طرف اومده یه کتابخونه نوشته ، دردسرای ما رو برای سر و کله زدن با زبون غیر آدمیزادی OLED از بین برده بعد از خودش یه رد و نشون به جا نزاره ؟ نمیشه که . به محض این که دستور begin تو بخش 3 اجرا میشه لوگو ادافروت نمایش داده میشه . ما با دستور clearDisplay میایم هر چیزی که رو صفحه هست رو پاک میکنیم. درست بعد از begin هم این کار رو می کنیم که چشممون به جمال لوگو روشن نشه . بعدشم یه تاخیر 100 میلی ثانیه میزاریم تا نمایشگر به یه پایداری برسه و برسیم سراغ کارهایی که خودمون میخواستیم انجام بدیم. دقت کنید این روشی که به کار بردیم تا لوگو رو نبینیم بی نهایت غیر اصولی و غیر حرفه ای هست. در واقع خیلی ساده و راحت می تونیم بریم تو کتابخونه و اون دستور رو پاک کنیم اما امان از تنبلی !

قسمت 5 : توی قسمت 5 اومدیم از تابعی استفاده کردیم که تو قسمت 9 معرفیش می کنیم . یه کلیت بخوام بگم اینه که ما خیلی جاها تو کدنویسی میخوایم یه سری عملیات رو تکرار کنیم . به عنوان مثال همین عملیات نوشتن توی OLED رو در نظر بگیرید . یه نوشتن ساده مراحل زیر رو داره :
1. تعیین کردن سایز نوشته
2. تعیین کردن رنگ نوشته
3. تعیین کردن نقطه شروع برای نوشتن
4. تعیین کردن متنی که قرار نمایش داده بشه
5. ارسال فرمان نمایش

شاید باورتون نشه ولی برای این که یه متن خشک و خالی روی یه نمایشگر نشون داده بشه باید 5 تا کار انجام بشه . یه راه حل باهوشانه !!! اینه که هر بار بخوایم چیزی رو چاپ کنیم هر 5 تا خط رو بنویسیم ( فک کنید برای چاپ چهار خط پشت سر هم باید 20 تا خط کد بزنیم ) و یه راه حل باحال اینه که بیایم یه تابع بنویسیم برای عملیات چاپ داده روی OLED . با این کار همون 4 خطی که بخوایم پشت سر هم بنویسیم رو میتونیم با 9 خط کد جمع کنیم حالا 20 خط کجا 9 خط کجا . منهای این که تعددخطوط کد نویسیمون کم میشه برنامه ای هم که نوشتیم بسیار تمیز و خوانا درمیاد.
ما هم برای این پروژمون از روش دوم یعنی تابع نویسی استفاده کردیم ( راه حل باهوشانه ماله باهوشا ) . یه تابع تعریف کردیم به اسم TextDisplay ( این اسم میتونست هر اسم دیگه ای هم باشه بعدا میگم ) که سه تا آرگومان ورودی داره . آرگومان اول دیتایی که هست که قراره روی نمایشگر چاپ بشه . آرگومان دوم شماره ستونی هست که میخوایم نوشتن دیتا از اون شروع بشه و آرگومان سوم سطری هست که میخوایم نوشتن دیتا از اون شروع بشه . دقت کنید که رنگ و سایز رو تو آرگومان ورودی تابع نیاوردیم که دلیلش رو تو قسمت 9 میگم. بعد از این دستور با همون دستور clearDisplay کل صفحه نمایشگر رو پاک می کنیم. شاید یه سوال به ذهنتون برسه که چاپ میکنیم بعد پاک میکنم ؟ با این کار که اصلا دیتایی نمی بینیم رو نمایشگر . این سوال رو تا پایان قسمت 9 نگه دارید.

قسمت 6 : توی این قسمت یه حلقه for داریم که 11 بار تکرار میشه. توی هر بار اجرای حلقه آردوینو یه مستطیل با لبه های گرد میکشه ( با استفاده از تابع RectangleShow که خودمون تعریفش می کنیم تو قسمت 10 ) بعد از اون شماره حلقه یا همون i رو با دستور TextDisplay چاپ می کنه  . دقت کنید تو قسمت 5 عبارت Hello از نقطه 0 و 0 نوشته میشه یعنی اینجا :

اما تو این قسمت شماره حلقه i که قراره چاپ بشه توی سطر 10 و ستون 55 نوشته میشه یعنی تقریبا وسط صفحه نمایش و اون مستطیلی که کشیدیم:

پایان هر حلقه هم صفحه کامل پاک میشه یه دونه به متغیر حلقه یعنی i اضافه میشه و دوباره مراحل قسمت 6 تکرار میشه. به این شکل اعداد 0 تا 10 نمایش داده میشن.

قسمت 7 : با دستور TextDisplay عبارت Good Bye توی سطر 5 وستون 30 نمایش داده میشه:

قسمت 8 : تمام این کدهایی که تا الان گفتیم تو تابع ستاپ نوشته شده بودن. علت این امر هم این بود که میخواستیم فقط یک بار تکرار بشن .
اگر هدفمون این بود که این پروسه مدام تکرار بشه باید تمام قسمت های 5 و 6 و 7 رو توی Loop می نوشتیم.

قسمت 9: اینجا در مورد طریقه نوشتن تابع TextDisplay صحبت می کنیم. 5 مرحله ای رو که لازم بود تا برای چاپ داده روی نمایشگر طی کنیم رو یادتون میاد؟
دقیقا عین همون 5 مرحله رو تو این تابع انجام میدیم :
1. تعیین کردن سایز نوشته : با استفاده از دستور setTextSize
2. تعیین کردن رنگ نوشته : با استفاده از دستور setTextColor
3. تعیین کردن نقطه شروع برای نوشتن : با استفاده از دستور setCursor
4. تعیین کردن متنی که قرار نمایش داده بشه :با استفاده از دستور println
5. ارسال فرمان نمایش :با استفاده از دستور display

یادتونه گفتم به این کتابخونه ها احترام بزارید. دلیلش رو الان باید متوجه شده باشید. برای این که به نمایشگر بگید سایزی که میخوام استفاده کنم 2 هست اگر قرار بود ما مستقیم به خود نمایشگر بگیم باید میرفتیم به رجیسترهای داخلیش دیتا میفرستادیم و دنگ و فنگ . الان خیلی شیک و بی دردسر داریم با دستور setTextSize و مشخص کردن سایز تو آرگومان این دستور کار خودمونو انجام میدیم.
و اما به اون تاخیر 1 ثانیه ای آخر تابع هم دقت کنید . یادتونه درست بعد از دستور TextDisplay از دستور clearDisplay برای پاک کردن استفاده می کردیم . سوالی که اونجا مطرح شد این بود که با این کار اصلا دیتایی می بینیم یا نه . جوای اینه که بله می بینیم. هر بار که تابع TextDisplay اجرا میشه بعداز دستور display یه تاخیر 1 ثانیه ای وجود داره همین تاخیر 1 ثانیه ای هست که ما میتونیم دیتایی رو که با دستور TextDisplay ارسال کردیم رو روی نمایشگر ببینیم. بعد از اون یک ثانیه هم با دستور clearDisplay  که نوشته بودیم صفحه پاک میشه.
این وسط فقط یک بحث باقی میمونه . چرا فقط متن قابل نمایش ، نقطه شروع و نقطه پایان رو به عنوان ورودی تابع گرفتیم و حق انتخابش رو به کد نویس دادیم؟ چرا مثلا یه int دیگه واسه سایز متن در نظر نگرفتیم و به عنوان آرگومان چهارم نذاشتیمش تو تابع ؟ باید بگم تابع نویسی سلیقه ایه . من مطمئن بودم که در تمام طول پروژه با سایز 2 کار می کنم بنابراین سایزم رو فیکس گذاشتم به جاش نقطه شروع و پایانمو به عنوان متغیر وردوی تابع TextDisplay در نظر گرفتم. ممکنه یکی دیگه بخواد تمام نوشته هاش رو از نقطه 0 و 0 بنویسه و در عوض دائم بخواد سایز رو عوض کنه خب اون تابعش رو یه شکل دیگه می نویسه . این وسط باید به یه چیز فقط دقت کنید. این که نوع متغیری که قصد دارید به عنوان ورودی تابع در نظر بگیرید رو درست انتخاب کنید.

قسمت 10 :با استفاده از این تابع و دستور drawRoundRect یه مستطیل با لبه های گرد کشیده میشه. باز هم از کتابخونه عزیز ادافروت متشکریم.
و بخش دوم این تابع هم با دستور display اون مستطیل رو روی صفحه نمایش نشون میده.
در انتها هم کد رو می تونید از این لینک بردارید و استفاده کنید.

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

با سلام

مدت زمان بسیار طولانی ای نبودم و نتونستم وبلاگ رو به روز کنم . بابت این قضیه عذر خواهی می کنم و انشاءالله از این به بعد هر هفته آموزش یک قطعه رو براتون قرار میدم.
در ادامه رسالت توضیح پروتکل 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 رو خالی رها کردم.

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


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

جلسه بیست و هشتم : کنترل تگ های RFID

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

مطابق جلسه قبل ریدری که من روش کار می کنم RC522 هست لذا سیم بندی این پروژه هم دقیقا مثل سیم بندی جلسه قبله .
rfid-522-diagram-pinout-wire-arduino

تنها تفاوتی که وجود داره در کدنویسیه که قدم به قدم با هم پیش میریم.
2016-11-15_13-34-20
قسمت 1 و 2 : دقیقا مطابق توضیح های جلسه قبله به همین دلیل تکرارش نمی کنم .

قسمت 3 : یه آرایه 4 تایی به اسم Cardid تعریف و مقدار دهی کردیم . این متغیر در واقع مقدار کارت مرجع ماست . یعنی میخوایم هر کارتی که خونده میشه رو با این مقایسه کنیم.

قسمت 4 : یه آرایه 4 تایی به اسم readCard تعریف کردیم ولی مقدار دهی نکردیم .توی این متغیر شماره کارت هایی که توسط ریدر خونده میشه رو ذخیره می کنیم . بنابراین به ازای هر کارتی که مقابل ریدر می گیریم مقدار این متغیر عوض میشه .

قسمت 5 : یه متغیر به اسم match تعریف کردیم . به قول برنامه نویسا این match یه پرچمه (flag) . به زبون خیلی ساده فلگ ها ( پرچم ها ) وضعیت رو به ما نشون میدن . اگر این فلگ false باشه یعنی کارتی که با ریدر خوندیم با شماره کارت مرجعمون فرق داره و مچ نیست . اگر true باشه یعنی کارتی که مقابل ریدر گرفتیم همون کارت مرجعمونه .

2016-11-15_13-41-15
تابع ستاپ هم جلسه قبل با جزئیات مطرح شده .

2016-11-15_13-42-04
قسمت 1 و 2 : مثل جلسه قبله دقیقا .
قسمت 3 : یادتونه جلسه قبل در مورد کد نویسی این قسمت چی گفتم ؟ گفتم میتونست بیاد داده ای که از دستور mfrc522.uid.uidByte میاد رو اول بریزه تو یه متغیر بعد اون متغیر رو پرینت کنه . الان دقیقا همین کار رو کرده. به جای اینکه مستقیم خروجی دستور mfrc522.uid.uidByte رو با print چاپ کنه اومده اول ریختتش تو متغیر readCard بعد متغیر readCard رو پرینت کرده .
دوستان این که چرا نوشته شده [readCard[i و نوشته نشده readCard به دلیل اینه که readCard یک آرایه هست . این بحث ها کد نویسی محضه به همین خاطر من توضیحی در موردشون نمیدم .

قسمت 4 : اومده تابعی رو صدا زده به اسم checkTwo . ممکنه از این جلسه به بعد زیاد از این روش کد نویسی استفاده کنیم . به این صورت که به غیر از setup و Loop که تابع های اساسی هستن و هرگز نباید حذف بشن یه سری توابع دیگه هم تعریف کنیم که یه قسمت از پردازش رو انجام بدن . الان هم دقیقا همین کار رو کردیم . تو تابع ستاپ کانفیگ هامونو انجام میدیم. تو تابع loop کارت رو میخونیم و تو تابع checkTwo عملیات مقایسه کارت خونده شده و کارت مرجع رو انجام میدیم. واقعیت داستان اینه که میتونستیم عملیات هایی که تو تابع checkTwo انجام میشه رو تو تابع loop هم انجام بدیم اما تابع نویسی ( یا به قول برنامه نویسا متد نویسی ) باعث میشه کدمون راحت تر فهمیده بشه . انتهای جلسه توضیح میدیم که چرا تابع رو اینطوری نوشتیم .

قسمت 5 : مطابق جلسه قبله بازم .

2016-11-15_14-03-39
قسمت 1 : این قسمت معرفی و اسم گذاری تابع هست.تابع هیچ خروجی ای نداره بنابراین از نوع void تعریف شده . اسم تابع checkTwo هست. ورودی های تابع دو تا آرایه به نام های a و b هستن . این دو تا در واقع همون متغیر هایی هستن که باید با همدیگه مقایسه بشن . متغیر a متغیری هست که باید مقایسه بشه و متغیر b متغیر مرجعمونه . این که چرا اسمشون a و b هست و از اسم متغیر های اصلی کد ( یعنی Cardid و readCard ) تو تعریف تابع استفاده نکردیم هم از قوانین تابع نویسیه .

قسمت 2 : میاد چک می کنه متغیر مقایسه شونده خالی نباشه . چون اگه خالی باشه یقینا مقایسه ما فایده ای نداره . تو همین قسمت میاد فلگ match رو هم true می کنه . یعنی پیش فرضمون این که که دو تا متغیر با هم مساوی ان .

قسمت 3 : یه حلقه for داریم که 4 بار تکرار میشه . علت این که 4 بارتکرار میشه اینه که آیدی کارت ما 4 بایته . تو هر بار اجرای حلقه یه بایت از متغیر مقایسه شونده با یه بایت از متغیر مرجع مقایسه میشه . اگه توی مقایسه این 4 بایت ، حتی توی یه بایت هم متغیر ها مساوی نباشن فلگ match تبدیل به false میشه . مثلا فرض کنید آیدی کارتی که خونده شده {11,12,13,14} باشه و آیدی کارت مرجع {11,15,13,14} باشه . این دو تا متغیر تو بایت یکم ( چون شماره بایت ها از 0 شروع میشه ) با هم تفاوت دارن . بنابراین فلگ match تبدیل به false میشه . اما اگر متغیر مرجع هم {11,12,13,14} بود فلگ match همون true می موند.

قسمت 4 : این قسمت یه if ساده داریم . اگر فلگ match برابر true باشه تو کنسول عبارت Match چاپ میشه . اما اگر اگر فلگ match برابر false باشه تو کنسول عبارت Not Match چاپ میشه . همونطوری که اول جلسه گفتم به جای این چاپ شدن تو کنسول میشه هر اتفاق دیگه ای بیفته . میتونه یه رله فرمان بگیره . میتونه بیپ یه بازر رو تغییر بده . میتونه رنگ یه LED RGB رو تغییر بده و … .

قبل از این که جلسه رو تموم کنیم یه توضیح دیگه باید اضافه بشه . توی تابع loop ما تابع checkTwo رو اینطوری صدا زدیم : (checkTwo(readCard, Cardid . قرار بود آرگومان اول این تابع متغیر مقایسه شونده باشه و آرگومان دوم متغیر مرجع . الان هم دقیقا همین اتفاق افتاده . آرگومان اول readCard آیدی کارت هایی که بود که توسط ریدر خونده میشد و به ازای هر کارتی این متغیر مقدارش تغییر می کرد. آرگومان دوم Cardid همون آیدی کارت مرجعمون بود که تو هدر برنامه مقدار دهیش کردیم و عملا مقدارش همیشه ثابته .

نکته دیگه ای که میمونه اینه که اگر شما بخواید همین کد رو روی سیستم خودتون پیاده کنید آیدی کارتتون نمیتونه مشابه آیدی کارت من یعنی 75796376 باشه . بنابراین یک بار کد رو آپلود کنید و آیدی کارت مرجع خودتون رو دربیارید . بعد به جای آیدی کارت من تو هدر برنامه یعنی {byte Cardid[4] = {75, 79, 63, 76 جایگزین کنید.

کد رو هم میتونید از انجمن بردارید و استفاده کنید .

پایان جلسه.

جلسه بیست و هفتم : راه اندازی RFID با آردوینو

سلام
این جلسه قصد دارم در مورد راه اندازی ماژول های RFID باهاتون صحبت کنم . این که تکنولوژی RFID چیه و چجوری کار می کنه و اینا رو طبق معمول یه عده از دوستان زحمت کشیدن نوشتن (بهتر و کامل تر از چیزی که من قراره بگم ) اما خب جهت آشنایی با RFID و وسواس های انتخاب در قطعات و تگ ها یه مقدار صحبت می کنیم با هم .

برای توضیح RFID با یه کاربرد رایجش شروع می کنیم. قدیما وقتی می رفتیم پارکینگ بهمون یه تیکه کاغذ میدادن که ساعت ورودمون به پارکینگ رو روش زده بود و موقع برگشت هم کاغذ رو پس میدادیم به مسئولش . اونم دستی حساب می کرد و رقم نهایی رو اعلام میکرد .
الان وقتی میریم پارکینگ موقع ورود بهمون یه کارت میدن . موقع برگشت وقتی کارت رو تحویل میدیم مسئولش کارت رو میگیره مقابل یه دستگاهی و بعد از گذشت چند ثانیه رقم نهایی رو اعلام می کنه .
کارتی که باهاش این کار انجام میشه کارت RFID هست.

به طور کلی RFID از Radio Frequency Identification میاد و معنی فارسی اش میشه شناسایی فرکانس رادیویی. شناساییش خب معلومه ، کلا هدف از این سیستم ها اینه که اطلاعات یه جا ذخیره بشه و موقع نیاز از اون اطلاعات استفاده بشه و عمل شناسایی اون داده انجام بشه. اما فرکانس رادیویی یعنی چی ؟ اگه به همون مثال پارکینگ برگردیم ، تو مدل های کارتی پارکینگ ها موقع خروج ، مسئول پارکینگ کارت رو میگیره جلوی یه دستگاه . نه سیم و کابل و رابطی وجود داره و نه حتی نیازی وجود داره که کارت رو بچسبونه به اون دستگاه . با یه فاصله کارت رو از دستگاه نگه میداره و هزینه پارکینگ رو اعلام می کنه. همین موضوع یعنی این ارتباط به صورت بی سیم داره برقرار میشه و به همین خاطر هم اسم رادیویی رو میزارن روش. اما چرا فرکانسی ! همونطور که وقتی میخوایم از یه مبدا برسیم به یه مقصد ، توی یه خیابون به طور متوسط دو تا لاین وجود داره ، هموطنور هم وقتی قراره یه داده به صورت بی سیم ارسال بشه داده میتونه روی فرکانس های مختلف ( به عنوان لاین ) ارسال بشه مثلا 2.4G یا 5.8G .
در مورد ماهیت تکنولوژی RFID میتونید از این لینک اطلاعات کامل تری رو به دست بیارید

*******************************************************

تو سیستمهای RFID به طور کلی دو بخش سخت افزاری وجود داره :
یه ریدر ( Reader ) و یه تگ یا کارت .
اول در مورد تگ صحبت می کنیم.تگ یا کارت های RFID یه تراشه توی خودشون دارن که روی اون تراشه یه سری دیتا ذخیره شده ( همون دیتاهایی که ما لازم داریم روی این تگ ها ذخیره کنیم ) . علاوه بر تراشه ، روی تگ یا کارت های RFID آنتن هم وجود داره .
rfid-card

rfid-chip-and-antenna-3
این دو تا عکس رو ببیند . توی یکیش یه تگ رو نشون داده و توی یکیش یه کارت رو نشون داده . میتونید چیپ و آنتن رو توی این عکس ها ببینید.
مدل های مختلف این تگ / کارت ها رو میتونید اینجا ببینید.

به ظاهر تگ ها نگاه کنید .بعضی هاشون دایره ای شکل هستن . بعضی هاشون مستطیلی . بعضی ها شفاف هستن . بعضی ها سکه ای . بعضی ها چسبی هستن . بعضی ها کارتی و بعضی ها هم مدل سر کلیدی .
میبیند که شکل های مختلفی دارن . بر حسب این که برای چه کاربردی از این تگ ها بخواد استفاده بشه شکلشون فرق می کنه . روی بعضی از دستگاه های الکترونیکی که میخریم مدل چسبیش رو زدن ، توی استخرا مدل دستبندیش رو گذاشتن و ….

به طور کلی تگ ها رو به دو شکل میشه تقسیم بندی کرد.
1. روش تغذیه تگ ها
2. فرکانس تگ ها

در مورد فرکانس تگ ها صحبت خواهیم کرد اما در مورد روش تغذیه یه توضیح کوتاه میدیم . قائدتا این چیپی ( تراشه ) که روی تگ های RFID گذاشتن باید بهش پاور داده بشه تا فعال بشه و بتونه کار کنه ( مثل تمام چیپ های دیگه) . بر حسب این که پاور چطوری تامین بشه دو نوع تگ داریم :
1. تگ اکتیو (Active)
2. تگ پسیو (Passive)
تگ های پسیو برای تامین پاورشون از هیچ باتری ای استفاده نمی کنن. روش کار این تگ ها به این صورته که هر وقت آنتن روی کارت سیگنالی دریافت کنه ( که این سیگنال در واقع از سمت ریدر ارسال شده ) انرژی اون سیگنال ، چیپ روی تگ رو فعال می کنه و چیپ میتونه اطلاعات ذخیره شده روی خودش رو برای ریدر بفرسته (از طریق آنتن ) . چون قراره پاور چیپ از انرژی سیگنال دریافتی تامین بشه نباید فاصله بین ریدر و تگ خیلی زیاد باشه . عملا این تگ ها ساختار ساده دارن و قیمت هاشون هم بالا نیست.
اما تگ های اکتیو این طوری نیستن . تگ های اکتیو روی خودشون یه باتری کوچیک دارن که ولتاژ مصرفی چیپ از اون تامین میشه. بر حسب این که طول عمر باتری ای که روی تگ هست چقدره قیمت تگ های اکتیو فرق میکنه اما در کل قیمت تگ های اکتیو از تگ های پسیو خیلی بیشتره . یه مشکلی که تگ های اکتیو دارن اینه که وقتی طول عمر باتری تموم شه عملا چیپ روی تگ خاموش میشه . بعضی از تگ ها طوری ساخته میشن که دسترسی به باتریشون راحته و میشه وقتی باتری تموم شد تعویضش کنن اما بعضی تگ ها به هیچ عنوان نمیشه به باتریشون دسترسی داشت . در این موارد باید تگ رو انداخت سطل آشغال !!!

اما در مورد فرکانس تگ های RFID . یه نگاهی به اسم تگ هایی که تو آفتاب لینک دادم بندازید. تو اسم بعضی ها نوشته 13.56MHz ، تو بعضی ها نوشته 125khz و تو بعضی ها هم نوشته UHF . چیزی که واضحه اینه که این عددا مربوط به فرکانس هستن ( چون واحدها به ترتیب مگاهرتز و کیلوهرتز هستن و اینا واحد فرکانس هستن ). حالا داستان چیه ؟ چرا تگ ها فرکانساشون فرق می کنه ؟
جواب اینه که کلا سه تا باند فرکانسی برای RFID داریم .
1. باند LF یا همون Low Frequency : بین 125 تا 134 کيلوهرتز (در عمل همون 125khz رو در نظر میگیریم.)
2. باند HF یا همون High Frequency :محدوده 13.56 مگاهرتز
3. باند UHF یا همون Ultra High Frequency : محدوده 860 تا 960 مگاهرتز
هر چقدر فرکانس کاری RFID بالاتر باشه فاصله ای که تگ میتونه از ریدر داشته باشه هم بیتشر میشه . به عنوان مثال سیستم های RFID ای که از باند UHF استفاده می کنن فاصله تگ و ریدرشون تا چند متر هم میرسه اما سیستم هایی که با باند LF کار می کنن فاصله تگ و ریدر فقط چند سانتی متره .
یه سوال بوجود میاد این وسط . آیا میشه هر تگی رو روی هر وسیله ای چسبوند ؟ جواب منفیه . همونطور که میدونید این یه قانونه که هر چی فرکانس بره بالاتر طول موجش کوتاه تر میشه . و همین اختلاف طول موج عاملی میشه تا هر فرکانس RFID برای یه هدف خاص مورد استفاده قرار بگیره . اینجا یه سری اطلاعات گذاشته که چه باند فرکانسی ای برای چه کاربردی مناسبه .

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

*******************************************************

قسمت دوم یه سیستم RFID ، ریدر بود. ریدر ماژول یا دستگاهی هست که اطلاعات رو از تگ RFID دریافت می کنه و بعد از اون میتونه هر بلایی سرش بیاره . میتونه وصل بشه یه میکروکنترلر مثل آردوینو و داده رو بفرسته برای آردوینو تا مورد پردازش قرار بگیره . میتونه داده رو مستقیم بفرسته برای کامپیوتر تا توی کامپیوتر مورد استفاده قرار بگیره . بسته به این که پروتکل ارتباطی چی باشه نوع انتقال داده اش هم فرق می کنه.
مثلا این دستگاه ریدر رو در نظر بگیرید :
rfid_jt400_3-500x500
این ریدر با یه کابل USB وصل میشه به کامپیوتر و تنها کاری که برای راه اندازیش لازمه انجام بشه اینه که یه notepad باز کنید و کارت رو مقابل ریدر قرار بدید . دیتا از کارت فرستاده میشه برای ریدر و ریدر اون دیتا رو از طریق کابل USB میفرسته برای کامپیوتر . کامپیوتر هم اون دیتا رو روی notepad نشون میده .

اما به این ماژول نگاه کنید :
rc522_rfid_reader-500x500
این ماژول پروتکل ارتباطیش SPI هست. مراحل استفاده از این ماژول به این صورته که کارت رو مقابل آنتن این ریدر قرار میدیم. ریدر دیتا رو دریافت می کنه . اما چون پروتکا ارتباطیش SPI هست باید حتما به یه میکروکنترلر وصل بشه و دیتا رو برای اون ارسال کنه . کاری هم که ماقصد داریم توی این جلسه انجام بدیم دقیقا همینه . قصد داریم دیتای یه کارت RFID رو به وسیله این ماژول بخونیم و توی کنسول آردوینو نمایش بدیم .
مجموعه کاملی از ریدرهای RFID رو میتونید اینجا ببینید.

دقیقا مثل تگ ها ، ریدر ها هم همون سه تا باند فرکانس LF و HF و UHF رو دارن .

اما یه سوال پیش میاد و اون هم اینه که آیا مثلا یه ریدر 13.56مگاهرتز میتونه یه تگ 125کیلوهرتزی رو بخونه ؟ جواب اکیدا منفیه. هر ریدری فقط میتونه تگ فرکانس خودش رو بخونه . ریدر 13.56 فقط میتونه تگ 13.56 رو بخونه . هیچ کدوم از تگ های دو باند دیگه روی این ریدر کار نمی کنن.

*******************************************************

تا این جای آموزش فقط داشتیم می گفتیم RFID چیه ، هر سیستم RFID چه اجزائی داره و اجزائش رو که همون تگ ها و ریدرها بودن معرفی کردیم .
حالا میریم سراغ راه اندازی ماژول RC522 با اردوینو .
این ماژول که از اینجا میتونید بخریدش فرکانس کاری اش 13.56 مگاهرتز هست و پروتکل ارتباطیش هم SPI .
مثل جلسه های پیش اول سیم بندیش رو برای اتصال با آردوینو قرار میدیم:
rfid-522-diagram-pinout-wire-arduino

اگه سیم بندی این ماژول رو با سیم بندی NRF که تو جلسه قبل بود مقایسه می بینید که پینهای SCK ، MISO و MOSI دقیقا مثل سیم بندی NRF به آردوینو وصل شده و این یعنی این سه تا پین فیکس هستن . میمونه دو تا پین. پین RST و پین SDA . پین SDA که همون پین چهارم پروتکل SPI هست ( همون CS خودمونه ) که اینجا اسمش شده SDA . بنابراین این پین میتونه به هر پین دیجیتال دلخواهی متصل بشه .پین RST هم پین ریست خود ماژول RC522 هست . این پین هم میتونه به هر پین دیجیتال دلخواهی متصل بشه .

**** باز هم به این موضوع دقت کنید که ولتاژ مصرفی این ماژول 3.3 هست 5 ولت نیست . بزنید به 5 ولت احتمال سوختنش مساوی است با 100% .
*******************************************************
و اما کد :
2016-10-31_12-44-52

قسمت 1 : معرفی کتابخونه هایی هست که داریم استفاده می کنیم. کتابخونه های استفاده شده در این کد کتابخونه های SPI و MFRC522 هستن . کتابخونه SPI کتابخونه پیش فرض آردوینو هست و هیچ نیازی به نصبش وجود نداره. اما کتابخونه MFRC522 باید به لیست کتابخونه های آردوینو اضافه بشه . فایل نصبش هم تو لینک انجمن قرار داده شده.

قسمت 2 : یک شیء به نام mfrc522 از آبجکت MFRC522 بوجود اومده . شیء ای که ساخته شده دو تا آرگومان داره . آرگومان اولش شماره پین SDA استفاده شده هست که تو پروژه ما میشه پین شماره 10 . آرگومان دوم هم شمار پین RST استفاده شده هست که ما از پین شماره 9 استفاده کردیم. همونطور که قبلا اشاره کردم این دو تا پین میتونن هر دو تا پین دیجیتال دلخواهی باشن به شرط این که توی این خط کد هم اون تغییر لحاظ بشه.

قسمت 3 : این قسمت تنظیمات تابع setup هست. تنظیماتی که تو این برنامه انجام شده تنظیم بادریت ارتباط سریال آردوینو و کامپیوتر ، فعال کردن ارتباط SPI بین آردوینو و ماژول RC522 و فعال کردن و تنظیم کردن خود ماژول RC522 هست. منظورمون از تنظیم کردن RC522 این هست که توی کتابخونه ای که برای RC522 نوشتن ( همون کتابخونه MFRC522 که بالا صداش کردیم ) میاد تمام تنظیمات و متغیرهای RC522 رو تنظیم و مقدار دهی میکنه و به اصلاح خودمون RC522 رو برای شروع کار کانفیگ می کنه . این تنظیمات رو کتابخونه انجام داده تا دردسر ما برای راه اندازی این ماژول به حداقل برسونه.

و اما تابع Loop:
2016-10-31_12-56-18

قسمت 1 : این قسمت یه if نوشته شده که به شرط این که ریدر کارت RFID ای رو در نزدیکی خودش پیدا کنه از این if رد بشه . در غیر ای صورت انقدر صبر می کنه تا یه کارت در نزدیکی ریدر دیده بشه.

قسمت 2 : این if میاد چک می کنه آیا کارتی که در نزدیکی ماژول ریدر قرار گرفته میشه باهاش ارتباط برقرار کرد و دیتاش رو خوند یا نه . اگر بتونه با کارت ارتباط برقرار کنه که از if رد میشه در غیر اینصورت پروسه خوندن آیدی کارت متوقف میشه .

قسمت 3 : وقتی وارد این قسمت میشه یعنی یه کارت RFID نزدیک ریدر تشخیص داده شده و ریدر تونسته با کارت ارتباط برقرار کنه حالا مرحله خوندن اطلاعات روی کارت رسیده . اول یه Serial.print می کنه . این قسمت فقط برای اینکه که تو کنسول داده ای که چاپ میشه قابل فهم تر باشه و اگر این خط کد برداشته هم بشه هیچ اتفاقی نمی افته . بعد از اون یه حلقه for داریم . ساختار کد نویسی حلقه for اینجا کامل توضیح داده شده. حلقه for ای که مانوشتیم یه قسمت خیلی مهم داره و اون هم حد نهاییشه ، یعنی mfrc522.uid.size . این دستور میاد حجم حافظه کارت رو در میاره . یعنی ممکنه توی یه کارت 10 بایت اطلاعات ذخیره شده باشه. خروجی این دستور میشه عدد 10 بنابراین این حلقه 10بار تکرار میشه .  توی حلقه چه اتفاقی می افته ؟ یه سریال پرینت انجام میشه . چی پرینت میشه ؟ [mfrc522.uid.uidByte[i . توی هر بار تکرار شدن حلقه for یک بایت از اطلاعات کارت پرینت میشه . با تغییر مقدار i در هر بار تکرار شدن حلقه for یک بایت جدید از کارت خونده میشه . یعنی وقتی برای اولین بار وارد حلقه میشیم [mfrc522.uid.uidByte[0 پرینت میشه . دور بعد [mfrc522.uid.uidByte[1 ، دور بعد [mfrc522.uid.uidByte[2 و الی آخر. یه کار متفاوت که توی این کد انجام داده اینه که به جای اینکه خروجی دستورmfrc522.uid.uidByte رو بریزه تو یه متغیر بعد اون متغیر رو چاپ کنه ، مستقیم اومده خروجی دستور رو چاپ کرده . با این کار تو خطوط کد نویسیش صرفه جویی کرده . در مورد دستور پرینت دو تا نکته وجود داره :
1.این که Serial.print نوشته شده نه Serial.println . اگر println نوشته میشد هر بایت توی یه خط چاپ می شد اما الان با print تمام بایت ها پشت سر هم چاپ میشن.
2.توی آرگومان دوم این دستور نوشته شده HEX . این آرگومان باعث میشه کد هگز آیدی کارت تو کنسول نمایش داده باشه . اگه میخواید خود آیدی رو ببینید کافیه HEX , رو بردارید تا دستور فقط یک آرگومان داشته باشه .
2016-10-31_13-34-31
قسمت 4 : اومده یه println خالی نوشته تا برای کارت های بعدی آیدی توخط بعد چاپ بشه . دستور mfrc522.PICC_HaltA باعث میشه اگر یک کارت رو مدت طولانی روی ریدر قرار بدی فقط یک بار آیدی اون کارت چاپ بشه . بهترین راه برای درک عملکرد این دوتا تصویر زیره :
2016-10-31_13-34-31

برای تست پروژه کافیه سیم بندی رو انجام بدید. کنسول آردوینو رو باز کنید و یه تگ یا کارت با فرکانس 13.56 مگاهرتز رو در نزدیکی آنتن ماژول قرار بدید . نیازی نیست که کارت بچسبه . میتونید تا فاصله حدود 15 سانتی متری نگهش دارید. آیدی کارت تو کنسول آردوینو نمایش داده میشه.
کد و کتابخونه مربوط به این جلسه اینجا گذاشته شده .
پایان جلسه .

جلسه بیست و ششم : راه اندازی NRF24L01 با آردوینو

سلام
اول بابت تاخیرم تو این مدت از همگی عذر خواهی می کنم.
این جلسه قصد دارم با یه تیر دو تا نشون بزنم اول این که در مورد پروتکل SPI و نحوه سیم بندی اون یه توضیح مختصری بدم و دوم این که در انتقال داده به صورت بی سیم رو آموزش بدم .
منظورم از انتقال اطلاعات به صورت بی سیم رو با یه مثال میگم. فرض کنید توی یه کارخونه قراره دمای محیط رو به صورت پیوسته مانیتور کنیم و بدونیم که مثلا در ضلع جنوبی کارخونه دما چند درجه هست. یه راه حل نه چندان قشنگ اینه که سنسور دما رو تو ضلع جنوبی کارخونه وصل کنیم و آردوینو رو بزاریم تو اتاق کنترل. حالا برای وصل کردن سنسور به آردوینو باید از ضلع جنوبی تا دفتر کنترل رو سیم بکشیم تا داده ( که همون دمای محیط هست ) برسه به آردوینو و با آردوینو نمایشش بدیم. این کار دو تا مشکل داره :
1. این همه سیم آخه چه خبره !!!
2. هر سیمی که وجود داره ، تلفات داره . میزان تلفاتش هم بر میگرده به قطر و طول و جنس سیم . یه سری جدول هایی وجود داره برای محاسبه آسون تر این تلفات که اینجا میتونید ببینید. در نتیجه سیم هایی که قراره سنسور رو به آردوینو وصل کنن تلفات دارن و ممکنه داده ای که سنسور اول خط به سیم تحویل میده با داده ای که آردوینو آخر خط از سیم تحویل میگیره زمین تا آسمون فرق داشته باشه .

بنابراین ما باید دنبال راه حلی بگردیم که بتونیم داده هامون رو به صورت بی سیم ارسال کنیم .
به روش های مختلفی میشه این کار رو انجام داد که به مرور زمان دونه دونه باهاشون آشنا میشیم .
این جلسه این ارتباط بی سیم رو با NRF24L01 انجام میدیم.
توضیح این که NRF بر چه اساسی کار می کنه و چرا این طوریه و چرا اون طوریه خودش در حد یک کتابه . اینجا من فقط یه سری مقدمات میگم که دونستنش به درد همه می خوره.

وقتی اسم ارتباط بی سیم میاد اولین سوالی که پیش میاد اینه که روی چه فرکانسی این ارسال و دریافت داره انجام میشه ؟ در جواب باید گفت که NRF ها روی فرکانس 2.4 گیگا هرتز داده ارسال می کنن. این باند فرکانس باند فرکانسی خیلی شلوغیه . توی این آموزش در مورد این موضوع یه مقدار بیشتر توضیح داده . اما یه جواب مهم برای این سوال که چرا با وجود شلوغی این باند باز هم ازش استفاده میشه اینه که که آنتن مورد نیاز برای این فرکانس نیازی نیست خیلی بزرگ باشه و همین مزیت بزرگ باعث پرکاربرد بودنش میشه.

دومین سوالی که پیش میاد اینه که تا چند متر یا حتی کیلومتر میتونه ارسال داده دقیق و بدون خطا انجام بشه. اصن یه چیزی وقتی NRF رو تا سایتا سرچ می کنیم مدل های مختلف میاره . یکیش بردش 100 متره یکیش بردش 1000 متره . یکیش آنتن داره یکیش آنتن نداره . داستان چیه ؟
جواب این سوال یه کم به توضیح بیشتری احتیاج داره . بله ماژولی که از چیپ NRF24L01 میسازن بردهای مختلفی داره . نقطه مشترک همه این ماژول ها اینه که چیپ اصلیشون NRF24L01 هست. این ماژول رو ببینید :
tc24l01plus-500x500
توی طراحی این ماژول فقط و فقط تنها از چیپ خود NRF24L01 استفاده شده . آنتش هم به صورت PCB هست . نه آمپلی فایری داره نه آنتن خارجی ای . همین دو تا موضوع باعث میشه که برد این ماژول کم باشه . برد اسمیش طبق دیتاشیت ها 100 متره (که در عمل کمتر از اینه )
حالا این ماژول رو ببینید:
npa4
این ماژول علاوه بر خود چیپ NRF24L01 از دو تا مدار دیگه به عنوان آمپلی فایر قدرت و آمپلی فایر کاهش نویز استفاده کرده . همچنین اومده از آنتن خارجی هم استفاده کرده که ترکیب اون آمپلی فایر ها و این آنتن بردی حدود 1000 متر ( برد اسمی ) رو به ماژول میده . اگه به اسم ثبت شده تو سایت مگاه کنید میبیند که کنار اسم این ماژول علاوه بر NRF24L01 دو تا اسم دیگه هم می بینید : NRF24L01+PA+LNA . منظور از این PA و LNA همون دو تا مداری هست که بالا گفتم. PA یعنی Power Amplifier و LNA یعنی Low Noise Amplifier . بنابراین بسته به این که قصد دارید دادتون رو تا چه فاصله ای ارسال کنید باید ماژول مناسب با کارتون رو خریداری کنید. و این رو هم بدونید که وقتی آمپلی فایر و آنتن خارجی به طراحی ماژول اضافه بشه قیمتش هم میره بالاتر !!!

سومین سوالی که پیش میاد اینه که اگه بخوایم یه ارتباط دو طرفه برقرار کنیم باید چند تا از این ماژول ها بخریم .
منظور از ارتباط دو طرفه اینه که هر دو تا NRF بتونن واسه هم داده بفرستن و داده بگیرن . به عبارت خیلی خیلی ساده اگه NRF شماره 1 به NRF شماره 2 سلام کرد ، NRF شماره 2 فقط نشینه نگاش کنه و بهNRF شماره 1 جواب بده علیک سلام . این طوری هر دو NRF توانایی ارسال و دریافت داده رو به صورت همزمان دارن.
بنابراین اگر هدف برقراری ارتباط دو طرفه باشه خریدن دو تا ماژول NRF کفایت می کنه . به بیان دیگه هر یه NRF هم میتونه گیرنده باشه هم فرستنده.

توضیحات کامل و ریز به ریز در مورد NRF رو میتونید از اینجا بخونید.

***************************************************************************
خب حالا میریم سراغ اصل قضیه یعنی راه اندازی. هدفی که تو این آموزش داریم این که بتونیم با استفاده از کامند دادن تو کنسول آردوینو فرستنده ، دو تا LED رو تو گیرنده خاموش روشن کنیم.
اگه بخوایم مسیر داده رو تفسیر کنیم به این صورت میشه :
یه داده رو از طریق کنسول آردوینو فرستنده ارسال می کنیم. این داده توسط آردوینو دریافت میشه و مورد پرادازش قرار می گیره . وقتی پردازشش تموم شد با NRF ای که به فرستنده وصله ارسال میشه . اون طرف NRF ای که سمت گیرنده هست ( و شاید حتی 1 کیلومتر با فرستنده فاصله داشته باشه ) این دیتا رو دریافت می کنه و پردازش می کنه. نتیجه حاصل از پردازشش میشه وصعیت روشنایی LED ها ی متصل به آردوینو گیرنده.

***************************************************************************
خب حالا باید سیم بندی اتصال NRF به آردوینو رو معین کنیم . یه نکته خیلی مهمی که در مورد همه NRF ها وجود داره اینه که سیم بندی تمام مدل هاش به همین شکله . چه آمپلی فایر دار باشه چه بدون آمپلی باشه .
برای این پروژه قطعات زیر رو باید داشته باشید:
1. دو تا آردوینو یکی به عنوان فرستنده یکی به عنوان گیرنده
2. دو تا ماژول NRF
3. دو تا LED
اسم و ترتیب پینهای NRF که اصطلاحا بهش میگن pin map به این صورته :
27733959955_2281f9e3b9_o
اتصال خود NRFها سمت فرستنده و گیرنده به آردوینو دقیقا مثل همه :
9440611443471082653
خیلی خیلی خیلی دقت کنید که ولتاژ کاری ماژول های NRF پنج ولت نیست بلکه 3.3 ولته . بنابراین پایه VCC مربوط به NRF به پایه 3.3 آردوینو وصل میشه .

سمت فرستنده با اتصال NRF به آردوینو کار تموم میشه اما سمت گیرنده علاوه بر متصل کردن NRF باید دو تا LED هم به آردوینو وصل کنیم که من به پین های7 و 6 وصل کردم و تو کد نویسی هم به این دو تا پین مقدار میدم ( وصل کردن دو تا LED درگیری خاصی نداره خدایی )

شروع جلسه گفتم قصد دارم در مورد پروتکل SPI هم صحبت کنم . یه نگاه به عکسی که گذاشتم بکنید. اسم پینهای NRF رو با هم مرور کنیم: SCK – MOSI – MISO – CSN – CE – IRQ . به نظر اسم های عجیب و غریبی میاد اما از این به بعد که راه اندازی سنسورها و سایر قطعات رو شروع می کنیم کاملا این بیگانگیتون با این اسم ها برطرف میشه . سوالی که پیش میاد اینه که کدوم یکی از این پینها مربوط به پروتکل SPI هست . اگه یادتون باشه وقتی داشتم در مورد پروتکل ارتباطی سریال حرف میزدم گفتم وقتی پین TX و RX رو روی یک ماژول دیدید یقینا پروتکل ارتباطی اون ماژول سریاله . در مورد SPI اگر پینهای SCK ، MOSI ،MISO و CS ( که روی ماژول های NRF نوشته میشه CSN ) رو روی یه ماژول دیدید پروتکل ارتباطی اون ماژول SPI خواهد بود . دقت کنید هر 4 تا باید وجود داشته باشن . اصن به همین خاطره که به SPI میگن پروتکل ارتباطی 4 سیمه . سول دیگه ای که به وجود میاد اینه که این پینهای پروتکل SPI میتونن به هر پین دلخواهی از آردوینو وصل بشن . جواب منفیه !
هر مدل آردوینو (UNO , مگا ، DUE ) پینهای خاصیشون رو برای پروتکل SPI در نظر گرفتن . مثلا آردوینو UNO پین های 13 و 12 و 11 اش رو تخصیص داده ( همونطور که تو سیم بندی بالا می بینید ) و برد آردوینو مگا پینهای 53 و 52 و 51 اش رو اختصاص داده . جدول کامل این تخصیص ها به صورت زیره :
2016-10-25_11-12-48
اگه یه کم دقیق بشید متوجه میشید که توی معرفی پینهای تخصیص داده شده SPI فقط اسم 3 تا پین 13 و 12 و 11 رو آوردم در صورتی که SPI چهار سیمه . پس پین چهارم چی؟ پین چهارم که همون CS هست یار آزاده و میتونه هر پین دیجیتال دلخواهی باشه . این که چرا اون سه تا باید فیسک باشن اما این پین آزاده نیاز به توضیحاتی در مورد ماهیت پروتکل SPI داره . در مورد ارتباط SPI میتونید این آموزش رو مطالعه کنید.

دو تا پین باقی مونده دیگه که CE و IRQ هستن . تعریف های این دو پین رو میتونید از این لینک پیدا کنید. پین CE هم مثل CSN میتونه به هر پین دیجیتال دلخواهی وصل بشه . پین IRQ بر مبنای اینتراپت کار می کنه و تو خیلی از آموزش ها دیده میشه که اصلا وصلش نمی کنن . شما هم میتونید وصلش نکنید ( هیچ مشکلی پیش نمیاد )

***************************************************************************
خب حالا باید بریم سراغ کد نویسی .
اول کد سمت فرستنده رو بررسی می کنیم بعد میریم سراغ گیرنده .
کد فرستنده ( از اونجایی که کد زیاده قسمت به قسمت تصاویرش رو میزارم ):
2016-10-24_14-18-07
قسمت 1 : این بخش کتابخونه RH_NRF24 صدا زده میشه و یک شیء به نام nrf24 از آبجکت RH_NRF24 ساخته میشه ( این شیء و کلاس یه سری قصه های برنامه نویسی دارن ) دقت کنید شیء ای که ساخته شده دو تا آرگومان داره . آرگومان اول شماره پین CE و آرگومان دوم شماره پین CSN هست. این دو تا پین طبق صحبت های قبلی میتونن هر پین دیجیتال دلخواهی باشن .

قسمت 2 و 3 و4: این قسمت ها کانفیگ های مورد نیاز هستن . کانفیگ هایی مثل ارتباط سریال بین آردوینو و کامپیوتر که بادریت روی 9600 تنظیم شده یا کانفیگ پین هایی که برای ارتباط SPI استفاده شده، کانفیگ شماره کانالی که داده داره توش ارسال میشه ، کانفیگ سرعت انتقال داده و کانفیگ قدرت ارسال فرستنده . یه نکته خیلی مهم اینه که اگر سیم بندیتون مشکل داشته باشه یا خود ماژول NRF به هر دلیلی نتونه کانال و سرعت و قدرتش با کدنویسی انجام شده تو کتابخونه تنظیم بشه یکی از ارورهای init failed ، setChannel failed و setRF failed روی کنسول نمایش داده میشه .

اگر کدتون از این قسمت ها رد بشه یعنی هم سیم بندیتون درسته هم ماژول NRF تون سالمه .
و اما تابع Loop :
2016-10-24_14-39-39
قسمت 1 :با دستور() Serial.available داریم از آردوینو می پرسیم آیا تو بافر ارتباط سریالت چیزی واسه خوندن هست یا نه . به زبون ساده داریم ازش سوال می کنیم آیا تو کنسول سریال آردوینو چیزی تایپ شده یا نه . اگر چیزی تایپ شده باشه که وارد پروسه پردازش اون داده میشه در غیر این صورت انقدر منتظر می مونه تا یه داده از طرف کنسول براش ارسال بشه .

قسمت 2 : این جا یک بایت داده توسط دستور Serial.read خونده میشه و تو متغیر c ریخته میشه . حالا باید روی این داده پردازش انجام بشه .

قسمت 3 : اگر داده دریافتی کاراکتر 1 باشه توی کنسول پیغام Sending to nrf24_server چاپ میشه و با دستور nrf24.send عدد 1 ارسال میشه . دقت کنید عدد 1 توی یه متغیر به اسم data ریخته شده بعد داده این متغیر با صدا کردن دستور nrf24.send ارسال میشه . دستور nrf24.send دو تا آرگومان ورودی داره . آرگومان اولش اون داده ای هست که باید ارسال بشه و متغیر دوم سایز داده ارسالی هست که با دستور sizeof این اندازه محاسبه میشه. برای درک بهتر سیستم پست رو در نظر بگیرید . تو سیستم پست وقتی قراره یه بسته ارسال شه دو تا پارامتر مهم وجود داره یکی اسم یکی وزن . اسم که خب تکلیفش معلومه اسم رو می نویسن . اما برای به دست آوردن وزن بسته از ترازو استفاده میکنن. حالا تو کد نویسی ما کار ترازو رو دستور sizeof انجام میده ( راحت و آسوده ! ) . بعد از اون هم با دستور nrf24.waitPacketSent منتظر می مونیم تا داده کامل و بدون مشکل ارسال بشه. این از مهم ترین قابلیت های NRF هست که میتونه بفهمه داده درست و کامل ارسال شده یا نه . به این موضوع دقت کنید که من تو کدم دارم کامند 1 رو برای NRF دوم ارسال می کنم . ممکنه شما دوست داشته باشید مثلا کامند LED1 رو برای NRF دوم ارسال کنید . هیچ مشکلی نداره . کافیه اونجایی که داره متغیر دیتا رو تعریف می کنه به جای 1 توش بنویسید LED1 یعنی این شکلی : “uint8_t data[] = “LED1

قسمت 4 : دقیقا مثل قسمت 3 هست با این تفاوت که میگه از کنسول عدد 2 اومده بود NRF هم 2 رو ارسال کنه .

قسمت 5 : میگه اگر داده دریافتی از کنسول نه 1 بود نه 2 تو کنسول چاپ کن unknown character

و اما کدسمت گیرنده :
2016-10-25_10-19-05

از قسمت 1 تا قسمت 6 کاملا مشابه با کد سمت فرستنده هست.

قسمت 7 : کانفیگ پینهای 6 و7 به عنوان خروجی. این دو تا پین در واقع همون پینهایی هستن که بهشون LED وصل کردیم .
2016-10-25_10-42-25
قسمت 1 : دستور nrf24.available در واقع چک می کنه آیا داده ای داده ای توسط NRF دریافت شده یا نه . اگر دریافت شده بود میاد روی داده پردازش می کنه ، در غیر اینصورت صبر می کنه تا موقعی ای که داده بیاد .

قسمت 2 : میاد دو تا متغیر تعریف می کنه از جنس uint8_t . یکیشون متغیر buf هست و یکی len . متغیر اول که همون بافر خودمونه متغیری هست که داده دریافتی از NRF توش ریخته میشه . و len سایز متغیر بافر هست که مثل قبل اومده برای به دست آوردنش از sizeof استفاده کرده. دقت کنید که توی تعریف بافر تعداد کاراکترهاش رو RH_NRF24_MAX_MESSAGE_LEN گذاشته . این متغیر تو فایل کتابخونه مقدار دهی شده و نیازی نیست ما درگیرش بشیم ( کد و کتابخونه باهم کنار میان ).

قسمت 3 : توی این قسمت میاد چک می کنه که آیا داده دریافتی از NRF موفقیت آمیز بوده یا نه .

قسمت 4 : از اونجایی که جنس متغیر بافر از نوع uint8_t هست یه مقدار کار کردن باهاش ناخوشاینده . به خاطر همین با دستور (*char) جنس متغیر بافر رو از uint8_t تبدیل می کنیم به استرینگ .

قسمت 5 و 6 : حالا میایم داده دریافتیمون رو بررسی می کنیم . اگر 1 باشه LED شماره 7 رو روشن می کنیم . اگر 2 باشه LED شماره 6 رو روشن می کنیم.

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

کد ها رو که روی آردووینوهاتون آپلود کردید سمت فرستنده کنسول رو باز کنید و عدد 1 و بعد 2 رو بفرستید. اگر سیم بندهاتون درست باشه باید به ازای هر کامند وضعیت LED ها دچار تغییر بشه .

پایان جلسه

جلسه بیست و پنجم : تغییر نام و پسورد ماژول بلوتوث HC-05 ( مد AT Command )

سلام

جلسه قبل در مورد این حرف زدیم که چطوری از آردوینو داده بفرستیم برای گوشی اندرویدمون و از گوشیمون داده بفرستیم برای آردوینو . تمام ارتباطات قرار بود وایرلس و با کمک بلوتوث انجام بشه که خب موفق شدیم و انجامش دادیم.

اگه یادتون باشه وقتی میخواستیم ماژول بلوتوث رو با گوشیمون pair کنیم اسم ماژول بلوتوث HC_05 بود و پسوردش هم به صورت پیش فرض 1234 بود . تغییر اسم این ماژول کار چندان مهمی به حساب نمیاد و سلیقه ایه اما تغییر پسورد ماژول برای محافظت از داده ها کار واجبیه . چرا که فرض کنید شما سیستم ورود و خروج یه شرکت رو با بلوتوث بستید. شب که همه تشریف می برن خونه یه آدم خرابکار میاد با بلوتوث pair میشه پسورد پیش فرض 1234 رو میزنه و میره تو شرکت یه لیوان آب میخوره و میره (!) .

خب حالا سوال اینه که ما چجوری باید این تغییرات رو اعمال کنیم ؟ برای جواب این سوال یه کم باید توضیح بدم :
ماژول های بلوتوث دو تا مد کاری مختلف دارن .
یه مد کاری دیتا
یه مد کاری AT کامند

مد دیتا همون مدی هست که تو جلسه قبل باهاش کار می کردیم . توی این مد ( کد مد پیش فرض ماژول بلوتوث هم محسوب میشه ) فقط میشه با یه دستگاه pair شد و باهاش داده رد و بدل کرد. توی این مد به هیچ عنوان نمیشه تنظیمات بلوتوث رو تغییر داد.

مد AT کامند مدی هست که باهاش تنظیمات ماژول بلوتوث رو میشه تغییر داد. تغییراتی مثل اسم بلوتوث ، پسورد ، baude rate و … .

خب حالا مساله اصلی اینه که چجوری بتونیم بفهمیم تو چه مدی هستیم و نکته بعد هم اینه که چجوری از این مد بریم به اون مد و به عکس.
اول سوال اول رو جواب میدم :
برای اینکه بتونیم تشخیص بدیم تو چه مدی هستیم باید به LED روی ماژول نگاه کنیم. به محض اینکه به ماژول پاور میدیم یه LED روی برد شروع به چشمک زدن می کنه . از روی سرعت چشمک زدن این LED میتونیم بفهمیم تو چه مدی هستیم . اگه LED خیلی تند تند چشمک بزنه یعنی تو مد دیتا هستیم . اگه LED کند چشمک بزنه ( حدود 2 ثانیه یه بار ) یعنی تو مد AT کامند هستیم.

خب حالا سوال دوم : چطوری بین مد ها تغییر وضعیت بدیم . اگه دقت کنید روی برد یه میکروسوئیچ هست:
HC-05 (1)-500x500
برای این که برید تو مد کامند کافیه که این میکروسوئیچ رو هنگام اتصال پاور نگه دارید. قبل از این که عملی این کار رو انجام بدیم لازمه نحوه اتصال سخت افزاری این ماژول رو معلوم کنیم.
برای استفاده از این بلوتوث تو مد AT کامند دو تا راه وجود داره :
1.راه حل اول اینه که از یه آردوینو برای این کار استفاده کنیم . سیم بندی اتصال بلوتوث به آردوینو دقیقا مطابق سیم بندی جلسه قبل خواهد بود.
2. به جای استفاده از آردوینو از یه تبدیل TTL به USB استفاده کنیم. من خودم از این تبدیل برای این کار استفاده می کنم . گفتن این نکته ضروریه که به جای این تبدیل میشه از هر تبدیل TTL به USB دیگه ای هم استفاده کرد.
برای اتصال این ماژول مبدل به ماژول بلوتوث کافیه سیم بندی زیر رو رعایت کنید:
*** VCC بلوتوث به VCC تبدیل
*** GND بلوتوث به GND تبدیل
*** TX بلوتوث به RX تبدیل
*** RX بلوتوث به TX تبدیل
همین وبس!

من خودم از روش دوم برای کانفیگ ماژول بلوتوث HC-05 استفاده می کنم . دقت کنید که اگر تبدیل دم دستتون نیست و میخواید از آردوینو برای این کار استفاده کنید لازمه همون کد جلسه قبل رو هم تو برد آردوینوتون آپلود کنید با این تفاوت که هر دو baude rate قبلی (baude rate ارتباط سریال و baude rate سریال نرم افزاری بلوتوث ) رو از 9600 به 38400 تبدیل کنید ( حتما این تغییر رو باید انجام بدید ).

*********************************************************************************

خب الان باید با هر کدوم از دو تا روش سیم بندیتون رو بسته باشید ( در مورد کسایی که با آردوینو کار می کنن باید کدتون رو هم آپلود کرده باشید )
الان وقت اینه که ماژول بلوتوث رو ببریم به مد کامند.
قبل از این کار پاور تبدیل ( یا آردوینو ) تون رو فراهم کنید (بزنیدشون به USB ) . الان به بردتون نگاه کنید باید یه LED با سرعت زیاد شروع به چشمک زدن کرده باشه . این همون مد دیتا هست. (این قسمت فقط برای این بود که نوع چشمک زدن رو تو مد دیتا ببینید )
برای این که ببریمش تو کامند پاور بردها رو قطع کنید (از USB بکشید ) قبل از این که دوباره بخواید پاور بدید دستتون رو روی میکروسوئیچی که قبلا نشون دادم بزارید و سوئیچ رو نگه دارید در همین حالت تبدیل ( یا آردوینو ) رو وصل کنید به پورت USB تا روشن بشه . الان اگه به LED نگاه کنید داره کندتر از قبل چشمک میزنه . خب سوئیچ رو رها کنید : به مد کامند خوش اومدید.
مراحلی که گفتم تو فیلم زیر نشون داده شده:


خب مرحله آخراینه که تنظیمات مطلوبمون رو انجام بدیم . کنسول سریال آردوینو رو باز کنید و مطابق عکس زیر تنظیمات رو انجام بدید . دقت کنید baude rate باید حتما روی 38400 باشه ( حتتتتتتتما ):
2016-07-12_10-39-14
یادتونه جلسات قبل که داشتم در مورد AT کامند حرف میزدم گفتم یه کامندی هست که همیشه اول با اون شروع می کنیم و نقش سلام رو داره . الان هم برای اینکه ببینیم همه چیز درسته و ارتباطمون با بلوتوث برقراره کامند AT رو میفرستیم .
AT رو قسمت بالایی کنسول تایپ کنید و send رو بزنید . در صورتی که بهتون OK برگردونه یعنی همه چیز حله ، اگر نه یا سیم بندیتون غلطه یا baude rate رو تغییر ندادید.

بعد از این که OK رو دریافت کردید (که یعنی همه چیز درست پیش رفته ) نوبت کامندهای بعدیه . اول سعی می کنیم تا اسم ماژولمون رو عوض کنیم برای این کار به ماژول میگیم اسمت رو بزار مثلا mbt ( این اسم میتونه هر چیزی باشه ) . کامند استاندارد برای تغییر نام AT+NAME=MBT هست . دقیقا همین رو توی کنسول سریال تایپ کنید و send کنید ماژول بلوتوث بهتون یه OK برمی گردونه یعنی کاری که میخواستی رو انجام دادم برات

قدم بعد اینه که پسورد ماژول بلوتوثمون رو عوض کنیم . برای این کار مراحل زیر رو پیش میریم:
1. اول ازش می پرسیم الان پسوردت چنده ؟
2. بهش میگیم پسوردت رو بزار مثلا 1395
با کامند ?AT+ PSWD ازش میپرسیم پسوردت چنده . جواب ماژول توی کنسول سریال این هست که :
+PSWD:1234
OK
حالا باید بهش بگیم پسوردت رو بزار 1395 . کامند استانداردش AT+ PSWD=1395 هست که پاسخ ماژول به این کامند هم OK خواهد بود .

حالا تبدیل ( یا آردوینو ) رو از USB بکشید تا پاور قطع بشه و دوباره بزنید به USB . با این کار ماژول از مد کامند خارج میشه و به مد پیش فرضش که دیتا هست بر میگرده .
برای این که مطمئن باشید کامندهایی که فرستادید تنظیم شده کافیه سعی کنید ماژول بلوتوث رو با گوشیتون pair کنید :
Screenshot_2016-07-12-11-15-04

Screenshot_2016-07-12-11-15-14

Screenshot_2016-07-12-11-15-21

جلسه بیست و چهارم : راه اندازی بلوتوث HC-05 با آردوینو

سلام این جلسه قصد دارم در مورد راه اندازی بلوتوث با آردوینو باهاتون صحبت کنم .هدفمون در این جلسه این هست که بتونیم از آردوینو یه کامند بفرستیم به گوشی و به عکس از گوشی یه کامند بفرستیم به آردوینو همین !
تمامی این تبادل اطلاعات بی سیم و از طریق بلوتوث انجام میشه. مدل بلوتوثی که من برای کارم استفاده می کنم HC-05 هست که از اینجا میشه تهیه اش کرد.

وقتی قراره یه ماژول رو راه اندازی کنیم قدم اول اینه که یه نگاه کوچیک به پینهاش بندازیم ببینیم روی پینهاش چی نوشته . الان در مورد بلوتوث به تصویر زیر برخورد می کنیم : HC-05 (2)-500x500 همونطور که می بینید روی دوتا از پینهاش اسم TX و RX به چشم میخوره بنابراین پروتکل ارتباطی این ماژول از نوع سریال هست. دو تا راه حل برای راه اندازی این ماژول داریم :
1. وصلش کنیم به پینهای 0 و 1 آردوینو
2. از سریال نرم افزاری استفاده کنیم من یقینا از سریال نرم افزاری استفاده خواهم کرد تا در مرحله آپلود کد به مشکلی برخورد نکنم بنابراین سیم بندی مطابق عکس زیر خواهد بود :
arduino_hc05_soft خب حالا نوبت آپلود کردن کده . همون کدی رو که برای ارسال AT کامند تو جلسه قبل استفاده کردیم این جلسه هم استفاده می کنیم با این تفاوت که الان اسم ارتباط سریالمون رو میزاریم : Bluetooth 2016-05-15_17-29-23 توضیح قسمت های مختلف کد :
قسمت 1 : معرفی کتابخونه softwareserial و استفاده از پینهای 2 و 3 به عنوان سریال . یعنی به جای پین 0 پین شماره 2 بشه rx آردوینو و به جای پین شماره 1 پین شماره 3 بشه tx آردوینو
قسمت 2 : کانفیگ ارتباط سریال اصلی کامپیوتر – آردوینو و ارتباط سریال بلوتوث – آردوینو
قسمت 3 : قبلا توضیح داده شده در جلسات لطفا مرور بفرمایید.

قسمت کد نویسی داستان که سمت آردوینو هست تموم شد. الان باید بریم سر وقت بخش اندرویدی ماجرا . برای این کار نرم افزار SENA BTerm Bluetooth Terminal رو از google play دانلود و نصب کنید. مراحل زیر رو برای اتصال گوشیتون به ماژول بلوتوث انجام بدید:
1.باز کردن نرم افزار و روشن کردن بلوتوث
1
2.نمایش صفحه اولیه نرم افزار
2
3.کلید setting موبایل رو انتخاب کنید و از بین گزینه ها، گزینه Bluetooth Management رو بزنید.
3
4. کلید connect to رو انتخاب کنید
4
5.کلید Select رو انتخاب کنید.
5
6.کلید Start Scan رو بزنید تا ماژولتون رو پیدا کنه
6
7. ماژول پیدا شده رو انتخاب کنید ( من از HC-05 استفاده می کنم و پیداش هم کرده )
7
8.کلید connect رو بزنید .
8
9. این قسمت ازتون پسورد می خواد . پسورد دیفالت این بلوتوث ها یا 1234 هست یا 0000 .
10
***تا الان فقط داشتیم موبایل و ماژول بلوتوث رو با هم آشنا میکردیم (اصطلاح انگلیسیش میشه pair و فارسی میشه جفت ) . از این جا به بعد می خوایم بین آردوینو و موبایل داده رد و بدل کنیم.
10. برای انتقال داده از آردوینو به موبایل هر چیزی که تو کنسول سریال آردوینو بنویسید توی این صفحه مشکی رنگ چاپ میشه . مثلا من تو کنسول سریال آردوینوم نوشتم salam و اینجا همون سلام چاپ شده . در واقع طبق قسمت سوم کد آردوینو (که عکسش رو بالا گذاشتم ) الان تو بافر سریال کامپیوتر و آردوینو یه چیزی هست (همون salam ) بنابراین وارد شرط if دوم حلقه loop میشه و اون داده توی بافر سریال رو بر میداره و با دستور Bluetooth.write میفرسته برای ماژول بلوتوث و اون هم میفرسته برای موبایلی که باهاش pair شده و این میشه که ما تو این صفحه اون دیتا یعنی salam رو می بینیم.
9
11. این قسمت بر خلاف قسمت قبل می خوایم از موبایلمون برای آردوینو دیتا بفرستیم. بنابراین باز هم کلید setting موبایل رو انتخاب کنید و Show toolbox رو بزنید.
10
12 توی این صفحه هر چیزی رو که میخواید برای آردوینو بفرستید تو قسمت 1 تایپ کنید و enter بزنید در این حالت داده شما باید توی کنسول آردوینو چاپ بشه یعنی شرط if اول حلقه loop داره اجرا میشه . توی این toolbox یه سری مخلفات هم مثل Alt و Ctrl و … داره که خودتون وقتی باهاش کار کنید می فهمید چیکارا می کنه.
11

در نهایت این که ما با کمک نرم افزار sena تونستیم بین آردوینو و موبایلمون داده رد و بدل کنیم.
پایان جلسه

جلسه بیست و سوم : ارسال AT Command

سلام
جلسه قبل در مورد سریال نرم افزاری یا همون Software Serialصحبت کردیم . این جلسه قصد دارم با استفاده از بحث جلسه قبل برای یه ماژول GSM کامند بفرستیم .
قدم اول اینه که اصلا ببینیم AT Command چیه ؟
خیلی موقع ها شده که وقتی داریم اطلاعات یه ماژول رو می خونیم می بینیم تو توضیحاتش نوشته ارتباط با این ماژول توسط AT Command هست. AT Command به زبون ساده یه سری حرف و در خواسته که ما به ماژول می زنیم و ماژول هم به ما جواب میده .
مثلا فرض کنید یه ماژول GSM داریم ( همون ماژول های سیم کارت خور خودمون ) می خوایم از ماژول سوال کنیم سیم کارتی که روشه پین کد داره یا نه ؟ کار خیلی سادس ! ما دقیقا همین رو ازش سوال می کنیم . حالا چجوری ازش بپرسیم ؟ مثلا بگیم ماژول جان پین کد داری؟ یا بگیم سلام آیا سیم کارت شما پین کد دارد یا هزار مدل دیگه ؟ فرض کنید که ما به هر شکلی پرسیدیم حالا ماژول بخواد جواب بده . میتونه بگه آره می تونه بگه بلی می تونه بگه بله و ….
به این مکالمه ما با ماژول میگن ارتباط AT Command . یعنی ما با ماژول با ارسال کامند حرف می زنیم . حالا این که ما چجوری بپرسیم و اون چجوری جواب بده یه استاندارد داره به نام لیست AT Command ها . ماژولی که باید باهاش با AT Command حرف زده بشه بدون شک یه فایل PDF داره که لیست تمام کامندهایی که میپذیره توش نوشته شده .
حالا چرا AT Command ؟ چراشو نمیدونم و حوصله سرچ کردن و فهمیدن هم ندارم . فقط همینو بدونین که هر کامندی که میدیم با AT شروع میشه . مثلا میگیم : ATRST یا میگیم : ATCDMA و الی آخر . بدون استثنا تمام کامندها با AT شروع میشه .

*****************************************************

تا اینجای جلسه فقط سعی کردم خیلی خیلی ساده بهتون بگم AT Command چیه ؟
الان قصد دارم روش ارسال AT Command رو شروع کنم.
بزرگترین و مهم ترین نکته اینه که هر ماژولی که روش انتقال اطلاعاتش AT Command هست پروتکل ارتباطی سخت افزاریش سریاله . یعنی تمام کامندهای ما روی پینهای RX و TX ماژول ارسال و دریافت میشه . ماژولی که من میخوام باهاش ارسال AT Command رو نشون بدم ماژول SIM800L هست که اینه .
به جای این ماژول شما می تونید از هر ماژول دیگه ای که انتقال اطلاعاتش به صورت AT Command هست استفاده کنید (هر ماژولی )

قدم اول برقرار کردن سیم بندیه . من قراره از سریال نرم افزاری و پینهای شماره 10 , 11 استفاده کنم .
2016-05-08_16-44-05

توی سیم بندی بالا تکلیف پینهای 10 و 11 و گراند که معلومه ، می مونه VCC . ممکنه ولتاژ کاری ماژولی که شما باهاش کار می کنید بیشتر یا کمتر از 5 ولت آردونیو باشه .حتی در بعضی موارد ولتاژ کاری ماژول همون 5 ولته ولی آمپر ماژول بالاتر از آمپر آردوینوس . در این حالت باید ولتاژ ماژولتون رو از یه منبع خارجی تهیه کنید و به یاد داشته باشید که گراند منبع خارجی و گراند آردوینو رو باید با هم مشترک کنید.

خب سیم بندی رو هم انجام دادیم میریم سراغ مرحله کد نویسی . از مسیری که قبلا رفتیم مثال اولیه Software Serial رو بیارید :
2016-05-08_16-52-55

حالا تو این کد من قصد دارم دست ببرم . مثلا میخوام اسم ارتباط سریال نرم افزاریمو بزارم SIM800L .
تغییر دومم اینه که Baude Rate ارتباط سریال کامپیوتر و ارتباط سریال SIM800L ام رو میزارم 9600.
از اونجایی که آردوینو من UNO هست اون تابع while ای که نوشته رو پاک می کنم.
توی تابع setup هم دو تا پرینت داره هر دوتاشو پاک می کنم .
کد نهایی من با پاک کردن کامنت های اضافی شد این :
2016-05-08_17-13-46

قسمت 1 : معرفی کتابخانه SoftwareSerial و معرفی پینهای 10و 11 بعنوان پینهای سریال . دقت کنید 10 میشه RX آردوینو و 11 میشه TX آردوینو. همچنین دقت کنید که اسم ارتباط سریالم شده SIM800L .
قسمت 2 : کانفیگ ارتباط سریال . Baude Rate ارتباط سریالم شده SIM800L.begin .
قسمت 3 : تابع LOOP که توجلسه قبل براتون توضیح دادم . باز هم اسم ارتباط سریالم تو خوندن و نوشتن شده SIM800L.

کد رو آپلود کنید تو آردوینو و کنسول سریال رو باز کنید. مثل عکس زیر دو تا تنظیم گفته شده رو حتما مثل خودش انجام بدید.
2016-05-08_17-17-18

*****************************************************

حالا وقت کامند دادنه . الان ممکنه تو دلتون این دلهره بوجود بیاد که سخت افزارمو درست بستم ؟ کد نویسیم درسته ؟ چیزی مشکل نداره ؟
برای پایان دادن به این دلهره یه راه حل وجود داره اونم اینه که اولین و مهم ترین کامند ( به نظر من ) رو بدید. تو این داستان ارتباط AT Command یه کامند خیلی مشهور و البته مهم و مشترک بین تمام ماژول ها وجود داره که همیشه با اون شروع می کنن به کامند دادن و اون کامند AT هست . AT یه جورایی در نقش سلام ظاهر میشه . ما به ماژول سلام می کنیم ( با ارسال کامند AT ) ، اگه ماژول سالم باشه و در اتصالات سخت افزاری مشکلی نداشته باشه ماژول به سلام ما جواب میده . جواب سلامی که میده کامند OK هست. یعنی اگر ما AT رو بفرستیم و ماژول OK جواب بده کار تمامه و ما تونستیم بین ماژول و آردوینومون ارتباط AT Command رو برقرار کنیم.
کلیپ زیر دقیقا داره همین رو نشون میده :

*****************************************************

در صورتی که مطابق کلیپ بالا به ماژول سلام کردید و ماژول هم جواب داد یعنی همه چیز درست پیش رفته و آمادس تا شما کامندهای اصلی تون رو برای کانفیگ وارد کنید . در غیز این صورت با توجه به این که کد درسته یقینا یه جا تو سیم بندیتون مشکل داشتید.

این جلسه صرفا قصد داشتم فرستادن AT Command با سریال نرم افزاری رو بهتون آموزش بدم . نگید چرا فقط یه AT فرستادم چون اگه این کامند کار کنه بدون شک بقیش هم کار خواهد کرد.

پایان جلسه

جلسه بیست و دوم : سریال نرم افزاری آردوینو ( Software Serial )

سلام
این جلسه تصمیم دارم در مورد SoftwareSerial باهاتون صحبت کنم .
اول برید از اینجا بخونید که ارتباط TTL چیه .
قدم بعد بیاین در مورد یه اشتباهی که به احتمال زیاد تا حالا هممون تو کار با آردوینو انجام دادیم حرف بزنیم .

******************************************************
اگه تا حالا با ماژول های GPS کار کرده باشید می دونید که پروتکل ارتباطی این دسته از سنسورها TTL هست. بنابراین باید اونا رو به پورت سریال آردوینو که همون پینهای دیجیتال 0 و 1 هست وصل کنید.
eFevW
پین شماره 0 دیجیتال آردوینو پین RX و پین شماره 1 دیجیتال آردوینو پین TX هست . RX یعنی پین دریافت و TX یعنی پین ارسال . اگر قرار باشه داده ای از آردوینو ارسال بشه روی پین TX فرستاده میشه و اگر قرار باشه داده ای توسط آردوینو دریافت بشه (از یه دیوایس دارای ارتباط سریال دیگه ) روی پین RX دریافت میشه . این قانون توی تمام ماژول هایی که پروتکل ارتباطیشون سریال TTL هست وجود داره.
حالا وقتی قراره این آردوینو از طریق ارتباط سریال به یه ماژول دیگه که ارتباط اونم سریال هست وصل بشه باید پین 0 دیجیتال آردوینو (همون RX )به پین ارسال یعنی TX اون ماژول وصل بشه و پین دیجیتال شماره 1 آردوینو (یعنی همون TX ) به پین دریافت یعنی RX اون ماژول وصل بشه . اصطلاحا میگن در ارتباط سریال قطعات به صورت ضربه دری وصل میشن . TX به RX و RX به TX .
50e1ce8bce395fb62b000000
تو عکس بالا علاوه بر نشون دادن ضربه دری بودن ارتباط TTL به یه نکته خیلی مهم هم اشاره شده . اگه قرار باشه دو تا ماژول از طریق ارتباط سریال با هم ارتباط برقرار کنن علاوه بر رعایت اتصالات TX و RX باید زمین مشترک رو هم حتما حتما حتما رعایت کنین. علتش رو تو جلسه قبل گفتم می تونید برگردید و مطالعه کنید .

*****************************************************
خب حالا فرض کنید یه ماژول GPS رو با رعایت نکات گفته شده به آردوینو وصل کردیم یعنی این شکلی :
Arduino-GPS
کد آردوینوشم کامپایل کردیم و حالا می خوایم آپلودش کنیم تو برد . هر چی می زنیم که آپلود شه ارور میده ! خب برمی گردیم تنظیمات نرم افزار رو چک می کنیم . برد رو درست انتخاب کردیم، شماره پورت کام رو هم درست انتخاب کردیم ولی کد آپلود نمیشه! مشکل کجاست؟
مشکل اون دو تا پین دیجیتالی هستن که وصلشون کردیم به GPS . میگید نه سیم ها رو از پین دیجیتال شماره 0 و 1 آردوینو جدا کنید و دوباره آپلود کنید . دیدید ؟ کد راحت آپلود میشه . دوباره سیم ها رو وصل کنید به آردوینو و سعی کنید که کد رو آپلود کنید، بازم آپلود نمیشه .
می دونید علتش چیه ؟ علت اینه که مسیر آپلود کد از کامیوتر به پردازنده از این دو پین سریال (یعنی 0 و 1 ) میگذره . وقتی این دو پین آزادن مشکلی نداره و کد آپلود میشه ولی وقتی این دو پین به ماژولی دیگه ای وصل باشن مسیر ارتباط سریال بین کامپیوتر و پردازنده اشغاله و کد نمیتونه روی پردازنده آپلود بشه .
شاید بگید این چه مسخره بازیه ایه ! یعنی هر بار بخوام از یه دیوایس سریال استفاده کنم باید موقع آپلود کد توی آردوینو هی سیم ها رو بکنم و وصل کنم ؟
جواب منفیه دوستان . راه حل استفاده از SoftwareSerial هست . هر جا دیوایسی داشتید که ارتباطش سریال TTL بود نیازی نیست حتما و فقط از پین های 0 و 1 آردوینو استفاده کنید . بلکه بسته به این که از کدوم برد آردوینو استفاده می کنید می تونید از پین های دیگه ای هم استفاده کنید. در مورد آردوینو UNO که بیس آموزش های ماست از هر پین دیجیتالی می تونید استفاده کنید . مثلا 2و 3 یا 5 و6 یا 10 و 11 و …. .

*****************************************************

حالا یه سوال فنی بوجود میاد :
این SoftwareSerial که من هی اسمشو میارم چیه اصن ؟
SoftwareSerial یه کتابخونه هست که ما به کمکش ارتباط سریالمون رو برقرار می کنیم. برای داشتن این کتابخونه نیازی نیست از هیچ جا دانلودش کنید چون کتابخونه پیش فرض آردوینو هست. باور نمی کنید ؟ مسیری که میگم رو پیش برید تا چشمتون به دیدارش روشن بشه :
FILE > Exapmles < SoftwareSerial
اینم عکسش :
Untitled
روی همون مثالی که مشخص شده کلیک کنید تا باز بشه ، وقتی باز بشه با کد زیر رو به رو میشید ( من یه سری کامنتاشو حذف کردم تا کد خلوت تر بشه ) :
4-29-2016 3-37-09 PM
و اما معرفی قسمت های مختلف کد :
قسمت 1 : توی این قسمت خط اول کتابخونه SoftwareSerial رو معرفی می کنه . خط دوم که فوق العاده خط مهمیه دوتا کار رو انجام میده :
اول : معرفی اسم ارتباط سریال . توی کدی که دیفالت نرم افزار هست اسم ارتباط سریال جدید رو گذاشته mySerial .شما هر اسمی مثل GPS ، مثل NEWSerial یا هر اسم دیگه ای که دوست دارید ( در صورتی که از اسم های خاص نرم افزار نباشه ) رو می تونید استفاده کنید.
دوم : میاد شماره پینهایی رو که داره به جای سریال استفاده می کنه معرفی می کنه . اینجا از پین 10 و 11 استفاده کرده . در مورد آردوینو UNO به جای این دو تا پین هر دو پین دیجیتال دیگه ای میشه گذاشت . دقت کنید پینی رو که اول می نویسید در نقش RX ظاهر میشه و پین دوم در نقش TX . یعنی الان باید پین TX ماژول GPS به پین 10 آردوینو و پین RX ماژول GPS به پین 11 آردوینو وصل بشه .

قسمت 2 : اینجا Baud Rate ارتباط سریال اصلی کانفیگ میشه . ارتباط سریالی که دقیقا با نام Serial استفاده میشه اون ارتباط سریال بین کامپیوتر و آردوینو هست که ما در نهایت خروجیش رو تو کنسول آردوینو می بینیم .
این while که نوشته عملا فقط صبر می کنه تا ارتباط سریال بین کامپیوتر و اردوینو برقرار بشه که طبق کامندی که خودش نوشته فقط واسه آردوینو لئوناردو نوشتنش لازمه میتونید برش دارید.
بعدش هم که نوشته (” Serial.println(“Goodnight moon فقط برای تست اینه که ارتباط سریال بین کامپیوتر و آردوینو برقرار شده یا نه . دقت کنید چون نوشته Serial.println مربوط به سریال اصلی آردوینو هست و خروجیش تو کنسول آدوینو قابل دیدنه .

قسمت 3 : این قسمت اون سریال نرم افزاری که به صورت دیفالت اسمش رو گذاشته mySerial ( و قرار شد هر چی دوست داشتیم بزاریم ) کانفیگ می کنه . دقت کنید نوشته mySerial.begin این یعنی داره روی سریال نرم افزاری کار می کنه . اگر اسمش رو اول گذاشته بودیم GPS باید می نوشتیم GPS.begin .

قسمت 4
: این قسمت که توی تابع LOOP نوشته شده کد جالبیه .
if اول رو براتون ترجمه می کنم :
اگر داده از از سمت GPS واسه آردوینو فرستاده شده بود اون داده رو دریافت کن و تو کنسول سریال نمایش بده .
با دستور mySerial.available چک میشه که داده ای از GPS فرستاده شده یا نه .
با دستور mySerial.read اون داده دریافت میشه
با دستور Serial.write اون داده تو کنسول سریال آردوینو نمایش داده میشه .

ترجمه if دوم :
اگر داده از از سمت آردوینو واسه GPS فرستاده شده بود اون داده رو دریافت کن وبفرست واسه GPS .
با دستور Serial.available چک میشه که داده ای از آردوینو فرستاده شده یا نه .
با دستور Serial.read اون داده دریافت میشه
با دستور mySerial.write اون داده واسه GPS فرستاده میشه .

در صورتی که شماره پینها 11 (به عنوان RX ) و 10 (به عنوان TX ) باشه سیم بندی مطابق عکس زیر می شه :
gps-adafruit

*****************************************************

خب من تو این جلسه صرفا قصد داشتم این کتابخونه رو بهتون معرفی کنم و بس .
این که چجوری با استفاده از این کتابخونه کد بزنیم رو تو جلسه بعد که ارسال AT Command هست یاد میدم
پایان جلسه

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

سلام
تو جلسه های قبلی در مورد راه اندزای موتور DC مفصل صحبت کردیم یادتونه ؟ جلسه دهم .
این جلسه قصد دارم در مورد سروو موتورها صحبت کنم .
مثل روند بقیه جلسه ها اول از خود سروو موتور می گیم. سروو موتور در حقیقت همون موتور DC هست که تو ساختمان داخلیش یه فیدبک اضافه شده . فیدبکی که به ما کمک می کنه بتونیم موقعیت ( یا قشنگ تر بگم زاویه ) سروو رو دقیق تعیین کنیم. مثلا بهش بگیم برو تو زاویه 45 درجه وایسا ! حالا این که چجوری میفهه کجا وایسه رو اینجا به صورت دقیق آموزش داده .

حتما لینک پیشنهاد داده شده رو بخونید چون علاوه بر این که در مورد سروو حرف میزنه بهتون میگه فرق این موتور با موتور DC چیه . ( ناگفته نمونه که تعدادی از سروو موتورها هستن که از موتور AC ساخته می شن اما مورد بحث ما نیستن ولی اینجا بهشون اشاره شده که می تونید استفاده کنید.)

*** یکی ازمهم ترین خاصیت موتورهای سروو این هست که جریان مورد نیازشون در مقایسه با خود موتور های DC کمتره و همین یعنی یه امتیاز مثبت.

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

***********************************************************
سروو موتورها دو دسته بندی اساسی دارن .
دسته بندی اول سروو 180 و سروو 360 هست.
سرووهای 180 تنها زاویه ای بین 0 تا 180 (در عمل حدود 175 ) رو قبول می کنن و خارج از این نیم دایره نمی چرخن .
سروو 360 چی ؟ لابد فکر می کنید این سروو زاویه بین 0 تا 360 رو میگیره نه ؟ باید بگم که نخیر . اینجوریا نیست . سروو 360 اصلا زاویه نمی گیره . بلکه فقط دور می زنه . یعنی چی ؟
تو کدی که در آینده می زنیم خواهید دید که یه جا میگیم : (myservo.write(45 . این برای سروو های 180 یعنی سروو جان برو تو زاویه 45 درجه وایسا . اگر همین خط کد رو بدیم به یه سرو 360 این سروو 45 بار دور خودش می چرخه . یعنی هر عددی که در آرگومان این دستور نوشته بشه تعیین کننده تعداد دور هست.

***********************************************************
دسته بندی دوم مربوطه به سرووهای دیجیتال و آنالوگ هست . تفاوت عمده این سروو ها بر سر دقت و سرعت هست که تو این فروم خیلی ساده و خوب توضیح داده شده و نیازی به تکرار نیست.

***********************************************************

خب این جا معرفی اولیه سرووها تموم شد . حالا قصد داریم با استفاده از آردوینو راه اندازیش کنیم . این جا دو تا حالت مختلف بوجود میاد :
یکی این که سروویی که انتخاب می کنیم آمپر پایین باشه و برای تامین توان مصرفیش خود آردوینو پاسخگو باشه . سرووهایی مثل این سروو :
H512-SG90-500x500 برای راه اندازی این سرووها سیم بندی مثل شکل زیره :
Arduino-Servo-Basic
یعنی GND و VCC از آردوینو تامین میشه و سیم سیگنال سروو (که میشه سیم نارنجی ) وصل میشه به پین PWM شماره 9 . دقت کنید به جای پین شماره 9 هر پین PWM دیگه ای میشه .

حالت دومی که اتفاق می افته اینه که امپر مورد نیاز سروو از آمپری که آردوینو میتونه براش تامین کنه بیشتر بشه در این صورت نمی تونیم پاور موتورمون رو از آردوینو بگیریم . سرووهایی مثل این سروو :
MG995_Metal_Gear_Servo_2-500x500

برای تامین پاور قائدتا باید بریم سراغ منبع تغذیه های با آمپر بالا . پیشنهاد من 5 ولت 1 آمپره . حالا سیم بندیمون رو چجوری انجام بدیم ؟

2016-03-28_10-29-52


اگه به عکس دقت کنید اومده پین سیگنال سروو رو به پین دیجیتال شماره 9 وصل کرده
پاور سروو ( 5 ولت ) رو از منبع خارجی گرفته .
گراند سروو و گراند منبع و گراند آردوینو هر سه به هم وصل شدن .به این کار میگن زمین مشترک کردن. این نکته فوق العاده مهمه که اگه داریم توی پروژه هامون از منبع خارجی استفاده می کنیم گراند منبعمون با گراند آردوینومون یکی بشه . برای این که درک کنید یه مثال می زنم .
فرض کنید قراره دو عدد رو پیدا کنیم که اختلافشون 5 باشه . این دوتا عدد میتونن 0 و 5 باشن، میتونن 0.5 و 5.5 باشن، میتونن 1 و 6 باشن و هزارتا حالت دیگه . درسته ؟ اختلاف همه این عددها یکیه ولی هیچ دو دسته ایشون با هم مساوی نیستن . توی آردوینو هم دقیقا همینه . منطق کاری آردوینو 5 ولته یعنی حداقل ولتاژ 0 و حداکثر ولتاژ 5 ولته . منبعی هم که الان وصل کردیم 5 ولته . یعنی اختلاف حداکثر و حداقل ولتاژش 5 ولته . حالا ما با ایجاد زمین مشترک بین منبع و آردوینو داریم میگیم دامنه تغییر ولتاژ هر دو از 0 تا 5 ولت باشه نه هر دامنه تغییر دلخواهی چرا که تو عالم الکترونیک و میکروکنترلر 5 ولت و 5.5 ولت خیلی اختلاف دارن . بنابراین توی این مساله همیشه گراند مشترک رو رعایت کنید.

***********************************************************

خب سیم بندی که انجام شد میریم سراغ کد:
2016-03-28_10-39-32

قسمت 1 : معرفی کتابخونه سروو . این کتابخونه کتابخونه پیش فرض آردوینو هست و هیچ احتیاجی نداره که بخواین اضافه کنین به کتابخونه های آردوینو.
قسمت 2 : معرفی آبجت myservo از کلاس Servo
قسمت 3 : با این خط کد داریم میگیم پین pwm ای که سیم سیگنال سروو رو بهش وصل کردیم پین شماره 9 هست.
قسمت 4 : با دستور myservo.write داریم به سروو زاویه ای رو که میخوایم بهش برسه میگیم . اول بهش میگیم برو تو زاویه 0 درجه وایسا ، یک ثانیه بهش زمان میدیم ((delay(1000) ، بهش میگیم برو تو زاویه 90 درجه وایسا ، یک ثانیه بهش زمان میدیم ، بهش میگیم برو تو ازویه 180 وایسا ، یک ثانیه بهش زمان میدیم و در آخر بهش میگیم تو زاوه 90 وایسا . اینجا LOOP تموم میشه و دوباره بر میگرده از اول و میره تو موقعیت 0 بعد 90 بعد 180 و الی آخر .