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

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

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

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

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

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

خب یک راست میریم سراغ سخت افزار مورد نیاز. مواد لازم :
آردوینو از هر مدلی
یه دونه مقاومت 10 کیلو اهم
یه دونه مقاومت 100 کیلو اهم
یه دونه برد بورد کوچیک

حالا مثل عکس زیر مدار رو ببندید:

adruino-sketch

خیلی خیلی خیلی حواستون جمع باشه که مقاومت ها را جا به جا نزارید.
طبق قوانین موجود در مدار و تقسیم ولتاژ این رابطه بین ورودی و خروجی وجود داره :
Vout = (R2 / (R1 + R2)) * Vin

Vout همون ولتاژی هست که روی پایه آنالوگ اردوینو می افته و توسط ADC داخلی آردوینو به یه عدد بین 0 تا 1023 تبدیل میشه .
Vin ولتاژی هست که میخوایم اندازی گیریش کنیم. امیدوارم با فرمول مشکلی نداشته باشید چون دقیقا قانون تقسیم ولتاژ مدار هست.
حالا یه سوال اساسی پیش میاد و اون اینه که ولتاژی که قراره اندازی گیری بشه تا چند ولت می تونه باشه؟ یعنی 100 ولت ؟ 50 ولت ؟ 10 ولت ؟ چقدر؟

جواب این سوال تو همون فرمول در میاد. ما میدونیم که ماکزیمم ولتاژی که می تونه به پین آنالوگ آردوینو داده بشه و آردوینو بدون مشکل باهاش کار کنه 5 ولته (به شرطی که ولتاژ آنالوگ رفرنس همون 5 ولت باشه . در مورد این آخر آموزش حرف میزنم زیاد درگیرش نشید.) طبق مداری هم که بستیم R1 مقاومت 100 کیلو اهمی و R2 مقاومت 10 کیلو اهمی هست ( مطابق عدد گذاری های عکس دارم میگم ) . اگر تو فرمول بالا به جای vout مقدار 5 و به جای مقاومت ها مقادیر متناظرشون رو بزارم مقدار vin به دست میاد 55. یعنی ورودی اگر 55 ولت باشه روی پین آنالوگ آردوینو ماکزیمم حد تحملش یعنی 5 ولت می افته. وقتی داشتید مدار رو می بستید بهتون گفتم حواستون باشه مقاومت ها رو جا به جا نذارید یادتونه ؟ حالا بیاید تصور کنیم شما جای R1 و R2 رو برعکس تومدار می ذاشتید. در اون صورت بازم طبق فرمول به ازای vout مساوی 5 ولت و اون مقدار مقاومت ها ماکزیمم مقدار ولتاژ قابل اندازی گیری 5.5 ولت می شد. حالا قابل درک شد براتون ؟ حالا شما اگه می خواید این محدوده اندازه گیری رو بزرگ تر یا کوچیک تر کنید می تونید با بازی با این مقاومت ها به هدفتون برسید فقط باید به یه نکته توجه داشته باشید که هر چی دامنه ولتاژ ورودی قابل اندازه گیری بالاتر بره دقت اندازه گیری پایین تر میاد و حساسیت اندازه گیری نسبت به تغییرات ولتاژ کمتر میشه.

خب مدار رو بستید ؟ حالا بریم سراغ کد نویسی .
این کد رو آپلود کنید تا در مورد قسمت های مختلفش حرف بزنیم:
2016-01-27_10-29-04

قسمت هدر برنامه میاد مقدار مقاومت های R1 و R2 رو به عنوان متغیر تعریف می کنه. فایده این کار اینه که اگه کسی خواست رنج اندازه گیری ولتاژش متفاوت باشه و در نتیجه اومد این مقاومت ها رو عوض کرد با همین تغییر ساده بتونه کد رو برای مدار خودش ادیت کنه. توجه کنید که اندازه ها بر حسب اهم وارد میشن یعنی 10 کیلو اهم میشه 10000.
اما تو همین هدر یه متغیر دیگه هم وجود داره به نام Vref. Vref یه مفهوم خیلی مهم در دنیای آنالوگ آردوینو هست که لازمه کامل در موردش توضیح داده بشه.
برای درک بهتر قضیه آردوینوتون رو با کابل USB به کامپیوتر وصل کنید تا روشن بشه. وقتی روشن شد ولتاژ های دو پایه نشون داده شده تو عکس زیر رو با یه ولت متر اندازه بگیرید.
arduino_uno
جالبه نه ؟ پایه ای که روش زده 5v روی ولت متر 5 ولت نیست! پایه Aref هم 5 ولت نیست. مثلا من 4.4 اندازه گرفتم. ممکنه شما یه عدد دیگه مثلا 4.8 یا 4.5 یا هر عددی رو اندازه بگیرید. ولی پایه 3.3v کنار 5v رو که اندازه بگیرید می بینید اون عینا 3.3 ولته. چه خبره ؟ چرا پایه 5v تو واقعیت 5 ولت نیست؟
حالا برید من همین برد آردوینوتون  رو با یه منبع تغذیه سوئیچینگ 9 ولت روشن کنید و ولتاژ همون دو تا پین رو اندازه بگیرید. عجب! تو اندازه گیری من که هر دو 5.00 شدن.

بنابراین می بینید نوع پاور دادنمون به آردوینو چقدر می تونه مهم باشه که از طریق USB بهش پاور بدیم یا از طریق منبه تغذیه های سوئیچینگ.
حالا این پایه Aref چیه که گیر دادیم بهش هی ولتاژشو اندازه می گیریم؟ Aref پایه ای هست که ولتاژش حد ماکزیمم ولتاژ های آنالوگه قابل درک برای آردوینو هست. یعنی در واقع ADC آردوینو ولتاژ های 0 تا Aref ولت رو به عدد بین 0 تا 1023 تبدیل کنه . حالا اگه این Aref همون 5 ولت باشه که خب عالیه و داره درست کار می کنه (مثل حالتی که با منبع تغذیه سوئیچینگ بهش پاور دادیم) اما اگه مثل حالتی که با USB بهش پاور دادیم این ولتاژ روی 4.4 باشه فاجعه پیش میاد! چرا ؟ چون فقط ولتاژهای 0 تا 4.4 ولت به 0 تا 1023 تبدیل میشن . یه کم واضح تر بگم :
فرض کنید سنسور آنالوگی که به آردوینو وصل کردیم یه سنسور فاصله سنج باشه که هر چی فاصله تشخیص داده شده توسط سنسور کمتر میشه ولتاژی که روی پایه آنالوگ سنسور که متصل به پین آنالوگ آردوینو هست بیشتر بشه. یعنی وقتی مثلا فاصله 2 متری رو تشخیص بده ولتاژ آنالوگش 3.5 ولت باشه، وقتی فاصله 1 متر رو تشخیص بده ولتاژ آنالوگش 4.4 باشه و موقعی که فاصله تشخیص داده شده نیم متر باشه بشه ولتاژ آنالوگ 4.8 باشه.
اگه آردوینو من ولتاژ Aref اش 5 ولت باشه هیچ مشکلی نداره به ازای هر فاصله ای که سنسور تشخیص بده آردوینو یه عدد تو بازه 0 تا 1023 بر می گردونه چون سقف ولتاژ آنالوگ قابل درکش همون 5 ولته.
اما اگه ولتاژ Aref آردوینو من 4.4 باشه یه مشکل بزرگ پیش میاد. تا فاصله یک متر رو که عدد ولتاژ آنالوگ 4.4 هست هیچ مشکلی نداره. ولی وقتی که عدد ولتاژ آنالوگ سنسور بالاتر از 4.4 بشه (که معنیش اینه که فاصل کمتر از 1 متر رو تشخیص داده ) تو خروجی ADC آردوینو هیچ تغییری بوجود نمیاد (نسبت به فاصله 1 متر) چون تو فاصله یک متر که عدد ولتاژ آنالوگ 4.4 ولت شده خروجی این ADC اومده روی 1023 و چسبیده به سقفش. حالا وقتی سنسور فاصله نیم متر رو تشخیص بده که در نتیجه ولتاژ 4.8 رو پایه آنالوگش بیفته خروجی ADC آردوینو همون 1023 می مونه. یعنی براش فرقی نمی کنه فاصله تشخیصی 1 متر باشه ، نیم متر باشه یا ده سانت باشه و این یعنی همون فاجعه یعنی فاصله زیر 1 متر یا بعبارتی ولتاژ بالاتر از 4.4 ولت برای آردوینو یک رفتار محصوب خواهد شد.

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

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

