Мазмуну:

ESP32, ESP8266 жана Arduino үчүн IO Expander: 24 кадам
ESP32, ESP8266 жана Arduino үчүн IO Expander: 24 кадам

Video: ESP32, ESP8266 жана Arduino үчүн IO Expander: 24 кадам

Video: ESP32, ESP8266 жана Arduino үчүн IO Expander: 24 кадам
Video: How to control Servo Motor using ESP32 with Arduino ESP32 Servo library 2024, Июль
Anonim
Image
Image
Киришүү
Киришүү

ESP32, ESP8266 же Arduino IOдорун кеңейтүүнү каалайсызбы? Сиз I2C автобусун колдонуп башкарыла турган 16 жаңы GPIO мүмкүнчүлүгү жөнүндө ойлондуңуз беле? Бүгүн мен сени GPIO кеңейтүүчү MCP23016 менен тааныштырганы жатам. Ошондой эле, мен сизге MCP23016 менен микроконтроллерди кантип байланыштырууну көрсөтөм. Мен ошондой эле кеңейтүүчү менен баарлашуу үчүн бул микроконтроллердин 2 төөнөгүчүн колдоно турган программа түзүү жөнүндө сүйлөшөм. Биз муну LED жана баскычты башкаруу үчүн колдонобуз.

1 -кадам: Киришүү

MCP23016 түзмөгү I2C шинасын колдонуу менен GPIO кеңейтүү үчүн 16 битти камсыздайт. Ар бир битти жекече конфигурациялоого болот (киргизүү же чыгаруу).

MCP23016 киргизүү, чыгаруу жана полярдыкты тандоо үчүн бир нече 8-биттик орнотуулардан турат.

Экспантерлер башка мисалдардын арасында IOs өчүргүчтөргө, сенсорлорго, баскычтарга жана Светодиоддорго керек болгондо жөнөкөй чечимди камсыз кылат.

2 -кадам: мүнөздөмөсү

16 киргизүү / чыгаруу казыктары (16 киргизүү стандарты)

Тез I2C автобус саатынын жыштыгы (0-400 кбит/с)

Үч аппараттык дарек казыгы сегиз түзмөккө чейин колдонууга мүмкүндүк берет

Port Capture Recorder үзгүлтүккө учуратуу

Полярдыкты өзгөртүү портунун маалыматтарынын полярдуулугун орнотуу үчүн реестр

Көпчүлүк микроконтроллерлерге шайкеш келет

3 -кадам: ESP01де 128 GPIO болушу мүмкүн

ESP01де 128 GPIO болушу мүмкүн!
ESP01де 128 GPIO болушу мүмкүн!

Бул экспансердин чоңдугун көрсөткөн мисал, анын ESP01 менен колдонулушу, ал экиден IOS менен сегизге чейин кеңейтилип, 128 GPIOго жетет.

4 -кадам: MCP23016

MCP23016
MCP23016

Бул жерде бизде сегиз биттен турган эки топ бар экспансердин схемасы бар. Бул жалпысынан 16 портту түзөт. Үзгүлтүк пинден тышкары, анын ичинде логикалык портко туташкан конденсатор менен резисторду байланыштырган CLK пини бар. Бул 1МГц саатка муктаж болгон кристалл осцилляторунун идеясын колдонуу менен саатты түзүү. TP пин саатты өлчөө үчүн колдонулат. A0, A1 жана A2 казыктары бинардык даректер.

5 -кадам: СААТ

СААТ
СААТ
СААТ
СААТ

MCP23016 Ошондуктан ички Сааттын ылдамдыгын аныктоо үчүн тышкы RC схемасын колдонот. Түзмөктүн туура иштеши үчүн 1 МГц ички саат талап кылынат (көбүнчө). Ички саатты TP пининде өлчөөгө болот. REXT жана CEXT үчүн сунушталган баалуулуктар төмөндө көрсөтүлгөн.

6 -кадам: Дарек

MCP23016 дарегин аныктоо үчүн биз A0, A1 жана A2 төөнөгүчтөрүн колдонобуз. Даректи өзгөртүү үчүн аларды ЖОГОРУ же ТӨМӨН калтырыңыз.

Дарек төмөнкүчө түзүлөт:

MCP_Address = 20 + (A0 A1 A2)

А0 А1 А2 ЖОГОРУ / ТӨМӨН маанилерди кабыл ала турган жерде, бул 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 - Input Polarity Registers

Бул регистрлер колдонуучуга кирүү портунун маалыматтарынын полярлыгын конфигурациялоого мүмкүндүк берет (GP0 жана GP1).

IODIR0 / IODIR1

Пин режимин көзөмөлдөгөн эки регистр бар. (Киргизүү же чыгаруу)

Bit = 1> INPUT Bit = 0> OUTPUT

INTCAP0 / INTCAP1 - Үзгүлтүксүз жазуу реестрлери

Бул үзгүлтүктү жараткан порттун маанисин камтыган регистрлер.

IOCON0 / IOCON1 - I / O Expander Control реестри

Бул MCP23016нын иштешин көзөмөлдөйт.

0 битин коюу (IARES> Аракетти үзгүлтүккө учуратуу) GP порту казыктарынын тандоо ылдамдыгын көзөмөлдөйт.

Bit0 = 0> (демейки) Максималдуу порт ишин аныктоо убактысы 32ms (аз энергия керектөө)

Bit0 = 1> портко активдүүлүктү аныктоо убактысы 200usec (жогорку энергия керектөө)

9 -кадам: Байланыш структурасы

Байланыш түзүмү
Байланыш түзүмү

Мен бул жерде Wire классын көрсөтөм, бул биздин негизги Arduinoдогу I2C байланышы, бул экспантерге Arduino Uno жана Mega менен иштөөгө мүмкүнчүлүк берет. Бирок, экинчисинде буга чейин бир нече IO бар. Биз бул жерде чиптин даректери, регистрлердин коддору болгон кирүүнү башкаруу, ошондой эле маалыматтар менен алектенебиз.

10 -кадам: Программа

Программа
Программа

Биздин программа ESP32 менен MCP23016 менен байланышып, көбүрөөк GPIO колдонушу керек. Андан кийин бизде баскыч жана MCP23016га туташкан кээ бир светодиоддор болот. Биз алардын бардыгын I2C автобусу менен гана көзөмөлдөйбүз. Ошентип, эки гана ESP32 төөнөгүч колдонулат. Төмөндөгү видеонун схемасын көрө аласыз.

11 -кадам: ESP01

ESP01
ESP01

Бул жерде мен ESP01 Pinout көрсөтөм.

12 -кадам: ESP01 монтаждоо

ESP01 монтаждоо
ESP01 монтаждоо

Бул мисалда бизде GPIO0 SDAга, GPIO2 SCLге туташкан. Ошондой эле бизде релелик такта, ызылдак жана светодиод бар. Башка портто, GP1.0де бизде резистору бар дагы бир LED бар.

13-кадам: NodeMCU ESP-12E

NodeMCU ESP-12E
NodeMCU ESP-12E

Бул жерде бизде NodeMCU ESP-12E Pinout бар.

14-кадам: NodeMCU ESP-12E монтаждоо

NodeMCU ESP-12E монтаждоо
NodeMCU ESP-12E монтаждоо

Бул учурда, биринчи мисалдан бир гана айырмасы, сиз SDA менен SCLде D1 жана D2ди туташтырдыңыз.

15-кадам: WiFi NodeMCU-32S ESP-WROOM-32

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

Бул жерде WiFi NodeMCU-32S ESP-WROOM-32 түйүнү.

16-кадам: WiFi орнотуу түйүнүMCU-32S ESP-WROOM-32

WiFi орнотуу түйүнүMCU-32S ESP-WROOM-32
WiFi орнотуу түйүнүMCU-32S ESP-WROOM-32

Бул жолу башка эки мисалдан негизги айырмачылык - бул баскыч жана үч жарк эткен LED. Бул жерде SDA GPIO19 менен туташкан, ал эми SCL GPIO23 менен туташкан.

17 -кадам: Китепканалар жана өзгөрмөлөр

Биринчиден, биз i2c байланыш үчүн жооптуу болгон Wire.h, ошондой эле MCP23016дын i2c дарегин орнотобуз. Мен бир нече буйруктарды көрсөтөм, атүгүл кээ бирлери биз бул долбоордо колдонбойбуз.

#include // Wire.h китепканасынын колдонулушун көрсөтүңүз. // endereço I2C do MCP23016 #MCPAddressти аныктоо 0x20 // БАЙЛАНЫШТЫ КАТТОО ҮЧҮН БУЙРУТ: Таблица: 1-3 Microchip MCP23016 - DS20090A // ENDEREÇOS DE REGISTRADORES #define GP0 0x00 // DATA PORT REGINER1 0 0de ПОРТ КАТТООЧУ 1 #OLAT0 аныктоо 0x02 // ЧЫГАРЫЛЫШ КЫЛЫШ КАТТООЧУ 0 #аныктоо OLAT1 0x03 // ЧЫГАРЫЛУУЛУК КЫРГЫЗ КАТТООЧУ 1 #define IPOL0 0x04 // КИРГИЗҮҮЧҮ ПОРТТУК ПОРТ КАТТОО 0 #аныктоо IPOL1 0x05 PIR0PEPE01 INPUTE /I/O БАГЫТ КАТТООЧУ 0 #аныктоо IODIR1 0x07 // I/O БАГЫТ КАТТООЧУ 1 #интерфейс INTCAP0 0x08 // үзгүлтүксүз тартуу каттоосу 0 #аныктоо INTCAP1 0x09 // үзгүлтүксүз катталуу 0 катталуучу 0 REGISTER 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); // жыштык // конфигурация GPIO0 аркылуу OUTPUT (toos os os pinos) configurePort (IODIR0, OUTPUT); // GPIO1 конфигурациясы INPUT же GP1.0 жана OUTPUT os outros GP1 configurePort (IODIR1, 0x01); // GPIO0 аркылуу LOW writeBlockData (GP0, B00000000) жасоо керек; // GPIO1 аркылуу LOW writeBlockData (GP1, B00000000) жасоо керек; } void loop () {// verifica e o botão GP for pressionado checkButton (GP1); } // аяктоочу цикл

19 -кадам: ConfigurePort

Бул кадамда биз GPIO пиндеринин режимин конфигурациялайбыз жана порттордун режимин аныктайбыз.

// GPIO конфигурациясы (GP0 ou GP1) // комо параметрлери: // порт: GP0 же GP1 // салт: INPUT үчүн todos port to do GP trabalharem como entrada // OUTPUT үчүн todos port to do GP trabalharem como saida/ / custom um valor de 0-255 indicando o modo das portas (1 = INPUT, 0 = OUTPUT) // ex: 0x01 or B00000001 ou 1: indica que apenas o GPX.0 trabalhará como entrada, or restando como saida void configurePort (uint8_t порт, uint8_t салт) {if (custom == INPUT) {writeBlockData (порт, 0xFF); } else if (custom == OUTPUT) {writeBlockData (порт, 0x00); } else {writeBlockData (порт, салт); }}

20 -кадам: WriteBlockData & CheckButton

Бул жерде, биз i2c автобус аркылуу MCP23016га маалыматтарды жөнөтөбүз, баскычтын абалын текшеребиз жана басуу же баспоо шартын эске алуу менен кийинки кадамды көрсөтөбүз.

// envia dados para mCP23016 através do barramento i2c // cmd: COMANDO (регистратор) // маалыматтар: dados (0-255) жараксыз WriteBlockData (uint8_t cmd, uint8_t маалыматтар) {Wire.beginTransmission (MCPAddress); Wire.write (cmd); Wire.write (маалыматтар); Wire.endTransmission (); кечигүү (10); }

// verifica se o botão foi pressionado // parametro GP: GP0 or GP1 void checkButton (uint8_t GP) {// faz a leitura do pino 0 no GP fornecido uint8_t btn = readPin (0, GP); // баскычтарды басуу, GP0 катары ЖОГОРУ орнотуу GP0 if (btn) {writeBlockData (GP0, B11111111); } // caso contrario deixa todas em estado LOW else {writeBlockData (GP0, B00000000); }}

21 -кадам: ReadPin & ValueFromPin

Биз бул жерде белгилүү бир пинди окуу жана бит маанисин каалаган позицияга кайтаруу менен алектенебиз.

// faz a leitura de um pino específico // pin: pino desejado (0-7) // gp: GP0 ou GP1 // retorno: 0 o 1 uint8_t readPin (uint8_t pin, uint8_t gp) {uint8_t statusGP = 0; Wire.beginTransmission (MCPA дареги); Wire.write (gp); Wire.endTransmission (); Wire.requestFrom (MCPA дареги, 1); // чип 1 байт statusGP = Wire.read (); return valueFromPin (пин, statusGP); } // retorna o valor do bit na posição desejada // pin: positsã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де колдонгон программанын кантип түзүлгөнүн көрөбүз, бул алардын ортосундагы айырмачылыктар минималдуу экенин түшүнүүгө мүмкүндүк берет.

Биз Wire объектисинин башталыш ыкмасы болгон i2c байланыш конструкторунун линиясын гана өзгөртөбүз.

Биз түзө турган плитага ылайык сызыкты комментарийлеңиз.

// 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); // жыштык // конфигурация GPIO0 аркылуу OUTPUT (toos os os pinos) configurePort (IODIR0, OUTPUT); // конфигурация GPIO1 аркылуу OUTPUT (toos os os pinos) configurePort (IODIR1, OUTPUT); // GPIO0 аркылуу LOW writeBlockData (GP0, B00000000) жасоо керек; // GPIO1 аркылуу LOW writeBlockData (GP1, B00000001) жасоо керек; }

Loop

Укурукта биз пиндерди ар бир 1 секундда алмаштырабыз. Ошентип, GP0 pin0 күйүп турганда, GP1 пиндери өчүрүлөт. GP1дин pin0 күйгүзүлгөндө, GP0 пиндери өчүрүлөт.

void loop () {// set 7 pno do GP0 como HIGH ЖАНА DOW writeBlockData (GP0, B10000000); // GPIO1 аркылуу LOW writeBlockData (GP1, B00000000) жасоо керек; кечигүү (1000); // GPIO0 аркылуу LOW writeBlockData (GP0, B00000000) жасоо керек; // GP1 комо ЖОГОРКУ ЖОК ЭМЕС, LOW writeBlockData (GP1, B00000001); кечигүү (1000); } // аяктоочу цикл

23 -кадам: МААНИЛҮҮ

Колдонулган өзгөрмөлөр жана китепкана биз ESP32 үчүн жасаган программанын, ошондой эле configurePort жана writeBlockData методдору менен бирдей.

24 -кадам: Файлдар

Файлдарды жүктөп алыңыз:

PDF

INO (ESP8266)

INO (ESP32)

Сунушталууда: