Πίνακας περιεχομένων:

IO Expander για ESP32, ESP8266 και Arduino: 24 βήματα
IO Expander για ESP32, ESP8266 και Arduino: 24 βήματα

Βίντεο: IO Expander για ESP32, ESP8266 και Arduino: 24 βήματα

Βίντεο: IO Expander για ESP32, ESP8266 και Arduino: 24 βήματα
Βίντεο: LDmicro 14: ЖК-дисплей I2C и часы реального времени DS3231 (программирование лестничной схемы ПЛК микроконтроллера с помощью LDmicro) 2024, Νοέμβριος
Anonim
Image
Image
Εισαγωγή
Εισαγωγή

Θέλετε να επεκτείνετε τα IO του ESP32, ESP8266 ή του Arduino; Και έχετε σκεφτεί τη δυνατότητα 16 νέων GPIO που μπορούν να ελεγχθούν χρησιμοποιώντας το δίαυλο I2C; Λοιπόν σήμερα, θα σας παρουσιάσω το GPIO Expander MCP23016. Επίσης, θα σας δείξω πώς να επικοινωνείτε με έναν μικροελεγκτή με το MCP23016. Θα μιλήσω επίσης για τη δημιουργία ενός προγράμματος όπου θα χρησιμοποιήσουμε μόνο 2 ακίδες αυτού του μικροελεγκτή για να επικοινωνήσουμε με τον διαστολέα. Θα τα χρησιμοποιήσουμε για τον έλεγχο των LED και του κουμπιού.

Βήμα 1: Εισαγωγή

Η συσκευή MCP23016 παρέχει 16 bit για επέκταση GPIO χρησιμοποιώντας το δίαυλο I2C. Κάθε bit μπορεί να ρυθμιστεί ξεχωριστά (είσοδος ή έξοδος).

Το MCP23016 αποτελείται από πολλαπλές ρυθμίσεις 8-bit για είσοδο, έξοδο και επιλογή πολικότητας.

Οι διαστολείς παρέχουν μια απλή λύση όταν χρειάζονται IO για διακόπτες, αισθητήρες, κουμπιά και LED, μεταξύ άλλων παραδειγμάτων.

Βήμα 2: Χαρακτηριστικά

16 ακίδες εισόδου / εξόδου (16 πρότυπα εισόδου)

Γρήγορη συχνότητα ρολογιού διαύλου I2C (0-400 kbits/s)

Τρεις καρφίτσες διευθύνσεων υλικού επιτρέπουν τη χρήση έως και οκτώ συσκευών

Διακοπή εγγραφής λήψης θύρας

Μητρώο αντιστροφής πολικότητας για ρύθμιση της πολικότητας των δεδομένων της θύρας εισόδου

Συμβατό με τους περισσότερους μικροελεγκτές

Βήμα 3: Το ESP01 μπορεί να έχει 128 GPIO

Το ESP01 μπορεί να έχει 128 GPIO!
Το ESP01 μπορεί να έχει 128 GPIO!

Ένα παράδειγμα που δείχνει το μέγεθος αυτού του διαστολέα είναι η χρήση του με το ESP01, το οποίο μπορεί να συνδεθεί με έως και οκτώ επεκτάσεις με μόνο δύο IOS, φτάνοντας τα 128 GPIO.

Βήμα 4: MCP23016

MCP23016
MCP23016

Εδώ, έχουμε το σχηματικό σχήμα του διαστολέα, το οποίο έχει δύο ομάδες οκτώ δυαδικών ψηφίων. Αυτό σημαίνει συνολικά 16 θύρες. Εκτός από έναν πείρο διακοπής, έχει τον πείρο CLK, ο οποίος συνδέει τον πυκνωτή και την αντίσταση, οι οποίες συνδέονται εσωτερικά σε μια λογική θύρα. Αυτό γίνεται για να σχηματίσει το ρολόι, χρησιμοποιώντας την ιδέα ενός κρυσταλλικού ταλαντωτή, ο οποίος χρειάζεται ρολόι 1MHz. Ο πείρος TP χρησιμοποιείται για τη μέτρηση του ρολογιού. Οι ακίδες A0, A1 και A2 είναι δυαδικές διευθύνσεις.

Βήμα 5: ΡΟΛΟΙ

ΡΟΛΟΪ
ΡΟΛΟΪ
ΡΟΛΟΪ
ΡΟΛΟΪ

Το MCP23016 χρησιμοποιεί επομένως ένα εξωτερικό κύκλωμα RC για να καθορίσει την ταχύτητα του εσωτερικού ρολογιού. Απαιτείται ένα εσωτερικό ρολόι 1 MHz (συνήθως) για τη σωστή λειτουργία της συσκευής. Το εσωτερικό ρολόι μπορεί να μετρηθεί στην ακίδα TP. Οι προτεινόμενες τιμές για REXT και CEXT φαίνονται παρακάτω.

Βήμα 6: Διεύθυνση

Για να ορίσουμε τη διεύθυνση του MCP23016, στη συνέχεια χρησιμοποιούμε τις ακίδες A0, A1 και A2. Απλώς αφήστε τα στο HIGH ή LOW για αλλαγή διεύθυνσης.

Η διεύθυνση θα διαμορφωθεί ως εξής:

MCP_Address = 20 + (A0 A1 A2)

Όπου το A0 A1 A2 μπορεί να λάβει τιμές HIGH / LOW, αυτό σχηματίζει έναν δυαδικό αριθμό από 0 έως 7.

Για παράδειγμα:

A0> GND, A1> GND, A2> GND (σημαίνει 000, στη συνέχεια 20 + 0 = 20)

Ή αλλιώς, A0> HIGH, A1> GND, A2> HIGH (σημαίνει 101, στη συνέχεια 20 + 5 = 25)

Βήμα 7: Εντολές

Εντολές
Εντολές

Παρακάτω είναι ένας πίνακας με τις εντολές για επικοινωνία. Ας χρησιμοποιήσουμε GP0 και GP1, καθώς και IODIR0 και IODIR1.

Βήμα 8: Κατηγορίες:

GP0 / GP1 - Καταχωρητές θύρας δεδομένων

Υπάρχουν δύο καταχωρητές που παρέχουν πρόσβαση στις δύο θύρες GPIO.

Η ανάγνωση καταχωρητή παρέχει την κατάσταση των ακίδων σε αυτήν τη θύρα.

Bit = 1> HIGH Bit = 0> LOW

OLAT0 / OLAT1 - ΕΓΓΡΑΦΕΣ LACTCH εξόδου

Υπάρχουν δύο καταχωρητές που παρέχουν πρόσβαση στις θύρες εξόδου των δύο θυρών.

IPOL0 / IPOL1 - Καταχωρητές πολικότητας εισόδου

Αυτοί οι καταχωρητές επιτρέπουν στο χρήστη να διαμορφώσει την πολικότητα των δεδομένων της θύρας εισόδου (GP0 και GP1).

IODIR0 / IODIR1

Υπάρχουν δύο καταχωρητές που ελέγχουν τη λειτουργία pin. (Είσοδος ή Έξοδος)

Bit = 1> ΕΙΣΟΔΟΣ Bit = 0> OUTPUT

INTCAP0 / INTCAP1 - Διακοπή καταγραφής καταγραφής

Πρόκειται για καταχωρητές που περιέχουν την τιμή της θύρας που δημιούργησε τη διακοπή.

IOCON0 / IOCON1 - I / O Expander Control Register

Αυτό ελέγχει τη λειτουργικότητα του MCP23016.

Η ρύθμιση του bit 0 (IARES> Interrupt Activity Resolution) ελέγχει τη συχνότητα δειγματοληψίας των ακίδων της θύρας GP.

Bit0 = 0> (προεπιλογή) Ο μέγιστος χρόνος ανίχνευσης δραστηριότητας θύρας είναι 32ms (χαμηλή κατανάλωση ενέργειας)

Bit0 = 1> ο μέγιστος χρόνος ανίχνευσης δραστηριότητας στη θύρα είναι 200usec (υψηλότερη κατανάλωση ενέργειας)

Βήμα 9: Δομή για την Επικοινωνία

Δομή για την Επικοινωνία
Δομή για την Επικοινωνία

Δείχνω εδώ την κατηγορία Wire, η οποία είναι η επικοινωνία I2C στον πυρήνα μας Arduino, η οποία επιτρέπει επίσης στον διαστολέα να συνεργαστεί με τα Arduino Uno και Mega. Ωστόσο, το τελευταίο έχει ήδη αρκετούς IO. Ασχολούμαστε εδώ με τις διευθύνσεις του τσιπ, τον έλεγχο πρόσβασης, που είναι οι κωδικοί των καταχωρητών, καθώς και τα δεδομένα.

Βήμα 10: Πρόγραμμα

Πρόγραμμα
Πρόγραμμα

Το πρόγραμμά μας συνίσταται στην επικοινωνία του ESP32 με το MCP23016 για χρήση περισσότερων GPIO. Στη συνέχεια θα έχουμε ένα κουμπί και μερικές λυχνίες LED συνδεδεμένες στο MCP23016. Θα τα ελέγξουμε όλα χρησιμοποιώντας μόνο το δίαυλο I2C. Έτσι, θα χρησιμοποιηθούν μόνο δύο ακίδες ESP32. Μπορείτε να δείτε το κύκλωμα εικόνας παρακάτω στο βίντεο.

Βήμα 11: ESP01

ESP01
ESP01

Εδώ, εμφανίζω το Pinout του ESP01.

Βήμα 12: Τοποθέτηση ESP01

Τοποθέτηση ESP01
Τοποθέτηση ESP01

Σε αυτό το παράδειγμα, έχουμε το GPIO0 συνδεδεμένο στο SDA και το GPIO2 συνδεδεμένο στο SCL. Έχουμε επίσης έναν πίνακα ρελέ, έναν βομβητή και ένα LED. Στην άλλη θύρα, στο GP1.0, έχουμε ένα ακόμη LED με αντίσταση.

Βήμα 13: NodeMCU ESP-12E

NodeMCU ESP-12E
NodeMCU ESP-12E

Εδώ, έχουμε το Pinout του NodeMCU ESP-12E.

Βήμα 14: Τοποθέτηση NodeMCU ESP-12E

Τοποθέτηση NodeMCU ESP-12E
Τοποθέτηση NodeMCU ESP-12E

Σε αυτή την περίπτωση, η μόνη διαφορά από το πρώτο παράδειγμα είναι ότι έχετε συνδέσει το D1 και το D2 στο SDA και το SCL, αντίστοιχα.

Βήμα 15: WiFi NodeMCU-32S ESP-WROOM-32

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

Εδώ είναι το Pinout του WiFi NodeMCU-32S ESP-WROOM-32.

Βήμα 16: Κόμβος τοποθέτησης WiFiMCU-32S ESP-WROOM-32

Κόμβος τοποθέτησης WiFiMCU-32S ESP-WROOM-32
Κόμβος τοποθέτησης WiFiMCU-32S ESP-WROOM-32

Αυτή τη φορά, η κύρια διαφορά από τα άλλα δύο παραδείγματα είναι το κουμπί και τα τρία LED που αναβοσβήνουν. Εδώ, το SDA συνδέεται με το GPIO19, ενώ το SCL με το GPIO23.

Βήμα 17: Βιβλιοθήκες και μεταβλητές

Πρώτον, θα συμπεριλάβουμε το Wire.h, το οποίο είναι υπεύθυνο για την επικοινωνία i2c, καθώς και τη ρύθμιση της διεύθυνσης i2c του MCP23016. Δείχνω αρκετές εντολές, ακόμη και μερικές που δεν χρησιμοποιούμε σε αυτό το έργο.

#include // καθορίστε τη χρήση της βιβλιοθήκης Wire.h. // endereço I2C do MCP23016 #define MCPAddress 0x20 // COMMAND BYTE TO REGISTER RELATIONSHIP: Πίνακας: 1-3 του Microchip MCP23016 - DS20090A // ENDEREÇOS DE REGISTRADORES #define GP0 0x0 // DATA PORT 0X0 // DATA PORT 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 // INTERPORT 0T000 /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 #0 ΕΓΓΡΑΦΗ 0 #define IOCON1 0x0B // I/O EXPANDER CONTROL REGISTER 1

Βήμα 18: Ρύθμιση

Εδώ έχουμε τις λειτουργίες για την προετοιμασία τεσσάρων διαφορετικών τύπων μικροελεγκτών. Ελέγχουμε επίσης τη συχνότητα, ρυθμίζουμε τα GPIO και ρυθμίζουμε τις ακίδες. Στο βρόχο, ελέγχουμε την κατάσταση του κουμπιού.

void setup () {Serial.begin (9600); καθυστέρηση (1000)? Wire.begin (19, 23); // ESP32 // Wire.begin (D2, D1); // nodemcu ESP8266 // Wire.begin (); // arduino // Wire.begin (0, 2); // ESP-01 Wire.setClock (200000); // frequencia // configura o GPIO0 como OUTPUT (todos os pinos) configurePort (IODIR0, OUTPUT); // configura o GPIO1 como INPUT o GP1.0 e como OUTPUT os outros GP1 configurePort (IODIR1, 0x01); // seta todos os pinos do GPIO0 como LOW writeBlockData (GP0, B00000000); // seta todos os pinos do GPIO1 como LOW writeBlockData (GP1, B00000000); } void loop () {// verifica e o botão GP foi pressionado checkButton (GP1); } // βρόχος τερματισμού

Βήμα 19: ConfigurePort

Σε αυτό το βήμα, διαμορφώνουμε τη λειτουργία των ακίδων GPIO και προσδιορίζουμε τη λειτουργία των θυρών.

// 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/ / 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 θύρα, uint8_t custom) {if (custom == INPUT) {writeBlockData (port, 0xFF); } else if (custom == OUTPUT) {writeBlockData (θύρα, 0x00); } else {writeBlockData (θύρα, προσαρμοσμένο); }}

Βήμα 20: WriteBlockData & CheckButton

Εδώ, στέλνουμε δεδομένα στο MCP23016 μέσω του διαύλου i2c, ελέγχουμε την κατάσταση του κουμπιού και υποδεικνύουμε το επόμενο βήμα λαμβάνοντας υπόψη την κατάσταση του να πιεστείτε ή όχι.

// envia dados para o MCP23016 através do barramento i2c // cmd: COMANDO (registrador) // data: dados (0-255) void writeBlockData (uint8_t cmd, uint8_t data) {Wire.beginTransmission (MCPAddress); Wire.write (cmd); Wire.write (δεδομένα); Wire.endTransmission (); καθυστέρηση (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 ως portas GP0 if (btn) {writeBlockData (GP0, B11111111); } // caso contrario deixa todas em estado LOW else {writeBlockData (GP0, B00000000); }}

Βήμα 21: ReadPin & ValueFromPin

Ασχολούμαστε εδώ με την ανάγνωση ενός συγκεκριμένου πείρου και την επιστροφή της τιμής bit στην επιθυμητή θέση.

// 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 (); επιστροφή τιμήςFromPin (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 << καρφίτσα)) == 0; 0: 1; }

Βήμα 22: Πρόγραμμα ESP8266

Από εδώ, θα δούμε πώς δημιουργήθηκε το πρόγραμμα που χρησιμοποιήσαμε στο ESP-01 και στο nodeMCU ESP-12E, το οποίο μας επιτρέπει να καταλάβουμε πώς οι διαφορές μεταξύ τους είναι ελάχιστες.

Θα τροποποιήσουμε μόνο τη γραμμή του κατασκευαστή επικοινωνίας i2c, η οποία είναι η αρχική μέθοδος του αντικειμένου Wire.

Απλώς σχολιάστε τη γραμμή σύμφωνα με την πλάκα που πρόκειται να συντάξουμε.

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

Ρύθμιση

Παρατηρήστε ότι ο κατασκευαστής εξακολουθεί να σχολιάζεται. Επομένως, μην σχολιάζετε σύμφωνα με τον πίνακα (ESP-01 ή nodeMCU ESP12-E).

void setup () {Serial.begin (9600); καθυστέρηση (1000)? // Wire.begin (D2, D1); // nodemcu ESP8266 // Wire.begin (0, 2); // ESP-01 Wire.setClock (200000); // frequencia // configura o GPIO0 como OUTPUT (todos os pinos) configurePort (IODIR0, OUTPUT); // configura o GPIO1 como OUTPUT (todos os pinos) configurePort (IODIR1, OUTPUT); // seta todos os pinos do GPIO0 como LOW writeBlockData (GP0, B00000000); // seta todos os pinos do GPIO1 como LOW writeBlockData (GP1, B00000001); }

Βρόχος

Στο βρόχο, αλλάζουμε τις ακίδες κάθε 1 δευτερόλεπτο. Έτσι, όταν το pin0 του GP0 είναι ενεργοποιημένο, οι ακίδες του GP1 είναι απενεργοποιημένες. Όταν το pin0 του GP1 είναι ενεργοποιημένο, οι καρφίτσες GP0 είναι απενεργοποιημένες.

void loop () {// seta o pino 7 έως GP0 como HIGH και osmais como LOW writeBlockData (GP0, B10000000); // seta todos os pinos do GPIO1 como LOW writeBlockData (GP1, B00000000); καθυστέρηση (1000)? // seta todos os pinos do GPIO0 como LOW writeBlockData (GP0, B00000000); // seta o pino 0 για GP1 como HIGH και os demais como LOW writeBlockData (GP1, B00000001); καθυστέρηση (1000)? } // βρόχος τερματισμού

Βήμα 23: ΣΗΜΑΝΤΙΚΟ

Οι μεταβλητές και η βιβλιοθήκη που χρησιμοποιούνται είναι οι ίδιες με αυτές του προγράμματος που κάναμε για το ESP32, καθώς και οι μέθοδοι configurePort και writeBlockData.

Βήμα 24: Αρχεία

Κατεβάστε τα αρχεία:

PDF

INO (ESP8266)

INO (ESP32)

Συνιστάται: