Isi kandungan:

IO Expander untuk ESP32, ESP8266, dan Arduino: 24 Langkah
IO Expander untuk ESP32, ESP8266, dan Arduino: 24 Langkah

Video: IO Expander untuk ESP32, ESP8266, dan Arduino: 24 Langkah

Video: IO Expander untuk ESP32, ESP8266, dan Arduino: 24 Langkah
Video: #24 - ESP32 Bagian 1: Tutorial Mikrokontroler ESP32/ESP8266 dengan MicroPython 2024, Julai
Anonim
Image
Image
Pengenalan
Pengenalan

Adakah anda ingin mengembangkan IO ESP32, ESP8266, atau Arduino anda? Dan adakah anda sudah memikirkan kemungkinan 16 GPIO baru yang dapat dikawal menggunakan bas I2C? Baiklah hari ini, saya akan memperkenalkan anda kepada GPIO expander MCP23016. Juga, saya akan menunjukkan kepada anda cara berkomunikasi mikrokontroler dengan MCP23016. Saya juga akan bercakap mengenai membuat program di mana kita hanya akan menggunakan 2 pin mikrokontroler ini untuk berkomunikasi dengan pengembang. Kami akan menggunakannya untuk mengawal LED dan butang.

Langkah 1: Pengenalan

Peranti MCP23016 menyediakan 16 bit untuk pengembangan GPIO menggunakan bas I2C. Setiap bit boleh dikonfigurasi secara individu (input atau output).

MCP23016 terdiri daripada beberapa tetapan 8-bit untuk pemilihan input, output, dan polaritas.

Pengembang memberikan penyelesaian mudah apabila IO diperlukan untuk suis, sensor, butang, dan LED, antara contoh lain.

Langkah 2: Ciri-ciri

16 pin Input / Output (16 input standard)

Kekerapan jam bas I2C pantas (0-400 kbits / s)

Tiga pin alamat perkakasan membenarkan penggunaan sehingga lapan peranti

Ganggu Perakam Tangkap Port

Daftar pembalikan polariti untuk menetapkan polaritas data port input

Sesuai dengan kebanyakan mikrokontroler

Langkah 3: ESP01 Boleh Memiliki 128 GPIO

ESP01 Boleh Mempunyai 128 GPIO!
ESP01 Boleh Mempunyai 128 GPIO!

Contoh yang menunjukkan besarnya pengembang ini adalah penggunaannya dengan ESP01, yang dapat disambungkan ke sehingga lapan pembesar dengan hanya dua IOS, mencapai 128 GPIO.

Langkah 4: MCP23016

MCP23016
MCP23016

Di sini, kita mempunyai skema pengembang, yang mempunyai dua kumpulan lapan bit. Ini menjadikan sejumlah 16 port. Selain pin interrupt, ia mempunyai pin CLK, yang menghubungkan kapasitor dan perintang, yang disambungkan secara dalaman dalam port logik. Ini untuk membentuk jam, menggunakan idea pengayun kristal, yang memerlukan jam 1MHz. Pin TP digunakan untuk mengukur jam. Pin A0, A1, dan A2 adalah alamat binari.

Langkah 5: JAM

JAM
JAM
JAM
JAM

Oleh itu, MCP23016 menggunakan litar RC luaran untuk menentukan kelajuan Jam dalaman. Jam dalaman 1 MHz diperlukan (biasanya) agar peranti berfungsi dengan baik. Jam dalaman boleh diukur pada pin TP. Nilai yang disyorkan untuk REXT dan CEXT ditunjukkan di bawah.

Langkah 6: Alamat

Untuk menentukan alamat MCP23016, kita kemudian menggunakan pin A0, A1, dan A2. Biarkan mereka pada TINGGI atau RENDAH untuk pertukaran alamat.

Alamatnya akan dibentuk seperti berikut:

MCP_Address = 20 + (A0 A1 A2)

Di mana A0 A1 A2 dapat mengambil nilai TINGGI / RENDAH, ini membentuk nombor binari dari 0 hingga 7.

Sebagai contoh:

A0> GND, A1> GND, A2> GND (bermaksud 000, kemudian 20 + 0 = 20)

Atau yang lain, A0> TINGGI, A1> GND, A2> TINGGI (bermaksud 101, kemudian 20 + 5 = 25)

Langkah 7: Perintah

Perintah
Perintah

Berikut adalah jadual dengan arahan untuk komunikasi. Mari gunakan GP0 dan GP1, serta IODIR0 dan IODIR1.

Langkah 8: Kategori:

GP0 / GP1 - Daftar Port Data

Terdapat dua daftar yang menyediakan akses ke dua port GPIO.

Bacaan daftar memberikan status pin pada port tersebut.

Bit = 1> Bit TINGGI = 0> RENDAH

OLAT0 / OLAT1 - DAFTAR LACTCH Keluaran

Terdapat dua register yang menyediakan akses ke port output dari dua port tersebut.

IPOL0 / IPOL1 - Daftar Polariti Input

Daftar ini membolehkan pengguna mengkonfigurasi polaritas data port input (GP0 dan GP1).

IODIR0 / IODIR1

Terdapat dua register yang mengawal mod pin. (Input atau Output)

Bit = 1> INPUT Bit = 0> OUTPUT

INTCAP0 / INTCAP1 - Interrupt Capture Register

Ini adalah daftar yang mengandungi nilai port yang menghasilkan gangguan.

IOCON0 / IOCON1 - Daftar Kawalan Expander I / O

Ini mengawal fungsi MCP23016.

Setting bit 0 (IARES> Interrupt Activity Resolution) mengawal kekerapan pensampelan pin port GP.

Bit0 = 0> (lalai) Masa pengesanan aktiviti port maksimum ialah 32ms (penggunaan kuasa rendah)

Bit0 = 1> masa pengesanan aktiviti maksimum di port adalah 200usec (penggunaan kuasa lebih tinggi)

Langkah 9: Struktur untuk Komunikasi

Struktur untuk Komunikasi
Struktur untuk Komunikasi

Saya tunjukkan di sini kelas Wire, yang merupakan komunikasi I2C dalam Arduino teras kami, yang juga membolehkan pengembang bekerja dengan Arduino Uno dan Mega. Walau bagaimanapun, yang terakhir sudah mempunyai beberapa IO. Kami berurusan di sini dengan alamat cip, kawalan akses, yang merupakan kod daftar, dan juga data.

Langkah 10: Program

Program
Program

Program kami terdiri daripada menyampaikan ESP32 dengan MCP23016 agar lebih banyak GPIO dapat digunakan. Kami kemudian akan mempunyai butang dan beberapa LED disambungkan ke MCP23016. Kami akan mengawal semuanya menggunakan bas I2C sahaja. Oleh itu, hanya dua pin ESP32 yang akan digunakan. Anda dapat melihat litar gambar di bawah dalam video.

Langkah 11: ESP01

ESP01
ESP01

Di sini, saya menunjukkan Pinout ESP01.

Langkah 12: Pemasangan ESP01

Pemasangan ESP01
Pemasangan ESP01

Dalam contoh ini, kita mempunyai GPIO0 yang tersambung di SDA, dan GPIO2 disambungkan di SCL. Kami juga mempunyai papan geganti, buzzer, dan LED. Di port lain, di GP1.0, kami mempunyai satu LED lagi dengan perintang.

Langkah 13: NodeMCU ESP-12E

NodeMCU ESP-12E
NodeMCU ESP-12E

Di sini, kita mempunyai Pinout NodeMCU ESP-12E.

Langkah 14: Pemasangan NodeMCU ESP-12E

Pemasangan NodeMCU ESP-12E
Pemasangan NodeMCU ESP-12E

Dalam kes ini, satu-satunya perbezaan dari contoh pertama ialah anda masing-masing telah menghubungkan D1 dan D2 di SDA dan SCL.

Langkah 15: Node WiFiMCU-32S ESP-WROOM-32

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

Inilah Pinout WiFi NodeMCU-32S ESP-WROOM-32.

Langkah 16: Node Pemasangan WiFiMCU-32S ESP-WROOM-32

Node Pemasangan WiFiMCU-32S ESP-WROOM-32
Node Pemasangan WiFiMCU-32S ESP-WROOM-32

Kali ini, perbezaan utama dari dua contoh lain adalah butang, dan tiga LED berkelip. Di sini, SDA disambungkan ke GPIO19, sementara SCL disambungkan ke GPIO23.

Langkah 17: Perpustakaan dan Pembolehubah

Pertama, kami akan memasukkan Wire.h, yang bertanggungjawab untuk komunikasi i2c, serta menetapkan alamat i2c MCP23016. Saya menunjukkan beberapa arahan, bahkan beberapa yang tidak kita gunakan dalam projek ini.

#masuk // tentukan penggunaan perpustakaan Wire.h // endereço I2C do MCP23016 #define MCPAddress 0x20 // COMMAND BYTE UNTUK MENDAFTAR HUBUNGAN: Jadual: 1-3 Microchip MCP23016 - DS20090A // ENDEREÇOS DE REGISTRADORES #define GP0 0x00 // DATA PORT REGISTER 0 #define 0 #define PORT REGISTER 1 #define OLAT0 0x02 // OUTPUT LATCH REGISTER 0 #define OLAT1 0x03 // OUTPUT LATCH REGISTER 1 #define IPOL0 0x04 // INPUT POLARITY PORT DAFTAR 0 # tentukan IPOL1 0x05 // INPUT PORPOR 0 0 / I / O DAFTAR PENDAFTARAN 0 #definisi IODIR1 0x07 // I / O DAFTAR ARAH 1 #tentukan INTCAP0 0x08 // INTERRUPT CAPTURE REGISTER 0 #define INTCAP1 0x09 // INTERRUPT CAPTURE REGISTER 1 #definisi I / OLEH DAFTAR 0 #tentukan IOCON1 0x0B // DAFTAR PENGAWAL PENDAPATAN I / O 1

Langkah 18: Persediaan

Di sini kita mempunyai fungsi untuk menginisialisasi empat jenis mikrokontroler yang berbeza. Kami juga memeriksa frekuensi, mengatur GPIO, dan menetapkan pin. Di Gelung, kami memeriksa status butang.

batal persediaan () {Serial.begin (9600); kelewatan (1000); Wire.begin (19, 23); // ESP32 // Wire.begin (D2, D1); // nodemcu ESP8266 // Wire.begin (); // arduino // Wire.begin (0, 2); // ESP-01 Wire.setClock (200000); // freencia // 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); } gelung void () {// verifica e o botão GP juga pressionado checkButton (GP1); } // gelung akhir

Langkah 19: ConfigurePort

Pada langkah ini, kita mengkonfigurasi mod pin GPIO dan mengenal pasti mod port.

// 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 seperti 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, o restando como saida void configurePort (port uint8_t, uint8_t custom) {if (custom == INPUT) {writeBlockData (port, 0xFF); } lain jika (custom == OUTPUT) {writeBlockData (port, 0x00); } lain {writeBlockData (port, custom); }}

Langkah 20: WriteBlockData & CheckButton

Di sini, kami menghantar data ke MCP23016 melalui bas i2c, memeriksa status butang, dan menunjukkan langkah seterusnya sambil mengambil kira keadaan ditekan atau tidak.

// 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 (data); Wire.endTransmission (); kelewatan (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 sebagai portas GP0 jika (btn) {writeBlockData (GP0, B11111111); } // caso contrario deixa todas em estado RENDAH yang lain {writeBlockData (GP0, B00000000); }}

Langkah 21: ReadPin & ValueFromPin

Kami berurusan di sini dengan membaca pin tertentu, dan pengembalian nilai bit ke kedudukan yang diinginkan.

// faz a leitura de um pino específico // pin: pino desejado (0-7) // gp: GP0 ou GP1 // retorno: 0 ou 1 uint8_t readPin (pin uint8_t, uint8_t gp) {status uint8_tGP = 0; Wire.beginTransmission (MCPAddress); Wire.write (gp); Wire.endTransmission (); Wire.requestFrom (MCPAddress, 1); // ler do chip 1 bait statusGP = Wire.read (); nilai pulanganFromPin (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) nilai uint8_tFromPin (pin uint8_t, status uint8_tGP) {return (statusGP & (0x0001 << pin)) == 0? 0: 1; }

Langkah 22: Program ESP8266

Dari sini, kita akan melihat bagaimana program yang kita gunakan di ESP-01 dan di nodeMCU ESP-12E dibuat, yang membolehkan kita memahami bagaimana perbezaan di antara mereka adalah minimum.

Kami hanya akan mengubah baris konstruktor komunikasi i2c, yang merupakan kaedah permulaan objek Wire.

Cukup melepaskan garis mengikut plat yang akan kami susun.

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

Persediaan

Perhatikan bahawa pembina masih diberi komen. Oleh itu, ketidakpuasan mengikut papan anda (ESP-01 atau nodeMCU ESP12-E).

batal persediaan () {Serial.begin (9600); kelewatan (1000); // Wire.begin (D2, D1); // nodemcu ESP8266 // Wire.begin (0, 2); // ESP-01 Wire.setClock (200000); // freencia // 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); }

Gelung

Dalam gelung, kami menukar pin setiap 1 saat. Oleh itu, apabila pin0 GP0 dihidupkan, pin GP1 mati. Apabila pin0 GP1 dihidupkan, pin GP0 mati.

gelung void () {// seta o pino 7 do GP0 como HIGH e os demais como LOW writeBlockData (GP0, B10000000); // seta todos os pinos do GPIO1 como LOW writeBlockData (GP1, B00000000); kelewatan (1000); // seta todos os pinos do GPIO0 como LOW writeBlockData (GP0, B00000000); // seta o pino 0 do GP1 como HIGH e os demais como LOW writeBlockData (GP1, B00000001); kelewatan (1000); } // gelung akhir

Langkah 23: PENTING

Pemboleh ubah dan perpustakaan yang digunakan sama dengan program yang kami lakukan untuk ESP32, begitu juga dengan kaedah configurePort dan writeBlockData.

Langkah 24: Fail

Muat turun fail:

PDF

INO (ESP8266)

INO (ESP32)

Disyorkan: