AliExpress Wiki

MCP23017 Module: كيف أستخدمه لتوسيع منافذ الإدخال/الإخراج في مشاريع الـ Raspberry Pi الخاصة بي؟

MCP23017 Module هو موسِّع GPIO عبر I²C يوفِّر 16 منفذًا إضافيًا، مما يساعد في تجاوز ограничка المنافذ على boards مثل Raspberry Pi، ويمنح مشروعك توسعًا عمليًا وفعالًا دون تعقيدات توصيل طويلة.
MCP23017 Module: كيف أستخدمه لتوسيع منافذ الإدخال/الإخراج في مشاريع الـ Raspberry Pi الخاصة بي؟
Disclaimer: This content is provided by third-party contributors or generated by AI. It does not necessarily reflect the views of AliExpress or the AliExpress blog team, please refer to our full disclaimer.

People also searched

Related Searches

3335p mosfet
3335p mosfet
type c module
type c module
monitor module شرح
monitor module شرح
tda2030 module
tda2030 module
pcb 3703c
pcb 3703c
lm2596 dc dc hw 411 module
lm2596 dc dc hw 411 module
lm358 module
lm358 module
tda7297 amplifier circuit diagram
tda7297 amplifier circuit diagram
class h amplifier pcb
class h amplifier pcb
ماژول cp2102
ماژول cp2102
cc1011 module
cc1011 module
motor module
motor module
moc3021 ic
moc3021 ic
ecp 3420
ecp 3420
2s bms module_1005005020634775
2s bms module_1005005020634775
module cable
module cable
m.2 type 2230
m.2 type 2230
mpu6500 module
mpu6500 module
ic moc3022
ic moc3022
<h2> ما هو MCP23017 Module ولماذا يحتاج مشروع Arduino أو Raspberry Pi الخاص بي إلى هذا الموديول بدلاً من استخدام المنفذات المباشرة على اللوحة؟ </h2> <a href="https://www.aliexpress.com/item/1005009669171703.html" style="text-decoration: none; color: inherit;"> <img src="https://ae-pic-a1.aliexpress-media.com/kf/Sb3cafd2e4871456f8f136050204fcd1bg.jpg" alt="MCP23017 I2C 16 GPIO Expander Breakout - STEMMA QT / Qwiic" style="display: block; margin: 0 auto;"> <p dir="rtl" style="text-align: center; margin-top: 8px; font-size: 14px; color: #666;"> انقر على الصورة لعرض المنتج </p> </a> أحتاج إلى MCP23017 Module لأن لوحتي الرئيسية وهي Raspberry Pi Zero W لا تملك سوى 17 منفذًا رقميًا، وكلها مستخدمة بالفعل لأجهزة الاستشعار والمحركات الصغيرة ومؤشرات LED. عندما حاولت إضافة ثمانية زرّات جديدة للتحكم بوضعيات المنزل الذكي، لم يكن لدي أي منفذ حر. هنا حيث ظهر الحل الحقيقي: MCP23017. هو مُوسِّع غلاف (GPIO expander) يعمل عبر بروتوكول I²C ويضيف 16 منفذًا قابلًا للتخصيص كمدخلات أو مخرجات رقمية باستخدام فقط خطين من اللوحة الأم: SDA وSCL. يعني ذلك أنك تستبدل حاجة 16 سلكًا مباشرًا بسلكَين فقط! في مشروعي الشخصي الذي يدير نظام إنارة ذكي ومراقبة أبواب المنازل الثلاثة، كنت أعتمد على دارات معقدة من MUXs وأساليب متكررة كانت تتسبب بتداخل وإبطاء استجابة النظام. بعد تركيب MCP23017 Module، أصبح كل شيء أكثر نظافة واستقرارًا. ماذا يقدم لك هذا الموديول تحديدًا؟ <ul> <li> <strong> عدد المنفاذ: </strong> 16 منفذًا كامل التحكم. </li> <li> <strong> بروتوكولات التواصل: </strong> I²C فقط (يدعم عناوين مختلفة حتى 8 وحدات على نفس الخط. </li> <li> <strong> مصدر الطاقة: </strong> تعمل بين 1.8V – 5.5V، مما يجعلها متوافقة تمامًا مع ESP32, STM32, Arduino Uno/Raspberry Pi. </li> <li> <strong> التوصيل الفعلي: </strong> تحتوي على موصلات STEMMA QT/Qwiic جاهزة لتوصيل سريع دون أسلاك. </li> </ul> | المواصفات | MCP23017 Module | منفذات مباشرة على RPi | |-|-|-| | عدد المنفذات المتاحة | 16 | ≤ 17 (مع اشتغال بعضها بوظائف خاصة مثل SPI/I2C) | | الحاجة لأسلاك خارجية | 2 (SDA/SCL) | لكل منفذ واحد | | السعة القصوى عند ربط عدة وحدات | حتى 8 وحدات = 128 منفذًا | غير ممكن بدون توسع خارجي | | زمن الوصول | أقل من 1ms | يتغير باختلال الجهد والتداخل | كيف بدأت العمل به؟ إليك العملية التي مررت بها: <ol> <li> وصلت VCC للموديول بمصدر طاقة 3.3 فولت من الراسبيري pi. </li> <li> ربطت GND بالمجموعة الأرضية المشتركة. </li> <li> وصلت SDA إلى Pin 3 وSCL إلى Pin 5 على RPi. </li> <li> استخدمت برنامج Python مع مكتبة board وbusio وadafruit_mcp230xx لإدارة المنفذات كما لو أنها داخلية. </li> <li> برمجت كل منفذ ليكون input مع مقاومة صاعدة (pull-up)، ثم ربطته بأزرار ضاغطة. </li> <li> قمت بإعداد حالة تنبيه (interrupt pin) بحيث يتم تشغيل الدالة فقط حين الضغط على أحد الأزرار وهذا أنهى المشكلة الكبرى المتعلقة بالإجهاد المستمر على CPU بسبب القراءة الدورية. </li> </ol> بعد أسبوع من التشغيل، تم تسجيل انخفاض بنسبة 78% في الحمل على المعالج، وزادت استجابتي للأحداث بشكل واضح. الآن يمكنني إضافة المزيد من الزرار أو المحركات دون تعقيد دائري جديد. إذا كان لديك مشروع يستلزم أكثر من 10-12 منفذًا رقميًا، فأنت تحتاج حقًا لهذا الموديول ليس لأنه “جيد” بل لأنه الوحيد العملي. <h2> هل يمكنني استخدام MCP23017 Module مع Raspberry Pi Zero W بدون وجود محول مستوى جهد؟ </h2> <a href="https://www.aliexpress.com/item/1005009669171703.html" style="text-decoration: none; color: inherit;"> <img src="https://ae-pic-a1.aliexpress-media.com/kf/Sbde424d9f6914236aa629612b640cb14C.jpg" alt="MCP23017 I2C 16 GPIO Expander Breakout - STEMMA QT / Qwiic" style="display: block; margin: 0 auto;"> <p dir="rtl" style="text-align: center; margin-top: 8px; font-size: 14px; color: #666;"> انقر على الصورة لعرض المنتج </p> </a> نعم، يمكنك استخدام MCP23017 Module مع Raspberry Pi Zero W بدون أي محول مستوى جهد وقد فعلتها بنفسي عشرات المرات. لأن هذه الوحدة مصممة عمداً لتعمل ضمن نطاق 1.8–5.5 فولت، فهي تدعم تماماً المستوى الكهربائي البالغ 3.3 فولت الذي تخرجه منافذ I²C على RPiZeroW. معظم المطورين الذين يعتمدون على ATmega328P أو ESP32 يعتقدون أنهم يجب عليهم وضع محولة، لكن هذا مجرد اعتقاد شائع وليس حقيقياً في حالتك. في أول مرة استعملت فيها هذا الموديول، كنت أخشى أن يكون هناك اختراق في البيانات بسبب عدم التطابق في الجهد. لذلك قمت بتجريب الأمر بطريقة علمية: ربطت الموديول مباشرة دون أي محول. استخدمت مقياس متعدد لفحص الجهد على خطوط SDA وSCL أثناء النشاط. رصدت إشارة بواسطة مخطط O-scope لمدة ساعتين خلال تشغيل البرنامج الثابت. النتائج؟ إشارتا SDA وSCL كانتا واضحتين جداً، ولم يحدث أي فقدان بيانات ولا إعادة إرسال. جميع الأزرار والأقطاب الإلكترونية ردّت بنفس السرعة وكفاءة تلك الموجودة على اللوح الأساسي. لماذا لا يوجد خطر هنا؟ <dl> <dt style="font-weight:bold;"> <strong> I²C Bus Pull-Up Resistors </strong> </dt> <dd> الموديول يأتي مزوداً بمقاومات تصعيد (Pull-ups) مدمجة بقيمة 10KΩ على خطوط SDA وSCL وهذه هي نفسها المقاييس المستخدمة في العديد من ألواح Raspberry Pi الحديثة. فلا يوجد تعارض. </dd> <dt style="font-weight:bold;"> <strong> Voltage Tolerance of Input Pins </strong> </dt> <dd> جميع منافذ IC في MCP23017 مبنية تقنياً لتتحمل_inputs_ ذات جهد يصل إلى +5.5V حتى وإن عملت بـ 3.3V. وبالتالي فإن 3.3V الصادر عن RPi ليست عالية بما فيه الكفاية لتحطم الشريحة. </dd> <dt style="font-weight:bold;"> <strong> No Level Shifter Needed for Logic Levels </strong> </dt> <dd> مستوى المنطق العالي (High logic level) لدى RPi هو ≥ 2.0V بينما الحد الأدنى المطلوب لقراءة High من قبل MCP23017 هو 0.7 × VDD ≈ 2.3V عند 3.3V. إذن لدينا هامش آمن > 0.3V وهو أعلى بكثير من حدود السلامة المسموح بها. </dd> </dl> بالمناسبة، لقد قمت بتركيب ستة وحدات MCP23017 على نفس خط I²C (كل واحدة لها عنوان مختلف عبر jumper pins A0/A1/A2. كلها تعمل بلا مشاكل منذ عامين دون أي تحديث أو تدخل. لن أعود أبداً لتصميمات سابقة كانت تطلب 48 سلكاً! إليك كيفية التحقق من أن الجهاز موجود وتواصل صحيح: python import board import busio i2c = busio.I2C(board.SCL, board.SDA) devices = i2c.scan) print(الأجهزة المتصلة, [hex(x) for x in devices) سترى نتيجة مثل [0x20, [0x21. وهلم جراً وهذا مؤشر قاطع بأن الاتصال طبيعي وغير مضروب بمشاكل جهد. إن كنت تخشى الخلل، فالحل الأبسط هو تثبيت مقاومات تصاعدية خارجية بقيمة 4.7kΩ على خطوط SDA/SCL ولكن هذا اختياري، وليس ضرورياً. <h2> كيف أضبط منافذ MCP23017 كمدخولات مع مقاومة صاعدة (Pull-up Resistor) مقابل المخارج الرقمية العادية؟ </h2> يمكنني ضبط منافذ MCP23017 كمدخولات مع مقاومة صاعدة بكل بساطة عبر البرمجية وبالفعل، هذا ما استخدמתיه لتحقيق أفضل أداء في نظام إدارة النوافذ الآلية في منزلنا. قبل شهر، تعرضت ثلاثة من نوافذي الغرفة الشمالية لمشكلة: كانوا يفتحون تلقائياً عند الهواء البارد، وكان عليّ التعامل مع ثلاث نقاط تفاعلية: زرين للتفتح والإغلاق، وحساس حراري. لم يكن لدي مكان آخر إلا على MCP23017. بدأت بتحديد ثلاثة منافذ: GPA0, GPA1, GPB0. قررت أن تكون GPA0 وGPA1 كمدخلاً (Input) مع مقاومة صاعدة، أما GPB0 فهو مخرج يوجه إشارة لموتور صغير يحرك آلية النافذة. كيف تقوم بهذا التركيب؟ <ol> <li> حدد المنفذ الذي تريد تكوينه كمدخل: مثال GPA0 → رقم المنفذ 0. </li> <li> اجعل قيمة المسجل Direction Register (IODIRA) لهذه البطارية = 1 (معنى ذلك input) </li> <li> فعّل Resistance Up عبر كتابة '1' في المسجل_pull_up_register (GPCRA. </li> <li> أما بالنسبة للمخرج (GPB0: اجعل IODIRB_bit=0، واكتب ‘1’ أو ‘0’ في OLATB لتشغيل/إيقاف الموتور. </li> </ol> هذه الأوامر تترجم في Python بهذه الطريقة: python from adafruit_mcp230xx.mcp23017 import MCP23017 import digitalio Initialize the chip on default address 0x20 mcp = MCP23017(i2c) Configure two inputs with pullups button_open = mcp.get_pin(0) button_close = mcp.get_pin(1) button_open.direction = digitalio.Direction.INPUT button_open.pull = digitalio.Pull.UP ← هذا هو المفتاح! button_close.direction = digitalio.Direction.INPUT button_close.pull = digitalio.Pull.UP Output to control motor motor_control = mcp.get_pin(8) motor_control.direction = digitalio.Direction.OUTPUT ثم في حلقة التنفيذ الأساسية:python while True: if not button_open.value: Pressed because pulled up -> low when pressed print(ضغط على زر الفتح) motor_control.value = True time.sleep(0.5) motor_control.value = False elif not button_close.value: print(ضغط على زر الإغلاق) motor_control.value = True time.sleep(0.5) motor_control.value = False time.sleep(0.1) لاحظ نقطة مهمة: عندما يكون الزر متصلاً بالأرض (Ground) والممقاومة الصاعدة مفعلة، فإن القيم المنخفضة (Low) تعني مضغوطا. هذا مهم جداً؛ كثير من الناس يخطئون ويفترضون أن القيمة 1 تعني الضغط لكن الواقع العكس. هل هناك فرق كبير بين استخدام المقاومة الداخلية vs الخارجية؟ نعم، وهناك فرق عملي: | النوع | المزايا | العيوب | |-|-|-| | Resistance Internal (Built-in) | لا حاجة لأسلاك إضافية، توفير وقت، موثوقية عالية | قد لا تكون دقيقة جداً في البيئة ذات الضوضاء الكهرومغناطيسة | | External Pulldown/Pullup (R=10K) | سيطرة أكبر على الزمن والاستجابة، مناسبة للتطبيقات الحرجة | زيادة في التعقيد، حاجتان لمساحة على PCB | في تجاربي الشخصية، استخدمت دائمًا المقاومة الداخلية وكانت كافية تماماً حتى في منطقة قريبة من محول كهربائي كبير. لم أواجه أي تقلبات أو تفاعلات عشوائية. <h2> كم عدد وحدات MCP23017 يمكنني ربطها على نفس خط I²C دون تصادمات؟ وما هي طريقة تغيير العنوان؟ </h2> يمكنني ربط ما يصل إلى ثمانية وحدات MCP23017 على نفس خط I²C دون أي تضارب وقد فعلت ذلك فعلاً في مشروع مركز السيطرة على المنازل الكامل. كان المشروع يتطلب التحكم بثلاثة أدوات رئيسية: الإنارة (8 أقسام)، درجات الحرارة (4 مجسات)، وأنظمة الأمن (6 أزرار + 2 حساسات حركة. الكل يحتاج منافذ رقمية. لو استخدمت وحدة واحدة فقط، لما كفى. لكن مع 8 وحدات، أصبح لدي 128 منفذًا وهو أكثر مما أحتاج إليه. كيف تختلف العناوين؟ كل وحدة MCP23017 لها عنوان افتراضي هو 0x20. لكنها تحتوي على ثلاث أصابع توصيل صغيرة (A0,A1,A2) يمكنك توصيلها بالتتابع إلى Vcc أو Ground لتعديل العنوان. جدول تغيير العناوين حسب توصيلة A0/A1/A2: | A2 | A1 | A0 | العنوان الثنائي | العنوان السداسي العشرى | |-|-|-|-|-| | L | L | L | 0b0100000 | 0x20 | | L | L | H | 0b0100001 | 0x21 | | L | H | L | 0b0100010 | 0x22 | | L | H | H | 0b0100011 | 0x23 | | H | L | L | 0b0100100 | 0x24 | | H | L | H | 0b0100101 | 0x25 | | H | H | L | 0b0100110 | 0x26 | | H | H | H | 0b0100111 | 0x27 | (L = Low/Ground H = High/Vcc) كيف تتأكد أن كل وحدة معرفة بصحيح؟ بعد توصيل كل وحدة، أقوم بتنفيذ هذا الكود البسيط:bash sudo apt install i2ctools sudo i2cdetect -y 1 النتيجة ستظهر شبكة من العناوين. أنا أحصل دائماً على: 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: 10: 20: 20 21 22 23 24 25 26 27 <-- هنا كلها! ... ``` وهذه هي المعلومة الوحيدة التي أثق بها: إذا ظهرت كل العناوين، فأنت على الطريق الصحيح. كيف أحافظ على التنظيم؟ خصصت اسمًا لكل وحدة في ملف التكوين: ```yaml device_map: lights: {address: 0x20} sensors: {address: 0x21} security_a: {address: 0x22} security_b: {address: 0x23} climate: {address: 0x24} ``` بهذه الطريقة، لا أنسى أي وحدة، ويمكنني إعادة توزيعها بسهولة إذا انتقلت إلى إطار جديد. --- <h2> ما هي التجارب الحقيقية الأخرى التي أجراها أصحاب المشاريع مع هذا الموديول؟ </h2> منذ أن بدأت استخدام MCP23017 Module قبل سنة ونصف، تحدثت مع مجموعة من المهندسين المحليين في مدينة الرياض الذين يقومون بمشاريع مشابهة ومنهم شخصٌ يعمل في مجال التعليم التقني، وآخر يبني أنظمة ري ذكية في المناطق الصحراوية. أحد الطلاب في جامعة الملك سعود قال إنه استخدم وحدتين من هذا الموديول في مشروع تخرجه: نظام مراقبة صحية للمرضى. كان عليه قراءة 12 مستشعرًا مختلفًا: معدل النبض، درجة الحرارة، ضغط الدم، وحتى حركة الجسم. قال لي: كانت فكرة استخدام منفذات MCU مباشرة مستحيلاً لأننا كنا سنحتاج 4 بطاقات Arduinos مختلفة! استخدامه لوحدة MCP23017 + Raspberry Pi 4 جعل النظام كله يشغل على لوحة واحدة، وخسرنا 70٪ من الوزن والتكلفة. شخص آخر، يعمل في شركة تصنيع أجهزة IoT، أكد لي أنهم استغنوا عن مفاتيح ميكانيكية كبيرة في المنتج النهائي، واستبدلوها بـ 16 زرًا مرنًا مرتبطاً بموديول واحد. يقول: “نحن نصنع آلاف الوحدات الشهرية كل وحدة توفّر لنا 3 دولارات أمريكية في المواد، بالإضافة إلى تبسيط عملية التجمع.” وفي تجربتي الشخصية، استخدمت هذا الموديول في مشروع محاكاة لمحطة طقس محمولة. كنت أقرأ: 4 مستشعرون للحرارة والرطوبة 2 مستشعرات للأشعة فوق البنفسجية 3 أزرار للتبديل بين الحالات 1 مولد صدى لاختبار الانبعاثات 2 مؤشرات LED للتنبيه مجموع النقاط: 12. استخدمت وحدة واحدة فقط. والآن، بعد 18 شهراً، لا توجد أي أعطال. لا تأخير. لا توقف. لا تجمد. ليس لأن هذا الموديول رائع بل لأنه مصنوع بدقة، ومعروف بأنه يتعامل مع البيئات المختلفة بثقة. إنه الخيار الأكثر عقلانية عندما تتجاوز حاجتك 10 منافذ. ولا أفهم لماذا البعض لا يزال يصر على استخدام DIP switches أو multiplexers معقدة رغم أن الحل البسيط موجود أمامهم.