İçindekiler:

ESP32, ESP8266 ve Arduino için IO Genişletici: 24 Adım
ESP32, ESP8266 ve Arduino için IO Genişletici: 24 Adım

Video: ESP32, ESP8266 ve Arduino için IO Genişletici: 24 Adım

Video: ESP32, ESP8266 ve Arduino için IO Genişletici: 24 Adım
Video: Amatörce Sohbetler - 8 Eylül 2021 - TİnyGS LoRA Yer Kontrol İstasyonu Kurulumu 2024, Temmuz
Anonim
Image
Image
Tanıtım
Tanıtım

ESP32, ESP8266 veya Arduino'nuzun IO'larını genişletmek ister misiniz? Ve I2C veri yolu kullanılarak kontrol edilebilecek 16 yeni GPIO olasılığını düşündünüz mü? Bugün sizi GPIO genişletici MCP23016 ile tanıştıracağım. Ayrıca size MCP23016 ile bir mikrodenetleyiciyi nasıl iletişim kuracağınızı göstereceğim. Ayrıca genişletici ile haberleşmek için bu mikrodenetleyicinin sadece 2 pinini kullanacağımız bir program oluşturmaktan bahsedeceğim. Bunları LED'leri ve düğmeyi kontrol etmek için kullanacağız.

Adım 1: Giriş

MCP23016 cihazı, I2C veri yolunu kullanarak GPIO genişletmesi için 16 bit sağlar. Her bit ayrı ayrı konfigüre edilebilir (giriş veya çıkış).

MCP23016, giriş, çıkış ve polarite seçimi için çoklu 8 bitlik ayarlardan oluşur.

Genişleticiler, diğer örneklerin yanı sıra anahtarlar, sensörler, düğmeler ve LED'ler için IO'lara ihtiyaç duyulduğunda basit bir çözüm sunar.

2. Adım: Özellikler

16 Giriş / Çıkış pini (16 giriş standardı)

Hızlı I2C veri yolu saat frekansı (0-400 kbit/s)

Üç donanım adres pimi, sekiz adede kadar cihazın kullanımına izin verir

Bağlantı Noktası Yakalama Kaydedicisini Kesinti

Giriş portu verilerinin polaritesini ayarlamak için polarite ters çevirme kaydı

Çoğu mikrodenetleyici ile uyumlu

Adım 3: ESP01 128 GPIO'ya Sahip Olabilir

ESP01 128 GPIO'ya Sahip Olabilir!
ESP01 128 GPIO'ya Sahip Olabilir!

Bu genişleticinin büyüklüğünü gösteren bir örnek, yalnızca iki IOS ile sekiz adede kadar genişleticiye bağlanabilen ve 128 GPIO'ya ulaşan ESP01 ile kullanılmasıdır.

Adım 4: MCP23016

MCP23016
MCP23016

Burada, sekiz bitlik iki gruba sahip genişleticinin şemasına sahibiz. Bu, toplam 16 bağlantı noktası yapar. Bir kesme pinine ek olarak, dahili olarak bir mantık portuna bağlı olan kondansatörü ve rezistörü birbirine bağlayan CLK pinine sahiptir. Bu, 1MHz saate ihtiyaç duyan bir kristal osilatör fikrini kullanarak saati oluşturmaktır. TP pini saati ölçmek için kullanılır. A0, A1 ve A2 pinleri ikili adreslerdir.

Adım 5: SAAT

SAAT
SAAT
SAAT
SAAT

Bu nedenle MCP23016, dahili Saatin hızını belirlemek için harici bir RC devresi kullanır. Cihazın düzgün çalışması için (genellikle) 1 MHz'lik bir dahili saat gereklidir. Dahili saat TP pininde ölçülebilir. REXT ve CEXT için önerilen değerler aşağıda gösterilmiştir.

6. Adım: Adres

MCP23016'nın adresini tanımlamak için A0, A1 ve A2 pinlerini kullanırız. Adres değişikliği için onları YÜKSEK veya DÜŞÜK olarak bırakın.

Adres aşağıdaki gibi oluşturulacaktır:

MCP_Adresi = 20 + (A0 A1 A2)

A0 A1 A2 YÜKSEK / DÜŞÜK değerleri alabildiğinde, bu 0 ile 7 arasında bir ikili sayı oluşturur.

Örneğin:

A0> GND, A1> GND, A2> GND (000 anlamına gelir, sonra 20 + 0 = 20)

Yoksa, A0> YÜKSEK, A1> GND, A2> YÜKSEK (101 anlamına gelir, sonra 20 + 5 = 25)

7. Adım: Komutlar

Komutlar
Komutlar

Aşağıda iletişim komutlarını içeren bir tablo bulunmaktadır. GP0 ve GP1'in yanı sıra IODIR0 ve IODIR1'i kullanalım.

Adım 8: Kategoriler:

GP0 / GP1 - Veri Bağlantı Noktası Kayıtları

İki GPIO bağlantı noktasına erişim sağlayan iki kayıt vardır.

Kayıt okuması, o port üzerindeki pinlerin durumunu sağlar.

Bit = 1> YÜKSEK Bit = 0> DÜŞÜK

OLAT0 / OLAT1 - Çıkış LACTCH KAYITLARI

İki bağlantı noktasının çıkış bağlantı noktalarına erişim sağlayan iki kayıt vardır.

IPOL0 / IPOL1 - Giriş Polarite Kayıtları

Bu kayıtlar, kullanıcının giriş bağlantı noktası verilerinin (GP0 ve GP1) polaritesini yapılandırmasına izin verir.

IODIR0 / IODIR1

Pin modunu kontrol eden iki kayıt vardır. (Giriş veya Çıkış)

Bit = 1> GİRİŞ Bit = 0> ÇIKIŞ

INTCAP0 / INTCAP1 - Yakalama Kayıtlarını Kesinti

Bunlar, kesmeyi oluşturan bağlantı noktasının değerini içeren kayıtlardır.

IOCON0 / IOCON1 - G / Ç Genişletici Kontrol Kaydı

Bu, MCP23016'nın işlevselliğini kontrol eder.

Bit 0'ı (IARES> Kesinti Etkinliği Çözünürlüğü) ayarlamak, GP bağlantı noktası pinlerinin örnekleme frekansını kontrol eder.

Bit0 = 0> (varsayılan) Maksimum bağlantı noktası etkinliği algılama süresi 32 ms'dir (düşük güç tüketimi)

Bit0 = 1> bağlantı noktasında maksimum etkinlik algılama süresi 200usec'dir (daha yüksek güç tüketimi)

Adım 9: İletişim Yapısı

İletişim Yapısı
İletişim Yapısı

Burada, genişleticinin Arduino Uno ve Mega ile çalışmasına izin veren çekirdek Arduino'muzdaki I2C iletişimi olan Wire sınıfını gösteriyorum. Ancak, ikincisi zaten birkaç GÇ'ye sahiptir. Burada çipin adresleri, kayıtların kodları olan erişim kontrolü ve verilerle ilgileniyoruz.

Adım 10: Program

programı
programı

Programımız, kullanılacak daha fazla GPIO'ya sahip olmak için ESP32'yi MCP23016 ile iletişim kurmaktan oluşur. Daha sonra bir düğmemiz ve MCP23016'ya bağlı bazı LED'lerimiz olacak. Hepsini sadece I2C bus kullanarak kontrol edeceğiz. Böylece sadece iki adet ESP32 pini kullanılacaktır. Aşağıdaki videoda resim devresini görebilirsiniz.

Adım 11: ESP01

ESP01
ESP01

Burada ESP01'in Pinout'unu gösteriyorum.

Adım 12: ESP01'i Monte Etme

ESP01'i Montaj
ESP01'i Montaj

Bu örnekte, SDA'ya bağlı GPIO0'a ve SCL'ye bağlı GPIO2'ye sahibiz. Ayrıca bir röle kartımız, bir zilimiz ve bir LED'imiz var. Diğer bağlantı noktasında, GP1.0'da dirençli bir LED'imiz daha var.

Adım 13: NodeMCU ESP-12E

DüğümMCU ESP-12E
DüğümMCU ESP-12E

Burada NodeMCU ESP-12E'nin Pinout'u var.

Adım 14: NodeMCU ESP-12E'yi Monte Etme

NodeMCU ESP-12E Montajı
NodeMCU ESP-12E Montajı

Bu durumda, ilk örnekten tek fark, sırasıyla SDA ve SCL'de D1 ve D2'yi bağlamış olmanızdır.

Adım 15: WiFi NodeMCU-32S ESP-WROOM-32

WiFi DüğümüMCU-32S ESP-WROOM-32
WiFi DüğümüMCU-32S ESP-WROOM-32

