Mündəricat:

ESP32, ESP8266 və Arduino üçün IO Expander: 24 addım
ESP32, ESP8266 və Arduino üçün IO Expander: 24 addım

Video: ESP32, ESP8266 və Arduino üçün IO Expander: 24 addım

Video: ESP32, ESP8266 və Arduino üçün IO Expander: 24 addım
Video: Home Assistant - подключаем адресную ленту WS2812B через ESP8266 с прошивкой WLED 2024, Iyul
Anonim
Image
Image
Giriş
Giriş

ESP32, ESP8266 və ya Arduino'nun IO'larını genişləndirmək istərdinizmi? I2C avtobusu ilə idarə oluna bilən 16 yeni GPIO -nun mümkünlüyü barədə düşünmüsünüzmü? Yaxşı bu gün sizi GPIO genişləndirici MCP23016 ilə tanış edəcəyəm. Ayrıca, MCP23016 ilə bir mikro nəzarətçi ilə necə əlaqə quracağınızı göstərəcəyəm. Genişləndirici ilə ünsiyyət qurmaq üçün bu mikro nəzarətçinin yalnız 2 sancağından istifadə edəcəyimiz bir proqram yaratmaq haqqında danışacağam. Bunları LEDləri və düyməni idarə etmək üçün istifadə edəcəyik.

Addım 1: Giriş

MCP23016 cihazı, I2C avtobusundan istifadə edərək GPIO genişləndirilməsi üçün 16 bit təmin edir. Hər bir bit fərdi olaraq konfiqurasiya edilə bilər (giriş və ya çıxış).

MCP23016, giriş, çıxış və polarite seçimi üçün bir çox 8 bitlik parametrlərdən ibarətdir.

Genişləndiricilər, digər nümunələr arasında açarlar, sensorlar, düymələr və LEDlər üçün IO -lara ehtiyac olduqda sadə bir həll təmin edir.

Addım 2: Xüsusiyyətlər

16 Giriş / Çıxış pinləri (16 giriş standartı)

Sürətli I2C avtobus saat tezliyi (0-400 kbit/s)

Üç hardware ünvan pinləri səkkiz cihaza qədər istifadə etməyə imkan verir

Port Capture Recorder -ı kəsin

Giriş port məlumatlarının polaritesini təyin etmək üçün polariteyi geri çevirən reyestr

Əksər mikrokontrolörlərə uyğundur

Addım 3: ESP01 128 GPIO -ya sahib ola bilər

ESP01 128 GPIO -ya sahib ola bilər!
ESP01 128 GPIO -ya sahib ola bilər!

Bu genişləndiricinin böyüklüyünü göstərən bir nümunə, ESP01 ilə istifadəsidir, bu, yalnız iki IOS ilə səkkizə qədər genişləndiriciyə qoşula bilər və 128 GPIO -ya çatır.

Addım 4: MCP23016

MCP23016
MCP23016

Burada, səkkiz bitdən ibarət iki qrupu olan genişləndiricinin sxeminə sahibik. Bu, ümumilikdə 16 limanı təşkil edir. Bir kəsmə pininə əlavə olaraq, daxili bir məntiq portuna bağlanan kondansatörü və rezistoru birləşdirən CLK pininə malikdir. Bu, 1MHz saata ehtiyacı olan bir kristal osilator ideyasından istifadə edərək saatı formalaşdırmaqdır. TP pin, saatı ölçmək üçün istifadə olunur. A0, A1 və A2 sancaqları ikili ünvanlardır.

Addım 5: SAAT

SAAT
SAAT
SAAT
SAAT

Buna görə MCP23016, daxili Saatın sürətini təyin etmək üçün xarici bir RC dövrəsindən istifadə edir. Cihazın düzgün işləməsi üçün (ümumiyyətlə) 1 MHz -lik daxili saat tələb olunur. Daxili saat TP pinində ölçülə bilər. REXT və CEXT üçün tövsiyə olunan dəyərlər aşağıda göstərilmişdir.

Addım 6: Ünvan

MCP23016 ünvanını təyin etmək üçün A0, A1 və A2 sancaqlarından istifadə edirik. Onları ünvan dəyişikliyi üçün YÜKSƏLİ və ya DÜŞÜK olaraq buraxın.

Ünvan aşağıdakı kimi formalaşacaq:

MCP_Address = 20 + (A0 A1 A2)

A0 A1 A2 -nin YÜKSEK / DÜŞÜK dəyərləri götürə biləcəyi yerdə, 0 -dan 7 -yə qədər olan ikili ədəd əmələ gətirir.

Misal üçün:

A0> GND, A1> GND, A2> GND (000 deməkdir, sonra 20 + 0 = 20)

Yoxsa, A0> YÜKSEK, A1> GND, A2> YÜKSÜZ (mənası 101, sonra 20 + 5 = 25)

Addım 7: Əmrlər

Əmrlər
Əmrlər

Aşağıda ünsiyyət əmrləri olan bir cədvəl var. GP0 və GP1, eləcə də IODIR0 və IODIR1 istifadə edək.

Addım 8: Kateqoriyalar:

GP0 / GP1 - Məlumat Portu Qeydləri

İki GPIO limanına çıxışı təmin edən iki qeyd var.

Qeyd oxunuşu həmin limandakı sancaqların vəziyyətini təmin edir.

Bit = 1> HIGH Bit = 0> LOW

OLAT0 / OLAT1 - Çıxış LACTCH QEYDİYYATÇILARI

İki limanın çıxış limanlarına çıxışı təmin edən iki qeyd var.

IPOL0 / IPOL1 - Giriş Qütblülük Qeydləri

Bu qeydlər istifadəçiyə giriş port məlumatlarının (GP0 və GP1) polaritesini konfiqurasiya etməyə imkan verir.

IODIR0 / IODIR1

Pin rejimini idarə edən iki qeyd var. (Giriş və ya Çıxış)

Bit = 1> GİRİŞ Bit = 0> Çıxış

INTCAP0 / INTCAP1 - Capture Registrləri kəsin

Bunlar kəsilməni yaradan portun dəyərini ehtiva edən qeydlərdir.

IOCON0 / IOCON1 - I / O Genişləndirici Nəzarət Qeydiyyatı

Bu, MCP23016 funksiyasını idarə edir.

0 bitini təyin etmək (IARES> Fəaliyyəti kəsmək) GP port sancaqlarının seçmə tezliyini idarə edir.

Bit0 = 0> (standart) Maksimum liman aktivliyi aşkarlama müddəti 32 ms-dir (aşağı enerji istehlakı)

Bit0 = 1> limanda maksimum aktivlik aşkarlama müddəti 200usec (daha yüksək enerji istehlakı)

Addım 9: Ünsiyyət quruluşu

Ünsiyyət quruluşu
Ünsiyyət quruluşu

Burada genişləndiricinin Arduino Uno və Mega ilə işləməsinə imkan verən əsas Arduino -dakı I2C ünsiyyəti olan Wire sinifini göstərirəm. Ancaq sonuncunun artıq bir neçə IO var. Burada çipin ünvanları, qeydlərin kodları olan giriş nəzarəti və məlumatlarla məşğul oluruq.

Addım 10: Proqram

Proqram
Proqram

Proqramımız, daha çox GPIO istifadə etmək üçün ESP32 ilə MCP23016 ilə əlaqə qurmaqdan ibarətdir. Daha sonra bir düymə və MCP23016 -ya bağlı bəzi LEDlərimiz olacaq. Yalnız I2C avtobusundan istifadə edərək hamısına nəzarət edəcəyik. Beləliklə, yalnız iki ESP32 sancağı istifadə ediləcək. Aşağıdakı şəkil sxemini videoda görə bilərsiniz.

Addım 11: ESP01

ESP01
ESP01

Burada ESP01 Pinoutunu göstərirəm.

Addım 12: ESP01 -in quraşdırılması

Montaj ESP01
Montaj ESP01

Bu nümunədə, SDA -ya bağlı GPIO0 və SCL -ə bağlı GPIO2 var. Həm də bir relay lövhəsi, səs siqnalı və bir LED var. Digər portda, GP1.0 -da bir rezistorlu daha bir LED var.

Addım 13: NodeMCU ESP-12E

NodeMCU ESP-12E
NodeMCU ESP-12E

Burada NodeMCU ESP-12E Pinout var.

