فهرست مطالب:
- مرحله 1: مقدمه
- مرحله 2: ویژگی ها
- مرحله 3: ESP01 می تواند 128 GPIO داشته باشد
- مرحله 4: MCP23016
- مرحله 5: ساعت
- مرحله 6: آدرس
- مرحله 7: دستورات
- مرحله 8: دسته بندی ها:
- مرحله نهم: ساختار ارتباطات
- مرحله 10: برنامه
- مرحله 11: ESP01
- مرحله 12: نصب ESP01
- مرحله 13: NodeMCU ESP-12E
- مرحله 14: نصب NodeMCU ESP-12E
- مرحله 15: WiFi NodeMCU-32S ESP-WROOM-32
- مرحله 16: گره نصب WiFiMCU-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 08:57
آیا می خواهید 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 است که تنها با دو IOS می تواند به هشت توسعه دهنده متصل شود و به 128 GPIO برسد.
مرحله 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 - ثبت کننده کنترل گسترش دهنده ورودی / خروجی
این عملکرد 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
در اینجا ، من 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: گره نصب WiFiMCU-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: فایل ها
دانلود فایلها:
INO (ESP8266)
INO (ESP32)
توصیه شده:
راه اندازی برای ارائه دهنده GPS بلوتوث خارجی برای دستگاه های Android: 8 مرحله
راه اندازی برای ارائه دهنده GPS خارجی بلوتوث برای دستگاه های Android: این دستورالعمل نحوه ایجاد GPS خارجی با قابلیت بلوتوث خود را برای تلفن شما توضیح می دهد ، هر چیزی را فقط با 10 دلار روشن کنید. صورت حساب مواد: ماژول بلوتوث NEO 6M U-blox GPSHC-05 رابط ماژول های کم مصرف Blutooth Ardui
555 تایمر برای ارسال سیگنال برای قطع Atmega328: 7 مرحله
555 تایمر برای ارسال سیگنال برای قطع Atmega328: هدف اصلی این مدار صرفه جویی در انرژی است. بنابراین ، من قصد ندارم در مورد آردوینو صحبت کنم زیرا خود برد هزینه اضافی اضافی برای محصول نهایی دارد. برای توسعه عالی است. اما ، برای پروژه های نهایی در حال اجرا بسیار خوب نیست
حالت 3.3V برای سنسورهای اولتراسونیک (HC-SR04 را برای منطق 3.3V در ESP32/ESP8266 ، ذرات فوتون و غیره آماده کنید): 4 مرحله
3.3V Mod برای سنسورهای اولتراسونیک (HC-SR04 را برای منطق 3.3V در ESP32/ESP8266 ، Particle Photon ، و غیره آماده کنید): TL؛ DR: روی سنسور ، ردیابی را به پین اکو ببرید ، سپس آن را با استفاده از تقسیم ولتاژ (Echo trace -& gt؛ 2.7kΩ -& gt؛ اکو پین -& gt؛ 4.7kΩ -& gt؛ GND). ویرایش: در مورد اینکه آیا ESP8266 واقعاً 5V در GPIO در
NODEMCU LUA ESP8266 با MCP23008 8 پورت IC Expander IC: 6 مرحله
NODEMCU LUA ESP8266 با IC MCP23008 8 Bit Expander IC: MCP23008 یک ورودی/خروجی 8 بیتی با رابط سریال است و بین 1.8 تا 5.5 ولت کار می کند ، بنابراین برای ESP8266 ، Arduino ، Raspberry Pi ، تراشه های PIC و موارد دیگر ایده آل است. اگر دستورالعمل دیگر من را در MCP23017 مشاهده کرده اید ، ممکن است برای خود فکر کنید
NODEMCU LUA ESP8266 با MCP23017 16 پورت IC Expander IC: 6 مرحله (همراه با تصاویر)
NODEMCU LUA ESP8266 با MCP23017 16 Bit Expander IC: MCP23017 یک IC نسبتاً آسان برای ساختن برد است زیرا دارای پورت A و B در دو طرف تراشه است و پین ها به ترتیب متوالی هستند. به طور مشابه گذرگاه آدرس I2C همه با هم همینطور. روی این IC 2 پین وجود دارد که بدون استفاده هستند