ماژول مبدل رابط سریال به I2C

پل ارتباطی بین پروتکل‌های سریال و I2C

ماژول مبدل رابط سریال به I2C: راه‌حل هوشمند ارتباط بین میکروکنترلرهای بدون I2C و دستگاه‌های I2C

ماژول مبدل رابط سریال به I2C یک برد واسطه قدرتمند است که پروتکل ارتباطی سریال (UART) را به پروتکل I2C تبدیل می‌کند. این ماژول با استفاده از تراشه‌های تخصصی مانند PCF8574، PCA9685 یا ماکروکنترلرهای برنامه‌ریزی شده، امکان اتصال ده‌ها دستگاه I2C به میکروکنترلرهای دارای تنها یک پورت سریال را فراهم می‌آورد.


کاربردهای اصلی و مزایای کلیدی

  • افزایش تعداد دستگاه‌های I2C: اتصال بیش از ۱۲۸ دستگاه روی یک باس I2C.

  • افزایش فاصله ارتباطی: ارتباط I2C تا فاصله چند متری (با استفاده از تبدیل به سریال).

  • سازگاری با میکروکنترلرهای ساده: اضافه کردن قابلیت I2C به میکروکنترلرهای فاقد سخت‌افزار I2C.

  • ایزولاسیون نوری: امکان ایزوله کردن کامل باس I2C از میکروکنترلر اصلی.

  • ساده‌سازی سیم‌کشی: کاهش سیم‌های ارتباطی در پروژه‌های پیچیده.


انواع ماژول‌های مبدل سریال به I2C

نوع تراشه اصلی ویژگی‌ها کاربرد اصلی
PCF8574 I2C Expander PCF8574 ۸ پین GPIO قابل گسترش، آدرس‌دهی تا ۸ دستگاه گسترش پین‌های I/O
PCA9685 PWM Driver PCA9685 ۱۶ کانال خروجی PWM 12-bit، آدرس‌دهی تا ۶۲ دستگاه کنترل سروو/موتور/LED
I2C Multiplexer TCA9548A ۸ کانال I2C مالتی‌پلکسر، رفع تداخل آدرس اتصال همزمان دستگاه‌های هم‌آدرس
I2C to UART Bridge SC16IS752 ۲ پورت سریال + I2C/SPI، بافر FIFO افزودن پورت سریال به I2C
General Purpose I2C Hub میکروکنترلر (ATmega) قابل برنامه‌ریزی، پروتکل سفارشی پروژه‌های خاص

مشخصات فنی ماژول عمومی (بر اساس PCF8574)

پارامتر مشخصات فنی
تراشه اصلی PCF8574 (Texas Instruments) یا PCF8574A
رابط ورودی I2C (آدرس پیش‌فرض: ۰x۲۰ تا ۰x۲۷)
خروجی‌ها ۸ پین GPIO دوطرفه (قابل استفاده به صورت ورودی/خروجی)
ولتاژ کاری ۲.۵V تا ۶V (سازگار با ۳.۳V و ۵V)
جریان خروجی هر پین ۲۵mA (حداکثر)
جریان کل خروجی ۲۰۰mA
فرکانس I2C تا ۱۰۰kHz (استاندارد) یا ۴۰۰kHz (فست)
آدرس‌دهی تا ۸ دستگاه (با پین‌های آدرس A0,A1,A2)
ابعاد ماژول حدود ۳۵mm × ۲۰mm

پین‌های ماژول PCF8574

پین ماژول نام عملکرد
VCC تغذیه ۳.۳V یا ۵V
GND زمین زمین مشترک
SDA داده I2C به SDA میکروکنترلر اصلی
SCL کلاک I2C به SCL میکروکنترلر اصلی
A0,A1,A2 آدرس I2C انتخاب آدرس (LOW=0, HIGH=1)
P0-P7 پین‌های GPIO ۸ پین ورودی/خروجی
INT وقفه (اختیاری) خروجی وقفه برای تغییر وضعیت پین‌ها

اتصال پایه‌ای به آردوینو

آردوینو 5V ---> VCC ماژول
آردوینو GND ---> GND ماژول
آردوینو A4 (SDA) ---> SDA ماژول
آردوینو A5 (SCL) ---> SCL ماژول

آدرس‌دهی:

  • A0,A1,A2 همگی به GND: آدرس ۰x۲۰ (پیش‌فرض)

  • A0=HIGH, A1,A2=LOW: آدرس ۰x۲۱

  • و به همین ترتیب تا آدرس ۰x۲۷


کد نمونه: کنترل LED و خواند کلید با PCF8574

// کتابخانه Wire برای I2C
#include <Wire.h>

// آدرس PCF8574 (با توجه به اتصال A0,A1,A2)
#define PCF8574_ADDRESS 0x20

void setup() {
  Wire.begin();
  Serial.begin(9600);
  Serial.println("PCF8574 I2C Expander Test");
}

void loop() {
  // === حالت ۱: خروجی (روشن کردن LED روی پین P0) ===
  Wire.beginTransmission(PCF8574_ADDRESS);
  Wire.write(0x01); // 00000001 = P0=HIGH, بقیه LOW
  Wire.endTransmission();
  Serial.println("LED روشن شد");
  delay(1000);
  
  // === حالت ۲: خاموش کردن همه LEDها ===
  Wire.beginTransmission(PCF8574_ADDRESS);
  Wire.write(0x00); // همه پین‌ها LOW
  Wire.endTransmission();
  Serial.println("همه LEDها خاموش");
  delay(1000);
  
  // === حالت ۳: خواندن وضعیت ورودی‌ها (فرض کنید کلید روی P7) ===
  Wire.beginTransmission(PCF8574_ADDRESS);
  Wire.write(0xFF); // همه پین‌ها به عنوان ورودی (با Pull-up داخلی)
  Wire.endTransmission();
  
  Wire.requestFrom(PCF8574_ADDRESS, 1);
  if (Wire.available()) {
    byte inputs = Wire.read();
    bool buttonPressed = !(inputs & 0x80); // اگر P7=0 (کلید فشرده)
    
    if (buttonPressed) {
      Serial.println("کلید فشرده شد!");
    }
  }
  
  delay(100);
}

کد پیشرفته: کنترل ۱۶ سروو با PCA9685

// کنترل ۱۶ سروو موتور با PCA9685
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x40); // آدرس پیش‌فرض

void setup() {
  Serial.begin(9600);
  pwm.begin();
  pwm.setPWMFreq(60);  // فرکانس PWM برای سروو (معمولاً 60Hz)
  
  Serial.println("PCA9685 16-Channel PWM Driver Ready");
}

void loop() {
  // حرکت سروو روی کانال 0 از 0 تا 180 درجه
  for (int angle = 0; angle <= 180; angle++) {
    int pulse = map(angle, 0, 180, 150, 600); // محدوده پالس برای سروو
    pwm.setPWM(0, 0, pulse);
    delay(10);
  }
  
  delay(1000);
  
  // حرکت همه سرووها به صورت موج
  for (int channel = 0; channel < 16; channel++) {
    for (int pulse = 150; pulse <= 600; pulse += 10) {
      pwm.setPWM(channel, 0, pulse);
      delay(5);
    }
  }
}

کاربردهای عملی

  1. گسترش پین‌های I/O: اضافه کردن کلید، LED، رله به میکروکنترلر با پین‌های محدود.

  2. کنترل نورپردازی: مدیریت ده‌ها LED RGB با آدرس‌دهی جداگانه.

  3. سیستم‌های رباتیک: کنترل چندین سروو موتور به صورت همزمان.

  4. نمایشگرهای چندگانه: اتصال چندین OLED/LCD روی یک باس I2C.

  5. سیستم‌های نظارتی: خواندن چندین سنسور دما، رطوبت، فشار.

  6. صنعت: کنترل actuatorها، سلونوئیدها، شیرهای برقی.

  7. هنرهای تعاملی: ایجاد تجهیزات نورپردازی و صوتی پیچیده.


نکات حیاتی برای عملکرد پایدار

⚠️ مقاومت‌های Pull-up: باس I2C نیاز به مقاومت Pull-up دارد (معمولاً ۴.۷kΩ روی SDA/SCL به VCC).
🔧 آدرس‌دهی: هر دستگاه I2C باید آدرس منحصربه‌فرد داشته باشد.
🔌 طول کابل: برای فاصله بیش از ۰.۵ متر از کابل‌های به هم تابیده و شیلددار استفاده کنید.
⚡ تغذیه: اگر دستگاه‌های زیادی وصل می‌کنید، منبع تغذیه مجزا با خازن فیلتر فراهم کنید.
📊 فرکانس I2C: با افزایش تعداد دستگاه‌ها، فرکانس I2C را کاهش دهید (مثلاً از 400kHz به 100kHz).


پروژه عملی: کنترل پنل LED ماتریسی ۸×۸

قطعات:

  • ۴ ماژول PCF8574 (هر کدام ۸ پین خروجی)

  • آردوینو UNO

  • برد برد ماتریسی ۸×۸ با LED

  • مقاومت ۲۲۰ اهم (۶۴ عدد)

  • سیم‌های ارتباطی

نحوه کار: هر PCF8574 سطرها و ستون‌های ماتریس LED را کنترل می‌کند. با آدرس‌دهی متفاوت، ۳۲ LED به صورت مستقل کنترل می‌شوند.


مقایسه با روش‌های دیگر گسترش I/O

روش I2C Expander شیفت رجیستر مالتی‌پلکسر آنالوگ میکروکنترلر ثانویه
پروتکل I2C SPI/سریال I2C/SPI UART/I2C/SPI
تعداد پین‌ها تا ۱۲۸ پین (با چند ماژول) ۸-۱۶ پین ۸-۱۶ کانال آنالوگ محدود به میکرو
سرعت متوسط (تا 400kHz) بالا (MHz) متوسط بالا
سیم‌کشی ۲ سیم + تغذیه ۳-۴ سیم + تغذیه ۲-۳ سیم + تغذیه ۲+ سیم
قیمت مناسب بسیار ارزان مناسب گران‌تر

سوالات متداول (FAQ)

✅ حداکثر تعداد دستگاه روی I2C چقدر است؟
از نظر تئوری ۱۱۲ دستگاه (آدرس ۷ بیتی). در عمل به دلیل ظرفیت خازنی باس، ۲۰-۳۰ دستگاه قابل اطمینان است.

✅ اگر دو دستگاه آدرس یکسان داشته باشند چه؟
از I2C Multiplexer (مانند TCA9548A) استفاده کنید یا آدرس یکی را با تغییر سخت‌افزار عوض کنید.

✅ فاصله حداکثر I2C چقدر است؟
در حالت استاندارد: ۰.۵ متر. با درایورهای ویژه تا ۱۰۰ متر (با کاهش سرعت).

✅ آیا می‌توانم همزمان از SPI و I2C استفاده کنم؟
بله، اما ممکن است نیاز به مالتی‌پلکسر یا کنترلر مجزا داشته باشید.

✅ چگونه سرعت I2C را تنظیم کنم؟
در آردوینو: Wire.setClock(400000); // 400kHz

✅ اگر دستگاه I2C پاسخ ندهد چه کنم؟
۱. آدرس را بررسی کنید. ۲. سیم‌کشی را چک کنید. ۳. مقاومت‌های Pull-up را بررسی کنید. ۴. از I2C Scanner استفاده کنید.

✅ تفاوت PCF8574 با MCP23017 چیست؟
MCP23017 امکانات پیشرفته‌تر: وقفه، تنظیم Pull-up، تغییر جهت پین‌ها. PCF8574 ساده‌تر و ارزان‌تر.


چرا این ماژول را از ما بخرید؟

✅ کیفیت ساخت: استفاده از تراشه‌های اصلی TI/NXP.
✅ مقاومت‌های Pull-up نصب‌شده: آماده استفاده بدون نیاز به قطعه اضافه.
✅ تست کامل: تست همه پین‌ها، آدرس‌دهی و عملکرد I2C.
✅ پشتیبانی فنی: ارائه کدهای نمونه، نقشه‌های اتصال و راهنمای عیب‌یابی.


پکیج پیشنهادی برای پروژه‌های گسترش I/O

  1. ماژول PCF8574 I2C Expander (۴ عدد)

  2. ماژول PCA9685 16-Channel PWM (۱ عدد)

  3. آردوینو نانو با کابل USB

  4. برد بورد بزرگ (۸۳۰ نقطه)

  5. سیم‌های جامپر نری-مادگی (۵۰ عدد)

  6. LED و مقاومت (برای تست)


نحوه انتخاب ماژول مناسب

  • برای کلید/LED ساده: PCF8574 یا MCP23017.

  • برای سروو/PWM: PCA9685.

  • برای سنسورهای آنالوگ: مالتی‌پلکسر آنالوگ.

  • برای دستگاه‌های هم‌آدرس: I2C Multiplexer (TCA9548A).

  • برای پروژه‌های سفارشی: ماژول قابل برنامه‌ریزی با ATmega.