Orodha ya maudhui:

Kupanua IO kwa ESP32, ESP8266, na Arduino: Hatua 24
Kupanua IO kwa ESP32, ESP8266, na Arduino: Hatua 24

Video: Kupanua IO kwa ESP32, ESP8266, na Arduino: Hatua 24

Video: Kupanua IO kwa ESP32, ESP8266, na Arduino: Hatua 24
Video: Controlling 32 Servo motors with PCA9685 and ESP32 - V4 2024, Novemba
Anonim
Image
Image
Utangulizi
Utangulizi

Je! Ungependa kupanua IO za ESP32 yako, ESP8266, au Arduino? Na umefikiria juu ya uwezekano wa GPIO 16 mpya ambazo zinaweza kudhibitiwa kwa kutumia basi ya I2C? Kweli leo, nitakujulisha kwa GPIO expander MCP23016. Pia, nitakuonyesha jinsi ya kuwasiliana na mdhibiti mdogo na MCP23016. Pia nitazungumza juu ya kuunda mpango ambapo tutatumia pini 2 tu za mdhibiti huyu mdogo kuwasiliana na mfukuzaji. Tutatumia hizi kudhibiti LED na kitufe.

Hatua ya 1: Utangulizi

Kifaa cha MCP23016 hutoa bits 16 kwa upanuzi wa GPIO ukitumia basi ya I2C. Kila kidogo inaweza kusanidiwa kivyake (pembejeo au pato).

MCP23016 ina mipangilio anuwai ya 8-bit ya uteuzi wa pembejeo, pato, na polarity.

Vipanuaji hutoa suluhisho rahisi wakati IO zinahitajika kwa swichi, sensorer, vifungo, na LED, kati ya mifano mingine.

Hatua ya 2: Sifa

Pini 16 za Uingizaji / Pato (kiwango 16 cha kuingiza)

Mzunguko wa saa ya basi ya I2C haraka (0-400 kbits / s)

Pini tatu za anwani ya vifaa huruhusu utumiaji wa vifaa hadi nane

Kukatisha Kirekodi cha Kukamata Bandari

Polarity kugeuza rejista ya kuweka polarity ya data ya bandari ya pembejeo

Sambamba na wadhibiti wengi wadogo

Hatua ya 3: ESP01 Inaweza kuwa na GPIOs 128

ESP01 Inaweza Kuwa na GPIO 128!
ESP01 Inaweza Kuwa na GPIO 128!

Mfano ambao unaonyesha ukubwa wa upanuzi huu ni matumizi yake na ESP01, ambayo inaweza kushikamana na hadi kupanua nane na IOS mbili tu, kufikia 128 GPIOs.

Hatua ya 4: MCP23016

MCP23016
MCP23016

Hapa, tuna skimu ya upanuzi, ambayo ina vikundi viwili vya bits nane. Hii inafanya jumla ya bandari 16. Mbali na pini ya kukatiza, ina pini ya CLK, ambayo inaunganisha capacitor na kontena, ambayo imeunganishwa kwa ndani kwenye bandari ya mantiki. Hii ni kuunda saa, kwa kutumia wazo la oscillator ya kioo, ambayo inahitaji saa 1MHz. Pini ya TP hutumiwa kupima saa. Pini A0, A1, na A2 ni anwani za binary.

Hatua ya 5: SAA

SAA
SAA
SAA
SAA

MCP23016 kwa hivyo hutumia mzunguko wa nje wa RC kuamua kasi ya Saa ya ndani. Saa ya ndani ya 1 MHz inahitajika (kawaida) kwa kifaa kufanya kazi vizuri. Saa ya ndani inaweza kupimwa kwenye pini ya TP. Thamani zilizopendekezwa za REXT na CEXT zinaonyeshwa hapa chini.

Hatua ya 6: Anwani

Ili kufafanua anwani ya MCP23016, tunatumia pini A0, A1, na A2. Waache tu kwa JUU au LOW kwa mabadiliko ya anwani.

Anwani itaundwa kama ifuatavyo:

Anwani ya MCP_Adress = 20 + (A0 A1 A2)

Ambapo A0 A1 A2 inaweza kuchukua viwango vya juu / chini, hii inaunda nambari ya binary kutoka 0 hadi 7.

Kwa mfano:

A0> GND, A1> GND, A2> GND (inamaanisha 000, halafu 20 + 0 = 20)

Au sivyo, A0> JUU, A1> GND, A2> JUU (maana yake 101, halafu 20 + 5 = 25)

Hatua ya 7: Amri

Amri
Amri

Chini ni meza na amri za mawasiliano. Wacha tutumie GP0 na GP1, na IODIR0 na IODIR1.

Hatua ya 8: Jamii:

GP0 / GP1 - Sajili za Bandari ya Takwimu

Kuna rejista mbili ambazo hutoa ufikiaji wa bandari mbili za GPIO.

Usomaji wa rejista hutoa hadhi ya pini kwenye bandari hiyo.

Kidogo = 1> JUU kidogo = 0> CHINI

OLAT0 / OLAT1 - Pato USAJILI WA TAARIFA

Kuna rejista mbili ambazo hutoa ufikiaji wa bandari za pato la bandari hizo mbili.

IPOL0 / IPOL1 - Sajili za Polarity za Ingizo

Sajili hizi huruhusu mtumiaji kusanidi polarity ya data ya bandari ya kuingiza (GP0 na GP1).

IODIR0 / IODIR1

Kuna rejista mbili zinazodhibiti hali ya siri. (Ingiza au Pato)

Bit = 1> Pembejeo Bit = 0> Pato

INTCAP0 / INTCAP1 - Kukatiza Sajili za Kukamata

Hizi ni rejista ambazo zina dhamana ya bandari ambayo ilisababisha usumbufu.

IOCON0 / IOCON1 - Sajili ya Udhibiti wa Upanuzi wa I / O

Hii inadhibiti utendaji wa MCP23016.

Kuweka kidogo 0 (IARES> Usuluhishi wa Shughuli za Kukatiza) hudhibiti mzunguko wa sampuli ya pini za bandari ya GP.

Bit0 = 0> (chaguo-msingi) Wakati wa kugundua shughuli za bandari ni 32ms (matumizi ya nguvu ndogo)

Bit0 = 1> wakati wa kugundua shughuli kwenye bandari ni 200usec (matumizi ya nguvu zaidi)

Hatua ya 9: Muundo wa Mawasiliano

Muundo wa Mawasiliano
Muundo wa Mawasiliano

Ninaonyesha hapa darasa la Waya, ambayo ni mawasiliano ya I2C katika msingi wetu Arduino, ambayo pia inaruhusu mfurishaji kufanya kazi na Arduino Uno na Mega. Walakini, huyo wa mwisho tayari ana IO kadhaa. Tunashughulika hapa na anwani za chip, udhibiti wa ufikiaji, ambazo ni nambari za sajili, na pia data.

Hatua ya 10: Programu

Programu
Programu

Programu yetu inajumuisha kuwasiliana na ESP32 na MCP23016 ili kuwa na GPIO nyingi za kutumia. Kisha tutakuwa na kitufe na taa zingine za LED zilizounganishwa na MCP23016. Tutazidhibiti zote kwa kutumia basi ya I2C tu. Kwa hivyo, pini mbili tu za ESP32 zitatumika. Unaweza kuona mzunguko wa picha hapa chini kwenye video.

Hatua ya 11: ESP01

E001
E001

Hapa, ninaonyesha Pinout ya ESP01.

Hatua ya 12: Kuweka ESP01

Kuweka ESP01
Kuweka ESP01

Katika mfano huu, tuna GPIO0 iliyounganishwa katika SDA, na GPIO2 imeunganishwa katika SCL. Pia tuna bodi ya kupokezana, buzzer, na LED. Kwenye bandari nyingine, katika GP1.0, tuna LED moja zaidi na kontena.

Hatua ya 13: NodeMCU ESP-12E

NodeMCU ESP-12E
NodeMCU ESP-12E

Hapa, tuna Pinout ya NodeMCU ESP-12E.

Hatua ya 14: Kuweka NodeMCU ESP-12E

Kuweka NodeMCU ESP-12E
Kuweka NodeMCU ESP-12E

Katika kesi hii, tofauti pekee kutoka kwa mfano wa kwanza ni kwamba umeunganisha D1 na D2 katika SDA na SCL, mtawaliwa.

Hatua ya 15: WiFi NodeMCU-32S ESP-WROOM-32

