فهرست مطالب:

IO Expander برای ESP32 ، ESP8266 و Arduino: 24 مرحله
IO Expander برای ESP32 ، ESP8266 و Arduino: 24 مرحله

تصویری: IO Expander برای ESP32 ، ESP8266 و Arduino: 24 مرحله

تصویری: IO Expander برای ESP32 ، ESP8266 و Arduino: 24 مرحله
تصویری: LDmicro 14: I2C LCD & DS3231 Real-Time Clock (Microcontroller PLC Ladder Programming with LDmicro) 2024, نوامبر
Anonim
Image
Image
معرفی
معرفی

آیا می خواهید IO های ESP32 ، ESP8266 یا Arduino خود را گسترش دهید؟ و آیا به احتمال 16 GPIO جدید که می توان با استفاده از گذرگاه I2C کنترل کرد فکر کرده اید؟ خوب امروز ، من قصد دارم شما را با GPIO Expander MCP23016 آشنا کنم. همچنین ، نحوه ارتباط میکروکنترلر با MCP23016 را به شما نشان خواهم داد. من همچنین در مورد ایجاد برنامه ای صحبت می کنم که در آن فقط از 2 پین این میکروکنترلر برای ارتباط با گسترش دهنده استفاده می کنیم. ما از آنها برای کنترل LED ها و دکمه استفاده می کنیم.

مرحله 1: مقدمه

دستگاه MCP23016 با استفاده از گذرگاه I2C 16 بیت برای توسعه GPIO فراهم می کند. هر بیت را می توان به صورت جداگانه پیکربندی کرد (ورودی یا خروجی).

MCP23016 شامل چندین تنظیم 8 بیتی برای انتخاب ورودی ، خروجی و قطبیت است.

هنگامی که IO ها برای سوئیچ ها ، حسگرها ، دکمه ها و LED ها مورد نیاز است ، گسترش دهندگان راه حل ساده ای ارائه می دهند.

مرحله 2: ویژگی ها

16 پین ورودی / خروجی (16 استاندارد ورودی)

فرکانس ساعت اتوبوس سریع I2C (0-400 کیلوبیت بر ثانیه)

سه پین آدرس سخت افزاری امکان استفاده از حداکثر هشت دستگاه را فراهم می کند

قطع ضبط ضبط پورت

قطب معکوس ثبات برای تنظیم قطبیت داده پورت ورودی

سازگار با اکثر میکروکنترلرها

مرحله 3: ESP01 می تواند 128 GPIO داشته باشد

ESP01 می تواند 128 GPIO داشته باشد!
ESP01 می تواند 128 GPIO داشته باشد!

نمونه ای که نشان دهنده بزرگی این توسعه دهنده است ، استفاده از آن با ESP01 است که تنها با دو IOS می تواند به هشت توسعه دهنده متصل شود و به 128 GPIO برسد.

مرحله 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 - ثبت کننده کنترل گسترش دهنده ورودی / خروجی

این عملکرد MCP23016 را کنترل می کند.

تنظیم بیت 0 (IARES> Interrupt Activity Resolution) فرکانس نمونه برداری از پین های پورت GP را کنترل می کند.

Bit0 = 0> (به طور پیش فرض) حداکثر زمان تشخیص فعالیت پورت 32 میلی ثانیه (مصرف کم مصرف)

Bit0 = 1> حداکثر زمان تشخیص فعالیت روی پورت 200usec (مصرف برق بیشتر)

مرحله نهم: ساختار ارتباطات

ساختار ارتباطات
ساختار ارتباطات

من در اینجا کلاس Wire را نشان می دهم ، که ارتباط I2C در هسته اصلی آردوینو است ، همچنین به گسترش دهنده اجازه می دهد تا با Arduino Uno و Mega کار کند. با این حال ، دومی قبلاً چندین IO دارد. ما در اینجا با آدرس های تراشه ، کنترل دسترسی ، که کدهای ثبت نام هستند ، و همچنین داده ها سروکار داریم.

مرحله 10: برنامه

برنامه
برنامه

برنامه ما شامل ارتباط ESP32 با MCP23016 است تا GPIO های بیشتری برای استفاده داشته باشیم. سپس یک دکمه و تعدادی 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

WiFi NodeMCU-32S ESP-WROOM-32
WiFi NodeMCU-32S ESP-WROOM-32

در اینجا Pinout WiFi NodeMCU-32S ESP-WROOM-32 آمده است.

مرحله 16: گره نصب WiFiMCU-32S ESP-WROOM-32

اتصال وای فای NodeMCU-32S ESP-WROOM-32
اتصال وای فای NodeMCU-32S ESP-WROOM-32

این بار ، تفاوت اصلی با دو مثال دیگر در دکمه و سه LED LED چشمک زن است. در اینجا ، SDA به GPIO19 متصل است ، در حالی که SCL به GPIO23 متصل است.

مرحله 17: کتابخانه ها و متغیرها

ابتدا ، Wire.h را که مسئول ارتباطات i2c است و همچنین آدرس i2c MCP23016 را تنظیم می کنیم. من چندین دستور را نشان می دهم ، حتی برخی از آنها که ما در این پروژه از آنها استفاده نمی کنیم.

#include // استفاده از کتابخانه Wire.h را مشخص کنید. // endereço I2C do MCP23016 #define MCPAddress 0x20 // دستور ثبت نام در رابطه: جدول: 1-3 از Microchip MCP23016 - DS20090A // ENDEREÇOS DE REGISTRADORES #define GP0 0x00 // DATA PORT 0 PORT REGISTER 1 #deleine OLAT0 0x02 // OUTPUT LATCH REGISTER 0 #تعریف OLAT1 0x03 // OUTPUT LATCH REGISTER 1 #تعریف IPOL0 0x04 // INPUT POLARITY PORT REGISTER 0 #define IPOLde 0x05 // INPET 0 P00000 /I/O DIRECTION REGISTER 0 #تعریف IODIR1 0x07 // I/O DIRECTION REGISTER 1 #تعریف INTCAP0 0x08 // INTERRUPT CAPTURE REGISTER 0 #تعریف INTCAP1 0x09 // INTERRUPT CAPTURE REGISTER 1 # REGISTER 0 #تعریف IOCON1 0x0B // I/O EXPANDER CONTROL REGISTER 1

مرحله 18: راه اندازی

در اینجا ما توابع راه اندازی چهار نوع مختلف میکروکنترلر را داریم. ما همچنین فرکانس را بررسی می کنیم ، GPIO ها را تنظیم می کنیم و پین ها را تنظیم می کنیم. در حلقه ، وضعیت دکمه را بررسی می کنیم.

void setup () {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) ؛ // frequencia // configura o GPIO0 como OUTPUT (todos os pinos) configurePort (IODIR0، OUTPUT)؛ // پیکربندی GPIO1 como INPUT یا GP1.0 و como OUTPUT خارج از GP1 configurePort (IODIR1 ، 0x01) ؛ // seta todos os pinos do GPIO0 como LOW writeBlockData (GP0، B00000000)؛ // seta todos os pinos do GPIO1 como LOW writeBlockData (GP1، B00000000)؛ } void loop () {// 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 said void configurePort (پورت uint8_t ، uint8_t سفارشی) {if (سفارشی == INPUT) {writeBlockData (پورت ، 0xFF) ؛ } else if (سفارشی == OUTPUT) {writeBlockData (پورت ، 0x00) ؛ } else {writeBlockData (پورت ، سفارشی) ؛ }}

مرحله 20: WriteBlockData & CheckButton

در اینجا ، ما داده ها را از طریق گذرگاه i2c به MCP23016 ارسال می کنیم ، وضعیت دکمه را بررسی می کنیم و با در نظر گرفتن شرایط فشار یا عدم فشار ، مرحله بعدی را نشان می دهیم.

// 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 contrario 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 وضعیت GP = 0؛ Wire.beginTransmission (MCPAddress) ؛ Wire.write (gp) ؛ Wire.endTransmission ()؛ سیم. درخواست از (MCPAddress، 1)؛ // ler do chip 1 byte statusGP = Wire.read ()؛ مقدار بازگشتی FromPin (پین ، 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 << پین]) == 0؟ 0: 1 ؛ }

مرحله 22: برنامه ESP8266

از اینجا ، خواهیم دید که چگونه برنامه ای که در ESP-01 و در nodeMCU ESP-12E استفاده کردیم ایجاد شده است ، که به ما امکان می دهد تفاوت بین آنها را به حداقل برسانیم.

ما فقط خط سازنده ارتباطات i2c را که روش ابتدایی شی Wire است تغییر می دهیم.

فقط مطابق صفحه ای که قرار است کامپایل کنیم خط را کامنت نکنید.

// Wire.begin (D2 ، D1) ؛ // nodemcu ESP8266 // Wire.begin (0 ، 2) ؛ // ESP-01

برپایی

توجه داشته باشید که سازنده هنوز اظهار نظر کرده است. بنابراین ، مطابق تابلوی خود (ESP-01 یا nodeMCU ESP12-E) اظهار نظر نکنید.

void setup () {Serial.begin (9600)؛ تاخیر (1000) ؛ // Wire.begin (D2 ، D1) ؛ // nodemcu ESP8266 // Wire.begin (0 ، 2) ؛ // ESP-01 Wire.setClock (200000) ؛ // frequencia // configura o GPIO0 como OUTPUT (todos os pinos) configurePort (IODIR0، OUTPUT)؛ // پیکربندی GPIO1 como OUTPUT (todos os pinos) configurePort (IODIR1، OUTPUT)؛ // seta todos os pinos do GPIO0 como LOW writeBlockData (GP0، B00000000)؛ // seta todos os pinos do GPIO1 como LOW writeBlockData (GP1، B00000001)؛ }

حلقه

در حلقه ، پین ها را هر 1 ثانیه تغییر می دهیم. بنابراین ، وقتی pin0 GP0 روشن است ، پین های GP1 خاموش هستند. وقتی pin0 GP1 روشن است ، پین های GP0 خاموش هستند.

void loop () {// 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 GP1 como HIGH e os demais como LOW writeBlockData (GP1، B00000001)؛ تاخیر (1000) ؛ } // حلقه پایان

مرحله 23: مهم

متغیرها و کتابخانه مورد استفاده مشابه برنامه ای است که برای ESP32 انجام دادیم ، و همچنین متدهای configurePort و writeBlockData.

مرحله 24: فایل ها

دانلود فایلها:

PDF

INO (ESP8266)

INO (ESP32)

توصیه شده: