تحرير شهد صقر على الإثنين، 22 أيلول/سبتمبر 2025
فئة: Robotics Workshop

بروتوكولات نقل البيانات

 في عالم الأنظمة المدمجة والروبوتات الحديثة، تعتبر القدرة على التواصل بين المتحكمات والمكونات الذكية هي قلب كل مشروع ناجح. من الحساسات الدقيقة إلى الشاشات عالية السرعة، ومن وحدات البلوتوث إلى الذاكرة الخارجية، كل جهاز يعتمد على بروتوكول اتصال فعال لضمان نقل البيانات بسرعة ودقة وموثوقية فالبروتوكولات الأكثر استخدامًا في هذا المجال هي UART, I²C و SPIفالبساطة والموثوقية لمسافات طويلة UART و الأسلاك القليلة وإمكانية توصيل عدة أجهزة I²C و السرعة العالية والدقة المثلى لنقل البيانات الكبيرة SPI.

بروتوكول I2C

 I2C (Inter-Integrated Circuit) هو بروتوكول تسلسلي (Serial Communication Protocol) اخترعته شركة Philips سنة 1982 فكرته تعتمد على خطين فقط:

SCL (Serial Clock Line): خط الساعة، يحدد توقيت نقل البيانات.
SDA (Serial Data Line): خط البيانات، يتم عبره تبادل البتات.

المميزات العميقة والنادرة في I2C

  1. نظام Multi-Master: ليس "ماستر واحد وبقية عبيد"، I2C يسمح بوجود أكثر من Master بنفس الوقت. إذا كان الأرسال مع بعض، البروتوكول فيه آلية Arbitration (تحكيم) تقوم بتحديد أي ماستر له الأولوية بدون تضارب . هذه الميزة نادرة و تدع I2C مناسب للأنظمة المعقدة.
  2. الـ Clock Stretching: الأجهزة البطيئة ممكن توقف الماستر عن طريق إبقاء خط الساعة منخفض، هذه التقنية تقوم بالمحافظة على التزامن وبتمنع فقدان البيانات، وليس كل بروتوكول يدعم هذه المرونة.
  3. Address Resolution Protocol (ARP): من الأشياء الأقل شهرة إن I2C عنده بروتوكول فرعي لإدارة العناوين التلقائية. يعني بعض الأجهزة تقوم "تفاوض" على العنوان إذا وجد فيه تضارب عناوين.
  4. استخدامه في مجالات حساسة:
في المعالجات الحديثة، يُستخدم كـ SMBus (System Management Bus) لمراقبة الحرارة والطاقة.

في الشاشات (Display Data Channel – DDC)، بروتوكول I2C هو اللي بيخلي الكمبيوتر يتعرف على نوع الشاشة ودقتها تلقائياً. 

المميزات العميقة والنادرة في I2C

  1. Start Condition: الماستر يسحب خط SDA لأسفل بينما SCL عالي → إشارة بدء.
  2. Address Frame: الماستر يرسل عنوان الجهاز (7 أو 10 بت).
  3. Read/Write Bit: يحدد إذا الماستر بده يقرأ أو يكتب.
  4. ACK/NACK: الجهاز العبد يرد بإشارة تأكيد أو رفض.
  5. Data Transfer: يتم تبادل البيانات بتات بتات.
  6. Stop Condition: الماستر يرفع SDA بينما SCL عالي → إشارة انتهاء.

العيوب :

  1. أبطأ من SPI لما تحتاج نقل بيانات ضخمة جداً.
  2. طول الأسلاك محدود (عادة أقل من مترين بسرعات عالية).
  3. احتمالية حدوث تضارب إذا ما تم إدارة العناوين بشكل صحيح.
  4. أعماق بروتوكول I2C 

بروتوكولات مبنية على I2C

I2C ليس بروتوكول عام، بل أساس لأنظمة فرعية:

المزامنة والـ Clock Stretching بعمق

أي جهاز Slave بطيء يقدر يوقف الخط عن طريق إبقاء SCL منخفض.
بعض الـ Master ما بيدعموها (مثلاً في بعض المتحكمات الرخيصة)، وهذا يسبب مشاكل توافق.
الأجهزة المتقدمة (زي الـ Raspberry Pi) تدعم Clock Stretching لكن بسرعات محددة.

الأمان والمشاكل الواقعية

Noise Sensitivity: بما إنه خط واحد مش تفاضلي مثل CAN، ممكن يتأثر بالتشويش (EMI). لذلك يستخدم بكثافة داخل البوردات، مش بالكابلات الطويلة.
Bus Lockup: إذا Device عمل Hold دائم على SDA → الباص كله يتجمد.
الحل: Reset الـ Slave.
أو فصل SDA/SCL لحظياً عبر MOSFET Switch

تطبيقات متقدمة نادرة

اتجاهات حديثة

دخول I3C (Improved Inter-Integrated Circuit): خليفة I2C.

تجربة عملية بسيطة:

​استخدم هذا الكود في Adruino لتجربة بروتوكول I2C.

ستحتاج الى:

التوصيل:

BMP280 أو OLED:
SDA → A4 (Arduino) / GPIO 2 (Raspberry Pi)
SCL → A5 (Arduino) / GPIO 3 (Raspberry Pi)
VCC → 3.3V / 5V
GND → GND
استخدم مقاومات Pull-up على SDA و SCL إذا لزم الأمر

ملاحظة عملية:

يمكن توصيل OLED بنفس SDA/SCL لعرض البيانات مباشرة.

يمكن تجربة عدة أجهزة على نفس الخطين لمشاهدة عمل I²C Multi-Device.

بروتوكول UART

UART هو بروتوكول غير متزامن، لا يستخدم ساعة مشتركة، بل يعتمد على التزامن الداخلي عبر توقيت البتات (Baud Rate). يستخدم خطين فقط:
TX: لنقل البيانات من المرسل إلى المستقبل.

RX: لاستقبال البيانات من المرسل الآخر. 

هيكل الفريم Frame Structure

كل بايت بينقل ضمن "فريم":

​السرعة والتزامن

Baud Rate (مثلاً 9600, 115200, 1M...) لازم تكون متطابقة بين الطرفين.
الانحراف (Baud Rate Error) لازم يكون < ±2% تقريباً، وإلا بيصير Loss للبيانات.

بعض الـ UART تدعم Auto-Baud Detection: بتتعلم السرعة من أول بايت مستلم. 

المميزات العميقة

بسيط جداً: ما يحتاج بروتوكول معقد أو Clock.
يشتغل لمسافات أطول من I²C (مع RS-232 أو RS-485 ممكن يتجاوز مئات الأمتار).

يدعم Full-Duplex حقيقي، مو مثل I²C اللي Half-Duplex. 

القيود

نقطة لنقطة (Point-to-Point): UART عادي ما يدعم أكثر من جهازين إلا باستخدام Multiplexers أو بروتوكولات فوقية.
ما في Addressing داخلي: على عكس I²C.

غير مناسب لعدد كبير من الأجهزة بدون وسيط. 

تطبيقات عملية واقعية

مستويات أعمق (Industrial UART)

RS-485: نسخة متطورة من UART تدعم Multi-Node (أكثر من جهاز على خطين).

LIN Bus: في السيارات، مبني فوق UART لكنه يضيف Addressing وتوقيت مضبوط. 

المقارنة مع I²C و UART

UART → سهل، مسافة أطول، لكن محدود بعدد الأجهزة.
I²C → جهازين وأكثر، لكن مسافة قصيرة.

الفلسفة وراء UART

UART ليس بروتوكول Bus مثل I²C أو CAN، بل هو آلية لنقل البيانات Point-to-Point.
الهدف: تحويل البتات من متوازي (داخل المعالج) إلى تسلسلي (على خط واحد) والعكس.
لذلك، الـ UART موجود تقريبًا بكل معالج ومتحكم، وغالبًا يكون "بوابة العالم الخارجي" للمطورين.

الميزات العملية

  1. Full-Duplex حقيقي: إرسال واستقبال بنفس الوقت.
  2. Latency قليل: ما في Arbitration أو Addressing مثل I²C.
  3. مناسب للـ Debugging: أي متحكم عنده UART → بسهولة بتشبكه على Serial Monitor. 

العيوب

  1. لا يوجد Addressing داخلي → يجب إضافة بروتوكول أعلى (مثلاً MODBUS).
  2. يدعم جهازين فقط (Point-to-Point) إلا إذا استخدمت RS-485 أو Multiplexer.
  3. حساس جدًا لعدم تطابق البود ريت أو التشويش. 

تطبيقات متقدمة

تجربة عملية بسيطة:

​هذا الكود يمكنك وضعه على Arduino لتجربة بروتوكول UART.

ستحتاج الى:

  • أسلاك توصيل (Jumper Wires)
التوصيل:
Arduino TX → USB → Computer (Serial Monitor)

Arduino RX → إذا أردنا جهاز آخر للتبادل 

ملاحظة عملية:
استخدمي Serial Monitor على Arduino IDE لمشاهدة البيانات.
يمكن ربط Arduino بـ GPS Module أو Bluetooth Module عبر نفس UART لقراءة بيانات فعلية.

​بروتوكول SPI

ي عالم الإلكترونيات، كل بروتوكول له "شخصيته". UART بسيط ومباشر، I²C منظم ومرن، بينما SPI هو البروتوكول اللي بيجمع بين السرعة الفائقة و البساطة الفيزيائية.

اخترعته شركة Motorola في الثمانينات، واليوم هو العمود الفقري للتواصل بين المتحكمات والذاكرات، الشاشات، الـ ADC/DAC، وحتى أجهزة الاستشعار عالية الدقة. 

ما هو SPI؟

SPI (Serial Peripheral Interface) هو بروتوكول تسلسلي متزامن (Synchronous Serial Communication Protocol).
Synchronous: فيه خط ساعة Clock يحدد التوقيت.

يعتمد على مبدأ Master–Slave: جهاز واحد Master يتحكم بالساعة، وبقية الأجهزة Slaves. 

خطوط SPI الرئيسية

بنية الإطار (Frame Format)

ما في بنية جامدة مثل UART/I²C، لكن العادة:
بايت 8 بت (أحيانًا 16 أو 32).
البيانات تُرسل بت بت، متزامنة مع نبضات الساعة.

النقل يتم Full-Duplex: بنفس الوقت اللي الماستر يرسل فيه بت، يستقبل بت من الـ Slave. 

السرعة (Speed)

SPI أسرع بكثير من I²C و UART.
ممكن يوصل لعشرات الـ MHz (10–100+ MHz حسب العتاد).

لذلك يُستخدم مع الذاكرات (Flash, EEPROM)، شاشات TFT، وحساسات دقيقة. 

المميزات العميقة لـ SPI

Full-Duplex حقيقي: إرسال واستقبال متزامن.
سرعة عالية: مثالي للبيانات الضخمة (صور، تسجيلات).
بنية بسيطة: ما يحتاج Addressing مثل I²C.

مرونة: يدعم أي طول بيانات (8، 16، 32، حتى Streams). 

العيوب

يحتاج أسلاك أكثر: على الأقل 4 خطوط (MISO, MOSI, SCLK, CS)، وتزداد مع عدد الأجهزة.
لا يوجد Addressing داخلي: كل جهاز محتاج خط CS مستقل.
مسافة قصيرة: مثل I²C، عادة أقل من 1–2 متر بسرعات عالية.

لا يوجد آلية كشف أخطاء مدمجة (لا Parity ولا ACK/NACK). 

​تطبيقات عملية

 الأعماق الفيزيائية

إشارات SPI عادة Push-Pull، يعني الماستر يقدر يرفع ويخفض الجهد.
ما يحتاج Pull-up Resistors مثل I²C.
الاستهلاك أعلى مع السرعات العالية (لأن كل تغيير على الساعة يستهلك شحن/تفريغ).
التداخل (Crosstalk) ممكن يسبب مشاكل بسرعات >20 MHz، لذلك لازم نستخدم مسارات قصيرة + Ground Planes. 

توسعات SPI

Daisy Chain SPI: بعض الأجهزة تسمح توصيلها بسلسلة، الماستر يرسل سلسلة بيانات والجهاز الصحيح يقرأ جزءه.
QSPI (Quad SPI): يستخدم 4 خطوط بيانات بدل MOSI/MISO → زيادة السرعة بشكل ضخم (حتى 100+ MB/s).

Dual SPI: مثل QSPI لكن بخطين. 

مقارنة عميقة مع I²C و UART

​الميزة ​UART ​ I²C ​SPI
​عدد الخطوط ​2 (TX,RX)​ ​2 (SDA,SCL) 4+ (MOSI, MISO, SCLK, CS)
​عدد الأجهزةجهازين فقط​100+ (Addressing)​​عدة أجهزة لكن يحتاج CS لكل واحد
السرعة​​حتى 1 Mbps​حتى 3.4 Mbps (HS Mode)حتى 100+ Mbps
المزامنة​Asynchronous​​Synchronous (Clock)​Synchronous (Clock)
​Full-Duplexنعم​لا (Half-Duplex)​نعم​
​آلية كشف الأخطاء​بت المساواة (Optional Parity Bit)

Bit-level + Ack/Nack​لا يوجد مدمج (يعتمد على بروتوكولات أعلى)​
أفضل استخدام​​اتصال بسيط بين جهازين (مثلا pc - متحكم)شبكات من عدة مستشعرات وأجهزة ببطء نسبي​نقل بيانات سريع بين متحكم واجهزة طرفية​
نوع الاتصال​نقطة-الى-نقطة (point-to-point)​متعدد النقاط (Multi-Master, Multi-Slave)​Master-Slave​

نصائح عملية للمهندسين

بيانات قليلة، أجهزة متعددة → I²C.
بيانات سريعة أو كبيرة الحجم → SPI.
مسافات طويلة أو Debugging → UART.

UART: نقطة لنقطة، يمكن تحويل RS-232 أو RS-485 للمسافات الطويلة.
I²C: Pull-up Resistors مهمة، الانتباه لـ Capacitance.
SPI: لكل Slave CS خاص، واستخدم مسارات قصيرة للسرعات العالية.

UART: Parity + Framing Error + Overrun Error.
I²C: ACK/NACK + Arbitration + Clock Stretching.
SPI: عادة بدون كشف أخطاء، يمكن إضافة CRC على طبقة البروتوكول العلوي
كل بروتوكول له مجاله:
UART: بساطة وموثوقية لمسافات طويلة.
I²C: مرونة بعدد الأجهزة وقلة الأسلاك.

SPI: سرعة ودقة عالية لنقل البيانات الثقيلة. 

تجربة عملية بسيطة:

استخدم هذا الكود في Arduino لتجربة بروتوكول  SPI.

ستحتاج الى:

التوصيل:
SCK → SCLK Arduino
SDI → MOSI Arduino
SDO → MISO Arduino
CS → أي Pin Digital (مثلاً D10)
VCC & GND كما سابقاً

ملاحظة عملية:
SPI أسرع من I²C → يمكن قراءة بيانات الحساس بسرعة أعلى.
إذا وصلنا أكثر من SPI Slave، لكل واحد نستخدم CS مختلف.

مدونات ذات صلة

اترك تعليقاتك