سلام
حدود 10 جلسه فقط و فقط از پینهای دیجیتال حرف زدیم . این که به پین دیجیتال مقدار بدیم یا از پین دیجیتال مقدار بخونیم .
این جلسه تمرکزمون رو می بریم روی آنالوگ ها . اینجا ببینید که کلا سیگنال آنالوگ چیه.
تو این آموزش قراره یاد بگیریم که چجوری با استفاده از آردوینو داده یک سنسور آنالوگ رو بخونیم. ولی قبل از این درست مثل حالت دیجیتال یه بحث کلی داریم روی ورودی و خروجی بودن پینها. اگه یادتون باشه می گفتیم مثلا وقتی داریم داده یه سوئیچ رو می خونیم از پین دیجیتال آردوینو به عنوان ورودی استفاده می کنیم و وقتی که قراره مثلا یه موتور رو روشن کنیم از پین دیجیتال آردوینو به عنوان خروجی استفاده می کردیم. دقیقا همین قانون در مورد آنالوگ ها هم وجود داره. وقتی یه سنسور آنالوگ داریم که می خوایم داده اون رو بخونیم زمانی که اون سنسور رو به پین آنالوگ آردوینو وصلش می کنیم اون پین رو به عنوان ورودی در نظر می گیریم و زمانی که قراره به یه دستگاه انالوگ فرمان بدیم پین آنالوگ به صورت خروجی تعریف میشه.
اما:
این وسط یه فرق خیلی خیلی بزرگ وجود داره. میکروکنترلر ما که وظیفش پردازش داده هاست دیجیتاله .چه داده از بیرون وارد میکروکنترلر بشه چه خود میکروکنترلر فرمان بده نوع سیگنال های دریافتی و تولیدی باید از جنس دیجیتال باشه ( یعنی 0 و 1 باشه) . هر نوع داده دیگه ای خارج از این تایپ داده برای میکروکنترلر قابل پردازش نیست. تو آموزش های قبلی چه وقتی سوئیچ وصل کردیم به آردوینوچه وقتی موتور یا RGB راه انداختیم جنس داده های رد و بدلی 0 و 1 بود. سوئیچ 0 و 1 داده می داد و به موتور و LED هم 0 و 1 داده می دادیم ( اگه یادتون باشه همیشه سر و کله HIGH و LOW تو کد نویسی مون پیدا می شد.)
اما وقتی از آنالوگ حرف میزنیم دیگه خبری از داده مطلق 0 و1 نیست بلکه با یه طیف پیوسته از اعداد سر و کار داریم. طیف پیوسته ای که میکروکنترلر به هیچ عنوان نمیتونه اون رو پردازش کنه چون زبونش رو نمیفهمه. بنابراین این وسط باید به واسط هایی داشته باشیم که آنالوگ رو بکنن دیجیتال (چون زبون قابل فهم برای میکروکنترلر دیجیتال هست) و در صورت نیاز دیجیتال رو بکنن آنالوگ.
مبدل سیگنالهای آنالوگ به دیجیتال :
اصطلاحا به این مبدل ها ADC میگن که مخفف Analog to Digital Converter هست. وکارکردش به طور خلاصه اینه که یه سیگنال آنالوگ دریافت میکنن و طی یه پروسه ای اون رو به سیگنال دیجیتال تبدیل می کنن:
بنابراین ما اگه یه سنسور آنالوگ داشته باشیم باید خروجی سنسور آنالوگمون رو بدیم به مبدل های ADC و بعد خروجی مبدل رو که از جنس دیجیتاله بدیم به میکروکنترلرمون و پردازشش کنیم. اینجا یه آموزش کامل در مورد ADC ها گذاشته. شما اگه یه کم در مورد ADC ها تحقیق کنید یه پارامتر خیلی مهم در مورد این مبدل ها تعداد بیت خروجی اونهاست. تو عالم داده های دیجیتال وقتی میگن یه داده مثلا 8 بیتیه (طبق قانون احتمال و به دلیل 0 و 1 بودن داده ها ) از 0 تا 255 می تونه تو این داده قرار بگیره (255 معادل 11111111 باینری هست ). حالا وقتی میگیم یه مبدل ADC مثلا 10 بیتیه یعنی از 0 تا عدد 1024 می تونه به عنوان خروجی این مبدل بوجود بیاد. دقیق تر بگیم یعنی این که سمت ورودی این مبدل یه ولتاژ بین 0 تا 5 ولت اعمال میشه (ولتاژ پیوسته :یعنی می تونه مثلا 4.2 ولت باشه ) بعد تو خروجی ADC محاسبه میشه که این ولتاژ معادل با چه عددی هست در صورتی که ADC ده بیتی باشه میشه یه عدد بین 0 تا 1023، در صورتی که ADC هشت بیتی باشه میشه یه عدد بین 0 تا 255. کاملا واضحه دیگه، هرچی بیت های خروجی ADC بیشتر باشه دقت این تبدیل بالاتر میره .چرا میگم منطقیه ؟ ورودی ADC ما (چه خروجی 8 بیت باشه چه 10 بیت) 0 تا 5 ولته. در صورتی که 8 بیتی باشیم هر 19.6mV در ورودی 1واحد در خروجی خواهد بود ( 5/255= 19.6mV) اما در صورتی که خروجی ADC ده بیتی باشد هر 4.9mV در ورودی 1واحد در خروجی خواهد بود (5/1024= 4.9mV).
حالا یه ترس بوجود میاد: اگه بخوایم داده سنسورهای آنالوگ رو (که سنسورهای خیلی زیادی در مجموعه سنسورهای آنالوگ قرار میگیرن ) بخونیم باید بین آردوینو و سنسورمون یه ADC طراحی کنیم و بزاریم؟ جواب منفیه.
بحث ما عموما روی UNO می چرخه بنابراین فقط در مورد UNO حرف میزنم. برد آردوینو UNO شش تا پایه آنالوگ ورودی داره (دقت کنید ورودی ). به تعداد همین 6 تا پایه آنالوگ ، 6 تا کانال ADC ده بیتی هم داره. یعنی شما هیچ احتیاجی به طراحی و قرار دادن ADC ندارید خودش همه کارها رو کرده یعنی آماده و حاضره. ادامه بحث رو روی همین موضوع ادامه خواهیم داد.
مبدل سیگنالهای دیجیتال به آنالوگ :
به این نوع مبدل ها اصطلاحا DAC میگن که مخفف Digital to Analog Convertor هست و به طور ساده بخوام بگم یه سیگنال دیجیتال به عنوان ورودی میگیره و در خروجی یه سیگنال آنالوگ میده. این مبدل در مواردی کاربرد داره که دستگاه محرک ما (دستگاهی که از ما فرمان میگیره تا یه کاری بکنه ) ورودی آنالوگ قبول کنه. در چنین مواردی بعد از این که تو میکروکنترلر پردازش ها انجام شد با یه تبدیل DAC سیگنال رو به آنالوگ تبدیل میکنن و به دستگاه محرک میدن.
ما تو دو پاراگراف قبل گفتیم آردوینو 6 تا پایه آنالوگ داره . خب بیاین درمورد دو تا ایده حرف بزنیم که عین دیجیتال ها باهاشون برخورد کنیم یعنی وقتی خواستیم به سنسور وصل کنیم ورودیشون کنیم و وقتی خواستیم به دستگاه محرک وصل کنیم خروجیشون کنیم. حتی شاید یه عده حرف گروه اول رو با با این استدلال غلط تایید کنن که : اره دیگه تو همون مسیری که سیگنال از آنالوگ به دیجیتال تبدیل میشه برعکس از دیجیتال هم به آنالوگ تبدیل بشه و بنابراین 6 تا پین آنالوگ آردوینو هم ورودی هستن هم خروجی.
اما این دو گروه به شدت اشتباه می کنن. مدار های DAC و ADC کاملا کاملا کاملا با هم متفاوت هستن و تبدیل دو طرفه به حساب نمیان. اون 6 تا پین آنالوگ آردوینو هم که قبلا در موردشون حرف زدیم ADC دارن. بنابراین نمیتونن به عنوان خروجی استفاده بشن و تنها و تنها می تونیم از اونها به عنوان ورودی استفاده کنیم. هیچ کدوم از بردهای آردوینو پین آنالوگ خروجی ندارن به جز آردوینو DUE و M0-PRO . این در صورتیه که تمام آردوینو ها بدون استثنا پین آنالوگ ورودی دارن.
خب تا اینجای داستان فقط در مورد فلسفه آنالوگ در آردوینو حرف زدیم. از این جای آموزش میریم سراغ پروژمون یعنی راه اندازی پتانسیومتر.
موارد لازم:
آردوینو از هر نوعی
پتانسیومتر
سیم برد بوردی نری به مادگی
خب حالا مطابق عکس زیر مدار رو ببندید.
دقت کنید به پایه آنالوگ شماره 2 وصلش کردیم.
خب حالا این کدرو آپلود کنید:
قسمت هدر که معرفی پین انالوگ هست که اگه دقت کنید نوشته شده A2. این A نمایشگر اینه که داریم از پین آنالوگ استفاده می کنیم. تو تابع setup این پین به عنوان ورودی و ارتباط سریال با نرخ 9600 کانفیگ شده.
تو تابع loop خط اول با دستور analogRead مقدار پین آنالوگ خونده میشه. عملا مقداری که توی متغیر sensorValue ریخته میشه خروجی ADC هست. یعنی پین وسط پتانسیومتر که متصل شده به پین آنالوگ شماره 2 آردوینو، طبق قانون مداری تقسیم ولتاژ ، یه ولتاژ بین 0 تا 5 ولت رو روی پین شماره 2 می ندازه. این ولتاژ میشه ورودی ADC متصل به پین شماره 2 آردوینو. از اون طرف خروجی این ADC به صورت یک عدد بین 0 تا 1023 (به علت 10 بیتی بودن ADC ) توی متغیر sensorValue ریخته میشه. با دستور پرینت هم این مقدار توی کنسول سریال چاپ میشه. خط آخر هم که دستور delay هست فرمان میده با سر فاصله های یک ثانیه این روند تکرار بشه.
پایان.
سلام مرسی واقعا.بسیار زیبا. راستی چرا این مطلب تو صفحه اول نیست
درود
عزیزجان شرمنده میدونم توقع زیادی هستش و شاید توی اموزشهای ایندتون باشه ولی خواستم بدونم که چطوری باید ماژول ترموکوپل MAX6675 تایپ K رو به اردوینو وصل کنم و به وصیله کامپیوتر و حتی یه ال سی دی کوچک و چندتا دکمه بشه درجه دمای دوتا هیتر رو تنظیم کنم و واقعن واسم خیلی مهم هستش اگه کمکم کنید ممنون میشم واقعتش میدونم که برای تنظیم دمای هیتر با کنترلر دما بگیرم ولی هم قیمتش گرونه هم تعداد کمیش وصل میشن به کامپیوتر که خودش قیمتش و چند برابر میکنه بازم ممنونم
دوست عزیز واسه این وبلاگ زوده به اونجا برسه
لطفا در انجمن آفتاب یه تاپیک ایجاد کن همونجا جواب داده میشه به سوالتون
با سلام و تبریک به خاطر وبلاگ خوبتون
میشه لطف کنید این کد را بنویسید و توضیح بدید، من نیاز به برنامه تبدیل اعداد دسیمال به باینری از0 تا 1023 داشتم. که analogread اون باید پتانسیومتر باشه که متصل به آردوینو هستش. همینطور خروجی اون باید ده لامپ LED متصل به آردوینو باشه که معرف اعداد باینری هستش (لامپ روشن 1 و لامپ خاموش صفر همینطور هر لامپ معرف یک بیت هستش.) در آخر همه اعداد دسیمال و باینری در serial monitor چاپ بشه.
با تشکر
سلام
اگه پین های آنالوگ آردوینو نبود ، برای خوندن سیگنال آنالوگ و استفاده از یه ADC ده بیتی خارجی ، نیاز بود که 10 تا از پین های دیجیتال رو برای دریافت خروجی ADC استفاده کنیم؟
منظورم اینه که یه ADC ده بیتی ده تا پین خروجی داره یا ازتباط رو از طریق پین های کمتر و مثلا به شکل سریال انجام میده؟
سلام پایه آنالوگ مشخص کردن pinModeهم می تونن ورودی بشن. درسته؟
سلام واقعا خسته نباشی دستتون درد نکنه خیلی عاااااالییییی
سلام.یه سوال داشتم. میشه از پتانسیومتر به عنوان سنسور دما استفاده کرد؟ پتانسیومتر ریز ک ولتاژشو با چرخوندن پیچ سرش تنظیم میکنن.
با سلام و قت بخیر
میخواستم با خانم اسماعیل زاده یک دعوت به همکاری داشته باشم. اگر امکانش باشه یک ایمیل به بنده بزنید.
سپاس
سلام
بسیار بسیار متشکرم از آموزشهاتون که واقعا بینظیره
من میخوام یه کاری رو انجام بدم اما واقعا برنامه نویسی بلد نیستم تماما دارم از روی نوشته ها و آموزشهای شما جلو میرم
در مورد تبدیل آنالوگ به دیجیتال . من از همین روش شما میخوام استفاده کنم منتها یه جور دیگه به این شکل که
میخوام بشه کاری کرد که مثلا پین آنالوگ A0 ولتاژ متغیری رو بخونه ( بین 1 الی 5 ولت ) که این ولتاژ میدونه دائما تعغیر کنه .
بعدش مثلا بهش تعریف کنیم که اگر ولتاژ ورودی پین A0 مثلا به 1.5 ولت رسید در خروجی پایه دیجیتال ولتاژ را 1.7 بده بیرون
و وقتی ولتاژ به 1.9 رسید در خروجی بهمون 2.1 ولت بده . در واقع بشه کاری کرد که هر ولتاژی در ورودی گرفت یه کمکی روش بزاره زیادش کنه و توی خروجی اعمال کنه .
اینو چطوری میتونم پیاده کنم ؟ ممنون میشم راهنمایی کنید
سرکار خانوم اسماعیل زاده. ضمن عرض ارادت بسیار سپاسگزارم که وقتتون رو بدون هیچ چشمداشتی اختصاص به این مبانی میدید تا سطح دانش در این زمینه رو بالا ببرید. ظمنا دانش شما و شخصیت شما مثال زدنی هست. از فضایی که ایجاد فرمودید بسیار بهرمند شدم. آرزوی موفقیتهای بسیار بزرگ رو از صمیم قلب برای شما دارم.