INHOUDSOPGAWE:
- Stap 1: Inleiding
- Stap 2: Eienskappe
- Stap 3: ESP01 kan 128 GPIO's hê
- Stap 4: MCP23016
- Stap 5: KLOK
- Stap 6: Adres
- Stap 7: bevele
- Stap 8: Kategorieë:
- Stap 9: Struktuur vir kommunikasie
- Stap 10: Programmeer
- Stap 11: ESP01
- Stap 12: Montage van ESP01
- Stap 13: NodeMCU ESP-12E
- Stap 14: Monteer NodeMCU ESP-12E
- Stap 15: WiFi NodeMCU-32S ESP-WROOM-32
- Stap 16: WiFi-monteringsknooppuntMCU-32S ESP-WROOM-32
- Stap 17: Biblioteke en veranderlikes
- Stap 18: Opstel
- Stap 19: ConfigurePort
- Stap 20: WriteBlockData & CheckButton
- Stap 21: ReadPin & ValueFromPin
- Stap 22: ESP8266 -program
- Stap 23: BELANGRIK
- Stap 24: lêers
Video: IO Expander vir ESP32, ESP8266 en Arduino: 24 stappe
2024 Outeur: John Day | [email protected]. Laas verander: 2024-01-30 07:27
Wil u die IO's van u ESP32, ESP8266 of Arduino uitbrei? En het u al gedink aan die moontlikheid van 16 nuwe GPIO's wat met die I2C -bus beheer kan word? Wel, vandag gaan ek u voorstel aan die GPIO -uitbreider MCP23016. Ek sal u ook wys hoe u 'n mikrobeheerder met die MCP23016 kan kommunikeer. Ek sal ook praat oor die skep van 'n program waar ons slegs 2 penne van hierdie mikrokontroleerder sal gebruik om met die uitbreider te kommunikeer. Ons gebruik dit om die LED's en die knoppie te beheer.
Stap 1: Inleiding
Die MCP23016 -toestel bied 16 bisse vir GPIO -uitbreiding met behulp van die I2C -bus. Elke bietjie kan afsonderlik gekonfigureer word (invoer of uitset).
Die MCP23016 bestaan uit veelvuldige 8-bis-instellings vir invoer-, uitvoer- en polariteitskeuse.
Die uitbreidings bied 'n eenvoudige oplossing as die IO's nodig is vir skakelaars, sensors, knoppies en LED's, onder andere voorbeelde.
Stap 2: Eienskappe
16 Invoer / Uitgang penne (16 ingang standaard)
Vinnige I2C-busklokfrekwensie (0-400 kbits/s)
Drie hardeware -adrespenne laat tot agt toestelle gebruik
Onderbreek Port Capture Recorder
Polariteitsomkeerregister om die polariteit van die invoerpoortdata in te stel
Versoenbaar met die meeste mikrobeheerders
Stap 3: ESP01 kan 128 GPIO's hê
'N Voorbeeld wat die omvang van hierdie uitbreiding aandui, is die gebruik daarvan met ESP01, wat met slegs twee IOS verbind kan word met tot agt uitbreidings en bereik 128 GPIO's.
Stap 4: MCP23016
Hier het ons die skema van die expander, wat twee groepe van agt bisse het. Dit sorg vir 'n totaal van 16 hawens. Benewens 'n onderbrekingspen, het dit ook die CLK -pen, wat die kapasitor en die weerstand verbind, wat intern verbind is in 'n logiese poort. Dit is om die klok te vorm, met die idee van 'n kristal ossillator, wat 'n klok van 1 MHz benodig. Die TP -pen word gebruik om die klok te meet. Spelde A0, A1 en A2 is binêre adresse.
Stap 5: KLOK
Die MCP23016 gebruik dus 'n eksterne RC -stroombaan om die spoed van die interne klok te bepaal. 'N Interne klok van 1 MHz word benodig (gewoonlik) om die toestel behoorlik te laat werk. Die interne klok kan op die TP -pen gemeet word. Die aanbevole waardes vir REXT en CEXT word hieronder getoon.
Stap 6: Adres
Om die adres van die MCP23016 te definieer, gebruik ons dan penne A0, A1 en A2. Laat hulle net op HOOG of LAAG vir die adresverandering.
Die adres sal soos volg gevorm word:
MCP_Address = 20 + (A0 A1 A2)
Waar A0 A1 A2 HIGH / LOW waardes kan neem, vorm dit 'n binêre getal van 0 tot 7.
Byvoorbeeld:
A0> GND, A1> GND, A2> GND (beteken 000, dan 20 + 0 = 20)
Of anders, A0> HOOG, A1> GND, A2> HOOG (beteken 101, dan 20 + 5 = 25)
Stap 7: bevele
Hieronder is 'n tabel met die opdragte vir kommunikasie. Kom ons gebruik GP0 en GP1, sowel as IODIR0 en IODIR1.
Stap 8: Kategorieë:
GP0 / GP1 - Data Port Registers
Daar is twee registers wat toegang tot die twee GPIO -poorte bied.
Die registerlesing gee die status van die penne op die poort.
Bit = 1> HOOG Bit = 0> LAAG
OLAT0 / OLAT1 - Uitvoer LACTCH REGISTRES
Daar is twee registers wat toegang bied tot die uitvoerpoort van die twee poorte.
IPOL0 / IPOL1 - Invoerpolariteitsregisters
Hierdie registers stel die gebruiker in staat om die polariteit van die invoerpoortdata (GP0 en GP1) op te stel.
IODIR0 / IODIR1
Daar is twee registers wat die penmodus beheer. (Invoer of uitvoer)
Bit = 1> INPUT Bit = 0> UITGANG
INTCAP0 / INTCAP1 - Onderbreek vangregisters
Dit is registers wat die waarde bevat van die poort wat die onderbreking gegenereer het.
IOCON0 / IOCON1 - I / O Expander Control Register
Dit beheer die funksionaliteit van die MCP23016.
Die stel van bits 0 (IARES> Onderbreking van aktiwiteitsresolusie) beheer die bemonsteringsfrekwensie van die GP -poortpenne.
Bit0 = 0> (standaard) Maksimum opsporingstyd vir poortaktiwiteit is 32 ms (lae kragverbruik)
Bit0 = 1> maksimum aktiwiteit opsporingstyd op die poort is 200 usec (hoër kragverbruik)
Stap 9: Struktuur vir kommunikasie
Ek wys hier die Wire -klas, wat die I2C -kommunikasie in ons kern -Arduino is, wat die expander ook in staat stel om met die Arduino Uno en Mega te werk. Laasgenoemde het egter reeds verskeie IO's. Ons behandel die adresse van die chip, die toegangsbeheer, wat die kodes van die registers is, sowel as die data.
Stap 10: Programmeer
Ons program bestaan uit die kommunikasie van die ESP32 met die MCP23016 om meer GPIO's te gebruik. Dan het ons 'n knoppie en 'n paar LED's wat aan die MCP23016 gekoppel is. Ons beheer almal met slegs die I2C -bus. Daar sal dus slegs twee ESP32 -penne gebruik word. U kan die prentkring hieronder in die video sien.
Stap 11: ESP01
Hier wys ek die Pinout van ESP01.
Stap 12: Montage van ESP01
In hierdie voorbeeld het ons die GPIO0 gekoppel in die SDA en die GPIO2 in die SCL. Ons het ook 'n aflosbord, 'n zoemer en 'n LED. Op die ander poort, in GP1.0, het ons nog een LED met 'n weerstand.
Stap 13: NodeMCU ESP-12E
Hier het ons die Pinout van die NodeMCU ESP-12E.
Stap 14: Monteer NodeMCU ESP-12E
In hierdie geval is die enigste verskil van die eerste voorbeeld dat u D1 en D2 in die SDA en SCL onderskeidelik verbind het.
Stap 15: WiFi NodeMCU-32S ESP-WROOM-32
Hier is die pinout van die WiFi NodeMCU-32S ESP-WROOM-32.
Stap 16: WiFi-monteringsknooppuntMCU-32S ESP-WROOM-32
Hierdie keer is die belangrikste verskil van die ander twee voorbeelde die knoppie en die drie knipperende LED's. Hier is die SDA gekoppel aan die GPIO19, terwyl die SCL aan die GPIO23 gekoppel is.
Stap 17: Biblioteke en veranderlikes
Eerstens sluit ons Wire.h in, wat verantwoordelik is vir i2c -kommunikasie, sowel as die instelling van die i2c -adres van MCP23016. Ek wys verskeie opdragte, selfs sommige wat ons nie in hierdie projek gebruik nie.
#include // spesifiseer die gebruik van die Wire.h -biblioteek. // endereço I2C do MCP23016 #define MCPAddress 0x20 // COMMAND BYTE TO REGISTER RELATIONSHIP: Table: 1-3 of Microchip MCP23016 - DS20090A // ENDEREÇOS DE REGISTRADORES #define GP0 0x00 // DATA PORT REGISTER 0 #define GP1 PORT REGISTER 1 #defineer OLAT0 0x02 // OUTPUT LATCH REGISTER 0 #define OLAT1 0x03 // OUTPUT LATCH REGISTER 1 #definieer IPOL0 0x04 // INPUT POLARITY PORT REGISTER 0 #definieer IPOL1 0x05 // INPUT POLARITY #INPUT 0 /I/O RIGTINGSREGISTER 0 #definieer IODIR1 0x07 // I/O RIGTINGSREGISTER 1 #definieer INTCAP0 0x08 // ONDERBREEK VASTE REGISTER 0 #definieer INTCAP1 0x09 // ONDERBREK KAPTUUR REGISTER 1 #definieer IOCON0 0x0A // REGISTREER 0 #definieer IOCON1 0x0B // I/O UITBREIDERBEHEER REGISTREER 1
Stap 18: Opstel
Hier het ons die funksies om vier verskillende tipes mikrobeheerders te initialiseer. Ons kyk ook na die frekwensie, stel die GPIO's op en stel die penne in. In die lus kyk ons na die status van die knoppie.
ongeldige opstelling () {Serial.begin (9600); vertraging (1000); Wire.begin (19, 23); // ESP32 // Wire.begin (D2, D1); // nodemcu ESP8266 // Wire.begin (); // arduino // Wire.begin (0, 2); // ESP-01 Wire.setClock (200000); // frekwensie // konfigurasie van GPIO0 as OUTPUT (todos os pinos) configurePort (IODIR0, OUTPUT); // configura o GPIO1 como INPUT o GP1.0 e como OUTPUT os outros GP1 configurePort (IODIR1, 0x01); // stel ons ook in staat om GPIO0 te skryf met LOW writeBlockData (GP0, B00000000); // stel ons ook in staat om GPIO1 as LOW writeBlockData (GP1, B00000000) te gebruik; } void loop () {// verifica e o botão GP foi pressionado checkButton (GP1); } // eindlus
Stap 19: ConfigurePort
In hierdie stap stel ons die modus van die GPIO -penne op en identifiseer die modus van die poorte.
// 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/ / aangepaste waarde van 0-255 aanduidings vir portas (1 = INVOER, 0 = UITGANG) // bv: 0x01 of B00000001 of 1: aanduiding van die GPX.0-ingang, of herstel van 'n ongeldige configurePort (uint8_t -poort, uint8_t -aangepaste) {if (custom == INPUT) {writeBlockData (poort, 0xFF); } anders as (custom == OUTPUT) {writeBlockData (poort, 0x00); } anders {writeBlockData (poort, pasgemaak); }}
Stap 20: WriteBlockData & CheckButton
Hier stuur ons data via die i2c -bus na die MCP23016, kyk na die status van die knoppie en dui die volgende stap aan, met inagneming van die toestand van druk of nie.
// envia dados para o MCP23016 através do barramento i2c // cmd: COMANDO (registrateur) // data: dados (0-255) void writeBlockData (uint8_t cmd, uint8_t data) {Wire.beginTransmission (MCPAddress); Draad.skryf (cmd); Wire.write (data); Wire.endTransmission (); vertraging (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 for HIGH as portas GP0 if (btn) {writeBlockData (GP0, B11111111); } // caso contrario deixa todas em estado LOW else {writeBlockData (GP0, B00000000); }}
Stap 21: ReadPin & ValueFromPin
Ons gaan hier oor die lees van 'n spesifieke pen en die terugkeer van die bitwaarde na die gewenste posisie.
// 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 (MCPAddress); Wire.write (gp); Wire.endTransmission (); Wire.requestFrom (MCPAddress, 1); // ler do chip 1 byte statusGP = Wire.read (); return valueFromPin (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; }
Stap 22: ESP8266 -program
Van hier af sal ons sien hoe die program wat ons in ESP-01 en in die nodeMCU ESP-12E gebruik het, geskep is, waarmee ons kan verstaan hoe die verskille tussen hulle minimaal is.
Ons sal slegs die lyn van die i2c -kommunikasie -konstruktor verander, wat die beginmetode van die Wire -voorwerp is.
Los die lyn net op volgens die bord wat ons gaan saamstel.
// Wire.begin (D2, D1); // nodemcu ESP8266 // Wire.begin (0, 2); // ESP-01
Stel op
Let op dat die bouer steeds kommentaar lewer. Laat u kommentaar dus nie volgens u raad nie (ESP-01 of nodeMCU ESP12-E).
ongeldige opstelling () {Serial.begin (9600); vertraging (1000); // Wire.begin (D2, D1); // nodemcu ESP8266 // Wire.begin (0, 2); // ESP-01 Wire.setClock (200000); // frekwensie // konfigurasie van GPIO0 as OUTPUT (todos os pinos) configurePort (IODIR0, OUTPUT); // konfigurasie van GPIO1 as OUTPUT (to os os pinos) configurePort (IODIR1, OUTPUT); // stel ons ook in staat om GPIO0 te skryf met LOW writeBlockData (GP0, B00000000); // stel ons ook in staat om GPIO1 as LOW writeBlockData (GP1, B00000001) te gebruik; }
Lus
In die lus verander ons die penne elke 1 sekonde. As pin0 van GP0 dus aan is, is die penne van GP1 af. As pin0 van GP1 aan is, is die GP0 -penne af.
void loop () {// seta o pino 7 do GP0 como HIGH e os demais como LOW writeBlockData (GP0, B10000000); // stel ons ook in staat om GPIO1 as LOW writeBlockData (GP1, B00000000) te gebruik; vertraging (1000); // stel ons ook in staat om GPIO0 te skryf met LOW writeBlockData (GP0, B00000000); // seta o pino 0 do GP1 como HIGH e os demais como LOW writeBlockData (GP1, B00000001); vertraging (1000); } // eindlus
Stap 23: BELANGRIK
Die veranderlikes en biblioteek wat gebruik word, is dieselfde as dié van die program wat ons vir ESP32 gedoen het, sowel as die configurePort- en writeBlockData -metodes.
Stap 24: lêers
Laai die lêers af:
INO (ESP8266)
INO (ESP32)
Aanbeveel:
Arduino motorwaarskuwingstelsel vir omgekeerde parkering - Stap vir stap: 4 stappe
Arduino -waarskuwingstelsel vir omgekeerde parkeerterrein | Stap vir stap: In hierdie projek ontwerp ek 'n eenvoudige Arduino Car Reverse Parking Sensor Circuit met behulp van Arduino UNO en HC-SR04 Ultrasonic Sensor. Hierdie Arduino -gebaseerde motor -omkeerwaarskuwingstelsel kan gebruik word vir 'n outonome navigasie, robotafstand en ander reeks
MicroPython vir goedkoop $ 3 ESP8266 WeMos D1 Mini vir 2x temperatuurregistrasie, wifi en mobiele statistieke: 4 stappe
MicroPython op goedkoop $ 3 ESP8266 WeMos D1 Mini vir 2x temperatuurregistrasie, wifi en mobiele statistieke: Met klein goedkoop ESP8266 -chip / toestel kan u temperatuurdata buite, in die kamer, kweekhuis, laboratorium, koelkamer of op enige ander plek heeltemal gratis aanmeld. Hierdie voorbeeld sal ons gebruik om die verkoelingstemperatuur binne en buite aan te meld
3.3V Mod vir ultrasoniese sensors (berei HC-SR04 voor vir 3.3V Logic op ESP32/ESP8266, Particle Photon, ens.): 4 stappe
3.3V Mod vir ultrasoniese sensors (berei HC-SR04 voor vir 3.3V Logic op ESP32/ESP8266, Particle Photon, ens.): TL; DR: Sny op die sensor die spoor na die Echo-pen en koppel dit dan weer met 'n spanningsverdeler (Echo trace -> 2.7kΩ -> Echo pin -> 4.7kΩ -> GND). Bewerk: Daar was 'n mate van debat oor of die ESP8266 eintlik 5V -verdraagsaam is op GPIO in
NODEMCU LUA ESP8266 Met MCP23008 8 Bit Port Expander IC: 6 stappe
NODEMCU LUA ESP8266 Met MCP23008 8 Bit Port Expander IC: Die MCP23008 is 'n 8-bit I/O Expander met Serial Interface en werk tussen 1.8 en 5.5 volt, en is dus ideaal vir die ESP8266, Arduino, Raspberry Pi, PIC Chips en meer. As u my ander Instructable op die MCP23017 gesien het, wonder u miskien
NODEMCU LUA ESP8266 Met MCP23017 16 Bit Port Expander IC: 6 stappe (met foto's)
NODEMCU LUA ESP8266 Met MCP23017 16 Bit Port Expander IC: Die MCP23017 is 'n relatief maklike IC om 'n bord voor te maak, aangesien dit poort A en B aan weerskante van die chip het en die penne in opeenvolgende volgorde is. Net so is die I2C -adresbus Daar is ook 2 penne op hierdie IC wat nog nie gebruik word nie