Daftar Isi:

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, November
Anonim
Image
Image
pengantar
pengantar

Apakah Anda ingin memperluas IO ESP32, ESP8266, atau Arduino Anda? Dan pernahkah Anda memikirkan kemungkinan 16 GPIO baru yang dapat dikontrol menggunakan bus I2C? Nah hari ini, saya akan memperkenalkan Anda ke GPIO expander MCP23016. Juga, saya akan menunjukkan cara mengomunikasikan mikrokontroler dengan MCP23016. Saya juga akan berbicara tentang membuat program di mana kita hanya akan menggunakan 2 pin mikrokontroler ini untuk berkomunikasi dengan expander. Kami akan menggunakan ini untuk mengontrol LED dan tombol.

Langkah 1: Pendahuluan

Perangkat MCP23016 menyediakan 16 bit untuk ekspansi GPIO menggunakan bus I2C. Setiap bit dapat dikonfigurasi secara individual (input atau output).

MCP23016 terdiri dari beberapa pengaturan 8-bit untuk input, output, dan pemilihan polaritas.

Ekspander memberikan solusi sederhana ketika IO diperlukan untuk sakelar, sensor, tombol, dan LED, di antara contoh lainnya.

Langkah 2: Karakteristik

16 Pin Input / Output (16 input standar)

Frekuensi clock bus I2C cepat (0-400 kbits/s)

Tiga pin alamat perangkat keras memungkinkan penggunaan hingga delapan perangkat

Interrupt Port Capture Recorder

Register pembalik polaritas untuk mengatur polaritas data port input

Kompatibel dengan sebagian besar mikrokontroler

Langkah 3: ESP01 Dapat Memiliki 128 GPIO

ESP01 Dapat Memiliki 128 GPIO!
ESP01 Dapat Memiliki 128 GPIO!

Contoh yang menunjukkan kehebatan expander ini adalah penggunaannya dengan ESP01, yang dapat dihubungkan hingga delapan expander hanya dengan dua IOS, mencapai 128 GPIO.

Langkah 4: MCP23016

MCP23016
MCP23016

Di sini, kami memiliki skema expander, yang memiliki dua kelompok delapan bit. Ini membuat total 16 port. Selain pin interupsi, ia memiliki pin CLK, yang menghubungkan kapasitor dan resistor, yang terhubung secara internal di port logika. Ini untuk membentuk jam, menggunakan ide osilator kristal, yang membutuhkan jam 1MHz. Pin TP digunakan untuk mengukur jam. Pin A0, A1, dan A2 adalah alamat biner.

Langkah 5: JAM

JAM
JAM
JAM
JAM

Oleh karena itu, MCP23016 menggunakan sirkuit RC eksternal untuk menentukan kecepatan Clock internal. Jam internal 1 MHz diperlukan (biasanya) agar perangkat berfungsi dengan baik. Jam internal dapat diukur pada pin TP. Nilai yang direkomendasikan untuk REXT dan CEXT ditunjukkan di bawah ini.

Langkah 6: Alamat

Untuk menentukan alamat MCP23016, kita kemudian menggunakan pin A0, A1, dan A2. Biarkan saja di TINGGI atau RENDAH untuk perubahan alamat.

Alamat akan terbentuk sebagai berikut:

MCP_Alamat = 20 + (A0 A1 A2)

Dimana A0 A1 A2 dapat mengambil nilai HIGH / LOW, ini membentuk bilangan biner dari 0 hingga 7.

Sebagai contoh:

A0> GND, A1> GND, A2> GND (berarti 000, maka 20 + 0 = 20)

Atau, A0> TINGGI, A1> GND, A2> TINGGI (artinya 101, lalu 20 + 5 = 25)

Langkah 7: Perintah

Perintah
Perintah

Di bawah ini adalah tabel dengan perintah untuk komunikasi. Mari kita gunakan GP0 dan GP1, serta IODIR0 dan IODIR1.

Langkah 8: Kategori:

GP0/ GP1 - Register Port Data

Ada dua register yang menyediakan akses ke dua port GPIO.

Pembacaan register memberikan status pin pada port tersebut.

Bit = 1> TINGGI Bit = 0> RENDAH

OLAT0 / OLAT1 - Keluaran DAFTAR LACTCH

Ada dua register yang menyediakan akses ke port output dari dua port.

IPOL0/IPOL1 - Register Polaritas Input

Register ini memungkinkan pengguna untuk mengkonfigurasi polaritas data port input (GP0 dan GP1).

IODIR0 / IODIR1

Ada dua register yang mengontrol mode pin. (Masukan atau Keluaran)

Bit = 1> INPUT Bit = 0> OUTPUT

INTCAP0/ INTCAP1 - Interrupt Capture Register

Ini adalah register yang berisi nilai port yang menghasilkan interupsi.

IOCON0 / IOCON1 - Daftar Kontrol Ekspander I / O

Ini mengontrol fungsionalitas MCP23016.

Pengaturan bit 0 (IARES> Interrupt Activity Resolution) mengontrol frekuensi sampling pin port GP.

Bit0 = 0> (default) Waktu deteksi aktivitas port maksimum adalah 32ms (konsumsi daya rendah)

Bit0 = 1> waktu deteksi aktivitas maksimum pada port adalah 200usec (konsumsi daya lebih tinggi)

Langkah 9: Struktur untuk Komunikasi

Struktur untuk Komunikasi
Struktur untuk Komunikasi

Saya tunjukkan di sini kelas Wire, yang merupakan komunikasi I2C di Arduino inti kami, yang juga memungkinkan expander untuk bekerja dengan Arduino Uno dan Mega. Namun, yang terakhir sudah memiliki beberapa IO. Kami berurusan di sini dengan alamat chip, kontrol akses, yang merupakan kode register, serta data.

Langkah 10: Program

Program
Program

Program kami terdiri dari mengkomunikasikan ESP32 dengan MCP23016 untuk memiliki lebih banyak GPIO untuk digunakan. Kami kemudian akan memiliki tombol dan beberapa LED yang terhubung ke MCP23016. Kami akan mengontrol semuanya hanya dengan menggunakan bus I2C. Dengan demikian, hanya dua pin ESP32 yang akan digunakan. Anda dapat melihat gambar rangkaian di bawah ini dalam video.

Langkah 11: ESP01

ESP01
ESP01

Di sini, saya menunjukkan Pinout dari ESP01.

Langkah 12: Memasang ESP01

Memasang ESP01
Memasang ESP01

Dalam contoh ini, GPIO0 terhubung di SDA, dan GPIO2 terhubung di SCL. Kami juga memiliki papan relay, buzzer, dan LED. Di port lain, di GP1.0, kami memiliki satu LED lagi dengan resistor.

Langkah 13: NodeMCU ESP-12E

NodeMCU ESP-12E
NodeMCU ESP-12E

Di sini, kami memiliki Pinout dari NodeMCU ESP-12E.

Langkah 14: Memasang NodeMCU ESP-12E

Memasang NodeMCU ESP-12E
Memasang NodeMCU ESP-12E

Dalam hal ini, satu-satunya perbedaan dari contoh pertama adalah Anda telah menghubungkan D1 dan D2 di SDA dan SCL, masing-masing.

Langkah 15: WiFi NodeMCU-32S ESP-WROOM-32

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

Berikut Pinout dari WiFi NodeMCU-32S ESP-WROOM-32.

Langkah 16: Pemasangan WiFi NodeMCU-32S ESP-WROOM-32

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

Kali ini, perbedaan utama dari dua contoh lainnya adalah tombol, dan tiga LED yang berkedip. Di sini, SDA terhubung ke GPIO19, sedangkan SCL terhubung ke GPIO23.

Langkah 17: Pustaka dan Variabel

Pertama, kami akan menyertakan Wire.h, yang bertanggung jawab untuk komunikasi i2c, serta mengatur alamat i2c dari MCP23016. Saya menunjukkan beberapa perintah, bahkan beberapa yang tidak kami gunakan dalam proyek ini.

#include // tentukan penggunaan library Wire.h. //endereço I2C melakukan MCP23016 #define MCPAddress 0x20 // COMMAND BYTE UNTUK MENDAFTAR HUBUNGAN: Tabel: 1-3 dari Microchip MCP23016 - DS20090A //ENDEREÇOS DE REGISTRADORES #define GP0 0x00 // DATA PORT REGISTER1 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 REGISTER 0 #define IPOL1 0x05 // INPUT POLARITY REGISTER 1 #defin PORT REGISTER / 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 CONTROL // I/O CONTROL DAFTAR 0 #define IOCON1 0x0B // I/O EXPANDER CONTROL DAFTAR 1

Langkah 18: Pengaturan

Di sini kita memiliki fungsi untuk menginisialisasi empat jenis mikrokontroler yang berbeda. Kami juga memeriksa frekuensi, mengatur GPIO, dan mengatur pin. Di Loop, kami memeriksa status tombol.

void setup() { Serial.begin(9600); penundaan (1000); Kawat.begin(19, 23); //ESP32 // Kawat.begin(D2, D1); //nodemcu ESP8266 // Kawat.begin(); //arduino // Wire.begin(0, 2);//ESP-01 Wire.setClock(2000000); //frekuensi //konfigurasi GPIO0 como OUTPUT (todos os pinos) configurePort(IODIR0, OUTPUT); //configura o GPIO1 como INPUT o GP1.0 dan como OUTPUT os outros GP1 configurePort(IODIR1, 0x01); //set untuk melakukan os pino melakukan GPIO0 como LOW writeBlockData(GP0, B00000000); //set untuk melakukan os pino melakukan GPIO1 como LOW writeBlockData(GP1, B00000000); } void loop() { //verifikasi dan GP untuk menekan tombol checkButton(GP1); } // akhiri putaran

Langkah 19: Konfigurasi Port

Pada langkah ini, kami mengonfigurasi mode pin GPIO dan mengidentifikasi mode 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 as portas do GP trabalharem como entrada / / 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, atau restando como saida void configurePort(uint8_t port, uint8_t custom) { if(custom == INPUT) { writeBlockData(port, 0xFF); } else if(custom == OUTPUT) { writeBlockData(port, 0x00); } else { writeBlockData(port, custom); } }

Langkah 20: WriteBlockData & CheckButton

Di sini, kami mengirim data ke MCP23016 melalui bus i2c, memeriksa status tombol, dan menunjukkan langkah selanjutnya dengan mempertimbangkan kondisi ditekan atau tidak.

//envia dados untuk MCP23016 através do barramento i2c//cmd: COMANDO (registrador) //data: dados (0-255) void writeBlockData(uint8_t cmd, uint8_t data) { Wire.beginTransmission(MCPAddress); Kawat.tulis(cmd); Kawat.tulis(data); Kawat.endTransmisi(); penundaan (10); }

//verifikasi 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); //selanjutnya, seta para HIGH sebagai porta GP0 if(btn) { writeBlockData(GP0, B111111111); } //caso contrario deixa todas em estado LOW else{ writeBlockData(GP0, B00000000); } }

Langkah 21: ReadPin & ValueFromPin

Di sini kita berurusan dengan pembacaan pin tertentu, dan pengembalian nilai bit ke posisi 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(uint8_t pin, uint8_t gp) { uint8_t statusGP = 0; Wire.beginTransmission (Alamat MCPA); Wire.write(gp); Kawat.endTransmisi(); Wire.requestFrom(MCPAaddress, 1); // untuk melakukan chip 1 byte statusGP = Wire.read(); mengembalikan nilaiDariPin(pin, statusGP); } //retorna o valor do bit na posição desejada //pin: posisi 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; }

Langkah 22: Program ESP8266

Dari sini, kita akan melihat bagaimana program yang kita gunakan di ESP-01 dan di nodeMCU ESP-12E dibuat, yang memungkinkan kita untuk memahami bagaimana perbedaan di antara keduanya minimal.

Kami hanya akan memodifikasi baris konstruktor komunikasi i2c, yang merupakan metode awal dari objek Wire.

Hapus tanda komentar pada baris sesuai dengan pelat yang akan kita kompilasi.

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

Mempersiapkan

Perhatikan bahwa pembuatnya masih dikomentari. Oleh karena itu, batalkan komentar sesuai dengan papan Anda (ESP-01 atau nodeMCU ESP12-E).

void setup() { Serial.begin(9600); penundaan (1000); // Kawat.mulai(D2, D1); //nodemcu ESP8266 // Kawat.begin(0, 2); //ESP-01 Wire.setClock(2000000); //frekuensi //konfigurasi GPIO0 como OUTPUT (todos os pinos) configurePort(IODIR0, OUTPUT); //configura o GPIO1 como OUTPUT (todos os pinos) configurePort(IODIR1, OUTPUT); //set untuk melakukan os pino melakukan GPIO0 como LOW writeBlockData(GP0, B00000000); //seta todos os pinos lakukan GPIO1 como LOW writeBlockData(GP1, B00000001); }

Lingkaran

Dalam loop, kami mengganti pin setiap 1 detik. Jadi, ketika pin0 dari GP0 aktif, pin GP1 mati. Ketika pin0 dari GP1 aktif, pin GP0 mati.

void loop() { //seta atau pino 7 melakukan GP0 como HIGH dan os demais como LOW writeBlockData(GP0, B10000000); //set untuk melakukan os pino melakukan GPIO1 como LOW writeBlockData(GP1, B00000000); penundaan (1000); //set untuk melakukan os pino melakukan GPIO0 como LOW writeBlockData(GP0, B00000000); //set atau pino 0 lakukan GP1 como TINGGI e os demais como LOW writeBlockData(GP1, B00000001); penundaan (1000); } // akhiri putaran

Langkah 23: PENTING

Variabel dan pustaka yang digunakan sama dengan program yang kami lakukan untuk ESP32, serta metode configurePort dan writeBlockData.

Langkah 24: File

Unduh file:

PDF

INO (ESP8266)

INO (ESP32)

Direkomendasikan: