Mundarija:

ESP32, ESP8266 va Arduino uchun IO Expander: 24 qadam
ESP32, ESP8266 va Arduino uchun IO Expander: 24 qadam

Video: ESP32, ESP8266 va Arduino uchun IO Expander: 24 qadam

Video: ESP32, ESP8266 va Arduino uchun IO Expander: 24 qadam
Video: LDmicro 14: ЖК-дисплей I2C и часы реального времени DS3231 (программирование лестничной схемы ПЛК микроконтроллера с помощью LDmicro) 2024, Noyabr
Anonim
Image
Image
Kirish
Kirish

ESP32, ESP8266 yoki Arduino -ning IO -larini kengaytirmoqchimisiz? Siz I2C avtobusi yordamida boshqariladigan 16 ta yangi GPIO imkoniyatlari haqida o'ylab ko'rganmisiz? Bugun men sizni GPIO kengaytiruvchisi MCP23016 bilan tanishtirmoqchiman. Shuningdek, men sizga MCP23016 bilan mikrokontroller bilan qanday bog'lanishni ko'rsataman. Men, shuningdek, kengaytiruvchi bilan bog'lanish uchun ushbu mikrokontrolderning 2 ta pinidan foydalanadigan dastur yaratish haqida gaplashaman. Biz ularni LED va tugmani boshqarish uchun ishlatamiz.

1 -qadam: kirish

MCP23016 qurilmasi I2C avtobusi yordamida GPIO kengayishi uchun 16 bitni ta'minlaydi. Har bir bitni alohida sozlash mumkin (kirish yoki chiqish).

MCP23016 kirish, chiqish va kutupluluğu tanlash uchun bir nechta 8 bitli sozlamalardan iborat.

Kengaytirgichlar, boshqa misollar qatorida, kalitlarga, datchiklarga, tugmachalarga va LEDlarga IO kerak bo'lganda oddiy echimni taklif qiladi.

2 -qadam: Xususiyatlar

16 ta kirish / chiqish pimi (16 ta kirish standarti)

Tez I2C avtobus soat chastotasi (0-400 kbit/s)

Uchta apparat manzil pinlari sakkiztagacha qurilmadan foydalanishga imkon beradi

Portni yozib oluvchi uzilish

Kirish porti ma'lumotlarining qutblanishini sozlash uchun qutbni qaytaruvchi registr

Ko'p mikrokontroller bilan mos keladi

3 -qadam: ESP01 128 ta GPIOga ega bo'lishi mumkin

ESP01 128 ta GPIOga ega bo'lishi mumkin!
ESP01 128 ta GPIOga ega bo'lishi mumkin!

Bu kengaytirgichning kattaligini ko'rsatadigan misol - bu ESP01 -dan foydalanish, u sakkiztagacha kengaytirgichga faqat ikkita IOS bilan ulanishi mumkin, bu esa 128 GPIOga etadi.

4 -qadam: MCP23016

MCP23016
MCP23016

Bu erda biz sakkiz bitli ikkita guruhga ega bo'lgan kengaytirgichning sxemasiga egamiz. Bu jami 16 ta portga to'g'ri keladi. O'chirish pinidan tashqari, u mantiqiy portga ichki ulangan kondansatör va rezistorni bog'laydigan CLK piniga ega. Bu 1MGts soatga muhtoj bo'lgan kristalli osilator g'oyasidan foydalanib, soatni yaratishdir. TP -pin soatni o'lchash uchun ishlatiladi. A0, A1 va A2 pinlari ikkilik manzillardir.

5 -qadam: soat

SAAT
SAAT
SAAT
SAAT

Shuning uchun MCP23016 ichki Soat tezligini aniqlash uchun tashqi RC sxemasidan foydalanadi. Qurilmaning to'g'ri ishlashi uchun 1 MGts chastotali ichki soat talab qilinadi. Ichki soatni TP pinida o'lchash mumkin. REXT va CEXT uchun tavsiya etilgan qiymatlar quyida ko'rsatilgan.

6 -qadam: Manzil

MCP23016 manzilini aniqlash uchun biz A0, A1 va A2 pinlaridan foydalanamiz. Manzil o'zgarishi uchun ularni "YUQORI" yoki "LOW" da qoldiring.

Manzil quyidagicha shakllantiriladi:

MCP_Address = 20 + (A0 A1 A2)

Qaerda A0 A1 A2 HIGH / LOW qiymatlarini olishi mumkin, bu 0 dan 7 gacha bo'lgan ikkilik raqamni hosil qiladi.

Masalan:

A0> GND, A1> GND, A2> GND (000 degan ma'noni anglatadi, keyin 20 + 0 = 20)

Yoki yana, A0> YUQORI, A1> GND, A2> YUQORI (ma'nosi 101, keyin 20 + 5 = 25)

7 -qadam: Buyruqlar

Buyruqlar
Buyruqlar

Quyida aloqa uchun buyruqlar berilgan jadval mavjud. Keling, GP0 va GP1, shuningdek IODIR0 va IODIR1 dan foydalanaylik.

8 -qadam: toifalar:

GP0 / GP1 - Ma'lumot portlari registrlari

Ikkita GPIO portiga kirishni ta'minlaydigan ikkita registr mavjud.

Ro'yxatdan o'tish kitobi portdagi pinlarning holatini ko'rsatadi.

Bit = 1> HIGH Bit = 0> LOW

OLAT0 / OLAT1 - LACTCH Ro'yxatga oluvchilarini chiqarish

Ikkala portning chiqish portlariga kirishni ta'minlaydigan ikkita registr mavjud.

IPOL0 / IPOL1 - kirish qutblanish registrlari

Bu registrlar foydalanuvchiga kirish porti ma'lumotlarining qutblanishini sozlash imkonini beradi (GP0 va GP1).

IODIR0 / IODIR1

Pin rejimini boshqaruvchi ikkita registr mavjud. (Kirish yoki chiqish)

Bit = 1> INPUT Bit = 0> Chiqish

INTCAP0 / INTCAP1 - Ro'yxatga olishning uzilishlari

Bu uzilishni yaratgan port qiymatini o'z ichiga olgan registrlar.

IOCON0 / IOCON1 - kirish -chiqish kengaytirgichlarini nazorat qilish reestri

Bu MCP23016 funksiyasini nazorat qiladi.

0 -bitni sozlash (IARES> Faoliyatni uzish) GP port pinlarining namuna olish chastotasini nazorat qiladi.

Bit0 = 0> (standart) Maksimal port faolligini aniqlash vaqti-32 ms (kam quvvat sarfi)

Bit0 = 1> portdagi faollikni aniqlashning maksimal vaqti-200 us. (Yuqori quvvat sarfi)

9 -qadam: Aloqa tuzilishi

Aloqa tuzilishi
Aloqa tuzilishi

Men bu erda Wire sinfini ko'rsataman, bu bizning asosiy Arduino -dagi I2C aloqasi, bu ham kengaytiruvchiga Arduino Uno va Mega bilan ishlashga imkon beradi. Biroq, ikkinchisida allaqachon bir nechta IO mavjud. Biz bu erda chiplarning manzillari, registrlarning kodlari bo'lgan kirishni boshqarish, shuningdek ma'lumotlar bilan shug'ullanamiz.

10 -qadam: Dastur

Dastur
Dastur

Bizning dasturimiz ESP32 -ni MCP23016 bilan ko'proq GPIO -larga ega bo'lishdan iborat. Keyin bizda tugma va MCP23016 ga ulangan ba'zi LEDlar bo'ladi. Biz ularning barchasini faqat I2C avtobusi yordamida boshqaramiz. Shunday qilib, faqat ikkita ESP32 pin ishlatiladi. Videoda quyidagi rasm chizig'ini ko'rishingiz mumkin.

11 -qadam: ESP01

ESP01
ESP01

Bu erda men ESP01 pinoutini ko'rsataman.

12 -qadam: ESP01 -ni o'rnatish

ESP01 o'rnatish
ESP01 o'rnatish

Bu misolda bizda SDA -ga GPIO0, SCL -ga GPIO2 ulangan. Shuningdek, bizda o'rni taxtasi, ovozli signal va LED mavjud. Boshqa portda, GP1.0 -da, bizda rezistorli yana bitta LED bor.

13-qadam: NodeMCU ESP-12E

NodeMCU ESP-12E
NodeMCU ESP-12E

Bu erda bizda NodeMCU ESP-12E pinout bor.

14-qadam: NodeMCU ESP-12E ni o'rnatish

NodeMCU ESP-12E o'rnatish
NodeMCU ESP-12E o'rnatish

Bunday holda, birinchi misoldan farqi shundaki, siz D1 va D2 ni mos ravishda SDA va SCL -ga uladingiz.

15-qadam: WiFi NodeMCU-32S ESP-WROOM-32

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

Bu erda Wi-Fi NodeMCU-32S ESP-WROOM-32-ni ajratish.

16-qadam: Wi-Fi-ni o'rnatish tuguniMCU-32S ESP-WROOM-32

WiFi o'rnatish tugunlariMCU-32S ESP-WROOM-32
WiFi o'rnatish tugunlariMCU-32S ESP-WROOM-32

Bu safar boshqa ikkita misoldan asosiy farq - bu tugma va uchta miltillovchi LED. Bu erda SDA GPIO19 ga ulangan, SCL esa GPIO23 ga ulangan.

17 -qadam: Kutubxonalar va o'zgaruvchilar

Birinchidan, biz i2c aloqasi uchun javobgar bo'lgan Wire.h ni, shuningdek MCP23016 ning i2c manzilini o'rnatamiz. Men bir nechta buyruqlarni ko'rsataman, hatto biz bu loyihada ishlatmaymiz.

#include // Wire.h kutubxonasidan foydalanishni belgilang. // endereço I2C do MCP23016 #MCPAddress 0x20 ni belgilang // Aloqa registratsiya qilish uchun buyruq bayt: Jadval: 1-3 Microchip MCP23016 - DS20090A // ENDEREÇOS DE REGISTRADORES #define GP0 0x00 // DATA PORT Ro'yxatdan o'tuvchi1 0 PORT Ro'yxatdan o'tish 1 #OLAT0 0x02 ni belgilash // OUTPUT LATCH Ro'yxatdan o'tish 0 #ta'rif OLAT1 0x03 // OUTPUT LATCH Ro'yxatdan o'tish 1 #ta'rif IPOL0 0x04 // INPUT POLARITY PORT Ro'yxatdan o'tish /I/U YO'NALISH Ro'yxatga oluvchisi 0 #aniqlang IODIR1 0x07 // I/U YO'NALISH Ro'yxatga oluvchisi 1 #aniqlang INTCAP0 0x08 // O'RNATISH YO'LG'ILISH Ro'yxatga oluvchisi 0 #ta'riflangan INTCAP1 0x09 // O'RNATISH CAPTURE Ro'yxatdan o'tish 1 Yozuvchi REGISTER 0 #define IOCON1 0x0B // I/U EXPANDER CONTROL Ro'yxatdan o'tish 1

18 -qadam: sozlash

Bu erda biz to'rt xil turdagi mikrokontrolderlarni ishga tushirish funktsiyalariga egamiz. Shuningdek, biz chastotani tekshiramiz, GPIO -ni o'rnatamiz va pinlarni o'rnatamiz. Loopda biz tugma holatini tekshiramiz.

void setup () {Serial.begin (9600); kechikish (1000); Wire.begin (19, 23); // ESP32 // Wire.begin (D2, D1); // nodemcu ESP8266 // Wire.begin (); // arduino // Wire.begin (0, 2); // ESP-01 Wire.setClock (200000); // chastota // konfiguratsiya yoki GPIO0 bilan bir vaqtda chiqish (konfiguratsiya) port (IODIR0, OUTPUT); // konfiguratsiya yoki GPIO1 uchun kirish yoki GP1.0 va OUTPUT - bu GP1 configurePort (IODIR1, 0x01); // GPIO0 bilan bir qatorda, LOW writeBlockData (GP0, B00000000); // LIO writeBlockData (GP1, B00000000) GPIO1 bilan bir vaqtda bajarilishi kerak; } void loop () {// verifica e o botão GP foi pressionado checkButton (GP1); } // oxiri

19 -qadam: Portni sozlash

Ushbu bosqichda biz GPIO pinlari rejimini sozlaymiz va portlar rejimini aniqlaymiz.

// GPIO (GP0 yoki GP1) konfiguratsiyasi // passamos parametrlari: // port: GP0 yoki GP1 // maxsus: GPU -ning kirish nuqtasi sifatida GPU -ni kiriting // OUTPUT -ni amalga oshirishda, GP -ni yoki tr -ni ishlating. / custom um valor de 0-255 indicando o modo das portas (1 = INPUT, 0 = OUTPUT) // ex: 0x01 or B00000001 ou 1: indica que apenas o GPX.0 trabalhará como entrada, or restando como saida void configurePort (uint8_t port, uint8_t custom) {if (custom == INPUT) {writeBlockData (port, 0xFF); } if if (custom == OUTPUT) {writeBlockData (port, 0x00); } boshqa {writeBlockData (port, maxsus); }}

20 -qadam: WriteBlockData va CheckButton

Bu erda biz ma'lumotlarni i2c avtobus orqali MCP23016 ga yuboramiz, tugma holatini tekshiramiz va bosish yoki bosmaslik shartini hisobga olgan holda keyingi qadamni ko'rsatamiz.

// envia dados para to MCP23016 através to barramento i2c // cmd: COMANDO (registrador) // ma'lumotlar: dados (0-255) yozilmagan BlockData (uint8_t cmd, uint8_t ma'lumotlar) {Wire.beginTransmission (MCPAddress); Wire.write (cmd); Wire.write (ma'lumotlar); Wire.endTransmission (); kechikish (10); }

// parametrlar bo'yicha GP parametrlari: GP0 yoki GP1 void checkButton (uint8_t GP) {// faz a leitura do pino 0 no GP fornecido uint8_t btn = readPin (0, GP); // agar siz bostiradigan bo'lsak, GP0 port sifatida HIGH (agar btn) {writeBlockData (GP0, B11111111); } // LOW else {yozish blokirovkasi (GP0, B00000000); }}

21 -qadam: ReadPin va ValueFromPin

Biz bu erda ma'lum bir pinni o'qish va bit qiymatini kerakli joyga qaytarish bilan shug'ullanamiz.

// faz a leitura de um pino específico // pin: pino desejado (0-7) // gp: GP0 yoki GP1 // retorno: 0 yoki 1 uint8_t readPin (uint8_t pin, uint8_t gp) {uint8_t statusGP = 0; Wire.beginTransmission (MCPA manzili); Wire.write (gp); Wire.endTransmission (); Wire.requestFrom (MCPA manzili, 1); // chip 1 bayt statusGP = Wire.read (); qaytish qiymatiFromPin (pin, statusGP); } // retorna o valor do bit na posichão desejada // pin: positsã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 -qadam: ESP8266 dasturi

Bu erda biz ESP-01 va nodeMCU ESP-12E dasturida qanday yaratilganligini ko'ramiz, bu esa ular orasidagi farqlar qanchalik minimal ekanligini tushunishga imkon beradi.

Biz faqat Wire ob'ektining boshlang'ich usuli bo'lgan i2c aloqa konstruktorining chizig'ini o'zgartiramiz.

Biz kompilyatsiya qilmoqchi bo'lgan plastinka bo'yicha chiziqni belgilang.

// Wire.begin (D2, D1); // nodemcu ESP8266 // Wire.begin (0, 2); // ESP-01

Sozlash

E'tibor bering, quruvchi hali ham izohlanadi. Shuning uchun, taxtangizga ko'ra izoh qoldirmang (ESP-01 yoki nodeMCU ESP12-E).

void setup () {Serial.begin (9600); kechikish (1000); // Wire.begin (D2, D1); // nodemcu ESP8266 // Wire.begin (0, 2); // ESP-01 Wire.setClock (200000); // chastota // konfiguratsiya yoki GPIO0 bilan bir vaqtda chiqish (konfiguratsiyaPort) configurePort (IODIR0, OUTPUT); // konfiguratsiya yoki GPIO1 uchun OUTPUT konfiguratsiyaPort (IODIR1, OUTPUT); // GPIO0 bilan bir qatorda, LOW writeBlockData (GP0, B00000000); // GPIO1 bilan bir qatorda LOW writeBlockData (GP1, B00000001); }

Loop

Loopda biz pinlarni har 1 soniyada almashtiramiz. Shunday qilib, GP0 pin0 yoqilganda, GP1 pinlari o'chadi. GP1 pin0 yoqilganda, GP0 pinlari o'chiriladi.

void loop () {// set up o pino 7 to GP0 como HIGH HIGH os demais como LOW writeBlockData (GP0, B10000000); // GPIO1 bilan bir qatorda LOW writeBlockData (GP1, B00000000); kechikish (1000); // GPIO0 bilan bir qatorda, LOW writeBlockData (GP0, B00000000); // yozib oling - bu GP1 -ni yoqish uchun juda yuqori, chunki LOW writeBlockData (GP1, B00000001); kechikish (1000); } // oxiri

23 -qadam: MUHIM

Amaldagi o'zgaruvchilar va kutubxona biz ESP32 uchun qilgan dastur bilan bir xil, shuningdek configurePort va writeBlockData usullari.

24 -qadam: fayllar

Fayllarni yuklab oling:

PDF

INO (ESP8266)

INO (ESP32)

Tavsiya: