جدول المحتويات:
- الخطوة 1: مقدمة
- الخطوة 2: الخصائص
- الخطوة 3: يمكن أن يحتوي ESP01 على 128 GPIOs
- الخطوة 4: MCP23016
- الخطوة 5: الساعة
- الخطوة 6: العنوان
- الخطوة 7: الأوامر
- الخطوة 8: الفئات:
- الخطوة 9: هيكل الاتصال
- الخطوة 10: البرنامج
- الخطوة 11: ESP01
- الخطوة 12: تركيب ESP01
- الخطوة 13: NodeMCU ESP-12E
- الخطوة 14: تركيب NodeMCU ESP-12E
- الخطوة 15: WiFi NodeMCU-32S ESP-WROOM-32
- الخطوة 16: تركيب WiFi NodeMCU-32S ESP-WROOM-32
- الخطوة 17: المكتبات والمتغيرات
- الخطوة 18: الإعداد
- الخطوة 19: ConfigurePort
- الخطوة 20: WriteBlockData & CheckButton
- الخطوة 21: ReadPin & ValueFromPin
- الخطوة 22: برنامج ESP8266
- الخطوة 23: هام
- الخطوة 24: الملفات
فيديو: IO Expander لـ ESP32 و ESP8266 و Arduino: 24 خطوة
2024 مؤلف: John Day | [email protected]. آخر تعديل: 2024-01-30 07:40
هل ترغب في توسيع IOs الخاصة بـ ESP32 أو ESP8266 أو Arduino؟ وهل فكرت في إمكانية وجود 16 GPIOs جديدة يمكن التحكم فيها باستخدام ناقل I2C؟ حسنًا ، سأقدم لكم اليوم موسع GPIO MCP23016. سأوضح لك أيضًا كيفية توصيل وحدة تحكم دقيقة بـ MCP23016. سأتحدث أيضًا عن إنشاء برنامج حيث سنستخدم دبابيس فقط من هذا المتحكم الدقيق للتواصل مع الموسع. سنستخدمها للتحكم في المصابيح والزر.
الخطوة 1: مقدمة
يوفر الجهاز MCP23016 16 بت لتوسيع GPIO باستخدام ناقل I2C. يمكن تكوين كل بت على حدة (الإدخال أو الإخراج).
يتكون MCP23016 من إعدادات 8 بت متعددة للإدخال والإخراج واختيار القطبية.
توفر الموسعات حلاً بسيطًا عند الحاجة إلى IOs للمفاتيح وأجهزة الاستشعار والأزرار ومصابيح LED ، من بين أمثلة أخرى.
الخطوة 2: الخصائص
16 دبابيس إدخال / إخراج (16 إدخال قياسي)
تردد ساعة ناقل I2C السريع (0-400 كيلوبت / ثانية)
تسمح ثلاثة دبابيس عناوين للأجهزة باستخدام ما يصل إلى ثمانية أجهزة
مقاطعة مسجل التقاط المنفذ
سجل عكس القطبية لتحديد قطبية بيانات منفذ الإدخال
متوافق مع معظم الميكروكونترولر
الخطوة 3: يمكن أن يحتوي ESP01 على 128 GPIOs
مثال يوضح حجم هذا الموسع هو استخدامه مع ESP01 ، والذي يمكن توصيله بما يصل إلى ثمانية موسعات مع اثنين فقط من IOS ، بحيث يصل إلى 128 GPIOs.
الخطوة 4: MCP23016
هنا ، لدينا مخطط الموسع ، الذي يحتوي على مجموعتين من ثماني بتات. هذا يجعل ما مجموعه 16 منفذًا. بالإضافة إلى دبوس المقاطعة ، فإنه يحتوي على دبوس CLK ، الذي يربط المكثف والمقاوم ، وهما متصلان داخليًا في منفذ منطقي. هذا لتشكيل الساعة ، باستخدام فكرة المذبذب البلوري ، الذي يحتاج إلى ساعة 1 ميجا هرتز. يتم استخدام دبوس TP لقياس الساعة. الدبابيس A0 و A1 و A2 هي عناوين ثنائية.
الخطوة 5: الساعة
لذلك يستخدم MCP23016 دائرة RC خارجية لتحديد سرعة الساعة الداخلية. مطلوب ساعة داخلية من 1 ميغا هرتز (عادة) حتى يعمل الجهاز بشكل صحيح. يمكن قياس الساعة الداخلية على طرف TP. القيم الموصى بها لـ REXT و CEXT موضحة أدناه.
الخطوة 6: العنوان
لتحديد عنوان MCP23016 ، نستخدم الدبابيس A0 و A1 و A2. فقط اتركهم في HIGH أو LOW لتغيير العنوان.
سيتم تشكيل العنوان على النحو التالي:
MCP_Address = 20 + (A0 A1 A2)
حيث يمكن أن تأخذ A0 A1 A2 قيم HIGH / LOW ، فإن هذا يشكل رقمًا ثنائيًا من 0 إلى 7.
على سبيل المثال:
A0> GND ، A1> GND ، A2> GND (تعني 000 ، ثم 20 + 0 = 20)
او اخرى،
A0> HIGH ، A1> GND ، A2> HIGH (بمعنى 101 ، ثم 20 + 5 = 25)
الخطوة 7: الأوامر
يوجد أدناه جدول بأوامر الاتصال. لنستخدم GP0 و GP1 ، وكذلك IODIR0 و IODIR1.
الخطوة 8: الفئات:
GP0 / GP1 - سجلات منفذ البيانات
هناك نوعان من السجلات التي توفر الوصول إلى منفذي GPIO.
توفر قراءة السجل حالة المسامير الموجودة على هذا المنفذ.
البتة = 1> بت عالية = 0> منخفضة
OLAT0 / OLAT1 - إخراج سجلات LACTCH
هناك نوعان من السجلات التي توفر الوصول إلى منافذ الإخراج من المنفذين.
IPOL0 / IPOL1 - تسجيلات قطبية الإدخال
تسمح هذه السجلات للمستخدم بتكوين قطبية بيانات منفذ الإدخال (GP0 و GP1).
IODIR0 / IODIR1
هناك نوعان من السجلات التي تتحكم في وضع الدبوس. (إدخال أو إخراج)
بت = 1> بت الإدخال = 0> الإخراج
INTCAP0 / INTCAP1 - تسجيلات التقاط المقاطعة
هذه هي السجلات التي تحتوي على قيمة المنفذ الذي أنشأ المقاطعة.
IOCON0 / IOCON1 - I / O Expander Control Register
هذا يتحكم في وظائف MCP23016.
يتحكم إعداد البت 0 (IARES> Interrupt Activity Resolution) في تردد أخذ العينات لدبابيس منفذ GP.
Bit0 = 0> (افتراضي) أقصى وقت لاكتشاف نشاط المنفذ هو 32 مللي ثانية (استهلاك منخفض للطاقة)
Bit0 = 1> الحد الأقصى لوقت اكتشاف النشاط على المنفذ هو 200 ثانية (استهلاك طاقة أعلى)
الخطوة 9: هيكل الاتصال
أعرض هنا فئة Wire ، وهي عبارة عن اتصال I2C في Arduino الأساسي لدينا ، والذي يسمح أيضًا للموسع بالعمل مع Arduino Uno و Mega. ومع ذلك ، فإن هذا الأخير لديه بالفعل العديد من IOs. نتعامل هنا مع عناوين الشريحة ، والتحكم في الوصول ، وهي أكواد السجلات ، وكذلك البيانات.
الخطوة 10: البرنامج
يتكون برنامجنا من توصيل ESP32 مع MCP23016 للحصول على المزيد من GPIOs لاستخدامها. سيكون لدينا بعد ذلك زر وبعض مصابيح LED متصلة بـ MCP23016. سنتحكم في كل منهم باستخدام ناقل I2C فقط. وبالتالي ، سيتم استخدام دبابيس ESP32 فقط. يمكنك أن ترى دائرة الصورة أدناه في الفيديو.
الخطوة 11: ESP01
هنا ، أقوم بعرض Pinout لـ ESP01.
الخطوة 12: تركيب ESP01
في هذا المثال ، لدينا GPIO0 متصل في SDA ، و GPIO2 متصل في SCL. لدينا أيضًا لوحة ترحيل ، وجرس ، ومصباح LED. على المنفذ الآخر ، في GP1.0 ، لدينا مؤشر LED آخر بمقاوم.
الخطوة 13: NodeMCU ESP-12E
هنا ، لدينا Pinout الخاص بـ NodeMCU ESP-12E.
الخطوة 14: تركيب NodeMCU ESP-12E
في هذه الحالة ، الاختلاف الوحيد عن المثال الأول هو أنك قمت بتوصيل D1 و D2 في SDA و SCL ، على التوالي.
الخطوة 15: WiFi NodeMCU-32S ESP-WROOM-32
إليك Pinout الخاص بـ WiFi NodeMCU-32S ESP-WROOM-32.
الخطوة 16: تركيب WiFi NodeMCU-32S ESP-WROOM-32
هذه المرة ، الاختلاف الرئيسي عن المثالين الآخرين هو الزر ومصابيح LED الوامضة الثلاثة. هنا ، يتم توصيل SDA بـ GPIO19 ، بينما يتم توصيل SCL بـ GPIO23.
الخطوة 17: المكتبات والمتغيرات
أولاً ، سنقوم بتضمين Wire.h ، المسؤول عن اتصالات i2c ، بالإضافة إلى تعيين عنوان i2c لـ MCP23016. أعرض عدة أوامر ، حتى بعض الأوامر التي لا نستخدمها في هذا المشروع.
# تضمين // حدد استخدام مكتبة Wire.h. // endereço I2C do MCP23016 #define MCPAddress 0x20 // COMMAND BYTE TO REGISTER RELATIONSHIP: الجدول: 1-3 من Microchip MCP23016 - DS20090A // ENDEREÇOS DE REGISTRADORES #define GP0 0x00 // DATA PORT REGISTER 0 #define GP1 // DATA PORT REGISTER 0 #define GP1 // PORT REGISTER 1 #define OLAT0 0x02 // OUTPUT LATCH REGISTER 0 #define OLAT1 0x03 // IUTPUT LATCH REGISTER 1 #define IPOL0 0x04 // INPUT POLARITY REGISTER 0 #define IPOL1IS05 // INPUT POLARITY # PORT / I / O DIRECTION REGISTER 0 #define IODIR1 0x07 // I / O DIRECTION REGISTER 1 #define INTCAP0 0x08 // INTERRUPT CAPTURE REGISTER 0 #define INTCAP1 0x09 // INTERRUPT CAPTURE REGISTER 1 #define IOCON0 التسجيل 0 #define IOCON1 0x0B // I / O EXPANDER CONTROL REGISTER 1
الخطوة 18: الإعداد
هنا لدينا وظائف لتهيئة أربعة أنواع مختلفة من ميكروكنترولر. نتحقق أيضًا من التردد ، ونقوم بإعداد GPIOs ، وضبط المسامير. في الحلقة ، نتحقق من حالة الزر.
إعداد باطل () {Serial.begin (9600) ؛ تأخير (1000) ؛ Wire.begin (19 ، 23) ؛ // ESP32 // Wire.begin (D2، D1) ؛ // nodemcu ESP8266 // Wire.begin () ؛ // arduino // Wire.begin (0، 2)؛ // ESP-01 Wire.setClock (200000) ؛ // التردد // configura o GPIO0 como OUTPUT (todos os pinos) configurationPort (IODIR0 ، الإخراج) ؛ // configura o GPIO1 como INPUT o GP1.0 e como OUTPUT os outros GP1 configurationPort (IODIR1 ، 0x01) ؛ // seta todos os pinos do GPIO0 como LOW writeBlockData (GP0 ، B00000000) ؛ // seta todos os pinos do GPIO1 como LOW writeBlockData (GP1 ، B00000000) ؛ } حلقة فارغة () {// verifica e o botão GP foi pressionado checkButton (GP1) ؛ } // حلقة النهاية
الخطوة 19: ConfigurePort
في هذه الخطوة ، نقوم بتكوين وضع دبابيس GPIO وتحديد وضع المنافذ.
// configura o GPIO (GP0 ou GP1) // como parametro passamos: // port: GP0 ou GP1 // custom: INPUT para todos as portas do GP trabalharem como entrada // OUTPUT para todos as portas do GP trabalharem como Saida / / custom um valor de 0-255 indicando o modo das portas (1 = INPUT، 0 = OUTPUT) // ex: 0x01 ou B00000001 ou 1: indica que apenas o GPX.0 trabalhará como entrada، o restando como saida void configurePort (uint8_t port ، uint8_t custom) {if (custom == INPUT) {writeBlockData (port، 0xFF)؛ } else if (custom == OUTPUT) {writeBlockData (port، 0x00)؛ } else {writeBlockData (port، custom)؛ }}
الخطوة 20: WriteBlockData & CheckButton
هنا ، نقوم بإرسال البيانات إلى MCP23016 من خلال ناقل i2c ، والتحقق من حالة الزر ، والإشارة إلى الخطوة التالية مع مراعاة حالة الضغط أم لا.
// envia dados para o MCP23016 através do barramento i2c // cmd: COMANDO (registrador) // data: dados (0-255) void writeBlockData (uint8_t cmd، uint8_t data) {Wire.beginTransmission (MCPAddress) ؛ Wire.write (cmd) ؛ Wire.write (البيانات) ؛ Wire.endTransmission () ؛ تأخير (10) ؛ }
// verifica se o botão foi pressionado // parametro GP: GP0 ou GP1 void checkButton (uint8_t GP) {// faz a leitura do pino 0 no GP fornecido uint8_t btn = readPin (0، GP)؛ // se botão pressionado، seta para HIGH as portas GP0 if (btn) {writeBlockData (GP0، B11111111)؛ } // caso contario deixa todas em estado LOW else {writeBlockData (GP0، B00000000)؛ }}
الخطوة 21: ReadPin & ValueFromPin
نتعامل هنا مع قراءة دبوس معين ، وإعادة قيمة البت إلى الموضع المطلوب.
// faz a leitura de um pino específico // pin: pino desejado (0-7) // gp: GP0 ou GP1 // retorno: 0 ou 1 uint8_t readPin (uint8_t pin، uint8_t gp) {uint8_t statusGP = 0؛ Wire.beginTransmission (MCPAddress) ؛ Wire.write (GP) ؛ Wire.endTransmission () ؛ Wire.requestFrom (MCPAddress، 1) ؛ // ler do chip 1 byte statusGP = Wire.read ()؛ إرجاع valueFromPin (دبوس ، statusGP) ؛ } // retorna o valor do bit na posição desejada // pin: posição do bit (0-7) // statusGP: valor lido do GP (0-255) uint8_t valueFromPin (uint8_t pin، uint8_t statusGP) {return (statusGP & (0x0001 << pin)) == 0؟ 0: 1 }
الخطوة 22: برنامج ESP8266
من هنا ، سنرى كيف تم إنشاء البرنامج الذي استخدمناه في ESP-01 وفي العقدة MCU ESP-12E ، مما يسمح لنا بفهم مدى ضآلة الاختلافات بينهما.
سنقوم فقط بتعديل خط مُنشئ الاتصالات i2c ، وهي الطريقة الأولى لكائن Wire.
فقط قم بإلغاء التعليق على السطر وفقًا للوحة التي سنقوم بتجميعها.
// Wire.begin (D2، D1) ؛ // nodemcu ESP8266 // Wire.begin (0، 2) ؛ // ESP-01
اقامة
لاحظ أن المنشئ لا يزال معلقًا. لذلك ، قم بإلغاء التعليق وفقًا للوح الخاص بك (ESP-01 أو nodeMCU ESP12-E).
إعداد باطل () {Serial.begin (9600) ؛ تأخير (1000) ؛ // Wire.begin (D2، D1) ؛ // nodemcu ESP8266 // Wire.begin (0، 2) ؛ // ESP-01 Wire.setClock (200000) ؛ // التردد // configura o GPIO0 como OUTPUT (todos os pinos) configurationPort (IODIR0 ، الإخراج) ؛ // configura o GPIO1 como OUTPUT (todos os pinos) configurationPort (IODIR1 ، الإخراج) ؛ // seta todos os pinos do GPIO0 como LOW writeBlockData (GP0 ، B00000000) ؛ // seta todos os pinos do GPIO1 como LOW writeBlockData (GP1 ، B00000001) ؛ }
حلقة
في الحلقة ، نقوم بتبديل المسامير كل ثانية. وبالتالي ، عند تشغيل pin0 الخاص بـ GP0 ، يتم إيقاف تشغيل دبابيس GP1. عند تشغيل pin0 الخاص بـ GP1 ، يتم إيقاف تشغيل دبابيس GP0.
حلقة باطلة () {// seta o pino 7 do GP0 como HIGH e os demais como LOW writeBlockData (GP0، B10000000) ؛ // seta todos os pinos do GPIO1 como LOW writeBlockData (GP1 ، B00000000) ؛ تأخير (1000) ؛ // seta todos os pinos do GPIO0 como LOW writeBlockData (GP0 ، B00000000) ؛ // seta o pino 0 do GP1 como HIGH e os demais como LOW writeBlockData (GP1، B00000001) ؛ تأخير (1000) ؛ } // حلقة النهاية
الخطوة 23: هام
المتغيرات والمكتبة المستخدمة هي نفسها المتغيرات والمكتبة المستخدمة في البرنامج الذي استخدمناه لـ ESP32 ، بالإضافة إلى طرق تكوين المنفذ و writeBlockData.
الخطوة 24: الملفات
قم بتنزيل الملفات:
بي دي إف
INO (ESP8266)
INO (ESP32)
موصى به:
LoRa 3Km to 8Km Wireless Communication مع جهاز E32 منخفض التكلفة (sx1278 / sx1276) لجهاز Arduino أو Esp8266 أو Esp32: 15 خطوة
LoRa 3Km to 8Km Wireless Communication With Low Cost E32 (sx1278 / sx1276) جهاز لـ Arduino أو Esp8266 أو Esp32: لقد قمت بإنشاء مكتبة لإدارة EBYTE E32 استنادًا إلى سلسلة Semtech لجهاز LoRa ، جهاز قوي جدًا وبسيط ورخيص. نسخة 3Km هنا ، نسخة 8Km هنا يمكن أن تعمل على مسافة 3000m إلى 8000m ، ولديهم الكثير من الميزات
Raspberry Pi - PCA9536 Input / output Expander Python تعليمي: 4 خطوات
Raspberry Pi - PCA9536 Input / output Expander Python Tutorial: PCA9536 عبارة عن جهاز CMOS مكون من 8 أسنان يوفر 4 بتات من توسع الإدخال / الإخراج للأغراض العامة (GPIO) لتطبيقات I2C-bus / SMBus. يتكون من سجل تكوين 4 بت لخدمة الغرض من تحديد الإدخال أو الإخراج ، 4 بت
اختيار محرك خطوة ومحرك لمشروع شاشة الظل الآلي في Arduino: 12 خطوة (بالصور)
اختيار Step Motor و Driver لمشروع شاشة الظل الآلي من Arduino: في هذا Instructable ، سأنتقل إلى الخطوات التي اتخذتها لتحديد Step Motor و Driver لمشروع نموذج شاشة الظل الآلي. شاشات الظل هي طرازات Coolaroo ذات الكرنك اليدوية الشائعة وغير المكلفة ، وأردت استبدال
NODEMCU LUA ESP8266 مع MCP23008 8 Bit Port Expander IC: 6 خطوات
NODEMCU LUA ESP8266 مع MCP23008 8 Bit Port Expander IC: MCP23008 عبارة عن موسع إدخال / إخراج 8 بت مع واجهة تسلسلية ويعمل بين 1.8 و 5.5 فولت ، لذا فهو مثالي لـ ESP8266 و Arduino و Raspberry Pi و PIC Chips والمزيد. إذا رأيت Instructable الآخر الخاص بي على MCP23017 ، فقد تتساءل
NODEMCU LUA ESP8266 مع MCP23017 16 Bit Port Expander IC: 6 خطوات (بالصور)
NODEMCU LUA ESP8266 مع MCP23017 16 Bit Port Expander IC: MCP23017 هو IC سهل نسبيًا لصنع لوحة لأنه يحتوي على المنفذين A و B على جانبي الشريحة والدبابيس بترتيب تسلسلي. وبالمثل ، فإن ناقل عنوان I2C هو جميعًا معًا أيضًا. هناك 2 دبابيس على هذا IC غير مستخدمين لأنه