Addım 14: NodeMCU ESP-12E montajı

NodeMCU ESP-12E montajı
NodeMCU ESP-12E montajı

Bu vəziyyətdə, ilk nümunədən yeganə fərq, sırasıyla SDA və SCL -də D1 və D2 -ni birləşdirdiyinizdir.

Addım 15: WiFi NodeMCU-32S ESP-WROOM-32

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

Budur WiFi NodeMCU-32S ESP-WROOM-32-nin Pinout.

Addım 16: WiFi Montaj NodeMCU-32S ESP-WROOM-32

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

Bu dəfə digər iki nümunədən əsas fərq düymə və üç yanıb -sönən LED -dir. Burada SDA GPIO19 -a, SCL isə GPIO23 -ə qoşulur.

Addım 17: Kitabxanalar və Dəyişənlər

Birincisi, i2c ünsiyyətindən məsul olan Wire.h, həmçinin MCP23016 -nın i2c ünvanını təyin edəcəyik. Bu layihədə istifadə etmədiyimiz bir neçə əmr göstərirəm.

#include // Wire.h kitabxanasının istifadəsini göstərin. // endereço I2C do MCP23016 #MCPAddress 0x20 təyin edin // İLİŞKİLƏRİ QEYDİYYAT ETMƏK ÜÇÜN BAYT: Cədvəl: 1-3 Microchip MCP23016 - DS20090A // ENDEREÇOS DE REGISTRADORES #define GP0 0x00 // DATA PORT QEYDİYYATCI 0 #dex PORT QEYDİYYATI 1 #OLAT0 0x02 təyin edin // Çıxış LATCH QEYDİYYATI 0 #müəyyən OLAT1 0x03 // ÇIXIŞ KİLİDİ QEYDİYYATI 1 #IPOL0 0x04 daxil edin // GİRİŞ POLARİTİ PORT QEYDİYYATI 0 #IPOL1 0x0AR PİTİF 1 İNDİRİN /I/O YÖN QAYDASI 0 #IODIR1 0x07 təyin edin // I/O YÖN QEYDİYYATI 1 #INTCAP0 müəyyən edin 0x08 // KESİNTİ CAPTURE QEYDİYYATI 0 #müəyyən INTCAP1 0x09 // ARALIQ YAZMA QEYDİYYAT 1 QEYD QAYDI 1 QEYDİYYAT 0 #define IOCON1 0x0B // I/O EXPANDER NƏZARƏT QEYDİYYATI 1

Addım 18: Quraşdırma

Burada dörd fərqli mikrokontrolörün işə salınması funksiyasına sahibik. Həm də tezliyi yoxlayırıq, GPIO qururuq və sancaqlar qururuq. Döngədə düymənin vəziyyətini yoxlayırıq.

void setup () {Serial.begin (9600); gecikmə (1000); Wire.begin (19, 23); // ESP32 // Wire.begin (D2, D1); // nodemcu ESP8266 // Wire.begin (); // arduino // Wire.begin (0, 2); // ESP-01 Wire.setClock (200000); // tezlik // konfiqurasiya və ya GPIO0 ilə ÇIXIŞ (əlaqəli işlər) configurePort (IODIR0, ÇIXIŞ); // konfiqurasiya və ya GPIO1 girişi GP1.0 və ya GP1 configurePort (IODIR1, 0x01) üzərində ÇIXIŞ; // GPIO0 üçün LOW writeBlockData (GP0, B00000000) ilə əlaqəli işlər; // GPIO1 ilə LOW writeBlockData (GP1, B00000000) arasındakı əlaqəni təyin edin; } void loop () {// checkButton (GP1) düyməsini basdıqdan sonra GP -ni yoxlayın; } // son döngə

Addım 19: Portu konfiqurasiya edin

Bu addımda GPIO sancaqlar rejimini konfiqurasiya edirik və limanların rejimini təyin edirik.

// GPIO konfiqurasiyası (GP0 və ya GP1) // komanda parametrləri: // port: GP0 və ya GP1 // xüsusi: GP -lərin daxil olduğu kimi girişlər daxil edin/GP -lərin Çıxışları GP -lərin olduğu kimi, trabalharem komo 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, or restando como saida void configurePort (uint8_t port, uint8_t custom) {if (custom == INPUT) {writeBlockData (port, 0xFF); } başqa if (xüsusi == ÇIXIŞ) {writeBlockData (port, 0x00); } başqa {writeBlockData (port, xüsusi); }}

Addım 20: WriteBlockData və CheckButton

Burada məlumatları i2c avtobusu ilə MCP23016 -a göndəririk, düymənin vəziyyətini yoxlayırıq və basıldığını və ya olmamasını nəzərə alaraq növbəti addımı göstəririk.

// MCP23016 através to barramento i2c // cmd: COMANDO (registrador) // data: dados (0-255) writeBlockData (uint8_t cmd, uint8_t data) {Wire.beginTransmission (MCPAddress); Wire.write (cmd); Wire.write (məlumatlar); Wire.endTransmission (); gecikmə (10); }

// parametrləri GP: parametrləri GP: GP0 və ya GP1 etibarsız checkButton (uint8_t GP) {// faz a leitura do pino 0 no GP fornecido uint8_t btn = readPin (0, GP); // yuxarıya basaraq, GP0 kimi yüksək olaraq təyin edin (btn) {writeBlockData (GP0, B11111111); } // LOW else {yazmaBlockData (GP0, B00000000); }}

Addım 21: ReadPin və ValueFromPin

Burada müəyyən bir pin oxunması və bit dəyərinin istədiyiniz mövqeyə qaytarılması ilə məşğul oluruq.

// 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 (MCPA ünvanı); Wire.write (gp); Wire.endTransmission (); Wire.requestFrom (MCPA ünvanı, 1); // çip 1 bayt statusGP = Wire.read (); qaytarılma dəyəriFromPin (pin, 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; }

Addım 22: ESP8266 Proqramı

Buradan, ESP-01-də və nodeMCU ESP-12E-də istifadə etdiyimiz proqramın necə yaradıldığını görəcəyik ki, bu da aralarındakı fərqlərin minimal olduğunu anlamağa imkan verir.

Yalnız Wire obyektinin başlanğıc metodu olan i2c rabitə qurucusunun xəttini dəyişdirəcəyik.

Sadəcə tərtib edəcəyimiz lövhəyə uyğun olaraq xətti açın.

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

Qurmaq

Qurucunun hələ də şərh edildiyinə diqqət yetirin. Buna görə lövhənizə görə şərh yazmayın (ESP-01 və ya nodeMCU ESP12-E).

void setup () {Serial.begin (9600); gecikmə (1000); // Tel.başla (D2, D1); // nodemcu ESP8266 // Wire.begin (0, 2); // ESP-01 Wire.setClock (200000); // tezlik // konfiqurasiya və ya GPIO0 ilə ÇIXIŞ (əlaqəli işlər) configurePort (IODIR0, ÇIXIŞ); // konfiqurasiya və ya GPIO1 ilə Çıxış (əlaqəli işlər) configurePort (IODIR1, Çıxış); // GPIO0 üçün LOW writeBlockData (GP0, B00000000) ilə əlaqəli işlər; // GPIO1 ilə LOW writeBlockData (GP1, B00000001) arasındakı əlaqəni təyin edin; }

Döngə

Döngədə, pinləri hər 1 saniyədə bir dəyişdiririk. Beləliklə, GP0 pin0 açıldığında, GP1 pinləri sönür. GP1 pin0 aktiv olduqda, GP0 pinləri sönür.

void loop () {// set up o pino 7 to GP0 como HIGH və ya LOW writeBlockData (GP0, B10000000); // GPIO1 ilə LOW writeBlockData (GP1, B00000000) arasındakı əlaqəni təyin edin; gecikmə (1000); // GPIO0 üçün LOW writeBlockData (GP0, B00000000) ilə əlaqəli işlər; // müəyyən etmək üçün GP1 -ni YÜKSEK və ya aşağı yazınBlockData (GP1, B00000001); gecikmə (1000); } // son döngə

Addım 23: Vacibdir

İstifadə olunan dəyişənlər və kitabxana, ESP32 üçün etdiyimiz proqramla, configurePort və writeBlockData metodları ilə eynidir.

Addım 24: Fayllar

Faylları yükləyin:

PDF

INO (ESP8266)

INO (ESP32)

Tövsiyə: