در این مطلب، فرایند راه اندازی ADS1115 ارتباط ماژول مبدل آنالوگ به دیجیتال (ADC) ۱۶بیتی ADS1115 با ESP32 را بررسی خواهیم کرد. برد بریک اوت (Breakout Board) ADS1115 یک مبدل آنالوگ به دیجیتال (ADC) با رزولوشن بالا است که میتوان از آن همراه با میکروکنترلرهای مختلف از جمله آردوینو، STM32 و ESP8266/32 استفاده کرد. به طور خاص، ESP32 یک میکروکنترلر قدرتمند با قابلیتهای Wi-Fi داخلی و بلوتوث است که آن را به یک گزینه ایدهآل برای کاربردهای حوزه IoT تبدیل کرده است.
میکروکنترلر ESP32 دارای یک ADC ۱۲ بیتی داخلی است که رزولوشن بالاتری نسبت به ADC ۱۰ بیتی موجود در بردهای آردوینو دارد. با این حال، ADS1115 دارای رزولوشن حتی بالاتری از 16 بیت است که عملکرد بهتری از نظر اندازهگیری ولتاژ دارد. کوچکترین ولتاژی که ESP32 میتواند اندازهگیری کند، 3.3V / 4096 = 0.0008V = 0.8mV است، در حالی که ADS1115 می تواند تا 5V / 65536 = 0.000076V = 76uV اندازهگیری کند.
این امر باعث میشود ADS1115 در مواقعی که اندازهگیری ولتاژ دقیق مورد نیاز است، انتخابی عالی باشد. اگر دقت بیشتری تا 0.3uV مورد نیاز باشد، میتوان ماژول آنالوگ به دیجیتال ۲۴بیتی ADS1220 را به عنوان یک گزینه در نظر گرفت.
راه اندازی ADS1115 با ESP32
در ادامه این مطلب، روش گامبهگام اتصال ADS1115 به ESP32، پیکربندی ارتباط I2C و نوشتن کد برای خواندن و پردازش سیگنالهای آنالوگ با استفاده از Arduino IDE را ارائه خواهیم کرد. در پایان این مطلب، درک کاملی از نحوه ارتباط ماژول ۱۶ بیتی ADC به نام ADS1115 با ESP32 و نحوه استفاده کامل از قابلیتهای آن برای پروژههای خود خواهید داشت.
فهرست قطعات
برای درک کامل ماژول ADC ADS1115 هنگام کار با ESP32، به قطعات زیر نیاز داریم:
- ۱ عدد برد ESP32
- ۱ عدد ماژول مبدل آنالوگ به دیجیتال ADS1115
- ۱ عدد نمایشگر LCD 16×2 I2C
- ۲ عدد پتانسیومتر 10kΩ
- ۱ عدد برد بورد
- سیم
پینهای ESP32 ADC و دقت آن
ESP32 یک میکروکنترلر قدرتمند با قابلیتهای Wi-Fi و بلوتوث یکپارچه است. این میکروکنترلر چندین پین ADC دارد که میتوان از آنها برای اندازهگیری سیگنالهای آنالوگ و تبدیل آنها به مقادیر دیجیتال استفاده کرد. ESP32 دارای دو مبدل آنالوگ به دیجیتال ADC1 و ADC2 است که در مجموع 18 کانال ADC دارد.
- ADC1 دارای 8 کانال (GPIO32 تاGPIO39 ) است.
- ADC2 دارای 10 کانال (GPIO0 GPIO2 ،GPIO4 ،GPIO12 تا GPIO15، و GPIO25 تاGPIO27) است.
مبدلهای آنالوگ به دیجیتال ESP32 دارای رزولوشن 12 بیت هستند، به این معنی که میتوانند یک سیگنال آنالوگ را با استفاده از 4096 سطح گسسته نمایش دهند. بااینحال، به دلیل نویز داخلی و ویژگیهای غیرخطی، رزولوشن مؤثر معمولاً در حدود 10 یا 11 بیت است.
برای بهبود دقت قرائتهای ADC در ESP32، میتوان کارهای زیر را انجام داد:
- استفاده از سنسور هال داخلی برای کالیبراسیون
- اجرای بیشنمونهبرداری (Oversampling) و میانگینگیری برای کاهش نویز
- استفاده از یک مرجع ولتاژ خارجی برای پایداری بهتر
- استفاده از یک ماژول ADC خارجی مانند ADS1115 در صورت نیاز به دقت بالاتر
بهخاطر داشته باشید که کانالهای ADC2 با قابلیتهای Wi-Fi به اشتراک گذاشته میشوند، بنابراین اگر از Wi-Fi استفاده میکنید، بهتر است از کانالهای ADC1 استفاده کنید تا از تداخل احتمالی یا تداخل با خواندن ADC جلوگیری کنید.
تراشه ADS1115
ADS1115 یک IC مبدل آنالوگ به دیجیتال با دقت بالا، کممصرف، 16بیتی و سازگار با I2C است.
ویژگیهای ADS1115
ویژگیهای ADS1115 عبارت است از:
- وضوح 16 بیتی
- ورودیهای تکسر 4 کاناله یا تفاضلی ۲ کاناله
- رابط پروتکل I2C
- مقایسهکننده برنامهپذیر
- محدوده تغذیه وسیع
- مصرف جریان کم
- حالت تبدیل مداوم
- نرخ داده قابلبرنامهریزی
- نتیجه دهی تکچرخه (Single-Cycle Settling)
- مرجع ولتاژ کم انحراف داخلی (Internal Low-Drift Voltage Reference)
- نوسانساز داخلی
- محدوده دمای کاری گسترده
- موجود در بستهبندی فوق کوچک X2QFN
پیکربندی پین ADS1115
تصویر زیر پیکربندی پین تراشه ADS1115 را نشان میدهد.
- پین 1 پین ADDR است که آدرس I2C را برای تراشه انتخاب میکند.
- پین 2 پین Alert/Ready است که به عنوان سیگنال Ready و Alert عمل میکند.
- پین 3 ترمینال GND است.
- پینهای 4، 5، 6 و 7 چهار پین ورودی ADC هستند. میتوانیم از این پینها به عنوان ۴ ورودی تکسر یا ۲ ورودی تفاضلی استفاده کنیم.
- پین 8 مربوط به منبع تغذیه مثبت است که 2 ولت تا 5 ولت به آن وصل میشود.
- پینهای 9 و 10 به ترتیب ترمینالهای رابط I2C، SDA و SCL هستند.
بلوک دیاگرام عملکردی ADS1115
تصویر زیر، بلوک دیاگرام عملکردی تراشه ADS1115 را نشان میدهد.
ابتدا یک مالتیپلکسر سیگنال ورودی را انتخاب میکند. سپس، این سیگنال انتخابشده وارد یک تقویتکننده بهره قابلبرنامهریزی (PGA) میشود که میتوان آن را برای تقویت سیگنالهای کوچکتر، قبل از انجام تبدیل برنامهریزی کرد.
سپس، یک مبدل دلتا سیگمای 16 بیتی ورودی را پردازش میکند. این مبدل از مرجع ولتاژ یکپارچه و اسیلاتور خود برای اندازهگیری سیگنال ورودی استفاده میکند. پس از انجام تبدیل، دادههای حاصل به رابط I2C ارسال میشود. علاوه بر این، یک مقایسهکننده سیگنالی را برای رابط خارجی تولید میکند که نشان می دهد نتیجه تبدیلشده برای بازیابی در دسترس است.
اتصالات ADS1115
اتصالات اولیه I2C برای ADS1115 در تصویر زیر قابلمشاهده است.
ADS1115 با کنترلرهای I2C حالت استاندارد، حالت سریع و حالت بسیار سریع سازگار است و میتواند مستقیماً با آنها ارتباط برقرار کند. ADS1115 با هر میکروکنترلر I2C جانبی که شامل تجهیزات جانبی I2C نوع master-only و single-master است، کار میکند. برای اطلاعات بیشتر به دیتاشیت ADS1115 مراجعه کنید.
ماژول یا بریکاوت برد ADS1115
ADS1115 در بستههای X2QFN و VSSOP موجود است که برای نمونهسازی مناسب نیستند. در نتیجه، یک ماژول ADS1115 یا بریکاوت برد (Breakout Board) برای استفاده با ESP32 یا هر میکروکنترلر دیگری ضروری است.
این ماژولها را میتوان از تولیدکنندگان مختلف با قیمتهای مقرونبهصرفه پیدا کرد. طراحی مناسب برد بورد آنها را برای نمونهسازی و تست کاربردهای عملی ایدهآل میکند و امکان یکپارچهسازی آسان را فراهم میکند.
پینهای ماژول ADS1115
ماژول ADS1115 در مجموع دارای 10 پین است که در جدول زیر آورده شدهاند.
شماره پین | نام پین | شرح پین |
۱ | VDD | منبع تغذیه: 2V تا 5.5V |
۲ | GND | زمین |
۳ | SCL | ورودی ساعت سریال: داده ساعت در SDA (برای ارتباط I2C استفاده میشود) |
۴ | SDA | دادههای سریال: دادهها را ارسال و دریافت میکند (برای ارتباط I2C استفاده میشود) |
۵ | ADDR | انتخاب آدرس I2C (Slave) |
۶ | ALERT/RDY | خروجی مقایسهکننده دیجیتال یا ready تبدیل |
۷ | AIN0 | کانال تفاضلی 1: ورودی کانال 1 تکسر یا ورودی منفی |
۸ | AIN1 | کانال تفاضلی ۱: ورودی کانال ۲ تکسر یا ورودی منفی |
۹ | AIN2 | کانال تفاضلی ۲: ورودی کانال ۳ تکسر یا ورودی مثبت |
۱۰ | AIN3 | کانال تفاضلی ۲: ورودی کانال ۴ تکسر یا ورودی منفی |
شماتیک ماژول ADS1115
تصویر قبلی، انطباق Adafruit ماژول ADS1115 را نشان میدهد.
این شماتیک بر اساس پروتکل اتصال استاندارد برای تراشه ADS1115 است. مدار دارای مقاومتهای pull-up با مقدار ۱۰ کیلواهم در هر دوپایه I2C و Alert و همچنین یک خازن ۱ میکروفارادی است که بین پایههای VDD و GND قرار دارد و بهعنوان یک خازن جداکننده عمل میکند.
رابط ماژول ADS1115 با ESP32
اتصالات مدار ESP32 برای رابط ماژول ADC ADS1115 ساده و سرراست است.
ابتدا، پین VDD و GND ماژول را به ترتیب به پین 3.3 ولت وGND میکروکنترلر ESP32 وصل کنید. سپس، پینهای I2C ماژول ADS1115 (SDA و SCL) را به پینهای I2C (SDA=GPIO21 و SCL=GPIO22) میکروکنترلر ESP32 متصل کنید. بسته به اینکه از کدامیک از آدرسهای 0x49، 0x4A یا 0x4B میخواهید استفاده کنید، پین ADDR تراشه باید به VDD، SDA یا SCL متصل شود. توجه داشته باشید که پین ADDR به طور پیش فرض توسط یک مقاومت 10 کیلواهمی به زمینpulled down شده است.
اگر میخواهید از پین ALERT/READY ماژول ADS1115 استفاده کنید، باید آن را به پین دیجیتال ESP32 وصل کنید. این پین دو کاربرد دارد. اول اینکه میتوان از آن برای تبدیل مبتنی بر وقفه استفاده کرد که بهعنوان سیگنال READY داده عمل میکند. دوم اینکه میتوان از آن با مقایسهکننده خروجی قابلبرنامهریزی برای تشخیص آستانه تبدیل استفاده کرد. در این مورد، بهعنوان یک سیگنال ALERT عمل میکند.
ADS1115 دارای چهار خروجی مبدل آنالوگ به دیجیتال A0، A1، A2 و A3 است که به این معنی است که میتوان حداکثر چهار سنسور آنالوگ را به این ماژول متصل کرد. بهعنوانمثال، برای آزمایش خواندن ماژول، میتوان از یک پتانسیومتر استفاده کرد که باید آن را مطابق مدار شکل قبل وصل کرد.
نصب کتابخانه ADS1115
چندین کتابخانه برای ماژول ADS1115 موجود است. با جستوجو در Library Manager، میتوان کتابخانه را از یک توسعهدهنده دیگر دریافت کرد.
از بین تمام کتابخانههای موجود، میتوانیم از یکی از کتابخانههای پایدار برای برنامه خود استفاده کنیم. کتابخانهای که استفاده میکنیم، از Adafruit است. میتوانید کتابخانه را از لینک زیر دانلود کنید.
این کتابخانه قابلیت تنظیم سرعت ساعت I2C، تنظیم بهره قابلبرنامهریزی، حالت عملیاتی و نرخ داده را دارد. با استفاده از این کتابخانه میتوانیم دادههای ADC سنسور را در حالت Single mode Differential Mode و Continuous Mode بخوانیم.
کد برنامه
با استفاده از کد نمونه اولیه از پوشه نمونه Adafruit ADS1115، میتوانیم عملکرد سنسور را آزمایش کنیم.
کد زیر را کپی کرده و در برد ESP32 آپلود کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 | #include <Adafruit_ADS1X15.h> Adafruit_ADS1115 ads;/* Use this for the 16-bit version */ //Adafruit_ADS1015 ads;/* Use this for the 12-bit version */ void setup(void) { Serial.begin(115200); Serial.println("Getting single-ended readings from AIN0..3"); Serial.println("ADC Range: +/- 6.144V (1 bit = 3mV/ADS1015, 0.1875mV/ADS1115)"); // The ADC input range (or gain) can be changed via the following // functions, but be careful never to exceed VDD +0.3V max, or to // exceed the upper and lower limits if you adjust the input range! // Setting these values incorrectly may destroy your ADC! // ADS1015 ADS1115 // ------- ------- // ads.setGain(GAIN_TWOTHIRDS); // 2/3x gain +/- 6.144V 1 bit = 3mV 0.1875mV (default) // ads.setGain(GAIN_ONE); // 1x gain +/- 4.096V 1 bit = 2mV 0.125mV //ads.setGain(GAIN_TWO); // 2x gain +/- 2.048V 1 bit = 1mV 0.0625mV // ads.setGain(GAIN_FOUR); // 4x gain +/- 1.024V 1 bit = 0.5mV 0.03125mV // ads.setGain(GAIN_EIGHT); // 8x gain +/- 0.512V 1 bit = 0.25mV 0.015625mV // ads.setGain(GAIN_SIXTEEN); // 16x gain +/- 0.256V 1 bit = 0.125mV 0.0078125mV if (!ads.begin()) { Serial.println("Failed to initialize ADS."); while (1); } } void loop(void) { int16_t adc0, adc1, adc2, adc3; float volts0, volts1, volts2, volts3; adc0 = ads.readADC_SingleEnded(0); adc1 = ads.readADC_SingleEnded(1); adc2 = ads.readADC_SingleEnded(2); adc3 = ads.readADC_SingleEnded(3); volts0 = ads.computeVolts(adc0); volts1 = ads.computeVolts(adc1); volts2 = ads.computeVolts(adc2); volts3 = ads.computeVolts(adc3); Serial.println("-----------------------------------------------------------"); Serial.print("AIN0: "); Serial.print(adc0); Serial.print(" "); Serial.print(volts0); Serial.println("V"); Serial.print("AIN1: "); Serial.print(adc1); Serial.print(" "); Serial.print(volts1); Serial.println("V"); Serial.print("AIN2: "); Serial.print(adc2); Serial.print(" "); Serial.print(volts2); Serial.println("V"); Serial.print("AIN3: "); Serial.print(adc3); Serial.print(" "); Serial.print(volts3); Serial.println("V"); } |
پس از آپلود کد، Serial Monitor را باز کنید. Serial Monitor مقدار ADC را برای هر 4 خروجی AIN0، AIN1، AIN2، AIN3 همراه با ولتاژ خروجی نشان میدهد.
ازآنجاکه فقط از دو پتانسیومتر برای AIN0 و AIN1 استفاده کردهایم، این مقادیر در حین چرخش پتانسیومتر تغییر میکنند.
تست دقت ماژول ADS1115
اکنون، دقت ماژول ADC ADS1115 را ارزیابی خواهیم کرد. برای ارزیابی دقت آن، میتوانیم از یک نمایشگر LCD برای نمایش مقدار ADC و ولتاژهای اندازهگیریشده استفاده کنیم. پس از آن، میتوانیم از یک مولتیمتر برای اندازهگیری ولتاژ شناساییشده و مقایسه آن با ولتاژ نمایشدادهشده در Serial Monitor استفاده کنیم.
اتصالات ADS1115 ،ESP32 و LCD
LCD را مطابق شکل زیر به مدار قبلی وصل کنید.
پین SDA و SCL مربوط به LCD را به GPIO21 و GPIO22 از ESP32 وصل کنید. با استفاده از پینهای Vin وGND تراشه ESP32، اتصال 5 ولت VCC و GND را به نمایشگر LCD برقرار کنید.
کد برنامه
کد برای کامپایل کردن به کتابخانه LCD I2C نیاز دارد. میتوانید کد زیر را کپی کرده و در بورد ESP32 آپلود کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 | #include <Adafruit_ADS1X15.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2); Adafruit_ADS1115 ads; /* Use this for the 16-bit version */ //Adafruit_ADS1015 ads; /* Use this for the 12-bit version */ void setup(void) { Serial.begin(115200); Serial.println("Getting single-ended readings from AIN0..3"); Serial.println("ADC Range: +/- 6.144V (1 bit = 3mV/ADS1015, 0.1875mV/ADS1115)"); // The ADC input range (or gain) can be changed via the following // functions, but be careful never to exceed VDD +0.3V max, or to // exceed the upper and lower limits if you adjust the input range! // Setting these values incorrectly may destroy your ADC! // ADS1015 ADS1115 // ------- ------- // ads.setGain(GAIN_TWOTHIRDS); // 2/3x gain +/- 6.144V 1 bit = 3mV 0.1875mV (default) // ads.setGain(GAIN_ONE); // 1x gain +/- 4.096V 1 bit = 2mV 0.125mV //ads.setGain(GAIN_TWO); // 2x gain +/- 2.048V 1 bit = 1mV 0.0625mV // ads.setGain(GAIN_FOUR); // 4x gain +/- 1.024V 1 bit = 0.5mV 0.03125mV // ads.setGain(GAIN_EIGHT); // 8x gain +/- 0.512V 1 bit = 0.25mV 0.015625mV // ads.setGain(GAIN_SIXTEEN); // 16x gain +/- 0.256V 1 bit = 0.125mV 0.0078125mV lcd.init(); lcd.backlight(); if (!ads.begin()) { Serial.println("Failed to initialize ADS."); while (1); } } void loop(void) { int16_t adc0, adc1, adc2, adc3; float volts0, volts1, volts2, volts3; adc0 = ads.readADC_SingleEnded(0); adc1 = ads.readADC_SingleEnded(1); adc2 = ads.readADC_SingleEnded(2); adc3 = ads.readADC_SingleEnded(3); volts0 = ads.computeVolts(adc0); volts1 = ads.computeVolts(adc1); volts2 = ads.computeVolts(adc2); volts3 = ads.computeVolts(adc3); Serial.println("-----------------------------------------------------------"); Serial.print("AIN0: "); Serial.print(adc0); Serial.print(" "); Serial.print(volts0); Serial.println("V"); Serial.print("AIN1: "); Serial.print(adc1); Serial.print(" "); Serial.print(volts1); Serial.println("V"); Serial.print("AIN2: "); Serial.print(adc2); Serial.print(" "); Serial.print(volts2); Serial.println("V"); Serial.print("AIN3: "); Serial.print(adc3); Serial.print(" "); Serial.print(volts3); Serial.println("V"); lcd.clear(); lcd.setCursor(0, 0); lcd.print("ADC0:"); lcd.print(adc0); lcd.print(" "); lcd.print(volts0); lcd.print("V"); lcd.setCursor(0, 1); lcd.print("ADC1:"); lcd.print(adc1); lcd.print(" "); lcd.print(volts1); lcd.print("V"); delay(1000); } |
بررسی نهایی
با آپلود کد، ماژول برای آزمایش آماده میشود. برای این منظور، به یک مولتیمتر نیاز است. LCD مقدار ADC و ولتاژ اندازهگیریشده را نمایش میدهد.
از دو پتانسیومتر برای وارد کردن ولتاژ ADC و نمایش هر دوی آنها در صفحه نمایش LCD استفاده میکنیم. یکی از ولتاژهای اندازهگیریشده با مولتیمتر 3.28V است که در LCD ولتاژ 3.31V را نشان میدهد.
حداکثر ولتاژ خروجی ADC از ماژول 3.3V و حداقل آن 0V است. هنگام اندازهگیری ولتاژ پایینتر، وقت LCD مقدار 0.84V را نشان میدهد، مقدار 0.827V در مولتیمتر اندازهگیری میشود.
بنابراین، میتوان نتیجه گرفت که ماژول مبدل آنالوگ به دیجیتال ۱۶بیتی ADS1115 دقت خوبی دارد و میتوان از آن برای کاربردهای چندمنظوره استفاده کرد.
طبق تستهای دیگر، این دستگاه دارای دقت معمولی 0.01% است، اما حداکثر دقت آن 0.15% است. این دقت شامل تمام منابع خطا مانند مرجع ولتاژ، خطای بهره، افست و نویز میشود.
منبع: