ESP8266-12E – як підключити велику кількість компонентів до модуля або плати NodeMCU

Аудиторія

Стаття для розробників інженерного рівня

Проблема і шляхи подолання

При вивченні публікацій щодо рішень IoT на основі різних контролерів складається враження, що використання інтегральних мікросхем сімейства ESP8266EX в якості контроллера не вигідне по причині малої кількості портів вводу-виводу GPIO. І це дійсно було б вагомою вадою будь-якого мініатюрного мікроконтролера типу ESP8266, якби не перевірені та ефективні шляхи вирішення проблеми бюджету вільних пінів.

Як недоліки ESP8266-12E перетворюються у можливості

Продемонструємо один із способів компактного використання входів/виходів ESP8266-12E і завдяки цьому не лише досягнемо мети, а і отримаємо нові можливості. 

Метод базується на підключенні входів/виходів компонентів через розширювачі портів вводу-виводу – так звані GPIO-екстендери, під’єднані до контроллера засобами послідовного інтерфейсу, широко відомого, як шина I2C. 

Примітка 1. Шина потребує під свою роботу лише дві сигнальні лінії: даних – SDA та синхронізації – SCL. А також потрібно дві лінії під організацію живлення пристроїв на шині: 3V3 та GND. 

Таким чином майстер пристрій (у нашому випадку це ESP8266-12E) має обов’язково забезпечити щонайменше лінії сигналізації та загальну “землю”. Лінію живлення 3V3 також забезпечує “майстер”, якщо систему живлення підпорядкованих (slave) пристроїв на шині не передбачено виконувати у інший спосіб. 

Примітка 2. Оскільки шина I2C не передбачає універсального механізму генерування подій засобами підпорядкованих пристроїв, тому класична модель організації зворотнього зв’язку забезпечується додатковою сигнальною лінією від підпорядкованого пристрою до майстер пристрою, що потребує ще одного окремого порту вводу-виводу. Таку модель реалізації подій підтримує переважна більшість пристроїв шляхом додаткового виводу INT. Таким чином, застосування шини I2C має бюджет видатків у 3 сигальні піни (SDA, SCL, INT) на майстер-контролері.

Автори провели достатню кількість практичних тестових випробувань, щоб рекомендувати читачам цей метод. Це рішення дозволяє заощадити бюджет вільних портів та отримувати, в результаті впровадження, баланс бюджету “- 3 + 8” при використанні екстендера PCA9538 (має 8 додаткових GPIO), або “- 3 + 16” PCA9655E (має 16 GPIO), чи MCP23017 (теж має 16 GPIO). 

Примітка 3. При тестуванні пристроїв з такими підключеннями ми не помітили утворення дефіциту обчислювальної чи пропускної спроможності системи. Адже шина I2C у межах прошивки NodeMCU, навіть враховуючи потенційні обмеження швидкості у i2c.SLOW = 100 КГц, має теоретичну максимальну швидкість передачі даних 12,5 Кбіт/с. Про доступні режими швидкості див. документацію за посиланням: https://nodemcu.readthedocs.io/en/master/modules/i2c/#parameters_2

На Схемі 1 зображено фрагмент схеми контроллера ESP8266-12E, до якого підключені 4 тактових кнопки, світлодіод RGB і зуммер. За рахунок підключеного екстендера, зайняті лише три GPIO контроллера і створено чотири ввідних GPIO і чотири вивідних.

Схема контроллера ESP8266-12E, до якого підключені 4 тактових кнопки, світлодіод RGB і зуммер
Схема 1. Фрагмент схеми підключення компонентів інтерфейсу користувача по шині I2C із застосуванням розширювача інтерфейсів PCA9538

Короткі пояснення до схеми

Таблиця 1. Інтерфейс I2C і переривання INT

Назва лініїPin NodeMCUPin ESP8266-12EPin на PCA9538Активний рівень на PCA9538
SCLD1GPIO514Низький (active-low)
SDAD2GPIO415Низький(active-low)
INTD3GPIO013Низький(active-low)

Примітка 4. Порти вводу-виводу для організації шини I2C ми обрали свідомо саме такими – адже ми керуємося власними рекомендаціями щодо планування та застосування пінів. Докладніше див. за посиланням: https://alterstrategy.com/recommended-pin-use-standard/ Читач може обирати будь-які інші піни там, де це не входить у протиріччя з технічними обмеженнями платформи ESP8266-12E та NodeMCU.

Компоненти можуть бути підключені до будь-яких GPIO екстендера. Рекомендації щодо підготовки  портів (Pin) екстендерів, Ви знайдете в документації відповідного виробника. На даній схемі встановлені Pull-Up резистори згідно цих рекомендацій. Встановлені також обмежувачі струму світлодіодів, елементи захисту від брязкоту кнопок і інші необхідні компоненти. 

При натисканні кнопок, екстендер низьким рівнем передає контроллеру сигнал перериваня INT, яким ініціюється обробка події і як наслідок, обробка відповідного прикладного сценарію.

Наприклад, якщо на вхід INT майстер пристрою прийшла подія про натискання кнопки, то перевіряємо зустрічним запитом (вже по шині I2C) яку саме кнопку було натиснуто і вмикаємо певний світлодіод, певним кольором, супроводжуючи потрібною кількістю звукових сигналів зумера. 

Висновки

  • У пошуках методів вивільнення “коштовних” портів вводу-виводу, ми знайшли прийнятний спосіб як заощадити порта, а також отримали у результаті гнучку систему побудови інтерфейсів користувача з мінімальною кількістю точок відмови. 
  • Зверніть увагу, що якби ми підключали кожен компонент запропонованого інтерфейсу індивідуально, нам знадобилося б тягнути від майстер контролера сумарно не 5 дротів, а щонайменше 16. Лише уявіть, що кожен такий провід – потенційна точка відмови.
  • Оскільки шина I2C дозволяє нам підключити декілька розширювачів портів одночасно, ми в будь-який момент зможемо суттєво розширювати бюджет вільних для застосування портів. Бонусом є ще й те, що у якості INT, ми все ще зможемо використовувати один і той же, спільний для кількох екстендерів, порт вводу-виводу майстер-контролера.
  • Якщо у процесі експлуатації виникне бажання змінити логіку роботи запропонованого інтерфейсу користувача – немає жодних обмежень. Це та гнучкість, про яку ми згадували на початку тексту.

Рекомендуємо ознайомитися з документацією виробників:

https://www.nxp.com/docs/en/data-sheet/PCA9538.pdf

http://www.ti.com/lit/ds/symlink/pca9555.pdf?ts=1587996933517

http://ww1.microchip.com/downloads/en/devicedoc/20001952c.pdf

Бажаємо успіхів.