اتصال پتانسیومتر به رزبری پای (ADC پاسخ مرحله ای)
نکته ای که در مورد برد های رزبری پای قابل ذکر است این است که قادر به خواندن مستقیم سیگنال های آنالوگ نیستند. یعنی در حقیقت مبدل آنالوگ به دیجیتال ندارند. رزبری پای می تواند سیگنال های دیجیتال مانند فشردن یک دکمه یا یک تغییر ساده در وضعیت یک سنسور دیجیتال را تشخیص دهد، اما تغییرات ایجاد شده توسط یک سنسور آنالوگ را نمیتواند تشخیص دهد. اما نگران نباشید، دو راه برای حل این مشکل وجود دارد.
روش اول استفاده از تراشه ADC (مبدل آنالوگ به دیجیتال) مانند MCP3008 (برای 8 کانال ورودی آنالوگ) یا ADS1115 (برای 4 کانال ورودی آنالوگ) است. تنها تفاوت آنها این است که ADS1115 در مقایسه با MCP3008 از نظر دقت بهتر عمل میکند.
خوشبختانه، راه دیگری برای خواندن سیگنال های آنالوگ بدون نیاز به خرید تراشه ADC وجود دارد. برای خرید تراشه های ADC باید هزینه بپردازید اما این راه کم هزینه هست. این روش به عنوان پاسخ مرحله ای یا “step-response” شناخته میشود. با استفاده از این روش میبینیم چطور مدار در هنگام تغییر حالت از HIGH به LOW یا LOW به HIGH رفتار میکند. این کار با استفاده از مدار شارژ و دشارژ کنترل شده توسط پتانسیومتر با برد رزبری ما انجام میشود.
پتانسیومتر چیست؟
پتانسیومتر یک مقاومت متغیر است که برای تغییر مقاومت در مدار با چرخاندن یک دستگیره استفاده می شود. این قطعه برای تغییر ولتاژ در مدار یا برای کنترل جریان در مدار استفاده می شود. پتانسیومتر شامل سه پین است. اولی به عنوان ورودی و دومی برای اتصال به زمین و سومی در گوشه به عنوان پایه خروجی قرار دارد.
خواندن ولتاژ آنالوگ با برد رزبری پای
حالا بیایید یک پروژه مثال بسازیم که از Raspberry Pi برای تشخیص سیگنال آنالوگ تولید شده توسط یک پتانسیومتر استفاده می کند. ما در اینجا از یک پتانسیومتر به عنوان یک مثال ساده استفاده می کنیم. همین اصول را می توان برای هر سنسور دیگری که سیگنال آنالوگ را تولید می کند مثلا LM35 اعمال کرد.
اجزای مورد نیاز برای ساخت این پروژه عبارتند از:
- رزبری پای
- پتانسیومتر 10 کیلو
- 2* مقاومت 1 کیلو اهم
- خازن 220 nF
- سیم های جامپر
- برد بورد
هنگامی که تمام قطعات را در اختیار دارید، همه چیز را مثل تصویر شماتیک زیر سیم کشی کنید.
قبل از اینکه ادامه دهیم، اجازه دهید چیزی را واضح تر توضیح دهم.
کل این مدار به شارژ و دشارژ یک خازن بستگی دارد که به نوبه خود به نحوه پاسخ این مدار به یک پالس الکتریکی در یک دوره زمانی خاص بستگی دارد. بنابراین، ما زمان تشخیص مقدار سیگنال آنالوگ را هدف قرار می دهیم. این زمان به مقاومت پتانسیومتر بستگی دارد که آن را تغییر می دهیم. نتیجه همه اینها در ترمینال Raspberry Pi نشان داده خواهند شد.
به عبارت ساده، خازن مانند یک ظرف شارژ عمل می کند. همانطور که با شارژ پر می شود، ولتاژ دو طرف آن افزایش می یابد، اما شما نمی توانید ولتاژ را بخوانید زیرا رزبری پای قادر به خواندن مقدار ولتاژ آنالوگ نیست. بنابراین، برای خواندن این مقدار، اساساً زمانی را که طول میکشد تا ولتاژ به بالای 1.5-1.6 ولت برسد، یادداشت میکنیم (ولتاژ بالای 1.5 حدودا مقداری است که رزبری پای به عنوان HIGH میشناسد). سرعت شارژ بستگی به مقدار مقاومت متغیر دارد. هرچه مقدار مقاومت پتانسیومتر کمتر باشد، خازن سریعتر شارژ می شود.
دومین مرحله مهمی که در اینجا باید به آن توجه کرد این است که خازن باید قبل از استفاده مجدد به طور کامل تخلیه شود تا خوانش خوبی داشته باشد. بنابراین برای این کار از مقاومت R1 متصل به پایه 18 با مقاومت متغیر 10K برای شارژ کامل خازن استفاده می کنیم. از طرفی برای تخلیه خازن متصل به پایه 24 در رزبری پای از مقاومت R2 استفاده می کنیم.
اکنون سیگنال پاسخ مرحله ای را برای 4 تا 5 میلی ثانیه (معمولاً 5 میلی ثانیه) اعمال می کنیم. در آن زمان خاص، خازن از طریق R1 و مقاومت متغیر شارژ می شود و از طریق R2 تخلیه می شود. زمان تخلیه در اینجا کمتر از 1 میلی ثانیه تنظیم شده است و از طریق کد پایتون نشان داده شده در زیر انجام می شود. همانطور که این چرخه برای شارژ و دشارژ ادامه می یابد، کد به عنوان یک شمارنده عمل می کند و مقادیری معادل گام-پاسخ خوانده شده توسط Raspberry Pi را ارائه می دهد. اینگونه است که Raspberry Pi کل سیگنال آنالوگ را با کمک یک پتانسیومتر در یک مدار پاسخ مرحله ای می خواند.
به طور خلاصه، ما اساساً از R1 و پتانسیومتر برای شارژ مدار استفاده می کنیم و از R2 برای تخلیه مدار استفاده می کنیم که سپس توسط کد پایتون خوانده می شود تا مقادیر پاسخ مرحله ای با زمان را به ما بدهد.
کد پایتون مبدل آنالوگ به دیجیتال
پس از ساخت مدار، کد زیر را در یک ویرایشگر متن در ترمینال Raspberry Pi کپی کنید و آن را به عنوان یک فایل با نام “step-res.py” ذخیره کنید.
import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) pin_a = 18 pin_b = 24 def discharge(): GPIO.setup(pin_a, GPIO.IN) GPIO.setup(pin_b, GPIO.OUT) GPIO.output(pin_b, False) time.sleep(0.004) def charge_time(): GPIO.setup(pin_b, GPIO.IN) GPIO.setup(pin_a, GPIO.OUT) count = 0 GPIO.output(pin_a, True) while not GPIO.input(b_pin): count = count + 1 return count def analog_read(): discharge() return charge_time() while True: print(analog_read()) time.sleep(1)
سپس فایل را با کد زیر اجرا کنید:
sudo python step-res.py
پس از اجرای کد، پاسخ را در ترمینال مشاهده خواهید کرد:
عدد نمایش داده شده همان مقداری است که از یک مبدل آنالوگ به دیجیتال خارج میشود. با چرخاندن پتانسیومتر، مقدار در یک جهت افزایش و در جهت دیگر کاهش می یابد.
این بهترین روش ممکن برای خواندن سیگنال های آنالوگ هر سنسوری است. فقط توجه داشته باشید که ما به جای استفاده از مبدل های فیزیکی آنالوگ به دیجیتال، تکنیک پاسخ مرحله ای را انجام دادیم. اگر مشکل بودجه ندارید، بهتر است از یک تراشه ADC استفاده کنید زیرا استفاده از آنها راحت تر و دقیق تر از روش بالا است.
از خواندن شما متشکریم و اگر در مورد چیزی سوالی دارید در قسمت نظرات بپرسید!