جلسه بیست و هشتم : کنترل تگ های 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 با آردوینو

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

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

سلام
تو جلسه های قبلی در مورد راه اندزای موتور 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 و الی آخر .

جلسه بیستم : بازر (زنگ اخبار)

خب تو این جلسه قصد دارم براتون در مورد بازر حرف بزنم و بعد بریم سراغ راه اندازی بازر با آردوینو .
خب بازر چیه ؟
به زبون ساده بازر همون بوقه ! بوقی که موقع بوت شدن سیستم عاملتون می شنوید همین صدای بازری هست که تو مدار داخلی سیستمتون استفاده شده. یه نمونه بازر مثل عکس زیر هست :
a-875
اگه می خواین دقیق تر از این که بازر چیه و چطوری کار می کنه اطلاعات داشته باشین به این لینک سر بزنید .
برای خریدن بازر هم به اینجا سربزنید .وقتی لینک رو باز کنید دو نمونه بازر متفاوت می بینید : اکتیو بازر و پسیو بازر .
خب حالا کدوم رو بخریم ؟ اصن فرقشون چیه ؟

اکتیو بازر :
اکتیوبازر بزرگترین حسنش اینه که کد نویسیش در حد کد نویسی راه اندازی یه LED هست. یعنی کافیه پین سیگنالش رو 0 و 1 کنید. دلیل این که راه اندازی این بازر انقدر ساده هست اینه که صدای بیپ تو مدار داخلی خودش ساخته میشه و فقط کافیه بهش بگی بنواز (با یک کردن پین سیگنالش بهش این دستور رو میدیم). بزرگ ترین عیب این بارزها هم اینه که صدایی که می تونید باهاش دربیارید فقط یک تن یا اصطلاحا فرکانس داره و هیچ تن صدای دیگه ای از این بازر خارج نمیشه.
ACTIVE-BUZZER-SQ1 (2)-500x500

همونطور که میبیند 3 تا پین داره :
VCC که بهتره 5ولت آردوینو بهش مصل بشه (3.3 هم می تونید البته ).
GND که به گراند آردوینو وصل میشه .
I / O که وصلش می کنیم به یکی از پین های دیجیتال آردوینو (به پین دیجیتال وصلش می کنیم چون طبق توضیح بالا فقط کافیه 0 و 1 بشه) . من به پین شماره 8 وصل کردم شما می تونید به هر پین دلخواهی وصلش کنید.

مدار سادس .
خب حالا کد زیر رو آپلود کنید :
2016-03-02_11-08-24
می بینید؟ کد دقیقا کد ساده LED چشمک زنه .

اپلود کنید و صدا رو بشنوید . با فاصله های 1 ثانیه داره بیپ بیپ می کنه. اگر می خواین که این فاصله ها تغییر کنه می تونید با عددهای تابع های delay بازی کنید.

                     ——————————————————————————–
پسیو بازر:

داستان پسیو بازر دقیقا بر عکسه . کد نویسی این بازرها به مراتب پیچیده تر از اکتیو هاست در عوض هر فرکانسی که دوست داشته باشیم رو می تونیم تولید کنیم. دلیل این موضوع اینه که این بازرها به دلیل ساختار مدار داخلیشون نمی تونن خودشون صدا تولید کنن و فقط می تونن صدایی که تولید شده رو پخش کنن.این بازرها یه جورایی مثل اسپیکر عمل می کنن با این فرق که اینا اسپیکر های قابل کنترل هستن یعنی میشه با برنامه نویسی بهشون بگی چه زمانی بخونن (البته فرق های دیگه ای هم دارن که لازم نیست زیاد واردشون بشیم ). خب حالا که اینا خودشون نمیتونن صدا تولید کنن و وظیفه تولید صدا افتاد گردن ما ، ما هم هر صدایی با هر فرکانسی که دوست داشته باشیم تولید می کنیم و می دیم به این بازرها که برامون پخش کنن. اما یه سوال پیش میاد . خب حالا چطوری صدا تولید کنیم ؟ ما که ماکزیمم یه آردوینو بیشتر نداریم چجوری صدا تولید کنیم ؟
ما با آردوینومون موج هایی تولید می کنیم که با انتقال اونها به بازر ، صدا تولید بشه. برای این کار از خاصیت سیگنال های PWM استفاده می کنیم. ما سیگنال های مربعی با Duty cycle ها و دامنه های متفاوت تولید می کنیم و اونها رو برای بازر می فرستیم . بازر با دریافت این سیگنال های مربعی و انتقال اونها به پیزو داخلیش ، برای ما می نوازه. بنابراین کل کاری که ما انجام میدیم تولید سیگنال های مربعی هست.
یه کم در مورد خط بالا بیشتر توضیح بدم : تا حالا موج مربعی دیدید دیگه درسته ؟
pwm1
توی موج مربعی یه زمان هایی 0 هستیم و یه زمان هایی 1 هستیم . مثلا فرض کنید دوره تناوب هر موج مربعی که ما می سازیم 10 ثانیه باشه ( یعنی شکل موج مربعی ما هر 10 ثانیه تکرار میشه ) .نسبت اون مدت زمانی رو که موج مربعی در وضعیت 1 قرار داشته به 10 میشه Duty cycle. به شکل بالا نگاه کنید. توشکل پایین پایینی تمام مدت زمان موج در وضعیت 1 قرار داشته بنابراین Duty cycle اش میشه 100 درصد. برعکسش تو موج بالا بالایی همیشه 0 بوده بنابراین Duty cycle اش میشه 0 درصد. هر چی مدت زمانی که شکل موج در وضعیت 1 هست بیشتر باشه Duty cycle هم بیشتر میشه .حالا ما باید بیایم برای راه اندازی بازرمون همچین شکل موج هایی رو با آردوینو تولید کنیم .
خب مدار مطابق حالت قبله فقط با یه تفاوت کوچیک :
VCC که بهتره 5ولت آردوینو بهش مصل بشه (3.3 هم می تونید البته ).
GND که به گراند آردوینو وصل میشه .
I / O که وصلش می کنیم به یکی از پین های PWM دیجیتال آردوینو . دقت کنید الان خیلی مهمه که پینی که استفاده می کنیم PWM باشه مثلا من از پین شماره 9 استفاده می کنم.
2016-03-02_12-08-45

خب قسمت های مختلف کد :
1. معرف پین 9 به عنوان پین متصل به بازر
2. تعریف تابع beep . این تابع 2 تا ورودی داره یکیش فرکانسه ، یکیش زمان delay بر حسب میلی ثانیه .
این تابع میاد مقدار فرکانس رو میگیره و به جای آرگومان analogWrite میزاره با این کار دامنه حداکثر سیگنال مربعی تولید شده مساوی این عدد میشه . یعنی توی شکل موج هامون دامنه ممکنه دیگه حداکثر 1 نباشه و کمتر بشه (بستگی داره به عددی که ما انتخاب می کنیم). بعد به ازای delayms میلی ثانیه صبر می کنه . بعد مقدار analogWrite رو مساوی 0 قرار میده (برای ساخت قسمت 0 شکل موج مربعی ) و دوباره به ازای delayms میلی ثانیه صبر می کنه . دقت کنید الان delayms میلی ثانیه مقدار حداکثر دامنه شکل موج برابر مقدار فرکانسه (freqency )و delayms میلی ثانیه مقداربرابر 0 هست بنابراین در این مدل کد نویسی Duty cycle موج مربعی ما 50 درصده.
3. بعد از کانفیگ پین بازر ، 3 بار تابع بیپ صدا زده میشه و هر بار دامنه (فرکانس صدا ) برابر 20 و زمان توقف بین بیپ ها 50 میلی ثانیه در نظر گرفته میشه. و در آخر هم یه دستور delay گذاشته شده که نشون بده تابع ستاپ تموم میشه.
4.در اینجا تابع بیپ با فرکانس 80 و زمان توقف 5 میلی ثانیه صدا زده شده چون تابع LOOP هستیم این خط تا بینهایت ادامه پیدا می کنه.
با تغییر عدد های فرکانس (که میشه آرگومان اول ورودی تابع بیپ ) از بازه 0 تا 255 می تونید فرکانس های بیپ مختلف رو بوجود بیارید.

با تغییر عدد زمان توقف (که میشه آرگومان دوم ورودی تابع بیپ ) فاصله بین بیپ ها رو تنظیم می کنید.

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

پایان جلسه.

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

به نام خدا
این جلسه قصد دارم در مورد راه اندازی رله باهاتون صحبت کنم .
قدم اول اصلا این که رله چیه؟ به طور خیلی خیلی خیلی کلی بخوام بگم رله یه سوئیچه . سوئیچ هایی که تو جلسه های قبلی استفاه می کردیم رو یادتونه ؟ اگه قرار بود سوئیچ زده بشه (اصطلاحا میگیم سوئیچ تحریک بشه )، ما باید با انگشت روی دکمه کلید فشار می آوردیم تا زده بشه .
اما رله ها سوئیچ هایی هستن که با یه سری فعل و انفعالات الکترونیکی و مکانیکی کار سوئیچینگ رو انجام میدن. به عبارت دیگه ما برای قطع و وصل کردن سوئیچ داخلی رله نیازی نداریم که با دست فشار بدیم یا هر نوع کار فیزیکی دیگه بکنیم، بلکه با استفاده از میکروکنترلر و کد نویسی این کار رو انجام می دیم.
یه کم واضح تر بگم منظورم چیه :
یه LED رو تصور کنید که می خوایم روشنش کنیم . یه راه حل اینه که دو تا ولتاژ VCC و GND داشته باشیم مثلا باتری (اینجوری:)
AABatteryHolder
خروجی باتری ها رو بزنیم به LED تا روشن بشه برداریم تا خاموش بشه (با رعایت پلاریته وگرنه LED می سوزه ). اینجا ما داریم به صورت فیزیکی LED رو خاموش و رو شن می کنیم . ولی اگه بیایم با استفاده از یه میکروکنترلر مثل آردوینو این عملیات خاموش و روشن شدن LED رو انجام بدیم (مثل پروژه چشمک زن که جلسه پنجم انجام دادیم ) داریم با استفاده از کدنویسی و بدون دخالت فیزیکی این کار رو انجام میدیم.
داستان رله هم همینه . سوئیچ های قبلی که باهاشون کار کردیم برای تحریکشون لازم بود به صورت فیزیکی سوئیچ رو قطع و وصل کنیم ولی اگه همین تحریک با استفاده از میکروکنترلر و بدون دخالت مستقیم دست انجام بشه میشه رله .
این تعریف های ساده ای از رله بود ، اگه قصد دارید خیلی جزئی تر بدونید رله چیه این لینک رو بخونید.

اما بریم سراغ معرفی قسمت های مختلف یه رله که باهشون کار داریم. شما می تونید انواع ماژول های رله رو از اینجا ببینید. مدلی که من امروز باهاش کار می کنم این هست:
KEEPONIC_Relay_5v_2-500x500 همونطور که می بینید این رله 3 قسمت مهم داره که دونه به دونه معرفیشون می کنم :
1 (1)
خب ما توسط این قسمت به رله میگیم خاموش بشه یا روشن بشه. یعنی همون بخش تحریکش در واقع. برای این کنترل یا بازهم می تونیم مثل مثال باتری بریم سیم برداریم و هر موقع خواستیم وصل کنیم و هر موقع نخواستیم قطع کنیم (یعنی به صورت دستی و فیزیکی )، یا این که می تونیم این قسمت رو به یه میکروکنترلر مثل آردوینو وصل کنیم و از طریق دستورهای کدنویسی این کار رو انجام بدیم. اگر دقت کنید این قسمت سه تا پایه داره . یکی DC+ که در واقع همون پایه VCC هست و باید بهش 5 ولت اردوینو رو وصل کنیم. پایه دیگه DC- هست که نقش گراند (GND) رو داره که به پین زمین آردوینو وصلش می کنیم. یه پایه دیگه داره به اسم IN. از طریق این پایه روشن یا خاموش بودن رله کنترل میشه. یعنی کل کاری که ما در کنترل یک رله انجام میدیم اینه که با ولتاژ این پین رله بازی کنیم . چون این بازی کردن یه وضعیت دوحالته هست یعنی خاموش و روشن (معادل 0 و 1 ) ، این پین رله رو به یکی از پین های دیجیتال دلخواه آردوینو وصل می کنیم. شماره پین مهم نیست چون فقط قصد داریم 0 و 1 کنیم و نم یخوایم PWM بدیم. حالا سوالی که پیش میاد اینه که باید به پین رله رو 0 کنیم تا رله روشن شه یا 1 کنیم تا روشن شه ؟ جواب این سوالتون رو تو بخش سوم همین توضیحات خواهم داد.

1 (3)
این قسمت از رله رو باید به وسیله ای وصل کنیم که قصد داریم تحت کنترلش بگیریم. مثلا به یه موتور با LED توان بالا. خب اگه به عکس دقت کنید میبینید که این قسمت از رله سه تا ترمینال داره که به صورت زیر نام گذاری می شن:
1 (3)
پایه normally close پایه ای هست که در حالت عادی که رله خاموشه به پایه common (یعنی پایه کناریش) وصله . این اتصال رو می تونید از طریق یک مولتی متر هم چک کنید. پایه normally open پایه ای هست که وقتی رله روشن میشه به پایه common وصل میشه در این حالت پایه common از پایه normally close جدا میشه که باز هم می تونید از طریق مولتی متر تست بگیرید. در همین حد برای ما کافیه که از این قسمت بگیم و لی اگه سوال دارید که اصلا پایه normally close چیه و چرا در حالت خاموش رله می چسبه به common این لینک رو مطالعه کنید.

1 (2)
این قسمت تعیین میکنیم که سطح تحریکمون high باشه یا low باشه. یعنی چی ؟
یادتونه تو معرفی قسمت یک همین جلسه گفتم حالا برای روشن کردن رله باید به پایه IN صفر بدیم یا یک بدیم؟ توی این قسمت رله داریم همین رو تعیین می کنیم. اگه وضعیت جامپر زرد رنگ به همین صورت الانش باشه (یعنی روی H باشه ) برای روشن کردن رله باید به پایه IN منطق HIGH وصل کنیم اگه وضعیت جامپر رله بر عکس باشه یعنی روی L باشه باید برای روشن کردن رله بهش LOW بدیم. اصطلاحا به حالت اول میگن رله 1 فعاله و به حالت دوم میگن 0 فعاله.

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

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

خب تو پروژمون قصد داریم فقط رله رو روشن و خاموش کنیم. برای این کار مطابق توضیح زیر مدار رو ببندید:

پایه DC+ رله به پایه 5v آردوینو
پایه DC- رله به پایه GND آردوینو
پایه IN رله به پایه دیجیتال شماره 8 آردوینو (به جای این پین دیجیتال هر پین دیجیتال دلخواه دیگه ای رو هم می تونید استفاده کنید)

سادست دیگه مگه نه ؟
خب حالا میریم سراغ مرحله کد نویسی :
کد زیر رو آپلود کنید تا هر قسمتش رو توضیح بدم :
2016-02-20_15-31-08
قسمت 1 : معرفی پین 8 (پین متصل به رله ) به نام relay_pin
قسمت 2 :کانفیگ ارتباط سریال
قسمت 3 :شرط if . این شرط که در جلسات پیش به تفصیل توضیح داده شده معین می کنه که آیا داده ای در کنسول سریال دریافت شده یا نه.
قسمت 4: :در این خط کد، داده کنسول سریال توسط دستور Serial.read خونده می شه. بعد از آن ،عدد 48 از این داده کم می شه. علت کم شدن عدد 48 چیه ؟
اگه همین کد رو بدون -48 پروگرام کنید و اجرا کنید وقتی تو کنسول عدد 0 تایپ بشه تو خروجی کنسول عدد 48 دیده می شه ( چی شد ؟ من 0 تایپ کردم ولی داره 48 نشون میده ). در صورتی که عدد 9 تایپ بشه در خروجی کنسول عدد 57 دیده می شه. داستان چیه ؟
با کمی جست و جو معلوم می شه که خروجی دستور Serial.read در واقع کد اسکی عدد 0 و 9 هست. یعنی 48 کد اسکی عدد 0 هست و 57 کد اسکی عدد 9 ! یعنی وقتی ما 0 تایپ می کنیم تو ورودی کنسول ، آردوینو میره عدد 48 که معادل کد اسکی 0 هست رو به عنوان خروجی دستور Serial.read تحویل میده.
بنابراین ما برای این که بتونیم از این خروجی اسکی (که مطلوبمون نیست ) به خروجی واقعی خودمون برسیم لازمه از کد اسکی (که الان خروجی دستور Serial.read هست ) عدد 48 رو کم کنیم .به همین سادگی. در نهایت خروجی این خط کد که تو متغیر data ریخته میشه همون عددی هست که ما توی کنسول تایپش کردیم یعنی 0 یا 9 . به نظر من یه بار بدون -48 کد رو تست کنید و ببینید.
قسمت 5 :داده ای که توی کنسول تایپ کردیم تو قسمت خروجی کنسول برامون نشون داده میشه.
قسمت 6 : داده توی متغیر data مستقیما به پین متصل به رله فرستاده میشه.

حالا کد رو تست کنید.
اگه جامپر روی قسمت H باشه وقتی 1 میدید رله روشن میشه و وقتی 0 میدید رله خاموش میشه .
اگه جامپر روی قسمت L باشه وقتی 0 میدید رله روشن میشه و وقتی 1 میدید رله خاموش میشه .

این جلسه هم همینجا تموم شد.
سوالتتون رو تو انجمن بپرسید لطفا .

جلسه هجدهم : راه اندازی LCD کاراکتری 1602

به نام خدا
اول جلسه یه پیشنهاد دارم : این که اول کل جلسه رو یه دور تا آخر بخونین بعد قسمت های سخت افزاریش رو اجرا کنین چون دو روش ارائه میشه. پس تا آخر جلسه رو بخونید هر کدوم از دو روش رو که خواستین انجام بدین.
این جلسه قصد داریم در مورد LCD کاراکتری 1602 حرف بزنیم . اول بگیم که چرا به این میگن 1602: این نمایشگر 16 تا ستون و دو تا سطر داره همین ! در مورد این که چرا لازمه تو پروژه هامون LCD داشته باشیم فکر نمی کنم هیچ نیازی داشته باشه که توضیح بدم. فقط همینو بگم که تا الان هر چیزی رو که می خواستیم ببینیم (مثلا عدد پتانسیومتر ) روی کنسول سریال آردوینو می دیدیم ولی خب خیلی مواقع ممکنه مدارمون رو از کامپیوتر جدا کنیم و با یه سوئیچ آداپتور ببریمش یه جایی وصلش کنیم که هیچ نوع کامپیوتری نباشه که بتونیم از کنسول سریالش استفاده کنیم. وقتی تو همچین شرایطی گرفتار شدیم می ریم سراغ استفاده از انواع LCD ها.
character_2x16_modules_lcd_display_hd44780_controller_black_on_yg
این نمایشگر 16 تا پایه داره که اگه به عکس بالا یه کم دقیق بشید کنار پینها یه شماره 1 می بینید یه شماره 16 . ارتباط آردوینو و این LCD به صورت پارالل هست به همین خاطر باید یه عالمه پین رو وصل کنیم پس بدون فوت وقت بریم سراغ سخت افزار مدرا .

مواد لازم :
هر نمونه آردوینو در دسترس
LCD کاراکتری 1602
برد بورد کوچیک
پتانسیومتر
مقاومت 220 اهم
سیم نری به نری

خب حالا مدارتون رو مثل عکس زیر ببندید :
LCD_Base_bb_Fritz
LCD_Base_bb_Schem
میدونم مدارش زیاد دل و روده داشت بنابراین خسته نباشید.
پروژه ای که می خوایم انجام بدیم اینه که هر چیزی رو که از کنسول سریال دریافت کردیم توی LCD نمایش بده .
برای این کار کتابخونه Liquid Crystal رو به کتابخونه های آردوینو اضافه کنید:
Adafruit_LiquidCrystal-master
آموزش اضافه کردن کتابخونه هم اینجاست:

بعد از این که کتابخونه رو به صورت موفقیت آمیز به آردوینو اضافه کردید مثل عکس زیر کد serialdisplay رو بیارید :
2016-01-30_14-07-20
خب با یه همچین کدی مواجه میشید (البته من نیم کیلو کامنت بالاش رو پاک کردم ):
2016-01-30_14-09-10

قسمت های مختلف :
1:معرفی کتابخونه LiquidCrystal

2: اگه یادتون باشه قبلا هر وقت یه پین رو استفاده می کردیم میومدیم توی هدر برنامه بهش اسم می دادیم . الان اگه بشمارید 6 تا سیم از LCD وصل کردیم به پین های آردوینو . قائدتا باید 6 تا متغیر تو هدر تعریف می کردیم . پس کو ؟ چرا نکردیم ؟ همین خط دستوری که اینجا نوشتیم (LiquidCrystal lcd(12, 11, 5, 4, 3, 2 دقیقا همین کار رو میکنه. فقط فرقش اینه که اون تعریف کردنا به جای اینه اینجا نوشته بشه رفته تو کتابخونه نوشته شده .

3.توی این قسمت کانفیگ پین هایی که تو قسمت 2 معرفی شد انجام میشه.تابع begin در کتابخونه LiquidCrystal پین های معرفی شده در قسمت 2 رو به صورت ورودی / خروجی کانفیگ میکنه. علاوه بر این تعداد سطر و ستون های LCD به عنوان آرگومان های ورودی این تابع قرار داده میشه (یعنی 2 و 16).

4: کانفیگ ارتباط سریال با baude rate مساوی 9600.

بافر ارتباط سریال : قبل از توضیح پارت پنجم لازمه در مورد بافر سریال یه توضیح خیلی ساده بدم. در همین حد بدونید که بافر سریال یه واسطه . یعنی هر آنچه که شما توی کنسول سریال آردوینو تایپ می کنید قبل از این که با دستور Serial.read بریزیدش تو یه متغیر، توی بافر سریال ذخیره میشه. بافر رو یه چیزی مثل شکل زیر تصور کنید که هر کاراکتری که ما تو کنسول تایپ می کنیم میره تو یکی از خونه های این بافر می شینه.

2016-01-30_14-53-39
5: این جا داریم میگیم اگه چیزی توی بافر ارتباط سریال وجود داشت بیا کارای توی کروشه رو انجام بده . دقت کنید با if نوشته . دستور Serial.available میاد تعداد متغیرهایی رو که توی بافر ارتباط سریال هست رو خروجی میده. یعنی مثلا اگه شما تو کنسول سریال تایپ کرده باشید salam خروجی دستورSerial.available عدد 5 هست (یعنی 5 تا کاراکتر). اینجا داره میگه اگه خروجی این دستور بزرگتر از صفر بود (یعنی یه چیزی توی کنسول سریال آردوینو نوشته شده بود (اصلا مهم نیست چند تا)) بیا دستور های بین دو کروشه مربوط به این if رو اجرا کن.

6: اینجا 100 میلی ثانیه صبر می کنه تا کل اون چیزی که ما توی کنسول سریال تایپ کردیم تو بافرارتباط سریال جا بگیره .

7: با دستور clear تمام داده های روی LCD پاک میشه در واقع LCD رو خالی می کنه تا داده بعدی روش چاپ بشه.

8 و 9 : اتفاقی که توی این دو خط کد می افته اینه که داده های خونه های بافر ارتباط سریال دونه دونه روی LCD چاپ میشن تا جایی که بافر خالی بشه. علت این که از while استفاده شده اینه که باید تک تک خونه ها رو خالی کنه تا جایی که دیگه بافر خالی بشه . بعد با دستور (()lcd.write(Serial.read میاد هر چیزی رو که از کنسول سریال میگیره توی LCD چاپ می کنه.

دقیق تر بگم ؟
بار اول که وارد دستور (while (Serial.available() > 0 میشه خروجی دستور Serial.available() مساوی 5 خواهد بود (چون salam توی بافر سریاله ) .بنابراین شرط برقراره و از while عبور میکنه میاد دستور (()lcd.write(Serial.read رو اجرا می کنه .

اگه یادتون باشه توی جلسه ای که در مورد ارتباط سریال حرف میزدیم می گفتیم Serial.read فقط یک کاراکتر رو بر می گردونه . یعنی اگه توی بافر سریال ما مثل بالا salam نوشته شده باشه نمیاد کل salam رو به عنوان خروجی بده فقط S رو برمیگردونه و بعد بافر سریال رو به این شکل در میاره یعنی S رو از اون خارج می کنه :
2016-01-30_15-23-13
توی همین بار اول کاراکتر S با دستور (()lcd.write(Serial.read روی LCD چاپ میشه.
به آخر while  می رسیم .طبق خاصیت حلقه while یک باردیگه شرایط while چک میشه. اگر شرط برقرار باشه وارد حلقه میشه اگه شرط برقرار نباشه از حلقه while خارج میشه.
بار دوم که قراره شرط while چک بشه خروجی دستور Serial.available() مساوی 4 خواهد بود بنابراین بازم شرط برقراره و یک بار دیگه دستور (()lcd.write(Serial.read اجرا میشه و این بار a از بافر سریال خارج میشه و توی LCD چاپ میشه .

اینطوریه که کارکاترها دونه دونه از بافر خارج میشن و روی LCD چاپ میشن تا جایی که بافر خالی بشه و خروجی دستور Serial.available() مساوی صفر بشه. در این حالت شرط while  برقرار نمیشه و از حلقه خارج میشیم.

برای این که حرف منو بهتر درک کنین این قسمت از کد رو تغییر بدید و اپلود کنید:
2016-01-30_16-42-17
همونطور که میبیند هر کدوم از کاراکترها با فاصله زمانی 2 ثانیه روی LCD چاپ میشن.

خب تا این جای داستان پارت اول جلسه تموم شد که راه اندازی اولیه نمایشگر بود. توی کتابخونه LiquidCrystal علاوه بر serialdisplay مثال های دیگه ای هم وجود داشت که می تونید اجرا کنید و ببینید و اگه سوالی داشتید تو انجمن بپرسید .

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

آزار دهنده ترین قسمت انجام این پروژه قسمت سیم بندی اون بود که مجبور بودیم n تاسیم رو با مقاومت و پتانسیومتر استفاده کنیم .
یه راه حل خیلی خوب وجود داره که به جای این همه بند و بساط با 4 تا دونه سیم بتونیم ارتباط نمایشگر و آردوینو رو فراهم کنیم.
برای این کار فقط باید دستمونو بکنیم تو جیبمون و یه دونه از درایور های LCD بخریم :2016-01-30_16-17-22

بعد از این که اینو خریدید لحیمش کنیمد پشت LCD به این شکل :
2016-01-30_16-15-27

وقتی لحیم کاری تموم شد الان سخت افزارمون رو به این شکل می بندیم :
LCD 1602 I2C SCH

می بینید فقط 4 تا دونه سیم .بدون پتانسیومتر ، بدون مقاومت و بدون n تا سیم. اگه دقت کنید علاوه بر VCC و GND دو تا پین دیگه وجود داره به نام های SCL و SDA. این دو تا پین ، پین های ارتباط I2C هستن . ارتباط I2C یکی از پرکاربردترین پروتکل های ارتباطی تو کار ماست . خیلی از سنسورها خیلی از نمایشگرهامون با این پروتکل کار میکنن و ما باید بتونیم تشخیصشون بدیم و راهشون بندازیم. حالا یه سوال پیش میاد و اونم اینه که یه قطعه رو که پروتکل ارتباطیش I2C هست چطوری تشخیص بدیم؟
جواب سوال اینه که به پین های قطعه نگاه می کنیم در صورتی که روی پینهای قطعه اسم های SCL و SDA وجود داشت پروتکل ارتباطی اون قطعه I2C هست.

حالا قطعه هایی رو که پروتکل ارتباطیشون I2C هست چجوری به آردوینو وصل کنیم ؟آیا پین خاصی دارن ؟
مطابق جدول زیر این قطعه ها رو به آردوینو وصل می کنیم :
2016-01-30_16-39-40

یعنی اگه با آردوینو UNO کار می کنید باید به پایه های آنالوگ 4 و 5 وصل کنید. اگه با مگا کار می کنید به پایه های دیجیتال 20 و 21 وصل کنید و الی آخر.

ما روی UNO کار می کنیم بنابراین به پایه های آنالوگ 4 و 5 وصل می کنیم . دقت کنین که ترتیب پایه ها تغییر نکنه که اگه جا به جا بزنین پروژه به هیچ عنوان کار نمی کنه.

خب مدار رو بستید حالا کتابخونه زیر رو به نرم افزار آردوینو اضافه کنید:
LiquidCrystal_I2C

مثل حالت قبل مطابق عکس زیر مثال serialdisplay رو بیارید :
2016-01-30_16-47-28

کدی مثل همون کد قبلی رو به این صورت میبینید (البته من بازم کامنت ها رو پاک کردم ) :
2016-01-30_16-50-17

1: معرفی کتابخونه Wire (در مواقع استفاده از پروتکل I2C صدا زده میشه )

2.معرفی کتابخونه LiquidCrystal_I2C

3.این جا تعداد سطر ها و ستون ها و آدرس I2C نمایشگر معرفی میشه (دقت کنید هر قطعه ای که با I2C کار کنه یه آدرس خاص داره مثلا مال این LCD آدرسش 0X27 هست)

4. بک لایت (نوز زمینه) نمایشگر صدا زده میشه.

بقیه قسمت های کد دقیقا مثل قبله و با همون توشیحات می تونید درکش کنید. کد رو آپلود کنید و استفاده کنید.

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

جلسه شانزدهم : راه اندازی فتوسل

سلام

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

این جلسه می خوایم در مورد فتوسل حرف بزنیم.
09088-02-L

PHOTOCELL2A

 

به زبون خیلی خیلی ساده بخوایم بگیم فوتوسل یه مقاومته. حالا یه سوال پیش میاد که آیا عین همون مقاومتهای خودمونه که تا الان باهاشون کار می کردیم؟ جواب اینه که هم آره هم نه.
بدون شک تا حالا مقاومت دیدید دیگه درسته ؟
imgres
این مقاومت هایی که تا الان باهاشون کار می کردیم اصطلاحا بهشون میگن مقاومت های ثابت. یعنی وقتی میگیم این مقاومت 10 کیلو اهمه یعنی بالا بری پایین بیای، تو مدار این سر دنیا بزنی تو مدار اون سر دنیا بزنی، هر کاری کنی کنی این مقاومت 10 کیلو اهمه. البته همونطور که میدونید بر حسب رنگ چهارم مقاومت ها که طلایی باشه یا نقره ای یه تلورانسی در حد دهم اهم دارن ولی فارق از این تلورانس ،یک مقاومت ثابت هستن و با هیچ واکنش محیطی و یا واکنش مداری این عدد (مثلا همون ده کیلو ) تغییر نمی کنه .

فتوسل هم یه مقاومته ولی از نوع مقاومت متغیر. یعنی وقتی میزان نور محیطی که این فتوسل توشه تغییر کنه مقاومتی که از دو سر این فتوسل دیده میشه تغییر می کنه. بنابراین هم مقاومته و هم مثل اون مقاومت های معمولی نیست. حالا این که چجوری این انرژی نورانی میاد و کاری می کنه که مقاومت دو سر فتوسل تغییر کنه یه سری فعل و انفعالات داخلیه که من به شخصه علاقه ای بهش ندارم ولی شما می تونید سرچ کنید و با این تکنولوژی آشنا بشید. در کل چیزی که واسه ما مهمه اینه که وقتی شدت نور تابیده شده به این سنسور تغییر می کنه مقاومت دوسرش هم تغییر می کنه. واسه اطلاعات تکمیلی هم بگم که به فوتوسل مقاومت نوری و یا  light-dependent resistor) LDR ) گفته می شه.

خب حالا قصد داریم این سنسور رو با آردوینو راه بندازیم.
مواد لازم:
آردوینو (هر نوعی )
سنسور فتوسل
برد بورد کوچیک
سیم نری به نری

حالا مطابق عکس زیر مدار رو ببندید :
light_cdspulldowndiag

همونطور که می بینید اومده یه مقاومت 10 کیلو اهمی (ثابت ) رو با فتوسل سری کرده و از پایه مشکترک بینشون به پین آنالوگ آردوینو داده. منطق این کار همون منطق تقسیم ولتاژه.
images

وقتی مقاومت فتوسل (با تغییر نور ) تغییر می کنه طبق قانون تقسیم ولتاژ ، ولتاژی که روی پایه وسط (مشترک بین مقاومت و فتوسل ) می افته هم تغییر می کنه که چون این تغییر به صورت پیوسته هست این پایه وسط رو به پین آنالوگ آردوینو (پین شماره 0 ) وصل می کنیم.

خب مدار رو بستید؟
بریم سراغ کد. برای کد عینا عینا عینا همون کد پتانسیومتر رو آپلود کنید. یعنی این کد :
2016-01-20_13-07-301

خب کد رو آپلود کنید و کنسول سریال رو باز کنید:
2016-01-26_12-26-48

همونطور که می بینید مقدار دیفالت سنسور روی حدود 600 بود . بعد دستم رو گذاشتم روی فتوسل ( روی قسمت بالایی ) و داده نشون داده شده از 600 به حدود 200 افت پیدا کرد. دوباره که دستم رو برداشتم برگشت رو همون حدودای 600 . این یعنی تو محیطی که تست کردم محدوده روشنایی 600 و محدوده تاریکی 200 هست. جایی که شما دارید تست می کنید می تونه اعداد تو رنج های کاملا متفاوتی بده بر حسب نور محیطی تون.

حالا کنسول رو ببندید و سریال پلاتر رو باز کنید و هی دستتون رو بزارید رو فتوسل و بردارید تا براتون شکل موج بکشه ( محض تفریح البته ).
2016-01-26_12-34-38

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

خب مدار رو بستید تمام ؟
حالا کد زیر رو آپلود کنید تا براتون توضیح بدم:
2016-01-26_13-04-56

تو قسمت هدر برنامه که فقط اومدیم علاوه بر متغیر های کد قبلی متغیر ledPin رو معرفی کردیم به عنوان پین شماره 2 .
تو قسمت کانفیگ دیگه سریال رو برداشتیم چون نیازی بهش نبود و به جاش پین دیجیتال ledPin رو به عنوان خروجی تعریف کردیم.
تو تابع loop خط اول ، داده کانال ADC شماره 0 رو می خونیم و تو متغیر sensorValue می ریزیم ( همون متغیری که تو هدر برنامه تعریف کردیم ).
تو کد قبلی دیدیم که حد روشنایی 600 و حد تاریکی 200 بود.
حالا کد نوشتیم اگه داده ای که خونده از 300 کمتر بود (یعنی رفته باشیم تو تاریکی ) بیا led رو روشن کن. معقوله دیگه وقتی تاریک میشه باید چراغا رو روشن کنیم.
تو خط بعدی هم نوشتیم اگه داده ای که خوندی از 500 بیشتر بود (یعنی تو روشنایی بودیم ) led رو خاموش کن چون هوا روشنه و نیازی به نور اضافه نداریم.

اعداد 300 و 500 رو که من تو کدم قرار دارم بر اساس محیط تستم بود. یعنی همون عدد هایی که با کد قبلی از کنسول در آوردم . شما هر رنج عددی که دارید می تونید در نظر بگیرید و این کد رو متناسب با محیط تست خودتون تغییر بدید.
یعنی مثلا اگه کسی تو تستش تاریکی رو روی عدد 120 داشت (مثلا ) نیازی نداره مثل کد من مرز تاریکی رو 300 بزاره میتونه 200 یا حتی کمتر انتخاب کنه.

و اما نکته آخر :
اگه دقت کنید من وقتی دستورهای if رو نوشتم هیچ آکولادی باز و بسته نکردم در صورتی که قبلا می گفتیم اگه شرط if برقرار بشه دستورهای بین دو آکولادی که باز و بسته شدن اجرا میشه{}. خب الان هیچ آکولادی نیست پس در صورت برقرار بودن شرط if چی اجرا میشه؟
جواب: این یه قانون برنامه نویسیه که اگر بعد از برقرار شدن شرط if تنها یک کار لازم باشه انجام بشه دیگه نیازی به گذاشتن آکولاد نیست. دقیقا مثل شرایط الان ما. در صورتی که نور از مرز تاریکی کمتر بشه فقط لازمه LED روشن بشه (یعنی فقط یک کار ) پس به آکولاد نیازی نیست.

پایان جلسه

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

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

یه توضیح کلی: اول بزارید ببینیم این امکانی که داریم ازش حرف می زنیم کجای نرم افزاره . از منوی Tools وارد Serial plotter میشیم:
2016-01-24_13-07-57
همونطور که می بیند اسم این آیتم سریال پلاتر هست و ما هم از این به بعد به این آیتم پلاتر میگیم. یه نمای کلی هم بخواید ازشکل رسم نمودارش ببینید این شکلیه:
2016-01-24_13-12-32

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

ما هم نمودار دیجیتال رو رسم می کنیم هم نمودار آنالوگ رو.
اول سوئیچ مدار و کد جلسه سیزدهم رو آماده کنید. مدار آخر رو ببندید که با دیبانس نوشتیم. همچین کدی داشتیم اگه یادتون باشه (البته من برای این که کد کوتاه بشه خط های کامنت ها رو پاک کردم)
2016-01-24_13-33-50

ما تو این کد برای این که ارتباط سریال داشته باشیم لازمه یه تغییراتی رو توی کد نویسیمون اعمال کنیم.
2016-01-24_13-39-31
چون لازم داشتیم ارتباط سریال استفاده کنیم خب تو تابع setup کانفیگش کردیم. اگه یادتون باشه گفتیم اساس کار سریال پلاتر ارتباط سریال هست که خدارو شکر تو آردوینو ایجاد ارتباط سریال بین آردوینو و کامپیوتر فقط با یک خط کد انجام میشه یعنی دستور Serial.print. هر آرگومانی که توی این دستور نوشته بشه عینا به صورت سریال (از طریق همون کابل USB که بین آردوینو و کامپیوتر هست ) به کامپیوتر شما ارسال میشه. بنابراین توی این کد هر جا منطق پین دیجیتال شماره 2 صفره ما هم 0 رو سریال پرینت می کنیم هر جا منطق پین یکه ما هم 1 رو سریال پرینت می کنیم.

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


دقت کنید در فیلم جاهایی که یهو یه تغییر دامنه داریم لحظاتی هست که کلید رو فشار دادیم.

این مدل دیجیتالش حالا مدل آنالوگ.
جلسه چهاردهم رو یادتونه ؟ همون مدار و همون کد رو عینا بیارید.
اگه یادتون باشه تو اون جلسه داده های پتانسیومتر رو روی کنسول سریال می دیدیم پس هیچ احتیاجی به تغییر کد نخواهیم داشت. همون کد رو آپلود کنید و سریال پلاتر رو باز کنید.

همونطور که می بینید دقیقا داره متناسب با تغییر ولوم پتانسیومتر (که دست من بود و شما نمی دیدید) نمودار تغییر می کنه.

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

پایان جلسه