Raspberry Pi توانایی انجام انواع عملکردهای الکتریکی- الکترونیکی مانند خواندن داده های دیجیتال، کنترل موتور DC و LED های چشمک زن را دارد. تنها عملکرد الکترونیکی که قادر به انجام آن نیست، خواندن سیگنال ها و داده های الکتریکی از یک دستگاه آنالوگ است. اگرچه RPi دارای تعداد زیادی پین GPIO، HDMI، جک صوتی، LCD و اتصالات دوربین است، اما قادر به خواندن سیگنال های آنالوگ نیست زیرا بر خلاف اغلب میکروکنترلرها دارای مدار ADC (مبدل آنالوگ به دیجیتال) نیست.
ADC چیست ؟
هنگامی که نیاز به استفاده از سنسورهای آنالوگ و ارتباط با یک میکروکنترلر باشد، این امکان وجود ندارد که میکروکنترلر مستقیماً این سیگنال های آنالوگ را درک کند. زیرا میکروکنترلرها فقط سیگنال های دیجیتالی را که توسط 1 و 0 شکل می گیرند، درک می کنند. بنابراین، این نوع سیستم نیاز به یک دستگاه میانی دارد که بتواند سیگنال های آنالوگ این سنسورها را به سیگنال های دیجیتال تبدیل کند تا میکروکنترلر این سیگنال ها را درک کند.
ADC (مبدل آنالوگ به دیجیتال) یک مدار مجتمع الکترونیکی است که قادر است این سیگنال های آنالوگ را به سیگنال های دیجیتال تبدیل کند. معمولاً یک ADC طیف وسیعی از ورودی ها را می پذیرد و آن ها را به شکل اعداد دودویی تبدیل می کند. ADC های مختلفی در بازار وجود دارد مانند 12 بیت، 14 بیت، 16 بیت و 24 بیت.
همانطور که در مقدمه به طور خلاصه ذکر شد، RPi قادر به خواندن سیگنال ها یا داده های الکتریکی آنالوگ نیست. دلیل عدم توانایی خواندن چنین سیگنال ها یا داده هایی این است که RPi دارای مدار ADC نیست. یکی از روش های جایگزین که می تواند به RPi اجازه دهد سیگنال های الکتریکی آنالوگ را بخواند، سیم کشی یک IC ADC خارجی (MCP3008) است که در ادامه شرح داده خواهد شد.
گذرگاه ارتباط جانبی سریال (SPI)
مقادیر آنالوگ توسط پروتکل گذرگاه ارتباط جانبی سریال به Pi منتقل میشود. گرچه این قابلیت در GPIO Zero تعبیه نشده است و باید به طور جانبی از آن استفاد ه کنید، ولی در صورتی که پشتیبانی کامل SPI را فعال کنید به نتایج بهتری دست خواهید یافت.
- یک پنجره ترمینال باز کنید و بسته spidev را نصب کنید.
sudo apt-get install python3-spidev python-spidev
- دیالوگ پیکربندی Raspberry Pi را از منوی اصلی باز کنید و گزینه SPI را در زبانه Interface فعال کنید:

- بر روی دکمه OK کلیک کنید و Pi را دوباره راهاندازی نمایید.
سیمکشی ADC (MCP3008) برای ورودی آنالوگ در Raspberry Pi
MCP3008 یک مبدل آنالوگ به دیجیتال با هشت کانال ورودی است. یک سمت آن به پینهای GPIO Pi و سمت دیگر به دستگاههای ورودی آنالوگ متصل میشود.
تراشه MCP3008 را روی بورد قرار دهید و سیم کشی را مطابق شکل زیر با دقت انجام دهید. یک شکاف یا خال کوچک در یک سر تراشه مشاهده میکنید. در این تصویر این سر تراشه هم راستای ستون 19 بردبورد است.

به جای این روش میتوانید از بورد Analog Zero استفاده کنید. این بورد تراشه MCP3008 را بر روی یک بورد جانبی و در دسترس قرار میدهد و شما را از مراحل پیچیده سیمکشی نجات میدهد.
اضافه نمودن پتانسیومتر
پس از اتصال مبدل به Raspberry Pi، میتوانید دستگاه ها را به کانالهای ورودی آنالوگ Raspberry Pi متصل کنید. پتانسیومتر یک دستگاه ورودی آنالوگ یا به عبارتی یک مقاومت متغییر است و Pi ولتاژ آن را (که بین 0 و 3.3) دریافت میکند.
پتانسیومتر سه پین دارد: زمین، دیتا، و 3.3 ولتی. به عبارت دیگر باید یک پین را به زمین و یک پین را منبع تغذیه 3.3 ولتی متصل کنید و پین وسط ولتاژ حقیقی را دریافت میکند.
پتانسیومتر را روی بردبورد قرار دهید، یک سمت آن را به ریل زمین و سمت دیگر را به ریل 3.3 ولتی متصل کنید و پین وسط را به اولین کانال ورودی متصل کنید:

اکنون پتانسیومتر متصل شده است و پایتون میتواند مقدار آن را بخواند.
- در منوی اصلی Mu را باز کنید.
- ابتدا کلاس MCP3008 از کتابخانه GPIO Zero را وارد کنید.
from gpiozero import MCP3008
- سپس، شیای بسازید که نمایانگر دستگاه آنالوگ شما باشد:
pot = MCP3008(0)
دقت داشته باشید که 0 به معنای کانال ADC صفر است. یعنی از میان هشت کانال موجود (0 تا 7) شما از اولین آن ها استفاده میکنید.
- خواندن مقدار زیر را امتحان کنید:
print(pot.value)
- کد خود را اجرا کنید. باید عددی بین 0 و 1 مشاهده کنید. این عدد مشخص میکند صفحه مدرج چه مقدار چرخیده است. اکنون مقادیر داخل حلقه را بخوانید.
while True: print(pot.value)
صفحه مدرج رابچرخانید، مشاهده میکنید که مقدار تغییر میکند.
PWMLED
پس از تست پتانسیومتر آن را به دیگر دستگاه GPIO متصل کنید.
- یک LED به بردبورد اضافه نمایید. از یک سمت آن را به Pi و از سمت دیگر به پین شماره 21 GPIO متصل کنید.

- کد نویسی پایتون را با ایمپورت کلاس PWMLED شروع کنید:
from gpiozero import PWMLED
کلاس PWMLED این امکان را برای شما فراهم میکند تا نور LED را با کمک مدولاسیون پهنای پالس (PWM) کنترل کنید.
- یک شی PWMLED روی پین 21 بسازید.
led = PWMLED(21)
- کنترل دستی LED را امتحان کنید:
led.on() # the led should be lit led.off() # the led should go off led.value = 0.5 # the led should be lit at half brightness
- اکنون میتوانید LED را به پتانسیومتر متصل کنید:
led.source = pot.values
- برای تغییر نور LED صفحه مدرج را بچرخانید
منبع و مقادیر
کتابخانه GPIO Zero دو ویژگی فوقالعادهای دارد: منبع و مقادیر. تمام دستگاهها دارای ویژگی value (مقدار فعلی) و ویژگی values (مقادیر جریان دستگاه در همه بازههای زمانی) هستند. تمام دستگاههای خروجی یک ویژگی source دارند که برای تعیین مقدار دستگاه استفاده میشود.
- value مقدار فعلی پتانسیومتر را به ما میدهد (به دلیل اینکه پتانسیومتر یک دستگاه ورودی است، این مقدار فقط خواندنی است)
- value مقدار فعلی LED است (قابل ویرایش است، میتوانید این مقدار را مشاهده کنید و آن را تغییر دهید)
- values یک مولد است که دائماً مقدار فعلی پتانسیومتر را نشان میدهد
- source روشی است که تعیین میکند LED مقادیر خود را از کجا میگیرد
جای تنظیم مداوم مقدار LED به مقدار پتانسیومتر در یک حلقه، میتوانید این دو با هم جفت کنید. بنابراین کد led.source = pot.values معادل حلقه زیر است:
while True: led.value = pot.value
استفاده از چند پتانسیومتر
- یک پتانسیومتر دیگر به بردبورد اضافه کنید و آن را به کانال 1 ADC متصل نمایید:

- اکنون شی MCP3008 دوم را روی کانال 1 ایجاد کنید:
pot2 = MCP3008(1)
- LED را در حالت چشمکزن قرار دهید:
led.blink()
LED یک ثانیه روشن و یک ثانیه خاموش میشود.
- با تغییر پارامترهای on_time و off_time میتوانید سرعت چشمکزدن LED را تنظیم کنید.
led.blink(on_time=2, off_time=2) led.blink(on_time=0.5, off_time=0.1)
- اکنون با استفاده از یک حلقه میتوانید زمان چشمکزدن را متناسب با مقادیر پتانسیومتر تغییر دهید:
while True: print(pot.value, pot2.value) led.blink(on_time=pot.value,off_time=pot2.value,n=1, background=False)
دقت داشته باشید که LED باید در پیش زمینه یک بار چشمک بزند تا هر تکرار پیش از به روز رسانی زمان چشمکزدن به پایان برسد.
- برای تغییر سرعت چشمکزدن، صفحهها را بچرخانید.
علاوه بر این تغییر blink به pulse و تغییر on_time و off_time به fade_in_time و fade_out_time را امتحان کنید در نتیجه به جای اینکه LED فقط خاموش و روشن شود، با سرعت متفاوت به تدریج درخشان و محو میشود:
while True: print(pot.value, pot2.value) led.pulse(fade_in_time=pot.value,fade_out_time=pot2.value,n=1, background=False)
- برای تغییر افکت، صفحه را بچرخانید