تو تابع setup هم که اومده ارتباط سریال و پین آنالوگ رو کانفیگ کرده. بعد دو خطر سریال پرینت کرده که فقط برای زیبایی برنامه هست که تو کنسول سریال موقع استارت برنامه بگه قراره چیکار کنه و ماکزیمم ولتاژ قابل اندازه گیری با این ولت متر دستی چقدره. اما یه خط کد داره به این صورت:
;((((Serial.print((int)(Vref / (R2 / (R1 + R2
یادتونه اول این آموزش حساب کردیم ماکزیمم ولتاژ قابل اندازه گیری این ولت متر چقدره ؟ همون فرموله رو میگم. الان کد با این خط دستور دقیق داره همون کار رو میکنه فقط به صورت کلی . ما برای حالت خاص 5 ولت حساب کردیم که شد 55 . این داره میگه اگه شرایط بحرانی بود و ولتاژ پایه Aref کمتر از 5 ولت بود هم طوری نمیشه. جای همون 5 که خودمون حساب کردیم الان مقدار Vref (ولتاژ اندازه گیری شده پایه Aref ) رو بزارید و تمام. فرق دوم اینه که نوشته (((int)(Vref / (R2 / (R1 + R2) .اگه دقت کنید متغیرهای R1 و R2 و Vref تو هدر برنامه از نوع float انتخاب شدن وقتی می نویسه (int) داره متغیر float رو به int تبدیل می کنه . شما می تونید برش دارید و هیچ مشکلی هم بوجود نیاد. بنابراین با این خط کدنویسی فقط داریم تو تابع setup میگیم که حداکثر ولتاژ قابل اندازه گیری با این ولت متر انقدره. ادامه هم که باز یک سری سریال پرینت هایی هست که برای زیبایی خروجی برنامه در کنسول نوشته شده.

و اما تابع loop .
خط ; float v = (analogRead(0) * Vref) / 1024.0
قسمت analogRead که معلومه داره چیکار می کنه (می بینید که ننوشته A0 نوشته 0 و مشکلی هم بوجود نمیاد ) . اما این وسط یه سری ضرب و تقسیم ها وجود داره که باید بفهمیم اینا چیه .
هدف ما تو این برنامه این بود که با فرمول مطرح شده تو قسمت بالای جلسه بتونیم ولتاژ رو اندازه بگیریم. اگه به فرمول اول جلسه دقت کنید دو تا متغیر داشت vout و vin . جنس هر دوی این متغیر ها ولتاژه دیگه درسته ؟ vout ولتاژ روی پایه آنالوگ آردوینو بود و vin ولتاژی بود که ما می خواستیم اندازه بگیریم . چیزی که analogRead تنها به ما میده یه عدد تو بازه 0 تا 1023 هست. حالا ما باید ببینیم چه ولتاژی روی پین آنالوگ شماره 0 افتاده بوده (یعنی vout ) که بعد با استفاده از فرمول بریم vin رو پیدا کنیم. در واقع الان باید عدد تو بازه 0 تا 1023 رو که با دستور analogRead خوندیم به یه ولتاژ تو بازه 0 تا Vref تبدیل کنیم که بشه همون vout فرمولمون. یه تناسب ساده بسته برای این کار. عدد خروجی analogRead رو تو Vref ضرب کرده .و به 1024 تقسیم کرده. خروجی این ضرب و تقسیم ها ریخته میشه تو متغیر v که در واقع همون vout ماست.

خط ;((float v2 = v / (R2 / (R1 + R2
تو این خط همون فرمول بالای جلسه رو پیاده سازی کرده . ریخته تو متغیر v2 که درواقع همون vin ماست وپرینت کرده. یه delay پونصد میلی ثانیه هم گذاشته تا روند نمایش دادن یه ذره کند بشه.
خب کد رو آپلود کنید و تو کنسول نتیجه رو ببینید.

پایان جلسه.

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

سلام
تو این جلسه قصد دارم بهتون یاد بدم چجوری با استفاده از آردوینو نمودار رسم کنید. چیزی که شاید خیلی از جاها به دردتون بخوره . ورژنای قدیمی نرم افزار آردوینو این امکان رو نداشت که بتونیم باهاش پلات کنیم (نمودار رسم کنیم ) ولی خب تو ورژنای جدید (از 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 رو سریال پرینت می کنیم.

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


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

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

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

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

پایان جلسه

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

میکروکنترلر چیست؟
قطعه ای که این روزها دارد جای خود را در خیلی از وسایل الکتریکی باز میکند .از تلفن گرفته تا موبایل از ماوس لیزری که الان دستتان روی آن است و دارین باهاش کامپیوتر رو کنترل میکنید تا هر وسیله ای که بتوان پیچیدگی رو در اون دید میتونید یک میکروکنترلر رو ببینید .
کلمه میکروکنترلراز دو کلمه میکرو و کنترلر تشکیل شده است.
میکرو : میدونین که این یک واحد یونانی است و برابر با 10 به توان منفی 6 متر است. یعنی یک ملیونیوم متر….
کنترلر : یعنی کنترل کننده به تعبیری یعنی “مغز ” البته بدون تفکر فقط دستوراتی که به اون داده میشه به نحو احسن انجام میده.
کلمه میکرو به دو منظور استفاده شده منظور اول و مهم ،سرعت عمل میکروکنترلر است که میتواند تا یک ملیونیوم ثانیه باشد یعنی میتواند در یک ثاینه یک میلیون عملیات رو انجام بده به همین خاطر واژه میکرو رو به اون اختصاص دادن . معنی دوم آن شاید کوچیکی این قطعه باشد که تا یک ملیونیوم متر کوچیک شده شاید باور کردنی نباشه ولی در یک تراشه ممکنه بیش از یک میلیون تراتزیستور به کار رفته باشه. این کلمه وقتی اهمیتش کامل میشه که با واژه کنترلر عجین بشه تا معنیش کامل بشود .

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

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

تمام میکروکنترلرها جزء این 4 قسمت هستنند:
8051(1
Pic(2
Avr(3
Arm(4
خوشبختانه همه میکروکنترلر هایی که جزء هر کدام از 4 نوع بالا باشند از یک برنامه پیروی میکنند. بدین معنا که اگر شما کار با یکی از مدل های آن میکرو را یاد گرفته باشید مثل اینکه کار با تمام میکروکنترلرهای آن نوع را یاد گرفته اید.مثلا شما اگر با یکی از مدل های میکروکنترلر avr مثلا atmega8 را یاد گرفته باشید دیگر با صد ها مدل دیگر میکروکنترلر avr مشکلی ندارید وتقریبا بدون هیچ مشکلی میتوانید با دیگر مدل های این میکرو کار کنید.
اما یه مشکل که در میکروکنترلر ها وجود دارد این است که این4 نوع از لحاظ برنامه نویسی به هیچ وجه با هم دیگر سازگاری ندارند . به طور مثال اگر شما میکروکنترلر های avr و 8051 را کامل یاد گرفته باشید حتی ساده ترین برنامه رو روی یک میکروکنترلر pic نمیتوانید اجرا کنید. واین یکی از بزرگترین عیب و مشکل برای یاد گیری میکرو است .بنابراین از همون اول باید یک انتخاب درست داشته باشید و میکروکنترلر مناسب را برگزینید تا با یادگیری آن میکروکنترلر بتوانید بعدا به سادگی پروژه های خود را اجرا کنید .

8051 :
اولین میکروکنترلری بود که به دست بشر ساخته شد . ابتدا این میکروکنترلر توسط شرکت بزرگ intel ساخته شد .اما بعدا intel این امکان را به دیگر شرکت ها داد که این میکروکنترلر را تولید کنند و شرکت هایی مانند ATMEL , PHILIPS , SIEMENS , DALLAS و… به تولید این میکروکنترلر پرداختنند. یکی از شرکت هایی که به صورت گسترده به تولید این تراشه پرداخت ATMEL بود. اما اگربخواهیم به صورت کلی سیر پیشرفت این نوع میکروکنترلر رو در نظر بگیریم اولین میکروکنترلر هایی که ساخته شد با جدیدترین میکروکنترلرهای 8051 که الان تولید میشود با توجه به این پیشرفت شگفت در تمام زمینه ها که صنایع دیگر در دنیا دارند پیشرفت زیادی ندارد به طور مثال AT89S5X که میکروکنترلر 8051 جدید ساخت ATMEL است نسبت به مدل های اولیه 8051 پیشرفت آنچنانی ندارد . امکانات این میکرو نسبت به AVR و PIC قابل مقایسه نیست . به صورتی که که همین مدل جدید 8051 تقریبا حافظه ای برابر یک صدم (0.01 ) میکروکنترلر های AVR را دارد و سرعتش 4 برابر کمتر از میکروکنترلر های PIC و 12 بار کمتر از میکروکنترلر های AVR است . از لحاظ امکانات دیگر هم چنین ضعفی احساس میشود. اما برای کارهای ساده تر که پیچیدگی زیادی در آن نباشد به خاطر قیمت بسیار پایینی که این میکروکنترلر دارد بسیار مناسب است . قیمت همین مدل جدید AT89S5X حول و حوش 1000 تومان است که قیمت بسیار مناسبی است.
این میکرو کنترلر از زبان اسمبلی و C پشتیبانی میکند که زبان برنامه نویسی اصلی آن اسمبلی است که واقعا نوشتن با این زبان برنامه نویسی نسبت به زبان های برنامه نویسی دیگر هم مشکل تر و هم طولانی تر است. در کل این میکروکنترلر امروزه دیگر توانای رقابت با AVR و PIC رو ندارد و امروزه رقابت اصلی بین این دو میکروکنترلر است.

PIC :
واقعا میکروکنترلر خیلی قوی است که بر اساس بعضی آمار ها بیشترین کاربر را به خود اختصاص داده است البته متذکر شوم که در ایران این آمار به نفع AVR است. این میکروکنترلر ساخت شرکت میکرو چیپ است که PIC رو در مدل های خیلی زیادی با امکانات مختلف برای کارهای مختلف میسازد .چون بحث اصلی ما روی AVR هست از توضیح بیشتر این میکروکنترلر میگذریم.

AVR :
به میکروکنترلر AVR میرسیم .اول از همه سرعت این میکروکنترلر بسیار بالاست و به قولی دستوراتی که بهش داده میشه در یک سیکل کلاک انجام میده. AVR از زبان های برنامه نویسی سطح بالا یا به اصطلاح (HIGH LEVEL LANGUAGE) HLL پشتیبانی میکند که باعث تولید کدهای بیشتری میشود که در کل برنامه نوشته شده نسبت به برنامه هایی که برای 8051 و PIC نوشته میشود کوتاهتر است. امکانات جانبی این میکروکنترلر بسیار مناسب است و شما را از خرید بعضی لوازم جانبی مانند چیپ های آنالوگ به دیجیتال (ADC) , مقایسه گر آنالوگ و… راحت میکند .در ضمن AVR از بسیاری از استاندارد های ارتباطی مانند SPI,UART,12C,JTAG پشتیبانی میکند که به راحتی میتوان این میکروکنترلر را با میکروکنترلر دیگر یا و سایل دیگر وصل کرد و با وسایل دیگر به راحتی ارتباط برقرار کند. قیمت این میکروکنترلر هم به نسبت امکانات فراوانی که داره بسیار پایین است به طوری که یک میکروکنترلر AVR تقریبا پیشرفته رو با قیمت حول و حوش 3 تا 4 هزار تومان خرید .
AVRها به پنج گروه تقسیم شده اند:
tinyAVR (1
megaAVR (2
AVR (3 XMEGA
AVR32 UC3 (4
AVR32 AP7 (5

ARM :
ARM یک میکرو کنترلر قدرتمند با کاربردهای متنوع است. ARM ها بیشتر در جاهایی که ظاهر زیبای کار مورد توجه است استفاده می شوند چرا که این میکروکنترلرها می توانند سیستم عامل های لینوکس و ویندوز رو راه اندازی کنند.
پروگرام میکروکنترلر :
شاید تا حالا به نظرتون رسیده باشه که این میکروکنترلر رو چگونه میشه برنامه ریزی کرد تا کار مورد نظرمان را انجام بده در صورتی که یک میکروکنترلر برنامه ریزی نشده هیچ کاری رو نمیتونه انجام بده و هیچ کاربردی نداره در واقع برنامه هر میکرو روح وجانی است که در اون دمیده میشه و اون رو زنده میکنه.
برای برنامه ریزی میکروکنترلر نیاز به دستگاه یا بردی هست به نام پروگرامر که یه پل ارتباطیه بین کامپیوتر و میکروکنترلر . پروگرامر را هم میشه از بازار تهیه کرد و هم میشه اون رو ساخت.
البته پروگرامرهای مختلفی در بازار هستنند که متانسب با کاربردشان قیمت های مختلفی دارند بعضی ها فقط چند مدل رو پروگرام میکنند بعضی از پروگرامر ها همه فن حریفند و تمام میکروکنترلر های 8051AVR ,ARM, PIC , رو برنامه ریزی میکنند به طبع قیمت زیادتری دارند.

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