ورودی آنالوگ: پتانسیومتر و مبدل آنالوگ به دیجیتال
با analogRead ولتاژ پتانسیومتر را به عددی بین ۰ و ۱۰۲۳ بخوان و با map روشنایی الایدی را تنظیم کن.
در پایان این درس میتوانید
- تفاوت پایههای آنالوگ و دیجیتال را توضیح دهی و بدانی analogRead روی کدامها کار میکند.
- بدانی مبدل ۱۰ بیتی چند سطح دارد و چرا بیشترین خروجیاش ۱۰۲۳ است.
- تفکیکپذیری را از ولتاژ مرجع حساب کنی و عدد خواندهشده را به ولت برگردانی.
- کار مقسم ولتاژ داخل پتانسیومتر را شرح دهی و بفهمی چرا مقدار مقاومتش مهم نیست.
- با map یک بازهٔ عددی را خطی به بازهٔ دیگری ببری و نتیجهٔ صحیح آن را پیشبینی کنی.
تا اینجا هر چیزی که از دنیای بیرون خواندی دوحالته بود: دکمه یا فشرده است یا نیست. اما بیشتر کمیتهای فیزیکی اینطور نیستند؛ دما، شدت نور، فشار و زاویهٔ یک پیچ پیوستهاند و میان کمینه و بیشینه بیشمار مقدار میانی دارند. برای خواندن اینها به مترجمی نیاز داری که ولتاژ را به عدد برگرداند. این مترجم داخل خود ATmega328P نشسته و نامش مبدل آنالوگ به دیجیتال است.
پایههای A چه فرقی با پایههای D دارند
پایههای D0 تا D13 فقط از یک آستانه خبر میدهند: هر ولتاژ زیر حدود ۱٫۵ ولت را صفر و هر ولتاژ بالای حدود ۳ ولت را یک میبینند و هرچه در میان است گرد میشود. شش پایهٔ A0 تا A5 اما به یک کلیدزن ورودی وصلاند که در هر لحظه یکی از آنها را به تنها مبدل موجود روی تراشه میبندد. پس analogRead() تنها روی پایههای A معنا دارد. راه برعکس اما باز است: هر پایهٔ A را میتوانی مثل یک پایهٔ دیجیتال هم به کار ببری، ولی هیچ پایهٔ D را نمیتوانی به مبدل وصل کنی.
نامanalogWrite()وanalogRead()شبیه هم است ولی هیچ خویشاوندیای ندارند. اولی همان PWM درس پیش است: یک موج مربعی روی پایهٔ دیجیتال میسازد و هیچ ولتاژ میانی واقعی تولید نمیکند. دومی حقیقتاً ولتاژ ورودی را اندازه میگیرد. یکی خروجی تقلبی است و دیگری ورودی حقیقی.
داخل پتانسیومتر چه میگذرد
پتانسیومتر چیزی جز یک نوار مقاومتی با دو سر ثابت و یک خزندهٔ متحرک نیست. سر بالا را به پنج ولت و سر پایین را به زمین میبندی؛ حالا کل نوار یک مقسم ولتاژ است و خزنده هرجا بایستد، ولتاژ همان نقطه را بیرون میدهد. اگر پیچ را درست وسط بگذاری، مقاومت بالا و پایین برابرند و پایهٔ میانی نصف پنج ولت یعنی ۲٫۵ ولت تحویل میدهد. نکتهٔ کلیدی این است که خروجی به نسبت دو بخش بستگی دارد، نه به مقدار مطلق مقاومت؛ یک پتانسیومتر ۱۰۰ کیلواهمی در همان زاویه همان ولتاژ را میدهد و فقط جریان کمتری از خودش عبور میدهد. از قطعهٔ ۱۰ کیلواهمی این کیت، جریانی برابر پنج تقسیم بر ۱۰۰۰۰ یعنی نیم میلیآمپر میگذرد که کاملاً ناچیز است.
ده بیت، ۱۰۲۴ سطح
مبدل داخل Uno ده بیتی است؛ یعنی خروجیاش عددی ده بیتی است و میتواند دو به توان ده یعنی ۱۰۲۴ حالت مختلف بگیرد. چون شمارش از صفر آغاز میشود، بازهٔ خروجی analogRead() از ۰ تا ۱۰۲۳ است. این عدد بهتنهایی هیچ معنایی ندارد و معنایش را ولتاژ مرجع میسازد: مرجع پیشفرض روی Uno همان تغذیهٔ پنج ولتی برد است، پس صفر یعنی زمین و ۱۰۲۳ یعنی نزدیک پنج ولت.
تفکیکپذیری و یک حساب کوچک
پنج ولت را به ۱۰۲۴ پله تقسیم کن: هر پله برابر پنج تقسیم بر ۱۰۲۴ یعنی حدود ۰٫۰۰۴۸۸ ولت یا ۴٫۸۸ میلیولت میشود. این کوچکترین تغییری است که مبدل میتواند تشخیص دهد و نامش تفکیکپذیری است. تبدیل در جهت عکس هم ساده است: عدد خواندهشده را در همین پله ضرب کن. اگر analogRead() عدد ۵۱۲ برگرداند، ولتاژ ورودی برابر ۵۱۲ ضربدر ۴٫۸۸ میلیولت یعنی حدود ۲٫۵ ولت است — درست وسط بازه. اگر عدد ۷۶۸ باشد، ولتاژ برابر ۷۶۸ ضربدر ۴٫۸۸ میلیولت یعنی ۳٫۷۵ ولت خواهد بود. دقت کن که هر پله بازهای کوچک از ولتاژ را نمایندگی میکند، پس اندازهگیری هیچوقت از یک پله دقیقتر نمیشود؛ اگر ولتاژ مرجع را پایین بیاوری تفکیکپذیری بهتر میشود ولی سقف اندازهگیری هم پایین میآید.
تابع map
map(value, fromLow, fromHigh, toLow, toHigh) یک بازه را خطی روی بازهٔ دیگری میکشد. در این درس بازهٔ ۰ تا ۱۰۲۳ ورودی را به بازهٔ ۰ تا ۲۵۵ چرخهٔ کار میبریم تا چرخاندن پیچ، روشنایی الایدی را عوض کند. فرمولش یک تناسب ساده است: خروجی برابر ورودی ضربدر ۲۵۵ تقسیم بر ۱۰۲۳. پس ۱۰۲۳ دقیقاً به ۲۵۵ میرسد و ورودی ۸۰۰ میشود ۸۰۰ ضربدر ۲۵۵ تقسیم بر ۱۰۲۳ یعنی ۱۹۹٫۴ که چون تمام حساب با عدد صحیح انجام میشود، به ۱۹۹ بریده میشود.
ولتاژی که به پایهٔ آنالوگ میدهی هرگز نباید از پنج ولت بالاتر یا از صفر پایینتر برود، وگرنه دیودهای محافظ ورودی آسیب میبینند؛ برای منابع بالاتر اول با دو مقاومت یک مقسم ولتاژ بساز. همچنین پایهٔ آنالوگی که به هیچجا وصل نیست شناور میماند و عددهای تصادفی میدهد؛ این را نشانهٔ خرابی مدار نگیر.
کجا به کار میآید
هر حسگری که خروجیاش ولتاژ است با همین یک تابع خوانده میشود: مقاومت نوری در یک مقسم ولتاژ برای سنجش روشنایی اتاق، دماسنج LM35 که به ازای هر درجه ۱۰ میلیولت میدهد، حسگر رطوبت خاک و اهرم دستهٔ بازی. هر خواندن حدود ۱۰۰ میکروثانیه طول میکشد، یعنی نزدیک ۱۰ هزار نمونه در ثانیه؛ بیش از اندازهٔ کافی برای کمیتهایی که آهسته تغییر میکنند.
رابطههای کلیدی
مأموریت روی میز کار
کیت را اجرا کن: پتانسیومتر روی پایهٔ A0 بسته است و الایدی زرد روی یک پایهٔ PWM. پیچ را بچرخان و رابطهٔ زاویه، ولتاژ و روشنایی را با چشم دنبال کن.
- پیچ پتانسیومتر را از انتها تا انتها بچرخان و ببین روشنایی الایدی نرم و پیوسته تغییر میکند.
- پیچ را طوری تنظیم کن که الایدی داخلی برد تازه روشن شود؛ این نقطه تقریباً ۲٫۵ ولت روی پایهٔ آنالوگ است.
- در فراخوانی map مقدار ۱۰۲۳ را به ۵۱۱ تغییر بده و ببین الایدی از نیمهٔ چرخش به بعد به بیشترین روشنایی میرسد و ثابت میماند.
- دو آرگومان آخر map را جابهجا کن تا بازهٔ خروجی از ۲۵۵ به ۰ برود؛ حالا چرخاندن پیچ اثر برعکس دارد.
- سیم پایهٔ میانی پتانسیومتر را از A0 جدا کن، اجرا کن و ببین روشنایی بیقرار و تصادفی میشود؛ بعد سیم را برگردان.
مدار و کد این درس از پیش چیده شدهاند. آزادانه تغییرشان بدهید — پروژههای خودتان دستنخورده میمانند. تمامصفحه با همین کیت
آزمون این درس
۵ پرسش چهارگزینهای. پس از ثبت، پاسخ درست و توضیح هر پرسش را میبینید. میتوانید هر چند بار که خواستید تلاش کنید؛ بهترین نمره در کارنامه ثبت میشود.