Daftar Isi:
- Langkah 1: Pendahuluan
- Langkah 2: Karakteristik
- Langkah 3: ESP01 Dapat Memiliki 128 GPIO
- Langkah 4: MCP23016
- Langkah 5: JAM
- Langkah 6: Alamat
- Langkah 7: Perintah
- Langkah 8: Kategori:
- Langkah 9: Struktur untuk Komunikasi
- Langkah 10: Program
- Langkah 11: ESP01
- Langkah 12: Memasang ESP01
- Langkah 13: NodeMCU ESP-12E
- Langkah 14: Memasang NodeMCU ESP-12E
- Langkah 15: WiFi NodeMCU-32S ESP-WROOM-32
- Langkah 16: Pemasangan WiFi NodeMCU-32S ESP-WROOM-32
- Langkah 17: Pustaka dan Variabel
- Langkah 18: Pengaturan
- Langkah 19: Konfigurasi Port
- Langkah 20: WriteBlockData & CheckButton
- Langkah 21: ReadPin & ValueFromPin
- Langkah 22: Program ESP8266
- Langkah 23: PENTING
- Langkah 24: File
Video: IO Expander untuk ESP32, ESP8266, dan Arduino: 24 Langkah
2024 Pengarang: John Day | [email protected]. Terakhir diubah: 2024-01-30 09:57
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
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
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
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
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
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 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
Di sini, saya menunjukkan Pinout dari ESP01.
Langkah 12: 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
Di sini, kami memiliki Pinout dari NodeMCU ESP-12E.
Langkah 14: 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
Berikut Pinout dari WiFi NodeMCU-32S ESP-WROOM-32.
Langkah 16: Pemasangan WiFi 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:
INO (ESP8266)
INO (ESP32)
Direkomendasikan:
Dudukan Kabinet untuk ESP32 dan ESP8266: 7 Langkah
Dudukan Kabinet untuk ESP32 dan ESP8266: Kadang-kadang berguna untuk menginstal proyek berbasis ESP32 atau ESP8266 Anda di dalam kabinet dan memberikan tampilan profesional. Kit enklosur kecil ini akan membantu Anda membawa proyek berbasis ESP Anda pada rel DIN. Kit ini mencakup PCB prototyping dengan
Mod 3.3V untuk Sensor Ultrasonik (siapkan HC-SR04 untuk Logika 3.3V pada ESP32/ESP8266, Foton Partikel, Dll): 4 Langkah
Mod 3.3V untuk Sensor Ultrasonik (siapkan HC-SR04 untuk Logika 3.3V pada ESP32/ESP8266, Particle Photon, Dll): TL;DR: Pada sensor, potong jejak ke pin Echo, lalu sambungkan kembali menggunakan pembagi tegangan (jejak gema -> 2.7kΩ -> Pin gema -> 4.7kΩ -> GND). Sunting: Ada beberapa perdebatan tentang apakah ESP8266 sebenarnya toleran 5V pada GPIO di
Panduan Pemula untuk ESP8266 dan Tweeting Menggunakan ESP8266: 17 Langkah (dengan Gambar)
Panduan Pemula untuk ESP8266 dan Tweeting Menggunakan ESP8266: Saya belajar tentang Arduino 2 tahun yang lalu. Jadi saya mulai bermain-main dengan hal-hal sederhana seperti LED, tombol, motor, dll. Kemudian saya pikir bukankah lebih keren untuk terhubung untuk melakukan hal-hal seperti menampilkan cuaca hari ini, harga saham, waktu kereta api di layar LCD. Saya
NODEMCU LUA ESP8266 Dengan MCP23008 8 Bit Port Expander IC: 6 Langkah
NODEMCU LUA ESP8266 Dengan IC Port Expander 8 Bit MCP23008: MCP23008 adalah Expander I/O 8-Bit dengan Antarmuka Serial dan beroperasi antara 1,8 dan 5,5 volt, jadi sangat ideal untuk ESP8266, Arduino, Raspberry Pi, Chip PIC, dan lainnya. Jika Anda telah melihat Instruksi saya yang lain di MCP23017, Anda mungkin bertanya-tanya
Yakinkan Diri Anda untuk Hanya Menggunakan Inverter 12V-ke-AC-line untuk Senar Lampu LED Alih-alih Menghubungkannya untuk 12V.: 3 Langkah
Yakinkan Diri Anda untuk Hanya Menggunakan Inverter 12V-ke-AC-line untuk Senar Lampu LED Alih-alih Menghubungkan Ulang Mereka untuk 12V.: Rencana saya sederhana. Saya ingin memotong seutas tali lampu LED bertenaga dinding menjadi beberapa bagian lalu menyambungkannya kembali menjadi 12 volt. Alternatifnya adalah menggunakan power inverter, tetapi kita semua tahu bahwa itu sangat tidak efisien, bukan? Benar? Atau apakah mereka?