Node ya WiFiMCU-32S ESP-WROOM-32
Node ya WiFiMCU-32S ESP-WROOM-32

Hapa kuna Pinout ya WiFi NodeMCU-32S ESP-WROOM-32.

Hatua ya 16: Kupakia WiFi NodeMCU-32S ESP-WROOM-32

Node ya Kupakia ya WiFiMCU-32S ESP-WROOM-32
Node ya Kupakia ya WiFiMCU-32S ESP-WROOM-32

Wakati huu, tofauti kuu kutoka kwa mifano mingine miwili ni kitufe, na taa tatu za kupepesa. Hapa, SDA imeunganishwa na GPIO19, wakati SCL imeunganishwa na GPIO23.

Hatua ya 17: Maktaba na Vigeuzi

Kwanza, tutajumuisha Wire.h, ambayo inahusika na mawasiliano ya i2c, na pia kuweka anwani ya i2c ya MCP23016. Ninaonyesha amri kadhaa, hata zingine ambazo hatutumii katika mradi huu.

# pamoja na // taja matumizi ya maktaba ya Wire.h. // endereço I2C do MCP23016 #fasili MCPAdress 0x20 // COMMAND BYTE KUSAJILI UHUSIANO: Jedwali: 1-3 ya Microchip MCP23016 - DS20090A // ENDEREÇOS DE REGISTRADORES #fasili GP0 0x00 // DATA PORT REGISTER 0 #fx0 GP 0 0 USAJILI WA BANDARI 1 #fafanua OLAT0 0x02 // OTPUT LATCH REGISTER 0 #fifisha OLAT1 0x03 // OTPUT LATCH REGISTER 1 #fasili IPOL0 0x04 // INPUT POLARITY PORT REGISTER 0 #fafsisha IPOL1 0x05 // INPUT P0X / I / O USAJILI WA MWELEKEZO 0 #fasili IODIR1 0x07 // I / O USAJILI WA MWELEKEZO 1 #fafanua INTCAP0 0x08 // KUSAJILI USAJILI WA KUNASA 0 #fafanua INTCAP1 0x09 // KUSAJILI KUSAJILI KWA TABIA 1 #fafanua IOCON0 0x0 JISAJILI 0 #fafanua IOCON1 0x0B // I / O KIWANGO CHA UDHIBITI WA KIWANGO 1

Hatua ya 18: Sanidi

Hapa tuna kazi za kuanzisha aina nne tofauti za wadhibiti-ndogo. Tunaangalia pia masafa, kuanzisha GPIOs, na kuweka pini. Katika Kitanzi, tunaangalia hali ya kitufe.

kuanzisha batili () {Serial.begin (9600); kuchelewesha (1000); Waya. Kuanza (19, 23); // ESP32 // Wire.anza (D2, D1); // nodemcu ESP8266 // Wire.begin (); // arduino // Waya.anza (0, 2); // ESP-01 Wire.setClock (200000); // frequencyencia // usanidi wa GPIO0 como OUTPUT (tosos pinos) sanidiPort (IODIR0, OUTPUT); // usanidi o GPIO1 como INPUT o GP1.0 na como OUTPUT os outros GP1 configurePort (IODIR1, 0x01); // seta todos os pinos do GPIO0 como LOW LOW writeBlockData (GP0, B00000000); // seta todos os pinos do GPIO1 como LOW LOW writeBlockData (GP1, B00000000); } kitanzi batili () {// verifica na o botão GP foi pressionado checkButton (GP1); } // kitanzi cha mwisho

Hatua ya 19: SanidiPort

Katika hatua hii, tunasanidi hali ya pini za GPIO na kutambua hali ya bandari.

// usanidi wa GPIO (GP0 ou GP1) // como parametro passamos: // bandari: GP0 ou GP1 // desturi: INPUT para todos kama bandari hufanya GP trabalharem como entada // OUTPUT para todos kama bandari hufanya GP trabalharem como saida / / desturi ya ustahimilivu wa 0-255 dalili ya milango ya milango (1 = Pembejeo, 0 = KIPENGELE) // ex: 0x01 ou B00000001 ou 1: indica que apenas o GPX.0 trabalhará como entada, o restando como saida void configurePort (bandari ya uint8_t, uint8_t desturi) {if (custom == INPUT) {writeBlockData (port, 0xFF); } vingine ikiwa (desturi == OUTPUT) {writeBlockData (bandari, 0x00); } mwingine {writeBlockData (bandari, desturi); }}

Hatua ya 20: AndikaBlockData & CheckButton

Hapa, tunatuma data kwa MCP23016 kupitia basi ya i2c, angalia hali ya kitufe, na uonyeshe hatua inayofuata ukizingatia hali ya kushinikizwa au la.

// envia dados para o MCP23016 através do barramento i2c // cmd: COMANDO (registrador) // data: dados (0-255) batili writeBlockData (uint8_t cmd, uint8_t data) {Wire.beginTransmission (MCPAdress); Andika waya (cmd); Andika waya (data); Uwasilishaji wa waya (); kuchelewesha (10); }

// verifica se o botão foi pressionado // parametro GP: GP0 ou GP1 batili 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 kama portas GP0 ikiwa (btn) {writeBlockData (GP0, B11111111); } // caso contrario deixa todas em estado LOW else {writeBlockData (GP0, B00000000); }}

Hatua ya 21: ReadPin & ValueFromPin

Tunashughulika hapa na usomaji wa pini maalum, na kurudi kwa thamani kidogo kwenye nafasi inayotakiwa.

// faz a leitura de um pino específico // pini: 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; Uwasilishaji wa waya (MCPAdress); Andika waya (gp); Uwasilishaji wa waya (); Ombi la Wire. Toka (MCPAdress, 1); // ler do chip 1 byte statusGP = Wire.read (); kurudi thamaniFromPin (pini, hadhiGP); } // 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) {kurudi (statusGP & (0x0001 << pini)) == 0? 0: 1; }

Hatua ya 22: Programu ya ESP8266

Kutoka hapa, tutaona jinsi mpango tuliotumia katika ESP-01 na katika nodeMCU ESP-12E iliundwa, ambayo inatuwezesha kuelewa jinsi tofauti kati yao ni ndogo.

Tutarekebisha tu mstari wa mjenzi wa mawasiliano wa i2c, ambayo ndiyo njia ya mwanzo ya kitu cha waya.

Ondoa tu laini kulingana na sahani ambayo tutakusanya.

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

Sanidi

Ona kwamba mjenzi bado ametolewa maoni. Kwa hivyo, uncomment kulingana na bodi yako (ESP-01 au nodeMCU ESP12-E).

kuanzisha batili () {Serial.begin (9600); kuchelewesha (1000); // Waya.anza (D2, D1); // nodemcu ESP8266 // Wire.anza (0, 2); // ESP-01 Waya.setClock (200000); // frequencyencia // usanidi wa GPIO0 como OUTPUT (tosos pinos) sanidiPort (IODIR0, OUTPUT); // usanidi o GPIO1 como OUTPUT (todos os pinos) configurePort (IODIR1, OUTPUT); // seta todos os pinos do GPIO0 como LOW LOW writeBlockData (GP0, B00000000); // seta todos os pinos do GPIO1 como LOW LOW writeBlockData (GP1, B00000001); }

Kitanzi

Katika kitanzi, tunabadilisha pini kila sekunde 1. Kwa hivyo, wakati pin0 ya GP0 imewashwa, pini za GP1 zimezimwa. Wakati pin0 ya GP1 imewashwa, pini za GP0 zimezimwa.

kitanzi batili () {// seta o pino 7 do GP0 como HIGH na os demais como LOW writeBlockData (GP0, B10000000); // seta todos os pinos do GPIO1 como LOW LOW writeBlockData (GP1, B00000000); kuchelewesha (1000); // seta todos os pinos do GPIO0 como LOW LOW writeBlockData (GP0, B00000000); // seta o pino 0 fanya GP1 como HIGH na os demais como LOW writeBlockData (GP1, B00000001); kuchelewesha (1000); } // kitanzi cha mwisho

Hatua ya 23: MUHIMU

Vigezo na maktaba yaliyotumiwa ni sawa na yale ya programu tuliyoifanya kwa ESP32, na pia njia za kusanidiPort na kuandikaBlockData.

Hatua ya 24: Faili

Pakua faili:

PDF

INO (ESP8266)

INO (ESP32)

Ilipendekeza: