دنیای میکروکنترلرها دنیای کار با مقادیر دیجیتال است حال آنکه میدانیم دنیای واقعی بیشتر و یا حتی میتوان گفت تماما، دنیای سیگنالها و مقادیر آنالوگ است. همین یک جملهی ساده دلیل وجود مبدلهای آنالوگ به دیجیتال (ADC) و یا برعکس (DAC) است که بتوان به واسطهی آنها سیگنالهای دنیال واقعی را به وسیلهی میکروها پردازش کرد و سپس خروجی آنها را مجددا به سیگنالهای آنالوگ تبدیل کرد.
از مبدلهای DAC در کاربردهای بسیاری مانند کنترل موتورها، کنترل روشنایی LEDها، کنترل آمپلیفایرهای صوتی، ویدئو انکودرها، سیستمهای درخواست اطلاعات و غیره استفاده میشود.
مبدل دیجیتال به آنالوگ MCP4725 DAC را علاوه بر رزبریپای، میتوان به میکروکنترلرهای STM32 و بوردهای آردوینو نیز متصل کرد. ما در این جلسه قصد داریم چگونگی اتصال این آیسی به رزبریپای را به شما آموزش دهیم و موارد دیگر را به جلسات دیگری موکول میکنیم.
فرض میکنیم که شما به روزترین OS موجود را بر روی بورد رزبری خود نصب دارید و همچنین اینکه به آن دسترسی SSH نیز دارید. (اگر این موارد برقرار نیستند، به قسمت آموزشهای بورد رزبریپای مراجعه کنید و مطابق با دستورالعملهای توضیح داده شده در آنجا، این شرایط پیشفرض را برآورده کنید)
در اینجا ما بورد Raspberry Pi 3 را استفاده میکنیم که بر روی آن Rasbian Stretch نصب شده است.
ابزارهای مورد نیاز برای انجام پروژه
- بورد Raspberry Pi 3 B+ (OS: Raspbian)
- تراشهی مبدل دیجیتال به آنالوگ MCP4725
- LCD 16×2
- برد بورد
- سیم رابط برد بوردی
آشنایی با مبدل MCP4725
این آیسی یک مبدل دیجیتال به آنالوگ ۱۲ بیتی است و خروجیهای ولتاژ بین ۰ تا ۵ ولت تولید میکند. با استفاده از پروتکل I2C قابل کنترل است و دارای یک مموری EEPROM نیز هست.
همان طور که گفتیم این مبدل ۱۲ بیتی است. به عبارت دیگر میتوان گفت که رزولوشن آن ۱۲ بیت است. یعنی میتوان مقادیر از ۰ تا ۴۰۹۶ (۲۱۲) را به آن داد و متناسب با هر ورودی یک سطح ولتاژ خروجی از ۰ تا ۵ دریافت کرد. اگر ۵ ولت را ولتاژ مرجع (Reference Voltage) بنامیم، بنابراین:
فرمول محاسبهی ولتاژ خروجی
O/P Voltage = (Reference Voltage / Resolution) x Digital Value
به عنوان مثال اگر مقدار دیجیتال خروجی برابر با ۲۰۴۸ باشد؛ خروجی آنالوگ به این ترتیب محاسبه میشود.
O/P Voltage = (5/ 4096) x 2048 = 2.5V
پایههای MCP4725
در دو تصویر زیر نمایی از پایههای این تراشه و توضیحات مربوط به هر پایه را میتوانید ببینید.
گفتیم که کنترل این IC با استفاده از پروتکل ارتباطی I2C انجامپذیر است. از طرفی میدانیم که I2C یک پروتکل دو سیمه است که تنها به سیمهای SCL و SDA نیاز دارد. در بخش بعدی میخواهیم ببینیم که استفاده از این پروتکل در بورد رزبریپای چگونه است.
پینهای ارتباط I2C در بورد رزبریپای
برای آنکه بتوانیم از این ماژول مبدل دیجیتال به آنالوگ در بورد رزبریپای استفاده کنیم، اولین کاری که باید انجام دهیم این است که بدانیم پورتهای ارتباط I2C در بورد رزبری به کدام پینهای آن نظیر میشوند تا بتوانیم ماژول مبدل را به همان پینها متصل کنیم.
نمودار پایههای بورد Raspberry Pi 3 مدل +B را در ادامه میبینیم. پینهای مربوط به I2C هم که در این آموزش با عنوان پینهای SCL و SDA از آنها نام برده میشوند، در آن مشخص هستند.
تنظیمات مربوط به پینهای I2C در رزبریپای
ارتباط I2C به صورت پیشفرض بر روی بوردهای رزبریپای غیر فعال است هرچند که امکان فعال کردن آن وجود دارد. بنابراین در قدم نخست باید آن را فعال کنیم. برای این کار کافیست سه قدم زیر را طی کنیم.
- ترمینال را باز کنید و عبارت «sudo raspi-config» را در آن تایپ کنید.
- کمی صبر کنید تا پنجرهی تنظیمات باز شود.
- در آنجا Interfacing options را انتخاب و سپس I2C را enable کنید.
- پس از فعالسازی I2C یک بار بورد را reboot کنید.
جستجو و یافتن I2C آدرسهای ماژول مبدل به وسیلهی بورد رزبریپای
گام بعدی برای برقرار کردن ارتباط میان رزبریپای و ماژول مبدل، این است که رزبریپای بتواند آدرسهای I2C ماژول را پیدا کرده و بخواند. برای این کار ابتدا پینهای SDA و SCL ماژول را متناظرا به پینهای SDA و SCL بورد متصل کنید. همچنین پینهای ۵ ولت و زمین را هم وصل کنید. حال برای پیدا کردن آدرس I2C ماژول متصل شده به بورد، ترمینال را باز کنید و دستور زیر را در آن وارد کنید.
sudo i2cdetect –y 1 or sudo i2cdetect –y 0
پس از اتمام مرحلهی فوق، باید کتابخانههای لازم برای استفاده و ارتباط با MCP4725 را بر روی بورد نصب کنیم.
نصب کتابخانهی MCP4725 Adafruit بر روی بورد رزبریپای
از این کتابخانه استفاده میکنیم تا I2C Bus میان ماژول و بورد را بتوانیم فعال کنیم. برای دانلود و نصب این کتابخانه به این ترتیب عمل کنید.
- مطمئن شوید که بورد رزبریپای به یک شبکهی اینترنت متصل است.
- ترمینال را باز کنید و دستورات زیر را در آن وارد کنید.
sudo apt-get install git build-essential python-dev git clone https://github.com/adafruit/Adafruit_Python_MCP4725.git cd Adafruit_Python_MCP4725 sudo python setup.py install
- پس از اینکه با موفقیت نصب شد، حالا Adafruit MCP4725 library آماده است که با استفاده از دستور زیر در هر اسکریپت پایتونی باز شود.
Import Adafruit_MCP4725
نصب کتابخانهی Adafruit LCD display
از LCD برای نمایش مقدار دیجیتال و مقدار معادل آنالوگ آن استفاده میکنیم. برای دانلود و نصب این کتابخانه به این شکل عمل کنید.
- ترمینال را باز کنید و دستورات زیر را یکی یکی وارد کنید.
apt-get install git git clone https://github.com/adafruit/Adafruit_Python_CharLCD.git cd Adafruit_Python_CharLCD sudo python setup.py install
- پس از آنکه نصب شد، با استفاده از کد زیر میتوان Adafruit_python_CharLCD را در هر پایتون اسکریپتی استفاده نمود.
import Adafruit_CharLCD as LCD
در این لحظه بورد رزبریپای آماده است که کد ارتباط با مبدل دیجیتال به آنالوگ بر روی آن ریخته شود. ابتدا اتصالات مدار را طبق آنچه که در ادامه میآید کامل میکنیم.
شماتیک مدار و نحوهی اتصالات
شماتیک مدار کلی برای ارتباط بورد رزبریپای و ماژول DAC به شکل زیر است.
اتصال LCD و بورد رزبریپای
اتصال MCP4725 و بورد رزبریپای
و در نهایت تنظیمات نهایی در واقعیت چنین شکلی خواهند داشت.
نوشتن کدهای لازم برای بورد رزبریپای به منظور تبدیل مقادیر دیجیتال به آنالوگ با استفاده از مبدل DAC
کد کامل پایتون این پروژه را در انتهای آموزش برایتان قرار دادهایم. کافیست آن را با استفاده از یک SSH client مانند Putty و یا یک FTP client مانند FileZilla بر روی بورد آپلود کنید. و یا اینکه یک مانیتور به بورد متصل کنید و خودتان آن را مستقیما پروگرم کنید. (اگر در پروگرم کردن رزبریپای و روشهای آن اشکال یا سوالی دارید، به آموزشهای دیگری که در این زمینه داشتهایم مراجعه کنید)
در برنامهای که مینویسیم، قرار است مقدار دیجیتالی در بازهی ۰ تا ۴۰۹۶ توسط I2C Bus، از بورد رزبریپای به ماژول MCP4725 ارسال شود و این مبدل مقدار آنالوگ متناظر با آن را تولید کرده و نمایش دهد. ضمنا هم مقدار دیجیتال و هم معادل آنالوگ آن را بر روی LCD نمایش خواهیم داد.
نکتهای که قبل از ورود به کد لازم است توضیح دهیم این است که مقادیر دیجیتال در حلقهای تولید میشوند که شمارندهی حلقه هر بار با ۱۵۰ جمع میشود. یعنی: (۴۰۵۰ … ۴۵۰، ۳۰۰، ۱۵۰، ۰)
بسیار خب، حالا بیایید جزییات برنامه را با هم مرور کنیم.
دستور زیر تمام کتابخانههایی که در بالا توضیح دادیم و نیز کتابخانهی time را به برنامه اضافه میکند.
import Adafruit_CharLCD as LCD import Adafruit_MCP4725 import time
در بخش بعدی پینهای LED و شماره ردیف وستون هر کدام را مشخص میکنیم. (میدانیم که LCD 16×2 دارای ۲ ردیف و ۱۶ ستون است)
lcd_rs = 25 lcd_en = 24 lcd_d4 = 23 lcd_d5 = 17 lcd_d6 = 18 lcd_d7 = 22 lcd_backlight = 4 # Define LCD column and row size for 16x2 LCD. lcd_columns = 16 lcd_rows = 2 lcd = LCD.Adafruit_CharLCD(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7,lcd_columns, lcd_rows, lcd_backlight)
سپس یک پیام اولیه را برای مدت کوتاهی؛ مثلا ۵ ثانیه روی صفحهی LCD نمایش میدهیم.
lcd.message('Circuit Digest') time.sleep(2.0) lcd.message('\nDAC using Rpi') time.sleep(5.0) lcd.clear()
در بخش بعدی از مبدل دیجیتال به آنالوگ یک Instance میگیریم و آدرس I2C آن را که در بخشهای قبلی پیدا کرده بودیم وارد میکنیم. مثلا بورد ما در اینجا آدرس 0x60 را داشته. شما آدرس بورد خودتان را به جای آن وارد کنید.
dac = Adafruit_MCP4725.MCP4725(address=0x60)
حالا در داخل حلقهی while، یک حلقهی for مینویسیم که مقادیر دیجیتال را تولید کند و ازطریق I2C bus برای ماژول مبدل ارسال کند. حلقهی for به این شکل خواهد بود، (۱۵۰، ۴۰۹۵، ۰). یعنی x از ۰ تا ۴۰۹۵ مقدار میپذیرد و مقادیر آن هربار ۱۵۰ تا افزایش خواهند یافت.
while True: for x in range(0,4097,150):
دستور زیر مقدار دیجیتال تولید شده را به مبدل MCP4725 ارسال میکند.
dac.set_voltage(x)
براساس فرمولی که در بخشهای قبلی گفتیم و براساس مقدار دیجیتالی که در هر بار به مبدل ارسال میشود، مقدار آنالوگ متناظر با آن محاسبه میشود.
voltage = x/4096.0*5.0
و دستورات زیر هم مقدار دیجیتال دریافت شده و مقدار آنالوگ محاسبه شدهی آن را با تاخیر زمانی ۲ ثانیه بر روی LCD نمایش میدهند.
lcd.cursor_pos = (0,0) lcd.message("DAC Value: " + str(x)) lcd.message("\nAnalogVolt: %.2f" % voltage) time.sleep(2)
در اینجا ما مقدار دیجیتال را در خط اول نمایشگر و مقدار آنالوگ معادل آن را در خط دوم نمایش دادهایم. از طرفی یک مولتیمتر را هم به خروجی ماژول مبدل وصل میکنیم تا اطمینال حاصل کنیم ولتاژ نمایش داده شده همان ولتاژ افتاده روی خروجی ماژول است.
کد کامل و ویدئویی از مراحل انجام پروژهی فوق را میتوانید در ادامه ببینید.
کد
import Adafruit_CharLCD as LCD import Adafruit_MCP4725 import time lcd_rs = 25 lcd_en = 24 lcd_d4 = 23 lcd_d5 = 17 lcd_d6 = 18 lcd_d7 = 22 lcd_backlight = 4 # Define LCD column and row size for 16x2 LCD. lcd_columns = 16 lcd_rows = 2 lcd = LCD.Adafruit_CharLCD(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, lcd_columns, lcd_rows, lcd_backlight) lcd.message('Circuit Digest') time.sleep(2.0) lcd.message('\nDAC using Rpi') time.sleep(5.0) lcd.clear() dac = Adafruit_MCP4725.MCP4725(address=0x60) while True: for x in range(0,4097,150): print(x) dac.set_voltage(x) lcd.cursor_pos = (0,0) lcd.message("DAC Value: " + str(x)) voltage = x/4096.0*5.0 lcd.message("\nAnalogVolt: %.2f" % voltage) time.sleep(2) lcd.clear()
ویدئو
- منبع: ترجمه از سایت circuitdigest.com
امیدواریم مقاله «آموزش کار با DAC در رزبریپای با ماژول MCP4725» برایتان مفید واقع شده باشد.
اگر این نوشته برایتان مفید بود لطفا کامنت بنویسید.