İşte WiFi NodeMCU-32S ESP-WROOM-32'nin Pinout'u.

Adım 16: WiFi Montaj NodeMCU-32S ESP-WROOM-32

WiFi Montaj DüğümüMCU-32S ESP-WROOM-32
WiFi Montaj DüğümüMCU-32S ESP-WROOM-32

Bu sefer, diğer iki örnekten temel fark, düğme ve üç yanıp sönen LED'dir. Burada SDA, GPIO19'a bağlıyken SCL, GPIO23'e bağlıdır.

Adım 17: Kitaplıklar ve Değişkenler

İlk olarak, MCP23016'nın i2c adresini ayarlamanın yanı sıra i2c iletişiminden sorumlu Wire.h'yi ekleyeceğiz. Bazılarını bu projede kullanmadığımız bile birkaç komut gösteriyorum.

#include // Wire.h kitaplığının kullanımını belirtin. //endereço I2C do MCP23016 #define MCPAddress 0x20 // İLİŞKİ KAYDI İÇİN KOMUT BYTE: Tablo: 1-3 of Microchip MCP23016 - DS20090A //ENDEREÇOS DE REGISTRADORES #define GP0 0x00 // DATA PORT REGISTER 0 #define GPATA 0x01 // PORT KAYIT 1 #define OLAT0 0x02 // ÇIKIŞ KİLİT KAYDI 0 #tanım OLAT1 0x03 // ÇIKIŞ KİLİT KAYDI 1 #define IPOL0 0x04 // GİRİŞ POLARİTESİ PORT REGISTER 0 #define IPOL1 0x05 // GİRİŞ POLARİTESİ PORT REGISTER0 #define /IO / G/Ç YÖN KAYDI 0 #define IODIR1 0x07 // G/Ç YÖNÜ KAYDI 1 #define INTCAP0 0x08 // KESİNTİ YAKALAMA KAYDI 0 #define INTCAP1 0x09 // KESME YAKALAMA KAYDI 1 #define IOCON0 0x0A // I/O GENİŞLETİCİ KAYIT 0 #define IOCON1 0x0B // G/Ç GENİŞLETİCİ KONTROL KAYIT 1

Adım 18: Kurulum

Burada dört farklı tipte mikrodenetleyiciyi başlatma fonksiyonlarına sahibiz. Ayrıca frekansı kontrol ediyoruz, GPIO'ları kuruyoruz ve pinleri ayarlıyoruz. Döngüde butonun durumunu kontrol ediyoruz.

geçersiz kurulum() { Serial.begin(9600); gecikme(1000); tel.başla(19, 23); //ESP32 // Wire.begin(D2, D1); //nodemcu ESP8266 // Wire.begin(); //arduino // Wire.begin(0, 2);//ESP-01 Wire.setClock(200000); //frekans //yapılandırma o GPIO0 ortak ÇIKIŞ (todos işletim sistemi pinos)configPort(IODIR0, OUTPUT); //configura o GPIO1 ortak GİRİŞ o GP1.0 ve ortak ÇIKIŞ çıkışları GP1 configurationPort(IODIR1, 0x01); // GPIO0'da LOW writeBlockData(GP0, B00000000); // GPIO1 como LOW writeBlockData(GP1, B00000000); } void loop() { //verifica e o botão GP foi pressionado checkButton(GP1); } // döngüyü sonlandır

Adım 19: ConfigurePort

Bu adımda GPIO pinlerinin modunu yapılandırıyoruz ve portların modunu belirliyoruz.

// GPIO (GP0 veya GP1) yapılandırması//parametro geçişleri: //port: GP0 veya GP1 //özel: GP trabalharem como girişleri için INPUT para todos // GP trabalharem como dedia gibi portlar olarak ÇIKIŞ para todos / / özel değer 0-255 portları o modo das göstergesi (1=GİRİŞ, 0=ÇIKIŞ) // örn: 0x01 veya B00000001 veya 1: göstergeler o GPX.0 trabalhará como giriş, o restando komo dedia void configurationPort(uint8_t bağlantı noktası, uint8_t özel) { if(özel == GİRİŞ) { writeBlockData(bağlantı noktası, 0xFF); } else if(özel == OUTPUT) { writeBlockData(port, 0x00); } else { writeBlockData(port, özel); } }

Adım 20: WriteBlockData & CheckButton

Burada i2c bus üzerinden MCP23016'ya veri gönderiyoruz, butonun durumunu kontrol ediyoruz ve basılıp basılmadığını dikkate alarak bir sonraki adımı belirtiyoruz.

//envia dados para o MCP23016 barramento i2c//cmd'ye bakın: COMANDO (kayıt şirketi) //veri: dados (0-255) void writeBlockData(uint8_t cmd, uint8_t verisi) { Wire.beginTransmission(MCPAddress); Wire.write(cmd); Wire.write(veri); Wire.endTransmission(); gecikme(10); }

//basınç denetimi için geçerli//parametro GP: GP0 veya GP1 geçersiz checkButton(uint8_t GP) { //faz a leitura do pino 0 GP fornecido uint8_t btn = readPin(0, GP); //se botão pressionado, seta para HIGH as portas GP0 if(btn) { writeBlockData(GP0, B111111); } //caso contrario deixa todas em estado DÜŞÜK başka{ writeBlockData(GP0, B00000000); } }

Adım 21: ReadPin ve ValueFromPin

Burada belirli bir pinin okunması ve bit değerinin istenen konuma geri döndürülmesi ile ilgileniyoruz.

//çok özel bir temel nokta//pin: pino desejado (0-7) //gp: GP0 veya GP1 //retorno: 0 veya 1 uint8_t readPin(uint8_t pin, uint8_t gp) { uint8_t statusGP = 0; Wire.beginTransmission(MCPAAdresi); Wire.write(gp); Wire.endTransmission(); Wire.requestFrom(MCPAAdresi, 1); // ler çip 1 baytlık durumGP = Wire.read(); dönüş değeriFromPin(pin, statusGP); } //gereğini yerine getirme ya da değiştirme //pin: doğru bit (0-7) //statusGP: GP değeri (0-255) uint8_t valueFromPin(uint8_t pin, uint8_t statusGP) { return (statusGP & (0x0001 << pin)) == 0 ? 0: 1; }

Adım 22: ESP8266 Programı

Buradan ESP-01'de ve nodeMCU ESP-12E'de kullandığımız programın nasıl oluşturulduğunu göreceğiz, bu da aralarındaki farkların ne kadar az olduğunu anlamamızı sağlıyor.

Sadece Wire nesnesinin başlangıç yöntemi olan i2c iletişim kurucusunun satırını değiştireceğiz.

Derleyeceğimiz plakaya göre satırın yorumunu kaldırmanız yeterlidir.

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

Kurmak

Oluşturucunun hala yorumlandığına dikkat edin. Bu nedenle, kartınıza göre yorum yapın (ESP-01 veya nodeMCU ESP12-E).

geçersiz kurulum() { Serial.begin(9600); gecikme(1000); // Tel.başla(D2, D1); //nodemcu ESP8266 // Wire.begin(0, 2); //ESP-01 Wire.setClock(200000); //frekans //yapılandırma o GPIO0 ortak ÇIKIŞ (todos işletim sistemi pinos)configPort(IODIR0, OUTPUT); //configura o GPIO1 ortak ÇIKIŞ (todos işletim sistemi pinleri) configurePort(IODIR1, OUTPUT); // GPIO0'da LOW writeBlockData(GP0, B00000000); // GPIO1 como LOW writeBlockData(GP1, B00000001); }

Döngü

Döngüde pinleri her 1 saniyede bir değiştiriyoruz. Böylece, GP0'ın pin0'ı açıkken, GP1'in pinleri kapalıdır. GP1'in pin0'ı açıkken, GP0 pinleri kapalıdır.

void loop() { // GP0 ortak noktası YÜKSEK ve ortak kullanım DÜŞÜK writeBlockData(GP0, B10000000); // GPIO1 como LOW writeBlockData(GP1, B00000000); gecikme(1000); // GPIO0'da LOW writeBlockData(GP0, B00000000); // seta o pino 0 GP1 komo YÜKSEK e os demais komo DÜŞÜK writeBlockData(GP1, B00000001); gecikme(1000); } // döngüyü sonlandır

Adım 23: ÖNEMLİ

Kullanılan değişkenler ve kitaplık, ESP32 için yaptığımız programınkilerle aynı olduğu gibi, configurePort ve writeBlockData yöntemleriyle de aynıdır.

Adım 24: Dosyalar

Dosyaları indirin:

PDF

INO (ESP8266)

INO (ESP32)

Önerilen: