Indholdsfortegnelse:
- Trin 1: Introduktion
- Trin 2: Karakteristika
- Trin 3: ESP01 kan have 128 GPIO'er
- Trin 4: MCP23016
- Trin 5: UR
- Trin 6: Adresse
- Trin 7: Kommandoer
- Trin 8: Kategorier:
- Trin 9: Struktur for kommunikation
- Trin 10: Programmer
- Trin 11: ESP01
- Trin 12: Montering af ESP01
- Trin 13: NodeMCU ESP-12E
- Trin 14: Montering af NodeMCU ESP-12E
- Trin 15: WiFi NodeMCU-32S ESP-WROOM-32
- Trin 16: WiFi-monteringsnodeMCU-32S ESP-WROOM-32
- Trin 17: Biblioteker og variabler
- Trin 18: Opsætning
- Trin 19: ConfigurePort
- Trin 20: WriteBlockData & CheckButton
- Trin 21: ReadPin & ValueFromPin
- Trin 22: ESP8266 -program
- Trin 23: VIGTIGT
- Trin 24: Filer
Video: IO Expander til ESP32, ESP8266 og Arduino: 24 trin
2024 Forfatter: John Day | [email protected]. Sidst ændret: 2024-01-30 08:29
Vil du gerne udvide IO'erne for din ESP32, ESP8266 eller Arduino? Og har du tænkt på muligheden for 16 nye GPIO'er, der kan styres ved hjælp af I2C -bussen? Nå i dag vil jeg præsentere dig for GPIO -ekspander MCP23016. Jeg viser dig også, hvordan du kommunikerer en mikrokontroller med MCP23016. Jeg vil også tale om at oprette et program, hvor vi kun bruger 2 pins af denne mikrokontroller til at kommunikere med ekspanderen. Vi bruger disse til at styre lysdioderne og knappen.
Trin 1: Introduktion
MCP23016 -enheden giver 16 bits til GPIO -udvidelse ved hjælp af I2C -bussen. Hver bit kan konfigureres individuelt (input eller output).
MCP23016 består af flere 8-bit indstillinger til input, output og polaritetsvalg.
Udviderne giver en enkel løsning, når IO'erne er nødvendige for kontakter, sensorer, knapper og lysdioder, blandt andre eksempler.
Trin 2: Karakteristika
16 input / output pins (16 input standard)
Hurtig I2C busurfrekvens (0-400 kbits/s)
Tre hardware -adresse -pins gør det muligt at bruge op til otte enheder
Afbryd Port Capture Recorder
Polaritetsomvendt register til indstilling af polariteten af inputportdataene
Kompatibel med de fleste mikrokontrollere
Trin 3: ESP01 kan have 128 GPIO'er
Et eksempel, der viser størrelsen på denne ekspander, er dens anvendelse med ESP01, som kan tilsluttes op til otte udvidere med kun to IOS og når 128 GPIO'er.
Trin 4: MCP23016
Her har vi skematikken over ekspanderen, som har to grupper på otte bits. Dette giver i alt 16 havne. Ud over en afbrydelsesstift har den CLK -stiften, som forbinder kondensatoren og modstanden, som er internt forbundet i en logisk port. Dette er for at danne uret ved hjælp af ideen om en krystaloscillator, som har brug for 1MHz ur. TP -stiften bruges til at måle uret. Stifterne A0, A1 og A2 er binære adresser.
Trin 5: UR
MCP23016 bruger derfor et eksternt RC -kredsløb til at bestemme hastigheden på det interne ur. Et internt ur på 1 MHz er påkrævet (normalt) for at enheden fungerer korrekt. Det interne ur kan måles på TP -stiften. De anbefalede værdier for REXT og CEXT er vist nedenfor.
Trin 6: Adresse
For at definere adressen på MCP23016 bruger vi derefter benene A0, A1 og A2. Bare lad dem stå på HIGH eller LOW for adresseændringen.
Adressen dannes således:
MCP_Address = 20 + (A0 A1 A2)
Hvor A0 A1 A2 kan tage HIGH / LOW værdier, danner dette et binært tal fra 0 til 7.
For eksempel:
A0> GND, A1> GND, A2> GND (betyder 000, derefter 20 + 0 = 20)
Ellers, A0> HØJ, A1> GND, A2> HØJ (betyder 101, derefter 20 + 5 = 25)
Trin 7: Kommandoer
Nedenfor er en tabel med kommandoer til kommunikation. Lad os bruge GP0 og GP1, samt IODIR0 og IODIR1.
Trin 8: Kategorier:
GP0 / GP1 - Dataportregistre
Der er to registre, der giver adgang til de to GPIO -porte.
Registerlæsningen giver status for benene på den pågældende port.
Bit = 1> HIGH Bit = 0> LAV
OLAT0 / OLAT1 - Output LACTCH REGISTRE
Der er to registre, der giver adgang til outputporte på de to porte.
IPOL0 / IPOL1 - Inputpolaritetsregistre
Disse registre giver brugeren mulighed for at konfigurere polariteten af inputportdataene (GP0 og GP1).
IODIR0 / IODIR1
Der er to registre, der styrer pin -tilstanden. (Input eller Output)
Bit = 1> INPUT Bit = 0> OUTPUT
INTCAP0 / INTCAP1 - Afbryd registreringsregistre
Disse er registre, der indeholder værdien af den port, der genererede afbrydelsen.
IOCON0 / IOCON1 - I / O Expander Control Register
Dette styrer funktionaliteten af MCP23016.
Indstillingsbit 0 (IARES> Afbryd aktivitetsopløsning) styrer samplingsfrekvensen for GP -portstifterne.
Bit0 = 0> (standard) Maksimal registreringstid for portaktivitet er 32 ms (lavt strømforbrug)
Bit0 = 1> maksimal registreringstid for aktivitet på porten er 200usec (højere strømforbrug)
Trin 9: Struktur for kommunikation
Jeg viser her Wire -klassen, som er I2C -kommunikationen i vores kerne -Arduino, som også giver ekspanderen mulighed for at arbejde med Arduino Uno og Mega. Sidstnævnte har imidlertid allerede flere IO'er. Vi behandler her adresserne på chippen, adgangskontrollen, som er registrenes koder samt dataene.
Trin 10: Programmer
Vores program består i at kommunikere ESP32 med MCP23016 for at have flere GPIO'er at bruge. Vi vil derefter have en knap og nogle lysdioder forbundet til MCP23016. Vi kontrollerer dem alle kun ved hjælp af I2C -bussen. Således vil der kun blive brugt to ESP32 -ben. Du kan se billedkredsløbet herunder i videoen.
Trin 11: ESP01
Her viser jeg Pinout af ESP01.
Trin 12: Montering af ESP01
I dette eksempel har vi GPIO0 forbundet i SDA og GPIO2 tilsluttet i SCL. Vi har også et relæbræt, en summer og en LED. På den anden port, i GP1.0, har vi endnu en LED med en modstand.
Trin 13: NodeMCU ESP-12E
Her har vi Pinout af NodeMCU ESP-12E.
Trin 14: Montering af NodeMCU ESP-12E
I dette tilfælde er den eneste forskel fra det første eksempel, at du har tilsluttet D1 og D2 i henholdsvis SDA og SCL.
Trin 15: WiFi NodeMCU-32S ESP-WROOM-32
Her er Pinout af WiFi NodeMCU-32S ESP-WROOM-32.
Trin 16: WiFi-monteringsnodeMCU-32S ESP-WROOM-32
Denne gang er den største forskel fra de to andre eksempler knappen og de tre blinkende lysdioder. Her er SDA forbundet til GPIO19, mens SCL er forbundet til GPIO23.
Trin 17: Biblioteker og variabler
Først inkluderer vi Wire.h, som er ansvarlig for i2c -kommunikation, samt indstilling af i2c -adressen på MCP23016. Jeg viser flere kommandoer, selv nogle, som vi ikke bruger i dette projekt.
#include // angiv brug af Wire.h bibliotek. // endereço I2C do MCP23016 #define MCPAddress 0x20 // COMMAND BYTE TIL REGISTER RELATIONS: Table: 1-3 of Microchip MCP23016 - DS20090A // ENDEREÇOS DE REGISTRADORES #define GP0 0x00 // DATA PORT REGISTER 0 #define GP1 0 PORT REGISTER 1 #define OLAT0 0x02 // OUTPUT LATCH REGISTER 0 #define OLAT1 0x03 // OUTPUT LATCH REGISTER 1 #define IPOL0 0x04 // INPUT POLARITY PORT REGISTER 0 #define IPOL1 0x05 // INPUT POLARITY #INfUT POLARITY /I/O DIRECTION REGISTER 0 #define IODIR1 0x07 // I/O DIRECTION REGISTER 1 #define INTCAP0 0x08 // INTERRUPT CAPTURE REGISTER 0 #define INTCAP1 0x09 // INTERRUPT CAPTURE REGISTER 1 #define IOCON0 0x0A // REGISTRE 0 #define IOCON1 0x0B // I/O EXPANDER CONTROL REGISTER 1
Trin 18: Opsætning
Her har vi funktionerne til at initialisere fire forskellige typer mikrokontrollere. Vi kontrollerer også frekvensen, konfigurerer GPIO'erne og sætter stifterne. I Loop kontrollerer vi status på knappen.
ugyldig opsætning () {Serial.begin (9600); forsinkelse (1000); Wire.begin (19, 23); // ESP32 // Wire.begin (D2, D1); // nodemcu ESP8266 // Wire.begin (); // arduino // Wire.begin (0, 2); // ESP-01 Wire.setClock (200000); // frekvens // konfiguration af GPIO0 som OUTPUT (todos os pinos) configurePort (IODIR0, OUTPUT); // konfigura o GPIO1 como INPUT o GP1.0 e como OUTPUT os outros GP1 configurePort (IODIR1, 0x01); // seta todos os pinos gør GPIO0 som LOW writeBlockData (GP0, B00000000); // seta todos os pinos gør GPIO1 som LOW writeBlockData (GP1, B00000000); } void loop () {// verifica e o botão GP foi pressionado checkButton (GP1); } // slutsløjfe
Trin 19: ConfigurePort
I dette trin konfigurerer vi tilstanden for GPIO -benene og identificerer portens tilstand.
// konfigura 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/ / brugerdefineret værdi for 0-255 indikationer for modas das portas (1 = INPUT, 0 = OUTPUT) // ex: 0x01 ou B00000001 ou 1: indica que apenas o GPX.0 trabalhará como entrada, o restando como saida void configurePort (uint8_t port, uint8_t brugerdefineret) {if (custom == INPUT) {writeBlockData (port, 0xFF); } ellers hvis (tilpasset == OUTPUT) {writeBlockData (port, 0x00); } ellers {writeBlockData (port, brugerdefineret); }}
Trin 20: WriteBlockData & CheckButton
Her sender vi data til MCP23016 gennem i2c -bussen, kontrollerer status for knappen og angiver det næste trin, samtidig med at der tages hensyn til tilstanden for at blive trykket eller ej.
// envia dados para o MCP23016 através do barramento i2c // cmd: COMANDO (registrator) // data: dados (0-255) void writeBlockData (uint8_t cmd, uint8_t data) {Wire.beginTransmission (MCPAddress); Wire.write (cmd); Wire.write (data); Wire.endTransmission (); forsinkelse (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); }}
Trin 21: ReadPin & ValueFromPin
Vi beskæftiger os her med aflæsning af en bestemt pin og tilbagevenden af bitværdien til den ønskede position.
// 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; }
Trin 22: ESP8266 -program
Herfra vil vi se, hvordan det program, vi brugte i ESP-01 og i nodeMCU ESP-12E blev oprettet, hvilket giver os mulighed for at forstå, hvordan forskelle mellem dem er minimale.
Vi vil kun ændre linjen i i2c -kommunikationskonstruktoren, som er begyndelsesmetoden for Wire -objektet.
Bare tag kommentaren ud af linjen i henhold til den plade, vi skal kompilere.
// Wire.begin (D2, D1); // nodemcu ESP8266 // Wire.begin (0, 2); // ESP-01
Opsætning
Bemærk, at bygherren stadig kommenteres. Derfor skal du ikke kommentere i henhold til dit board (ESP-01 eller nodeMCU ESP12-E).
ugyldig opsætning () {Serial.begin (9600); forsinkelse (1000); // Wire.begin (D2, D1); // nodemcu ESP8266 // Wire.begin (0, 2); // ESP-01 Wire.setClock (200000); // frekvens // konfiguration af GPIO0 som OUTPUT (todos os pinos) configurePort (IODIR0, OUTPUT); // konfiguration af GPIO1 som OUTPUT (todos os pinos) configurePort (IODIR1, OUTPUT); // sætter os også på, at GPIO0 kan lave LOW writeBlockData (GP0, B00000000); // seta todos os pinos gør GPIO1 som LOW writeBlockData (GP1, B00000001); }
Sløjfe
I sløjfen skifter vi stifterne hvert 1. sekund. Når pin0 på GP0 er tændt, er benene på GP1 således slukket. Når pin0 på GP1 er tændt, er GP0 -benene slukket.
void loop () {// seta o pino 7 do GP0 como HIGH e os demais como LOW writeBlockData (GP0, B10000000); // seta todos os pinos gør GPIO1 som LOW writeBlockData (GP1, B00000000); forsinkelse (1000); // sætter os også på, at GPIO0 kan lave LOW writeBlockData (GP0, B00000000); // seta o pino 0 do GP1 como HIGH e os demais como LOW writeBlockData (GP1, B00000001); forsinkelse (1000); } // slutsløjfe
Trin 23: VIGTIGT
De anvendte variabler og bibliotek er de samme som for det program, vi lavede for ESP32, samt metoderne configurePort og writeBlockData.
Trin 24: Filer
Download filerne:
INO (ESP8266)
INO (ESP32)
Anbefalede:
LoRa 3 km til 8 km trådløs kommunikation med lavpris E32 (sx1278/sx1276) enhed til Arduino, Esp8266 eller Esp32: 15 trin
LoRa 3 til 8 km trådløs kommunikation med lavpris E32 (sx1278/sx1276) enhed til Arduino, Esp8266 eller Esp32: Jeg opretter et bibliotek til at styre EBYTE E32 baseret på Semtech -serien af LoRa -enheder, meget kraftfuld, enkel og billig enhed.Du kan finde 3Km version her, 8Km version herDe kan arbejde over en afstand på 3000m til 8000m, og de har en masse funktioner og
LoRa Messenger til to enheder til distancer Op til 8 km: 7 trin
LoRa Messenger til to enheder til afstande Op til 8 km: Tilslut projektet til din bærbare computer eller telefon, og chat derefter mellem enhederne uden internet eller SMS ved hjælp af bare LoRa.Hey, hvad sker der gutter? Akarsh her fra CETech. I dag skal vi lave et projekt, der kan forbindes til din smartphone eller en hvilken som helst
1A til 40A nuværende BOOST -konverter til op til 1000W DC -motor: 3 trin
1A til 40A Current BOOST-konverter til op til 1000W DC-motor: Hej! I denne video lærer du, hvordan du laver et strømforstærkerkredsløb til dine høj ampere DC-motorer op til 1000W og 40 ampere med transistorer og en center-tap-transformer. Selvom, strømmen ved udgangen er meget høj, men spændingen bliver r
3.3V Mod til ultralydssensorer (forbered HC-SR04 til 3.3V Logic på ESP32/ESP8266, Particle Photon, etc.): 4 trin
3.3V Mod til ultralydssensorer (forbered HC-SR04 til 3.3V Logic på ESP32/ESP8266, Particle Photon, etc.): TL; DR: På sensoren skal du afskære sporet til Echo-stiften, og derefter tilslutte den igen ved hjælp af en spændingsdeler (Echo trace -> 2.7kΩ -> Echo pin -> 4.7kΩ -> GND). Rediger: Der har været en vis debat om, hvorvidt ESP8266 faktisk er 5V -tolerant på GPIO i
Overbevis dig selv om bare at bruge en 12V-til-AC-line inverter til LED-lysstrenge i stedet for at genoprette dem til 12V .: 3 trin
Overbevis dig selv om bare at bruge en 12V-til-AC-line inverter til LED-lysstrenge i stedet for at genoprette dem til 12V .: Min plan var enkel. Jeg ville skære en væg-drevet LED-lysstreng i stykker og derefter genkoble den til at køre 12 volt. Alternativet var at bruge en strømomformer, men vi ved alle, at de er frygtelig ineffektive, ikke? Ret? Eller er de det?