
راهاندازی ارتباط I2C بین چند سنسور؛ بررسی آدرس تکراری، مقاومت Pull-up و عیبیابی باس
تصور کنید میخواهید در یک پروژه الکترونیکی، چند سنسور دما، فشار، شتابسنج یا مبدل آنالوگ به دیجیتال را به یک میکروکنترلر متصل کنید. اگر برای هر قطعه به پایههای جداگانه نیاز داشته باشید، خیلی زود با کمبود پایههای ورودی و خروجی روبهرو میشوید.
ارتباط I2C یکی از راهکارهای کاربردی برای حل این مشکل است. با استفاده از دو خط ارتباطی، میتوانید چندین دستگاه را به یک میکروکنترلر متصل کنید؛ اما این روش هم قواعد خاص خودش را دارد. آدرس تکراری، مقاومتهای Pull-up نامناسب، سیمکشی طولانی و ناسازگاری ولتاژ منطقی از جمله عواملی هستند که میتوانند باعث شناسایینشدن سنسورها یا ناپایداری ارتباط شوند.
در این مقاله، نحوه اتصال چند دستگاه I2C، بررسی آدرسها، انتخاب مقاومتهای Pull-up و روش عیبیابی این گذرگاه را بهصورت عملی بررسی میکنیم.

۱. ارتباط I2C چگونه کار میکند؟
I2C یک پروتکل ارتباطی سریال است که معمولاً از دو خط اصلی استفاده میکند:
-
SDA: خط انتقال داده
-
SCL: خط سیگنال ساعت
در یک ارتباط معمولی، میکروکنترلر نقش کنترلکننده (Controller) را بر عهده دارد و سنسورها و سایر قطعات، دستگاههای مقصد (Target) هستند. در بسیاری از پروژههای متداول، میکروکنترلر ارتباط را آغاز میکند و اطلاعات موردنیاز را از دستگاه مقصد میخواند یا برای آن ارسال میکند.
ویژگی مهم I2C این است که دستگاههای مختلف میتوانند خطوط SDA و SCL را بهصورت مشترک استفاده کنند. بنابراین، لازم نیست برای هر سنسور یک جفت پایه ارتباطی مستقل در نظر بگیرید.
برای نمونه، در یک پروژه میتوانید سنسور دما، سنسور فشار و یک نمایشگر دارای رابط I2C را به همان دو خط متصل کنید؛ به شرط آنکه آدرسها و شرایط الکتریکی ارتباط با یکدیگر سازگار باشند.
نکته مهم این است که علاوه بر SDA و SCL، اتصال زمین مشترک نیز در مدارهای معمول ضروری است. ولتاژ تغذیه هر ماژول باید مطابق مشخصات همان ماژول انتخاب شود.
۲. نحوه اتصال چند سنسور به یک باس I2C
سیمکشی پایهای چند دستگاه I2C ساده است. پایههای SDA تمام دستگاهها به یکدیگر و به پایه SDA میکروکنترلر متصل میشوند. همین کار برای پایههای SCL نیز انجام میشود.
ساختار کلی اتصال به شکل زیر است:
-
پایه SDA میکروکنترلر به SDA تمام سنسورها متصل میشود.
-
پایه SCL میکروکنترلر به SCL تمام سنسورها متصل میشود.
-
زمین میکروکنترلر و ماژولها به یکدیگر متصل میشود.
-
تغذیه هر ماژول مطابق محدوده مجاز آن تأمین میشود.
-
مقاومتهای Pull-up باس به ولتاژ منطقی مناسب متصل میشوند.
برای مثال، اگر یک میکروکنترلر به سه سنسور I2C متصل باشد، هر سه سنسور میتوانند SDA و SCL مشترک داشته باشند. کنترلکننده با استفاده از آدرس هر دستگاه مشخص میکند که کدام سنسور باید به درخواست پاسخ دهد.
البته تعداد دستگاههای قابل اتصال فقط به تعداد آدرسهای پروتکل محدود نمیشود. ظرفیت خازنی باس، طول سیمها، سرعت ارتباط، توانایی قطعات در پایینکشیدن خطوط و کیفیت سیمکشی نیز اهمیت دارند.
نکته عملی: پایههای SDA و SCL را بر اساس مستندات همان برد انتخاب کنید. محل این پایهها در Arduino Uno، بردهای ESP32 و Raspberry Pi Pico الزاماً یکسان نیست و بعضی بردها امکان انتخاب پایههای متفاوت یا استفاده از چند رابط I2C را دارند.
۳. آدرس I2C چیست و چرا اهمیت دارد؟
هر دستگاه I2C باید آدرسی داشته باشد که کنترلکننده بتواند با استفاده از آن دستگاه مقصد را مشخص کند.
در بسیاری از کاربردهای متداول، آدرس دستگاهها بهصورت ۷ بیتی نمایش داده میشود؛ برای مثال، آدرسهایی مانند 0x48 یا 0x68 ممکن است در برخی قطعات دیده شوند. این مقادیر صرفاً نمونه هستند و آدرس واقعی باید از دیتاشیت قطعه یا مستندات ماژول استخراج شود.
اگر چند دستگاه روی یک باس قرار داشته باشند، آدرس آنها باید با یکدیگر سازگار باشد. در ارتباط معمولی، دو دستگاه با آدرس یکسان نمیتوانند بهطور مستقل و مطمئن از همان باس انتخاب شوند.
مشکل آدرس تکراری چگونه ایجاد میشود؟
فرض کنید دو سنسور یکسان خریداری کردهاید. سازنده هر دو را با آدرس پیشفرض یکسان عرضه کرده است. پس از اتصال هر دو سنسور به SDA و SCL مشترک، کنترلکننده نمیتواند صرفاً با ارسال آن آدرس، یکی از سنسورها را از دیگری متمایز کند.
در چنین شرایطی ممکن است هر دو دستگاه به درخواست پاسخ دهند و در هنگام انتقال داده، تداخل ایجاد شود. نتیجه میتواند دادههای نادرست، رفتار غیرقابل پیشبینی یا شکست ارتباط باشد.
نکته مهم این است که یکسانبودن مدل دو سنسور لزوماً به معنی یکسانبودن آدرس آنها نیست؛ بعضی قطعات امکان تغییر آدرس دارند و برخی دیگر تنها یک آدرس قابل انتخاب ارائه میکنند.
برای حل این مشکل، ابتدا دیتاشیت را بررسی کنید تا مشخص شود آدرس قطعه ثابت است یا میتوان آن را از طریق پایههای انتخاب آدرس، جامپر یا تنظیمات نرمافزاری تغییر داد.
۴. مقاومت Pull-up در ارتباط I2C چه وظیفهای دارد؟
یکی از بخشهای مهم و گاهی نادیدهگرفتهشده در طراحی I2C، مقاومتهای Pull-up است.
خطوط SDA و SCL در ساختار متداول I2C بهصورت Open-drain یا Open-collector عمل میکنند. این یعنی دستگاهها معمولاً میتوانند خط را به سطح پایین بکشند یا آن را آزاد کنند؛ برای ایجاد سطح منطقی بالا، مقاومت Pull-up لازم است.
برای هر دو خط SDA و SCL باید مسیر Pull-up مناسبی وجود داشته باشد. اگر این مقاومتها وجود نداشته باشند یا مقدارشان مناسب نباشد، ممکن است ارتباط بهدرستی برقرار نشود.
مقدار مقاومت Pull-up چقدر باشد؟
مقدار 4.7 kΩ نقطه شروع رایجی در بسیاری از مدارهای I2C است، اما یک مقدار ثابت و مناسب برای تمام پروژهها نیست. انتخاب نهایی به ولتاژ باس، سرعت ارتباط، ظرفیت خازنی، تعداد دستگاهها و مشخصات الکتریکی قطعات وابسته است.
مقاومت بیش از حد بزرگ میتواند بالا رفتن ولتاژ خطوط را کند کند. از طرف دیگر، مقاومت بیش از حد کوچک جریان بیشتری از دستگاهی میخواهد که خط را به سطح پایین میکشد و ممکن است از حدود مجاز آن فراتر برود.
بنابراین، در مدارهای حساس یا باسهای پرظرفیت، مقدار مقاومت باید با توجه به دیتاشیت قطعات و مشخصات زمانی پروتکل بررسی شود.
چرا چند ماژول ممکن است مشکل Pull-up ایجاد کنند؟
بسیاری از ماژولهای آماده سنسور، مقاومتهای Pull-up مخصوص خود را دارند. هنگامی که چند ماژول را به یکدیگر متصل میکنید، ممکن است مقاومتهای آنها بهصورت موازی روی باس قرار بگیرند.
برای نمونه، دو مقاومت 4.7 kΩ که بین یک خط و یک ولتاژ تغذیه یکسان بهصورت موازی قرار گرفتهاند، مقاومت معادل حدود 2.35 kΩ ایجاد میکنند. با اضافهشدن ماژولهای بیشتر، مقاومت معادل ممکن است باز هم کاهش پیدا کند.
این وضعیت الزاماً به معنی بروز خطا نیست، اما میتواند جریان هنگام پایینبودن خط را افزایش دهد. به همین دلیل، نباید فرض کرد که اتصال تعداد زیادی ماژول آماده همیشه بدون بررسی مقاومتهای موجود امکانپذیر است.
در عین حال، حذف مقاومتهای Pull-up نیز نباید بدون محاسبه و بررسی انجام شود. هدف این است که باس در محدوده الکتریکی مجاز تمام دستگاههای متصل کار کند.
مراقب ولتاژ Pull-up باشید
یکی از اشتباهات مهم، اتصال خطوط I2C به ولتاژ نامناسب است.
برای مثال، اگر میکروکنترلر با منطق 3.3 ولت کار کند، نباید فرض کنید که ورودیهای آن تحمل Pull-up به 5 ولت را دارند. تحمل ولتاژ به مشخصات دقیق پایه و قطعه بستگی دارد.
در پروژههایی که دستگاههای دارای سطوح منطقی متفاوت به هم متصل میشوند، باید سازگاری ولتاژ بررسی شود و در صورت نیاز از مبدل سطح منطقی مناسب I2C استفاده شود. اتصال مستقیم تنها زمانی مجاز است که مستندات قطعات آن را تأیید کنند.
۵. چگونه آدرس سنسورهای متصل را پیدا کنیم؟
یکی از سادهترین روشهای عیبیابی، استفاده از برنامه I2C Scanner است. این برنامه آدرسهای معمول قابل اسکن را بررسی میکند و وجود دستگاههایی را که به درخواست شناسایی پاسخ میدهند گزارش میدهد.
کد زیر برای بردهای سازگار با کتابخانه Arduino Wire نوشته شده است. پیش از اجرا، باید اتصالها و پایههای پیشفرض یا انتخابشده I2C در برد خود را بررسی کنید.
|
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 |
#include <Wire.h> void setup() { Serial.begin(115200); Wire.begin(); Serial.println("I2C Scanner"); } void loop() { byte address; byte error; int found = 0; Serial.println("Scanning..."); for (address = 1; address < 127; address++) { Wire.beginTransmission(address); error = Wire.endTransmission(); if (error == 0) { Serial.print("I2C device found at 0x"); if (address < 16) { Serial.print("0"); } Serial.println(address, HEX); found++; } } if (found == 0) { Serial.println("No I2C devices found"); } delay(3000); } |
نحوه استفاده از I2C Scanner
-
میکروکنترلر را به کامپیوتر متصل کنید.
-
کد را در محیط Arduino IDE بارگذاری کنید.
-
Serial Monitor را با سرعت 115200 باز کنید.
-
آدرسهای نمایشدادهشده را یادداشت کنید.
-
سنسورها را یکییکی جدا و دوباره متصل کنید تا مشخص شود هر آدرس مربوط به کدام دستگاه است.
اگر هنگام اتصال یک سنسور جدید، آدرس تازهای ظاهر شود، میتوان نتیجه گرفت که آن دستگاه به اسکن پاسخ میدهد. با این حال، اسکنر بهتنهایی مدل قطعه، صحت اندازهگیری یا عملکرد کامل سنسور را تأیید نمیکند.
همچنین، اگر دو دستگاه آدرس یکسان داشته باشند، اسکنر الزاماً آنها را بهعنوان دو دستگاه مستقل گزارش نمیکند. بنابراین، مشاهده یک آدرس فقط وجود پاسخ در آن آدرس را نشان میدهد و برای تشخیص تعداد دستگاههای همآدرس کافی نیست.
نکته: در بعضی بردها، تنظیم پایههای I2C یا روش مقداردهی اولیه کتابخانه متفاوت است. اگر برنامه کامپایل نشد یا باس شناسایی نشد، ابتدا مستندات برد و کتابخانه مورد استفاده را بررسی کنید.
۶. عیبیابی مرحلهبهمرحله ارتباط I2C
اگر سنسور شناسایی نمیشود یا ارتباط ناپایدار است، بهتر است بهجای تغییر همزمان چند عامل، مراحل زیر را بهترتیب انجام دهید.
گام اول — فقط یک دستگاه را متصل کنید
تمام سنسورهای اضافی را جدا کنید و تنها یک دستگاه را روی باس نگه دارید. اگر ارتباط با یک دستگاه برقرار میشود اما با اضافهکردن دستگاههای دیگر از کار میافتد، احتمال وجود مشکل در آدرسها، مقاومتهای Pull-up، ظرفیت باس یا سیمکشی افزایش مییابد.
گام دوم — سیمکشی را بررسی کنید
مطمئن شوید که SDA به SDA و SCL به SCL متصل شدهاند. جابهجایی این دو خط، قطعشدن سیم، اتصال نامناسب زمین و اشتباه در پایههای انتخابشده میتوانند مانع ارتباط شوند.
گام سوم — تغذیه و سطوح منطقی را بررسی کنید
ولتاژ تغذیه سنسور باید در محدوده مجاز آن باشد. همچنین، ولتاژ Pull-up خطوط باید با ورودیهای تمام دستگاههای متصل سازگار باشد.
صرف اینکه یک ماژول با 5 ولت تغذیه میشود، به معنی تحمل 5 ولت در پایههای SDA و SCL آن نیست.
گام چهارم — آدرس صحیح را پیدا کنید
آدرس گزارششده توسط اسکنر را با دیتاشیت یا مستندات ماژول مقایسه کنید. در صورت وجود پایه انتخاب آدرس، وضعیت آن را بررسی کنید.
به خاطر داشته باشید که بعضی کتابخانهها آدرس ۷ بیتی را دریافت میکنند، در حالی که برخی مستندات قدیمیتر ممکن است آدرس را به شکل دیگری نمایش دهند. هنگام مقایسه آدرس، این تفاوت را در نظر بگیرید.
گام پنجم — مقاومتهای Pull-up را بررسی کنید
وجود مقاومتهای Pull-up، محل اتصال آنها و ولتاژ مرجعشان را بررسی کنید. اگر چند ماژول دارای مقاومت Pull-up هستند، مقاومت معادل و جریان پایینکشیدن خطوط را در نظر بگیرید.
مقاومتها را بدون بررسی حذف یا جایگزین نکنید؛ ابتدا مشخص کنید که مشکل واقعاً از بار الکتریکی باس ناشی میشود یا خیر.
گام ششم — سرعت ارتباط و سیمکشی را بررسی کنید
اگر ارتباط در سرعت پایین برقرار است اما در سرعت بالاتر دچار خطا میشود، ظرفیت باس، طول سیمها و زمان بالا رفتن سیگنالها میتوانند از عوامل احتمالی باشند.
برای آزمایش، سرعت ارتباط را به یک مقدار پایینتر که دستگاهها پشتیبانی میکنند کاهش دهید. اگر مشکل برطرف شد، این نتیجه سرنخی برای بررسی کیفیت سیگنال است، نه اثبات قطعی علت خطا.
گام هفتم — دستگاهها را یکییکی اضافه کنید
پس از برقراری ارتباط پایدار با یک دستگاه، سنسور بعدی را اضافه و دوباره اسکن کنید. این روند را تا اتصال تمام دستگاهها ادامه دهید.
با این روش، میتوانید مشخص کنید که خطا با اضافهشدن کدام ماژول یا تغییر کدام بخش از مدار ایجاد میشود.
۷. اگر دو سنسور آدرس یکسان داشته باشند، چه کنیم؟
در صورتی که دو سنسور آدرس یکسان داشته باشند، چند راهکار وجود دارد. انتخاب روش مناسب به قابلیتهای قطعه، تعداد سنسورها و پیچیدگی مدار بستگی دارد.
روش اول — تغییر آدرس سنسور
اگر قطعه پایههای انتخاب آدرس یا تنظیمات قابل برنامهریزی داشته باشد، میتوان آدرس یکی از سنسورها را تغییر داد تا هر دو دستگاه آدرس متمایز داشته باشند.
این روش معمولاً سادهترین گزینه است، اما تعداد آدرسهای قابل انتخاب و روش تنظیم آنها به مدل دقیق سنسور بستگی دارد.
روش دوم — استفاده از مالتیپلکسر I2C
اگر آدرس سنسور قابل تغییر نباشد، میتوان از مالتیپلکسر I2C استفاده کرد. برای مثال، TCA9548A یک مالتیپلکسر با یک رابط بالادست و 8 کانال پاییندست است.
با فعالکردن کانال مناسب، کنترلکننده میتواند به سنسور موردنظر دسترسی پیدا کند؛ حتی اگر چند سنسور روی کانالهای متفاوت آدرس یکسان داشته باشند.
در این روش، باید آدرس خود مالتیپلکسر نیز با سایر دستگاههای باس تداخل نداشته باشد. همچنین، تغذیه، ولتاژهای منطقی و مقاومتهای Pull-up در سمتهای مختلف مدار باید مطابق مشخصات قطعات بررسی شوند.
روش سوم — استفاده از رابط I2C مستقل
بعضی میکروکنترلرها بیش از یک رابط I2C دارند. در چنین شرایطی میتوان سنسورهای همآدرس را به باسهای مستقل متصل کرد، مشروط بر اینکه برد و نرمافزار امکان استفاده از این رابطها را فراهم کنند.
این راهکار ممکن است به سیمکشی یا کدنویسی بیشتری نیاز داشته باشد و برای تمام بردها در دسترس نیست.
قاعده انتخاب: اگر تغییر آدرس پشتیبانی میشود، ابتدا آن را بررسی کنید. اگر آدرس ثابت است، مالتیپلکسر معمولاً راهکار مناسبی است. استفاده از رابط مستقل نیز در صورت وجود سختافزار و پشتیبانی نرمافزاری میتواند گزینه دیگری باشد.
۸. جمعبندی
ارتباط I2C امکان اتصال چند سنسور و ماژول را با استفاده از خطوط مشترک SDA و SCL فراهم میکند، اما عملکرد صحیح آن به رعایت چند اصل اساسی وابسته است.
-
سیمکشی و پایههای صحیح را بر اساس مستندات برد انتخاب کنید.
-
آدرس دستگاهها را بررسی کنید و برای ارتباط معمولی، از تداخل آدرسها جلوگیری کنید.
-
مقاومتهای Pull-up را با توجه به ولتاژ، سرعت، ظرفیت باس و مشخصات قطعات انتخاب کنید.
-
ولتاژ منطقی خطوط را با محدودیتهای تمام دستگاههای متصل تطبیق دهید.
-
از I2C Scanner برای بررسی اولیه پاسخ دستگاهها استفاده کنید، اما نتیجه آن را تأیید کامل عملکرد سنسور در نظر نگیرید.
-
برای عیبیابی، ابتدا یک دستگاه را آزمایش کنید و سپس قطعات را یکییکی به باس اضافه کنید.
-
در صورت وجود آدرس تکراری، تغییر آدرس، مالتیپلکسر یا استفاده از رابط مستقل را بررسی کنید.
اگر هنگام اضافهکردن یک سنسور جدید، ارتباط سایر قطعات مختل میشود، بهترین نقطه شروع این است که آدرسها، مقاومتهای Pull-up و کیفیت سیمکشی را بهصورت جداگانه بررسی کنید. این روش معمولاً مسیر عیبیابی را روشنتر و تغییرات غیرضروری در مدار را کمتر میکند.



