التحكم في الأجهزة من Raspberry Pi إنه ممتع ومفيد للغاية بمجرد إتقان حافلات الاتصال الخاصة به. في الاستخدام اليومي، يُعدّ UART وI2C العنصرين الرئيسيين: أحدهما هو الحافلة التسلسلية غير المتزامنة التقليدية، والآخر هو حافلة متزامنة ثنائية الأسلاك تسمح بتوصيل أجهزة متعددة في وقت واحد. إليك دليل واضح ومباشر لاستخدامهما في Raspberry Pi.
بالإضافة إلى شرح ما هي وكيفية تفعيلها، ستشاهد تكوينات العالم الحقيقي على Raspberry Pi. (وحدة التحكم التسلسلية، الدبابيس، الأدوات)، أمثلة عملية في بايثون، تفاصيل دقيقة حول البلوتوث و mini-UART في بعض الموديلات، و قسم التشخيص بالنسبة للأخطاء الشائعة مثل خطأ الإدخال/الإخراج عن بعد المزعج عند مزج I2C وUART، فقد قمنا أيضًا بتضمين نهج Windows 10/IoT مع RhProxy وACPI، في حالة عملك في هذا المجال.
ما هو UART و I2C ولماذا يجب أن نهتم به؟

UART (جهاز استقبال - مرسل عالمي غير متزامن) واجهة تسلسلية غير متزامنة تُرسل وتستقبل البيانات دون الحاجة إلى ساعة مشتركة. تستخدم خطين مُخصصين: تكساس (الشحن) y RX (الاستقبال)نظرًا لعدم وجود ساعة، يجب أن يتفق كلا الطرفين على نفس السرعة، أي معدل الباود (على سبيل المثال، 9600، 115200 بت في الثانية). مقارنةً بـ SPI أو I2C، يكون التوصيل أسهل، على الرغم من أنه عادةً ما يكون أبطأ ويتصل من نقطة إلى نقطة.
وعلى الجانب الآخر لدينا I2C (الدائرة المتكاملة)، بروتوكول تسلسلي متزامن يعمل باستخدام سلكين فقط: SDA (البيانات) و SCL (الساعة). كل جهاز على الناقل لديه عنوان فريد مكون من 7 أو 10 بتيتيح هذا توصيل عدة مستشعرات أو شاشات أو وحدات ذاكرة بنفس الخطوط. يدعم سرعات مختلفة (قياسية ١٠٠ كيلوهرتز، سريعة ٤٠٠ كيلوهرتز، وسرعات أعلى مثل ٣.٤ ميجابت في الثانية) و متعدد الماجستير في ظل ظروف معينة.
في التمرين، UART مثالي لوحدات التحكم أو نظام تحديد المواقع العالمي (GPS) أو البلوتوث أو المتحكمات الدقيقة التي تتحدث التسلسل الكلاسيكي؛ تتميز I2C بقدرتها على قراءة أجهزة استشعار متعددة مع الحد الأدنى من الأسلاك والتكامل الجيد في المشاريع إنترنت الأشياء والروبوتات والأتمتةيعمل كلاهما معًا بشكل رائع على Raspberry Pi، طالما قمت بتكوين دبابيسهما بشكل صحيح وتجنب التداخلات.
UART على Raspberry Pi: إعدادات الدبابيس ووحدة التحكم والمفاتيح

على Raspberry Pi، يتم عرض UART الرئيسي على GPIO14 (TXD) وGPIO15 (RXD) من موصل 40 سنًا. بشكل افتراضي، العديد صور النظام تفعيل سلسلة وحدات التحكم هذه الدبابيس مفيدة جدًا لتصحيح الأخطاء دون الحاجة إلى شاشة أو شبكة. تاريخيًا، يتضمن نظام Broadcom SoC منفذي UART: UART0 (PL011، كامل) y UART1 (Mini-UART، مقطوع).
في نماذج مثل Raspberry Pi 3، تم تخصيص UART "الجيد" (PL011) لتقنية Bluetooth وتنتقل وحدة التحكم إلى وحدة UART المصغرة. وهذا له عواقب: تعتمد وحدة UART المصغرة على تردد النواة، ولكي تكون مستقرة، عادةً ما تكون تعيين core_freq=250وإلا، فقد تواجه اختلافات في معدل الباود مع منظم التردد وتفقد الأحرف بشكل كبير.
إذا كنت تريد استخدام UART لمشروعك بدلاً من وحدة التحكم، فإن الشيء المعتاد الذي يجب عليك فعله هو تعطيل وحدة التحكم التسلسليةلديك عدة خيارات: استخدام raspi-config في Interfaces > Serial، أو تعطيل تسجيل الدخول التسلسلي (ولكن مع إبقاء الأجهزة ممكّنة)، أو يدويًا عن طريق التحرير /boot/cmdline.txt لحذف وحدة التحكم=serial0,115200 y تمهيدمع ذلك، دبابيس GPIO 14/15 مجانية لتطبيقك.
خيار آخر مفيد للغاية هو استخدام محول USB-UARTتحتوي العديد من الكابلات على أربعة أسلاك: أحمر (5 فولت)، أسود (GND)، أبيض، وأخضر (TX/RX). في الاستخدام النموذجي مع Raspberry Pi، لا تقم بتوصيل السلك الأحمر. (جهاز Pi مُزوّد بالطاقة الذاتية بالفعل.) وصّل الأرضي (GND) بالأرضي (GND)، ثم اعبر جهاز الإرسال (TX) بجهاز الاستقبال (RX) (جهاز الإرسال في المحول إلى جهاز الاستقبال في Pi، والعكس صحيح). وصّل طرف USB بجهاز Pi للتواصل مع لوحة أخرى أو جهاز Pi آخر عبر... / dev / ttyUSB0 o / dev / ttyACM0.
لاختبار وحدة التحكم التسلسلية من Raspberry Pi نفسها باستخدام المحول، يمكنك استخدام miniterm.py أو محطة تسلسلية أخرى: miniterm.py /dev/ttyUSB0 115200سوف ترى مطالبة تسجيل الدخول (اسم المستخدم) pi، كلمه السر التوت (في الأنظمة الكلاسيكية). للخروج من miniterm في مثال ورشة العمل، استخدم Ctrl + AltGr + ]إذا كنت تفضل الشاشة: شاشة / ديف / ttyUSB0 115200 وتخرج مع السيطرة-A seguido دي \.
I2C على Raspberry Pi: التمكين والأسلاك والأدوات الأساسية
I2C على Raspberry Pi يظهر على الدبابيس المادية 3 و5 من الرأس (SDA1 وSCL1، واللذان يتوافقان مع GPIO2 وGPIO3). الخطوة الأولى هي تفعيله. في نظام Raspberry OS، انتقل إلى سودو raspi-config وفي "الخيارات المتقدمة" أو "خيارات الواجهة"، قم بتنشيط I2Cيعرض المعالج تحميل الوحدة عند بدء التشغيل.
في التكوينات الكلاسيكية، تمت إضافتها إلى / etc / modules الخطوط i2c-bcm2708 e i2c-devالصور الحديثة اليوم تتعامل بالفعل مع التراكبات، ولكن i2c-dev يبقى هذا العنصر أساسيًا في مساحة المستخدم. ثبّت الأدوات المساعدة التالية: تحديث sudo apt y sudo apt install i2c-tools python-smbus (o بايثون3-smbus (حسب نسختك).
للتأكد من أن كل شيء يعمل، قم بتشغيل lsmod | grep i2c وسترى الوحدات المُحمّلة. ثم حدد الحافلة واستكشفها باستخدام i2cdetect -y 1 (في النماذج القديمة جدًا، كان -و 0إذا كانت هناك أجهزة متصلة بشكل صحيح ومع شكا من سحب مناسب لـ SDA وSCL، سيُظهر الفحص عناوين مثل 0x48, 0x20، الخ.
تذكر أن ناقل I2C يتطلب مقاومات السحب في SDA وSCL (عند 3.3 فولت على Pi) وهذا يجب أن تتحد كل الجماهير (GND شائع). قد يؤدي غياب عمليات السحب أو الكابلات الطويلة/المزعجة إلى حدوث مشاكل متقطعة أو انقطاع الإشارة (NACK)، خاصةً عند تردد 400 كيلوهرتز فأكثر.
التحدث بلغة I2C من Python (smbus/smbus2)
للتفاعل مع أجهزة I2C من Python، يمكنك استخدام سموس o smbus2قم بتثبيته إذا لزم الأمر مع تثبيت pip smus2مثال أساسي للكتابة والقراءة للعنوان 0x48 سيكون كالتالي:
from smbus2 import SMBus
DEVICE_ADDRESS = 0x48 # Dirección I2C del dispositivo
bus = SMBus(1) # Bus I2C 1 en Raspberry Pi
# Escribir un byte (por ejemplo, 0x01) al dispositivo
bus.write_byte(DEVICE_ADDRESS, 0x01)
# Leer un byte del dispositivo
data = bus.read_byte(DEVICE_ADDRESS)
print(f"Dato leído: {data}")
bus.close()
هذا النمط من اكتب/اقرأ يساعدك على التأكد من استجابة الجهاز. إذا واجهت خطأ الإدخال/الإخراج عن بعد، عادة العبد لا يتم التعرف على العنوان أو السجل/المعاملة المرسلة، أو خطوط SDA/SCL ليست في حالة جيدة (السحب، الأسلاك، GND أو مصدر الطاقة).
اتصال UART مع Arduino: USB أو GPIO، حسب اختيارك
لكي يتمكن Raspberry Pi وArduino من التواصل بشكل تسلسلي، فإن الطريقة الأكثر مباشرة هي كابل USBقم بتوصيل Arduino بـ Pi، وسيظهر منفذ مثل هذا. / dev / ttyACM0 o / dev / ttyUSB0إنه مريح ويجنّبك متاعب المستويات ووحدات التحكم. بدلاً من ذلك، يمكنك استخدام دبابيس GPIO (UART للأجهزة) إذا قمت بتعطيل تسجيل الدخول التسلسلي باستخدام تكوين raspi وتترك الواجب المنزلي نشطًا.
قم بتثبيت مكتبة Python التسلسلية باستخدام sudo apt install python3-serial وحدد المنفذ المتاح مع ls / dev / tty *في Arduino، قم بتحميل رسم تخطيطي بسيط يرسل نصًا:
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.println("Hello from Arduino!");
delay(1000);
}
على Raspberry Pi، قارئ صغير مع جرسي سوف يبدو الأمر كالتالي:
import serial
import time
ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=1)
# Espera breve para que Arduino reinicie al abrir el puerto
time.sleep(2)
try:
while True:
if ser.in_waiting > 0:
data = ser.readline().decode('utf-8', errors='ignore').strip()
print(f"Received: {data}")
except KeyboardInterrupt:
ser.close()
لإرسال البيانات من Pi إلى Arduino، ببساطة... ser.write(b"مرحبا من Raspberry Pi!\n") وفي الرسم اقرأ مع Serial.readStringUntil('\n')ومن المهم أن كلاهما يستخدم نفس السرعة (البود)، ومن المستحسن الانتظار لبضع ثوانٍ عند فتح المنفذ حتى يتمكن ATmega من إعادة التشغيل وتجنب "القمامة" الأولية.
نهج Windows 10/IoT: واجهات برمجة تطبيقات المستخدم لـ GPIO وI2C وSPI وUART مع RhProxy وACPI
إذا كنت تعمل بنظام Windows 10/IoT Core أو Windows Enterprise، فهناك آلية لـ عرض GPIO وI2C وSPI وUART لوضع المستخدم من خلال وحدة تحكم تسمى RhProxyالفكرة هي الإعلان، في جداول ACPI (ASL/AML)، عن موارد SPB/GPIO المسموح بها للمستخدم، ويتيح RhProxy الوصول إليها عبر واجهات برمجة تطبيقات Windows.Devices.*. هذا هو النهج المتبع في لوحات مثل رازبيري باي 2/3 في هذا النظام البيئي.
نقطة البداية هي إنشاء عقدة ACPI كـ الجهاز (RHPX) مع _HID/_CID «MSFT8000» وعلى _معرف المستخدموضمن تحديد الموارد من النوع ناقل تسلسلي SPIS, ناقل تسلسلي I2CS, ناقل تسلسلي UART و GPIO مسموح للمستخدم. في _DSD الخصائص مرتبطة بمثل حافلة-SPI-SPI0, SPI0-دقيقة ساعة بالهرتز, SPI0-أقصى سرعة للساعة بالهرتز, أطوال بتات البيانات المدعومة من SPI0 o حافلة-I2C-I2C1حتى تتمكن واجهة برمجة التطبيقات من إرجاع "وحدة تحكم افتراضية" لكل ناقل.
بالنسبة لـ I2C، سيكون أحد الأمثلة على الوصف شيئًا مثل I2CSerialBus(... «\_SB.I2C1» ...)بينما بالنسبة لـ UART لديك ناقل تسلسلي UART مع حقول معدل البود الأولي, التكافؤ, المخازن المؤقتة و مصدر الموارد من وحدة التحكم. في SPI، كل CE (اختيار الشريحة) يتم إعلانه كمورد منفصل ثم يتم تجميعه حسب الناقل في DSD مع مؤشرات الموارد.
إن المفهوم القوي في هذه البيئة هو تعدد إرسال الدبابيس وقت التشغيلمن خلال موارد ACPI الخاصة تكوين وظيفة Msft، الأطر جبيوكلكس, SpbCx y سيرككس إنهم يوجهون وحدة التحكم GPIO لتبديل وظيفة الدبابيس عندما يقوم العميل بإلغاء قفل الجهاز (على سبيل المثال، من هوية غير متزامنة () (في UWP). إذا كانت الدبابيس قيد الاستخدام بالفعل بواسطة وظيفة أخرى، فشل الافتتاح؛ عند إغلاق الوصف، فإنه يعود الإرسال المتعدد.
من وجهة نظر مطور المنصة، التحقق من الصحة إنه يتضمن التحقق مع المساعدة DevCon أن برامج التشغيل SpbCx/GpioClx/SerCx يتم تحميلها، rhproxy موجود في النظام (مفتاح تسجيل الخدمة)، قم بتجميع لغة الإشارة الأمريكية إلى ملف ACPITABL.dat مع asl.exe (وضع /MsftInternal لـ MsftFunctionConfig) وتفعيل الاختباراتيمكنك بعد ذلك إدراج أجهزة المستخدم باستخدام أدوات مثل I2cTestTool.exe -قائمة, SpiTestTool.exe -list, GpioTestTool.exe -list o MinComm.exe -قائمةوتدرب عليها من خلال تمارين قراءة/كتابة نموذجية. للحصول على الشهادة، أجرِ اختبارات HLK (I2C WinRT، GPIO WinRT، SPI WinRT).
خلط I2C وUART بدون أخطاء: تشخيصات الإدخال/الإخراج عن بعد ومفاجآت أخرى
حالة نموذجية: تقوم بتشغيل برنامج يتحدث من خلال I2C مع مستشعر IMU (ITG/MPU) وآخر يستخدم UART مع وحدة تحكم (على سبيل المثال، SSC-32)، وفجأة تنفجر عملية I2C مع خطأ الإدخال/الإخراج عن بعديشير هذا الخطأ إلى أن المعلم لا يتلقى ACK في الحافلة: الجهاز لا يستجيب أو الخطوط ليست في الحالة الصحيحة.
للخروج من الازدحام المروري، تحقق مما يلي: 1) تم إلغاء تنشيط وحدة التحكم التسلسلية إذا كنت تستخدم دبابيس GPIO 14/15 لجهاز UART الخاص بك؛ 2) في Pi 3/المشتقات، ضع في اعتبارك تعطيل البلوتوث إذا كنت تريد أن يكون PL011 UART مستقرًا، أو ثابتًا على الأقل. التردد الأساسي = 250 إذا قمت بسحب mini-UART؛ 3) تحقق GND مشترك بين جميع المعدات (Pi، IMU، وحدة التحكم)، و الأكل النظيف (وحدات القياس بالقصور الذاتي حساسة لانخفاض الطاقة).
4) تحقق من عنونة I2C: مسح مع i2cdetect -y 1 وتأكد من ظهور العنوان (مثلاً، 0x68/0x69 على العديد من وحدات قياس القصور الذاتي). إذا لم يظهر، فقد تحتاج إلى استخدام الحافلة الخاطئة، هناك كابل معيب، أو شكا من سحب5) تحقق من سرعة الحافلة (إذا كنت تستخدم 400 كيلو هرتز وكان الإعداد على لوحة توصيل ذات أسلاك طويلة، فقم بخفض التردد إلى 100 كيلو هرتز وقم بالاختبار.) 6) تجنب تصادمات الوصول: على الرغم من أن Linux يسمح بعمليات متعددة على /dev/i2c-1إذا تم الوصول إلى خيطين بالتوازي دون تنسيق، فقد يتسبب ذلك في حدوث ظروف غريبة؛ استخدم أقفال أو تسلسل العمليات.
7) إذا ظهر الخطأ بمجرد تحميل برنامج UART أو زيادة تحميل وحدة المعالجة المركزية، فمن المحتمل أن يكون السبب هو mini-UART خارج المزامنة بسبب مقياس التردد (أعراض في Pi 3). تم الإصلاح التردد الأساسي = 250 en /boot/config.txt أو يطلق سراحه PL011 لـ UART الخاص بك 8) تأكد من ذلك لا تشارك الدبابيس من بين أمور أخرى: في نظام التشغيل Windows/IoT، قد تفشل عملية الفتح بسبب الإرسال المتعدد؛ في نظام التشغيل Raspberry OS، قد تعمل طبقة أو خدمة على إبقاء دبابيس GPIO معينة مشغولة. 9) أخيرًا، تحقق من صحة الكابلات المادية:SDA مع SDA، SCL مع SCL، بدون عبور، وTX–RX متقاطعان على التوالي.
اختبارات سريعة وأدوات مساعدة تنقذ اليوم
بالنسبة لـ I2C، فإن الرمح الأساسي هو: i2cdetect -y 1 لعرض الأجهزة، i2cget/i2cset لقراءات وكتابات السجل البسيطة، ونص برمجي لـ smbus2 للتحقق من صحة التدفق الفعلي. إذا i2cdetect إنه لا يرى IMU، فلا تضيع وقتك مع الكود: هناك مشكلة مادية أو تراكبية..
بالنسبة لـ UART، استخدم miniterm.py o شاشة كطرفية تسلسلية، وتأكد من إمكانية الإرسال والاستقبال بالسرعة المحددة دون أي أحرف غريبة. في بايثون، جرسي مع مهلة زمنية وتوقف مؤقت قصير في البداية عادةً ما يتجنب القراءات الفارغة. وإذا كنت تعمل بنظام Windows IoT، المساعدة DevCon, ملف ACPITABL.dat مع asl.exe وأدوات المثال أداة اختبار I2c/أداة اختبار Spi/أداة اختبار Gpio/MinComm إنهم يمنحونك رؤية كاملة.
لديك الآن الخريطة الكاملة للعمل مع I2C و UART. على نظام التشغيل Raspberry OS (وأيضًا على نظام التشغيل Windows/IoT إذا كان ذلك ممكنًا): بدءًا من ماهيتها وكيفية تنشيطها، إلى استخدامها في Python، ومعالجة وحدة التحكم، وميزات UART على Pi 3 وإرسال الدبابيس المتعددة، إلى دقة إرنو 121 عندما تجمع بين الحافلتين، مع تكوينهما بشكل صحيح وتوصيلات كهربائية نظيفة، فإنهما تصبحان أدوات قوية لأي مشروع استشعار أو روبوتات أو تحكم.