خواندن چندین ورودی آنالوگ و اندازه‌گیری ولتاژ در آردوینو | قسمت بیست و هشتم آموزش آردوینو

blog
gasemi.m100
۱۴۰۳-۱۲-۲۵
8 دقیقه

در قسمت بیست و هفتم از آموزش Arduino به بررسی خواندن keyboard (صفحه‌کلید)، خواندن مقادیر آنالوگ و تغییر دامنه مقادیر پرداختیم. در این قسمت قصد داریم درباره خواندن بیش از شش ورودی آنالوگ و همچنین اندازه‌گیری ولتاژها تا 5 ولت صحبت کنیم.

خواندن بیش از شش ورودی آنالوگ

فرض کنید تعداد ورودی‌های آنالوگ شما بیشتر از تعداد پین‌های آنالوگ موجود در بردتان باشد. یک برد استاندارد Arduino (بر پایه ATmega328) دارای شش ورودی آنالوگ است (در حالی که Arduino Mega دارای 16 ورودی آنالوگ است). اگر تعداد ورودی‌های مورد نیاز شما بیشتر از این مقدار باشد، می‌توانید از یک Multiplexer استفاده کنید.

Multiplexer یک سوئیچ آنالوگ است که به‌صورت دیجیتالی کنترل می‌شود. با استفاده از چیپ 4051 می‌توان هشت ورودی آنالوگ را به یک پین آنالوگ متصل کرد و از طریق سه پین Selector (S0، S1 و S2) آن‌ها را انتخاب کرد. در این روش، هر ورودی به نوبت خوانده می‌شود. در ادامه کد نمونه‌ای آورده شده است:

مالتپلکسر 4051 متصل به آردوینو

شکل 1: مالتپلکسر 4051 متصل به آردوینو

Analog Multiplexers سوئیچ‌های آنالوگی هستند که به‌صورت دیجیتالی کنترل می‌شوند. Chip 4051 یکی از هشت ورودی را از طریق Three-Pin Selector (S0, S1, S2) انتخاب می‌کند. برای این Selector Pins، هشت ترکیب مختلف از مقادیر وجود دارد و Sketch به‌صورت متوالی هر یک از این Bit Patterns را انتخاب می‌کند. به Table 1 نگاه کنید.

شما باید Ground (GND) دستگاه‌هایی را که اندازه‌گیری می‌کنید، به GND ماژول 4051 و Arduino متصل کنید. برای اینکه بتوانید مقادیر را به‌درستی بخوانید، همه آن‌ها باید یک Common GND داشته باشند. اگر قصد دارید تمام دستگاه‌ها را از طریق پین 5V یا 3.3V روی برد خود تغذیه کنید، مطمئن شوید که میزان Power Consumption شما از حداکثر توان Power Supply یا بیشترین توانی که پین قادر به تأمین آن است (هرکدام که کمتر باشد) بیشتر نشود.

به‌عنوان‌مثال، پین 5V در Arduino Uno می‌تواند تا 900mA جریان را به‌صورت ایمن تأمین کند، البته در صورتی که از یک External Power Supply استفاده شود. در حالت تغذیه از طریق USB Power، حداکثر جریان 400mA است. (اما اگر از یک 500mA Power Source استفاده می‌کنید، حداکثر جریانی که می‌توانید دریافت کنید کمتر از 500mA خواهد بود، زیرا Microcontroller، LEDs و سایر اجزا نیز از این توان استفاده می‌کنند). این مقدار یک مقدار تئوری است، بنابراین بهتر است همیشه کمی پایین‌تر از این حد بمانید.

همچنین، ممکن است لازم باشد به Board Documentation ،Microcontroller Datasheet و Voltage Regulator Datasheet مراجعه کنید تا از Current Limitations مطلع شوید.

علاوه بر این، برای دستگاه‌هایی که متصل می‌کنید، اگر مجموع Current Consumption شما به حداکثر مقدار نزدیک شود، باید از یک External Power Supply استفاده کنید.

جدول مالتی‌پلکسر 4051

جدول 1: جدول مالتی‌پلکسر 4051

شما ممکن است الگوی موجود در Table 1 را به‌عنوان نمایش Binary Representation مقادیر Decimal از 0 تا 7 تشخیص دهید.

در Solution Sketch، تابع getValue() مسئول تنظیم Selector Bits برای کانال مشخص با استفاده از دستور digitalWrite(pin, isBitSet) است. سپس مقدار Analog را از ورودی انتخاب‌شده 4051 با استفاده از دستور analogRead(analogPin) می‌خواند. همچنین، برای تولید Bit Patterns از تابع داخلی bitRead() استفاده می‌شود.

به خاطر داشته باشید که این روش به‌صورت Sequential هشت ورودی را انتخاب و نظارت می‌کند. بنابراین، برای خواندن‌های ورودی‌های مختلف، نسبت به زمانی که از analogRead() به‌صورت Direct استفاده می‌شود، زمان بیشتری نیاز است. برای مثال، اگر شما هشت ورودی را می‌خوانید، زمان لازم برای خواندن هر ورودی هشت برابر بیشتر خواهد بود. به‌طورکلی، این مسئله ممکن است باعث شود این روش برای ورودی‌هایی که Rapidly Changing هستند، مناسب نباشد.

اندازه‌گیری ولتاژها تا 5 ولت

برای اندازه‌گیری ولتاژ در محدوده 0 تا 5 ولت از تابع analogRead() استفاده می‌شود. مقدار خوانده‌شده از این تابع را می‌توان با استفاده از ولتاژ مرجع (Reference Voltage) به مقدار واقعی ولتاژ تبدیل کرد:

اندازه‌گیری ولتاژها تا 5 ولت با استفاده از برد 5 ولتی

شکل 2: اندازه‌گیری ولتاژها تا 5 ولت با استفاده از برد 5 ولتی

اندازه‌گیری ولتاژهای آنالوگ بر روی بردهای ESP8266

اگر از بردی مبتنی بر ESP8266 استفاده می‌کنید، ممکن است محدود به ولتاژهایی در بازه 0 تا 1V باشید. برخی از بردهای مبتنی بر ESP8266 دارای Internal Voltage Dividers هستند که به شما این امکان را می‌دهند که تا 3.3V (چون ESP8266 روی 3.3 V کار می‌کند) را بخوانید، بنابراین حتماً Documentation برد خود را بررسی کنید. بدون Voltage Divider، Analog Input Pins در ESP8266 حداکثر تا 1V می‌توانند ورودی داشته باشند.

ساده‌ترین راه‌حل، استفاده از یک Floating-Point Calculation برای چاپ ولتاژ است. این راه‌حل نمونه، مقدار ولتاژ را به‌صورت Ratio Calculation محاسبه کرده و نمایش می‌دهد:

فرمول

ولتاژ = (مقدار دیجیتال خوانده‌شده از پین آنالوگ / analog steps) × ولتاژ مرجع

  • analog steps: به تعداد تقسیماتی اشاره دارد که یک مبدل آنالوگ به دیجیتال (ADC) می‌تواند ولتاژ ورودی آنالوگ را به آن‌ها تبدیل کند. در یک ADC 10 بیتی، این مراحل 2 به توان 10 یعنی 1024 مرحله است که از 0 تا 1023 شماره‌گذاری می‌شود. به این معنی که ADC می‌تواند ولتاژ ورودی را به 1024 مقدار دیجیتال تقسیم کند.
  • ولتاژ مرجع: ولتاژی که به‌عنوان مرجع استفاده می‌شود (مثلاً 5 ولت یا 3.3 ولت بستگی به برد دارد).

این فرمول برای تبدیل مقدار دیجیتال خوانده‌شده به معادل ولتاژ آن استفاده می‌شود.

زمانی که یک مقدار Floating-Point را با استفاده از دستور Serial.println() به Serial Port چاپ می‌کنید، به‌صورت پیش‌فرض این مقدار با دو رقم اعشار نمایش داده می‌شود.

اگر از بردی استفاده می‌کنید که دارای 3.3V Logic است، این تغییر را اعمال کنید:

اعداد شناور (Floating-Point) حافظه زیادی مصرف می‌کنند، بنابراین اگر در بخش‌های دیگری از کدتان نیازی به آن‌ها ندارید، بهتر است از مقادیر صحیح (Integer) استفاده کنید تا کارایی افزایش یابد.

کد زیر شاید در ابتدا کمی عجیب به نظر برسد، اما از آنجایی که analogRead() برای 5V مقدار 1023 را برمی‌گرداند، هر تغییر در مقدار معادل 5 ÷ 1023 است.

در واحد میلی‌ولت، این مقدار برابر است با: 5000 ÷ 1023.

کد زیر مقدار را برحسب میلی‌ولت (mV) چاپ می‌کند:

✅نکته

اگر از بردی با ولتاژ 3.3V استفاده می‌کنید، مقدار 500000/1023L را به 330000/1023L تغییر دهید.

کد زیر مقدار را با استفاده از اعداد اعشاری (Floating-Point) چاپ می‌کند. اگر ولتاژ 1.5V باشد، مقدار 1.5 را نمایش می‌دهد.

تابع analogRead() مقداری را برمی‌گرداند که متناسب با نسبت ولتاژ اندازه‌گیری‌شده به ولتاژ مرجع (Reference Voltage) است. در Arduino Uno، مقدار ولتاژ مرجع 5V می‌باشد.

برای جلوگیری از استفاده از اعداد اعشاری (Floating-Point) و افزایش دقت، کد به‌جای ولت (V) با میلی‌ولت (mV) کار می‌کند (چون هر 1V معادل 1000mV است). ازآنجایی‌که 1023 معادل 5000mV است، هر واحد برابر است با:

50001023≈4.89mV\frac{5000}{1023} \approx 4.89mV

✅نکته

شما ممکن است برای تبدیل مقادیر analogRead() به میلی‌ولت، هم از 1023 و هم از 1024 استفاده کنید.

  • مهندسان معمولاً از 1024 استفاده می‌کنند زیرا 1024 مقدار ممکن بین 0 تا 1023 وجود دارد.
  • عدد 1023 برای برخی منطقی‌تر است چون بیشترین مقدار ممکن برابر با 1023 است.
  • در عمل، اختلاف بین این دو مقدار کمتر از دقت سخت‌افزار است، بنابراین می‌توانید هرکدام را که راحت‌ترید استفاده کنید.

روش حذف اعشار برای بهینه‌سازی حافظه

برای حذف اعشار، مقادیر در 100 ضرب می‌شوند:

5000×1001023\frac{5000 \times 100}{1023}

این مقدار تعداد میلی‌ولت‌ها را 100 برابر می‌کند. سپس با تقسیم بر 100، مقدار نهایی به میلی‌ولت (mV) تبدیل می‌شود.

اگر ضرب کردن اعداد اعشاری در 100 برای شما پیچیده است، می‌توانید از روش memory-hungry با اعداد شناور (Floating-Point) استفاده کنید. اما این روش زمان‌برتر و پرهزینه‌تر از نظر پردازشی خواهد بود.

⚠ توجه

این راه‌حل فرض می‌کند که شما از Arduino Uno یا یک برد مشابه 8 بیتی با لاجیک 5V استفاده می‌کنید.

📌 اگر از بردی با ولتاژ 3.3V استفاده می‌کنید، حداکثر ولتاژی که می‌توانید اندازه‌گیری کنید 3.3V خواهد بود، مگر اینکه از تقسیم‌کننده ولتاژ (Voltage Divider) استفاده کنید.

 
 
اطلاعات
0
0
لینک و اشتراک
جلسات دیگر
توصیه شده

خواندن کیبورد + خواندن مقادیر...

جلسه قبل
profile

Arduino captain

متخصص الکترونیک

من کاپیتان آردوینو، اسمم میلاده و اینجا هستم تا تجربیاتم در رابطه با آردوینو رو با شما به اشتراک بزارم!

مقالات بیشتر
slide

پالت | بازار خرید و فروش قطعات الکترونیک

قطعات اضافه و بدون استفاده همیشه یکی از سرباره‌‌های شرکتها و طراحان حوزه برق و الکترونیک بوده و هست. پالت سامانه‌ای است که بصورت تخصصی اجازه خرید و فروش قطعات مازاد الکترونیک را فراهم می‌کند. فروش در پالت
family

آیسی | موتور جستجوی قطعات الکترونیک

سامانه آی سی سیسوگ (Isee) قابلیتی جدید و کاربردی از سیسوگ است. در این سامانه سعی شده است که جستجو، انتخاب و خرید مناسب تر قطعات برای کاربران تسهیل شود. وقتی شما در این سامانه، قطعه الکترونیکی را جستجو می‌کنید؛ آی سی به سرعت نتایج جستجوی شما در اکثر فروشگاه‌های آنلاین در حوزه قطعات الکترونیک را نمایش می‌دهد. جستجو در آیسی
family

سیسوگ‌شاپ | فروشگاه محصولات Quectel

فروشگاه سیسوگ مجموعه ای متمرکز بر تکنولوژی های مبتنی بر IOT و ماژول های M2M نظیر GSM، GPS، LTE، NB-IOT، WiFi، BT و ... جایی که با تعامل فنی و سازنده، بهترین راهکارها انتخاب می شوند. برو به فروشگاه سیسوگ
family

سیسوگ فروم | محلی برای پاسخ پرسش‌های شما

دغدغه همیشگی فعالان تخصصی هر حوزه وجود بستری برای گفتگو و پرسش و پاسخ است. سیسوگ فروم یک انجمن آنلاین است که بصورت تخصصی امکان بحث، گفتگو و پرسش و پاسخ در حوزه الکترونیک را فراهم می‌کند. پرسش در سیسوگ فرم
family

سیکار | اولین مرجع متن باز ECU در ایران

بررسی و ارائه اطلاعات مربوط به ECU (واحد کنترل الکترونیکی) و نرم‌افزارهای متن باز مرتبط با آن برو به سیکار
become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
خانواده سیسوگ

سیسوگ‌شاپ

فروشگاه محصولات Quectel

پالت

سیسوگ فروم

محلی برای پاسخ پرسش‌های شما

سیسوگ جابز
سیسوگ
سیسوگ فروم

سی‌کار

اولین مرجع متن باز ECU در ایران

سیسوگ مگ

آی‌سی

موتور جستجوی قطعات الکترونیکی

سیسوگ آکادمی

پالت

بازار خرید و فروش قطعات الکترونیک

دیدگاه ها

become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله