جدول المحتويات:

IO Expander لـ ESP32 و ESP8266 و Arduino: 24 خطوة
IO Expander لـ ESP32 و ESP8266 و Arduino: 24 خطوة

فيديو: IO Expander لـ ESP32 و ESP8266 و Arduino: 24 خطوة

فيديو: IO Expander لـ ESP32 و ESP8266 و Arduino: 24 خطوة
فيديو: Build The Most EQUIPPED Security Camera with ESP32-CAM 2024, شهر نوفمبر
Anonim
Image
Image
مقدمة
مقدمة

هل ترغب في توسيع 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 على 128 GPIOs!
يمكن أن يحتوي ESP01 على 128 GPIOs!

مثال يوضح حجم هذا الموسع هو استخدامه مع ESP01 ، والذي يمكن توصيله بما يصل إلى ثمانية موسعات مع اثنين فقط من IOS ، بحيث يصل إلى 128 GPIOs.

الخطوة 4: MCP23016

MCP23016
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

ESP01
ESP01

هنا ، أقوم بعرض Pinout لـ ESP01.

الخطوة 12: تركيب ESP01

تصاعد ESP01
تصاعد ESP01

في هذا المثال ، لدينا GPIO0 متصل في SDA ، و GPIO2 متصل في SCL. لدينا أيضًا لوحة ترحيل ، وجرس ، ومصباح LED. على المنفذ الآخر ، في GP1.0 ، لدينا مؤشر LED آخر بمقاوم.

الخطوة 13: NodeMCU ESP-12E

NodeMCU ESP-12E
NodeMCU ESP-12E

هنا ، لدينا Pinout الخاص بـ NodeMCU ESP-12E.

الخطوة 14: تركيب NodeMCU ESP-12E

تركيب NodeMCU ESP-12E
تركيب NodeMCU ESP-12E

في هذه الحالة ، الاختلاف الوحيد عن المثال الأول هو أنك قمت بتوصيل D1 و D2 في SDA و SCL ، على التوالي.

الخطوة 15: WiFi NodeMCU-32S ESP-WROOM-32

واي فاي NodeMCU-32S ESP-WROOM-32
واي فاي NodeMCU-32S ESP-WROOM-32

إليك Pinout الخاص بـ WiFi NodeMCU-32S ESP-WROOM-32.

الخطوة 16: تركيب WiFi NodeMCU-32S ESP-WROOM-32

عقدة تثبيت WiFi MCU-32S ESP-WROOM-32
عقدة تثبيت WiFi MCU-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)

موصى به: