Огляд C-модулів у складі прошивки NodeMCU з LUA. Частина 2.

Ви читаєте другу частину публікації, що присвячено огляду модулів прошивки NodeMCU. У цій частині ми розглянемо призначення ключових модулів доступних для прошивки. У попередній частині (Огляд C-модулів у складі прошивки NodeMCU) ми визначили типи модулів і зробили класифікацію.

Всі модулі ми розподіляли за типом і за призначенням:

 C-модулі на вибір:
 – модулі платформи
 – модулі зовнішніх пристроїв
Lua-модулі:
– модулі платформи
– модулі зовнішніх пристроїв
вбудовані C-модулі мови програмування

А потім навіть запропонували власну класифікацію за категоріями з точки зору застосування модулів у проектах для IoT-пристроїв.

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

Статистика

Статистичні дані ресурсу nodemcu-build.com/stats не збігаються, як ви побачите далі, з нашим баченням, адже ми робимо огляд саме ключових для будь-якого розумного пристрою модулів.

На Рис. 1 показано статистику за останніх 60 днів на момент написання даного тексту у травні 2020. Ця статистика базується на популярності тих чи інших модулів, які розробники включають до своїх прошивок засобами сайту nodemcu-build.com.

Рис 1. Кількість білдів прошивки NodeMCU з певними C-модулями

Найпопулярнішими є модулі по замовчуванню, тобто ті, які засновник сайту вирішив оголосити такими. Те що найпопулярнішими є модулі по замовчуванню псує сподівання на свідомий вибір розробників і вказує на те що більшість з них покладається на рекомендацію сервісу. Втім, сервіс nodemcu-build влаштовано так, і це добре, що будуючи прошивку, можливо самостійно обирати модулі: як ті що рекомендовано за замовчуванням, так і будь-які інші.

Ця статистика є доволі промовистою і допомагає орієнтуватися у загальних тенденціях щодо застосування ESP8266 з прошивкою NodeMCU/Lua, адже у такий спосіб можливо бачити наближений до реальності попит на функціональність під капотом мікроконтролера.

Середньостатистичний портрет

Опишемо середньостатистичний портрет: маємо контролер, у якого обов’язково застосовується Wi-Fi (C-модуль WiFi) та інше базове апаратне начиння таке як:

  • порти вводу-виводу (C-модуль gpio), що мають обробку переривань;
  • робота з файловою системою (C-модуль file), вочевидь, для читання і запису файлів конфігурації та/чи реєстраційних журналів;
  • таймери (C-модуль tmr), як ще одне важливе джерело системних переривань;
  • взаємодія з пристроями через інтерфейс UART (дещо застарілий, але актуальний і зручний “текстовий” інтерфейс, який теж має прокладений на рівень Lua-коду, обробник події). Популярність у рейтингу uart, може також пояснюватися і тим, що консоль розробника працює через однойменний інтерфейс, і тому всі долучають цей модуль про всяк випадок, хоча його призначено суто для зовнішніх периферійних пристроїв, а не для debug консолі;

Мережна взаємодія середньостатистичного NodeMCU, покладається на головний у цьому напрямку C-модуль net який може як встановлювати вихідні так і приймати вхідні мережеві з’єднання на рівні TCP. Слід відзначити, що за статистикою, лише 15% прошивок мають модуль tls – відповідальний за підтримку захищених з’єднань TLS/SSL.

Також можемо бачити, що за статистикою модулі передачі даних http та mqtt мають майже однакову і високу популярність (на відміну від websocket), а ось про модулі послідовних шин передачі даних i2c та spi, такого вже сказати не можемо – шина i2c має значно більший рейтинг, ніж spi.

Наступним за популярністю після шини I2C йде модуль adc – дозволяє розробникові підключати аналогові сенсори типу термістора чи фоторезистора для вимірювання фізичних величин, але найперше що дозволяє цей вбудований 10-бітний, уніполярний, одноканальний АЦП, так це вимірювати рівень напруги (рівнем 0-1В==0-1023 поділки) на власній батареї живлення. Ця можливість може призводити до популярності даного модуля у прошивках. Принайнмі, ми саме так застосовуємо цей маленький і корисний модуль у своїх пристроях.

Модуль широтно-імпульсної модуляції pwm, вказує на задачі, що пов’язані з керуванням різноманітними виконавчими механізмами, а швидше за все, різноманітними двигунами.

Наявність модуля sjson на високих позиціях у прошивках, може нам сказати, що доволі популярне перетворення масивів даних Lua у json і у назад через необхідність передачі або отримання даних мікроконтролером у хмару/з хмари, як продовження ланцюжка функціональності http та mqtt.

Модулі роботи з датою/часом rtctime та sntp, знаходяться лише посередині рейтингу, що дивує, адже який може бути розумний пристрій, якщо у нього немає обліку часу, необхідного для збору даних чи реєстрації подій.

Наявність у рейтингу модуля графічної бібліотеки u8g2 для OLED дисплеїв і відсутність графічної бібліотеки ucg для TFT дисплеїв, може свідчити про заощадження розробниками ресурсу батареї та коштів на великоформатний кольоровий TFT дисплей.

Ось такі суб’єктивні висновки можемо робити опираюсь на власний досвід та наочну статистику.

Кластери внутрішніх функціональних взаємозв’язків

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

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

Наприклад, C-модуль wifi бере суттєву участь у керуванні живленням мікроконтролера ESP8266 через свої методи wifi.setmode(), wifi.setphymode(), wifi.setmaxtxpower(), wifi.nullmodesleep(), wifi.sta.sleeptype(), але це не є очевидним з першого погляду.

У той же час, не лише кожен окремий модуль може бути задіяний у вирішенні декількох задач, а і навпаки – декілька модулів разом, у зв’язці, можуть давати потрібний результат.

Такі взаємозв’язки модулів бувають як сильними – так зване dependency, так і слабкими – у вигляді логіки їх сумісного застосування у коді.

Посеред інших, сильною є залежність модуля cron від модуля rtctime, а він у свою чергу не принесе ніякої користі без модуля sntp. Подібних депенденсі у прошивці не багато, але вони є і про них потрібно піклуватися одразу, ще на етапі створення двійкового файла для заливки у контролер.

На рис. 3 (натисніть, щоб збільшити зображення) наводимо сильні взаємозв’язки (aka dependency) відповідно до офіційної документації та файлів вихідного коду прошивки на github. Як можна бачити, особливостей дуже багато і щораз потрібно стратегічно підходити до прийняття рішень про набір модулів у прошивці.

До речі, з Lua-модулями такої проблеми немає – адже будь-які lua-скрипти можливо завантажити чи вилучити, коли це буде потрібно, звісно якщо не використовується прошивка з розділом файлової системи типу LFS ( Lua Flash Store, nodemcu.readthedocs.io/en/master/lfs/ ). В той же час, сильні взаємозв’язки також поширюються на Lua-модулі, як з боку виклику ними системних функцій, так і з боку інших Lua-модулів, що застосовуються в коді скриптів.

Слабких залежностей також вистачає. Як приклад, наведемо необхідність у наявності в прошивці модуля gpio, для обробки переривань з пристроїв, що приєднано на шину I2C, яку обробляє однойменний модуль. Тобто треба не лише i2c, а і gpio.

До пари, наведемо ще одну слабку залежність: для того, щоб працювати з інфрачервоним передавачем/приймачем, засобами модуля gpio, може знадобитися модуль node, який дозволяє змінити тактову частоту центрального процесора в більшу сторону.

Ключові модулі

Повертаючись до нашої версії переліку ключових модулів, і враховуючи викладене вище, наш вибір є наступним:

Таблиця 1. Ключові модулі за версією alterstrategy.lab

МодульОсновна категоріяВажливість
1adcсенсориякщо вимагає проект
2nodeсистемні компонентиобов’язково
3bitсистемні компонентибажано
4cronсистемні компонентибажано
5fileсистемні компонентиобов’язково
6gpioсистемні компонентиобов’язково
7httpсистемні компонентиобов’язково
8i2cсистемні компонентиобов’язково
9mdnsсистемні компонентибажано
10mqttсистемні компонентиякщо вимагає проект
11netсистемні компонентиобов’язково
12pwmвиконавчі механізмиякщо вимагає проект
13rtctimeсистемні компонентиобов’язково
14sjsonсистемні компонентибажано
15sntpсистемні компонентиобов’язково
16spiсистемні компонентиякщо вимагає проект
17tlsсистемні компонентиобов’язково
18tmrсистемні компонентиобов’язково
19u8g2інтерфейс користувачаякщо вимагає проект
20uartсистемні компонентиякщо вимагає проект
21ucgінтерфейс користувачаякщо вимагає проект
22websocketсистемні компонентиякщо вимагає проект
23wifiсистемні компонентиобов’язково
24wpsінтерфейс користувачабажано

Маємо:

Обов’язкові модулі11
Модулі, котрі бажано включати до прошивки5
Модулі, які користувач включить відповідно до вимог задачі8

Зверніть увагу, що у таблиці 1 наведено лише ключові модулі. Якби ми писали перелік для своїх проектів, то обов’язково також додали б модулі взаємодії із зовнішніми пристроями типу ads1115, ds3231, bme280.

Призначення ключових модулів

Наведемо коротко призначення та особливості ключових модулів, які ми хотіли б відзначити. Докладно читайте про кожен модуль у офіційній документації та розділах вихідних файлів прошивки NodeMCU.

C-Модуль node

Модуль node є системним і цей компонент так і позиціонується розробниками. Знаємо, що прошивку без цього модуля зробити можливо, але чи буде вона працювати, ми не перевіряли.

Цей модуль має ключові з нашої точки зору методи, що дозволяють керувати енергоспоживанням, відслідковувати і обробляти помилки раптового рестарту контролера. Дозволяє контролювати кількість вільної оперативної пам’яті під час виконання скриптів, зчитувати унікальні ідентифікатори та багато іншого.

Поміж іншого, саме цей модуль дозволяє виконувати компіляцію скриптів у двійковий формат.

Рекомендуємо до обов’язкового включення до складу прошивки.

C-Модуль adc

Модуль adc дозволяє легко застосовувати вбудований, 10-біт, уніполярний, одноканальний АЦП, що є на борту ESP8266. Зручно застосовувати як для вимірювання однієї фізичної величини, отриманої з аналогового сенсора, або для контролю власної акумуляторної батареї живлення пристрою.

Рекомендуємо включати до прошивки в залежності від задачі.

C-Модуль bit

Модуль bit дозволяє виконувати bitwise операції з двійковими числами, які, як приклад, отримано з регістрів периферійних пристроїв засобами шин i2c чи spi.

Бажано включати цей модуль до прошивки, особливо якщо планується взаємодія з іншими підпорядкованими пристроями.

C-Модуль cron

Модуль cron є аналогом юніксового планувальника задач. У модулі зручно виконувати планування систематично повторюваних задач завдяки застосуванню масок. Модуль має сильну залежність від наявності у прошивці C-модуля rtctime.

Бажано включати до складу прошивки, якщо дозволяє вільне місце у двійковому образі.

C-Модуль file

Модуль file є замінником модуля io з класичного Lua. Модуль file Забезпечує роботу з файлами. Зручний для читання і запису файлів конфігурацій та журналів вимірів чи подій.

Рекомендуємо до обов’язкового включення до складу прошивки.

C-Модуль gpio

Модуль gpio є чи не головним, дуже простим модулем, що відрізняє (звісно на рівні з модулями adc, wifi, uart, pwm, тощо) класичну мову Lua від вбудованої у NodeMCU. Цей модуль дозволяє працювати з портами вводу виводу мікроконтролера та обробляти переривання, що виникають на цих портах.

Рекомендуємо до обов’язкового включення до складу прошивки.

Модуль http

Модуль http реалізує клієнтські методи передачі даних по HTTP(s), але конкурентних запитів не підтримується. Розробник може застосовувати інший модуль net, що є більш гнучким і навіть десь функціонально збитковим. У модулі ж http є необхідний мінімум гнучкості і функціональності. Об’єм даних, що може бути отримано регулюється наявною вільною ОЗУ, тому це також накладає деякі обмеження (на відміну від можливостей модуля net).

Рекомендуємо до обов’язкового включення до складу прошивки.

C-Модуль i2c

Модуль i2c є третім за популярністю серед розробників. Модуль призначено для організації взаємодії з підпорядкованими периферійними пристроями на послідовній шині I2C. Функціонально модуль достатній для реалізації всіх можливих задач. У останніх версіях прошивки NodeMCU модуль було сильно перепрацьовані і доповнено новими можливостями, звісно, у межах специфікації на шину.

Оскільки складно собі уявити розумний пристрій без шини I2C, рекомендуємо цей модуль до обов’язкового включення до складу прошивки.

C-Модуль mdns

Модуль mdns реалізує одну просту, але дуже потрібну користувацьку функцію – Multicast DNS – реєструє у таблиці домашнього маршрутизатора зв’язку IP-адреси ESP8266 (наприклад, динамічної, тобто отриманої від DHCP) та локального доменного імені формату hostname.local. Цей технологічний процес робить можливим для користувачів відкривати у браузері web-інтерфейс мікроконтролера не за незручним і динамічним IP, а за статичним доменним ім’ям, наприклад, boiler.local

Бажано включити цей модуль до складу прошивки, якщо дозволяють обставини.

C-Модуль mqtt

Модуль mqtt реалізує клієнтську частину специфікації протоколу MQTT і призначений для прийому-передачі прикладних даних між NodeMCU та MQTT брокером. Якщо дуже спростити, то прикладний сенс приблизно такий самий як у модуля http, а от технологічний стек і сервісна таксономія абсолютно інші.

Рекомендуємо цей модуль долучати до прошивки лише в разі потреби, оскільки він має велике внутрішнє депенденсі на рівні C.

C-Модуль net

Модуль net призначений для обслуговування вхідних і вихідних TCP з’єднань. Потребує поглиблених знань у структурах внутрішніх повідомлень протоколів. Втім, цей модуль є одним з базових для будь-якого пристрою. Зверніть увагу, що HTTPS, тобто TLS/SSL не є частиною даного модуля, а тому модуль TLS потрібно включати окремим налаштуванням на сайті nodemcu-build.com: “TLS/SSL support provided by mbed TLS: TLS 1.0 / 1.1 / 1.2 and most common cipher suites including DH/ECDH (ECDSA-based disabled by default)”.

Рекомендуємо до обов’язкового включення до складу прошивки.

C-Модуль pwm (і pwm2 також)

Модулі pwm та pwm2 призначені для реалізації широтно-імпульсної модуляції на портах вводу-виводу у режимі виходу. Модуль pwm з’явився давно, а от pwm2 було створено нещодавно (починаючи з прошивки 3.0-master_20190907). Модуль pwm підтримує 10-бітну шкалу для duty cycle, частоту до 1 кГц і не підтримує індивідуальних частот для кожного GPIO. Зауважте, що не всі GPIO мають підтримку PWM. Модуль pwm2 підтримує частоти від 120 кГц @ CPU80MHz до 250 кГц @ CPU160MHz. У pwm2 є підтримка індивідуальних частот для кожного GPIO. Також pwm2 може генерувати фракції (не круглі значення, 1001 Гц) частот.

Рекомендуємо цей модуль долучати до прошивки лише в разі потреби.

C-Модуль rtctime

Модуль rtctime є одним з вузлових модулів по роботі з вбудованим RTC і застосовується для реалізації функціональності довкола календаря – дати та часу. Наявності цього модуля вимагають інші модулі, наприклад cron, sntp. Також цей модуль забезпечує метод rtctime.dsleep() – альтернативний глибокий сон, зі збереженням значення внутрішнього RTC. Звичайний node.dsleep() дані календаря не зберігає.

Рекомендуємо до обов’язкового включення до складу прошивки.

C-Модуль sjson

Модуль sjson є дуже зручним інструментом кодування та декодування нативних Lua-масивів даних у текстовий формат обміну JSON. Це дуже зручний і заощадливий з точки зору кількості коду метод підготовки даних мікроконтролера до обміну із зовнішніми системами, наприклад, хмарними сервісами засобами протоколів передачі даних HTTP(s) чи MQTT. З точки ж зору кількості оперативної пам’яті та місця в прошивці, що споживається sjson, це не самий кращий модуль.

Бажано включати даний модуль до складу прошивки розумних пристроїв, що точно будуть взаємодіяти із зовнішніми інформаційними системами на верхніх рівнях моделі OSI.

C-Модуль sntp

Модуль sntp працює на рівні протоколу з’єднань UDP та отримує від спеціалізованих зовнішніх SNTP (Simple Network Time Protocol) серверів дані, про синхронізований єдиний час у таймзоні UTC. Фактично це число секунд та мікросекунд, що пройшло з 00:00 01/01/1970.

Оскільки без цього модуля неможливо отримати час та дату через інтернет, ми рекомендуємо його до обов’язкового включення до складу прошивки будь-яких пристроїв, хіба що крім тих, де функція відліку чи обліку часу/дати точно не потрібна.

C-Модуль spi

Модуль spi, як і модуль i2c, є модулем що реалізує синхронний повнодуплексний обмін даними в межах специфікації послідовної шини SPI (Serial Peripheral Interface). Ми не є прихильниками даного інтерфейсу, адже на наш погляд він є громіздким з точки зору бюджету необхідних портів вводу виводу, а також збитковим з точки зору організації взаємодії з кількома підпорядкованими пристроями одночасно. Одним словом багато коду, багато пінів, багато проводів. Не кажучи вже про максимальну довжину інтерфейсної лінії, яка є ефективною лише в межах плати чи модуля.

Рекомендуємо включати до складу прошивки цей модуль лише якщо того вимагає проект.

C-Модуль tls

Модуль tls є базовим у сучасних умовах і обмеженнях, що накладають локальні та міжнародні вимоги державного регулювання і користувачі розумних пристроїв. Без цього модуля неможливо побудувати хоча б на якомусь рівні захищеного обміну даними. HTTPs та Secure MQTT не будуть працювати без підтримки контролером протоколів TLS/SSL. Врахуйте, що для нормального рукостискання під час встановлення захищених з’єднань, у контролері має обов’язково працювати внутрішній годинник RTC. Записування SSL сертифікату на пристрій є опцією і у більшості випадків все працює без нього, крім тих, що зазначено у документації модуля.

Рекомендуємо до обов’язкового включення до складу прошивки.

C-Модуль tmr

Модуль tmr реалізує роботу з таймерами. Функціональність модуля доволі широка і повністю нас влаштувала. Оскільки таймер є чи не єдиним нормальним і заощадливим інструментом обробки подій у асинхронному середовищі виконання коду NodeMCU, ми радимо цей модуль до обов’язкового включення до складу прошивки.

C-Модуль u8g2

Модуль u8g2 є графічною бібліотекою для широкої низки OLED та подібних їм дисплеїв. Цей модуль не має підтримки кольорових дисплеїв. В той же час є повна підтримка встановлення потрібних шрифтів на вибір.Оскільки технологія OLED за дуже енергоефективною, такого типу дисплеї бажано встановлювати на пристрої, що заплановано живити від акумуляторних батарей. Дисплеї, зазвичай мають інтерфейс I2C чи SPI, а тому не забудьте включити до прошивки і один з них також.

Оскільки модуль є дуже великим завдячуючи купі методів для реалізації графічних примітивів, рекомендуємо включати його до складу прошивки, лише якщо того вимагає ваш проект.

C-Модуль uart

Модуль uart призначений для встановлення двостороннього символьного зв’язку з зовнішніми периферійними пристроями. Наприклад, це можуть бути інші, самостійні мікроконтролери типу 4g/gsm модеми, gps-трекери, пристрої ws2801 / ws2812 тощо. Зверніть увагу, що у NodeMCU є лише 1.5 інтерфейса UART – один з яких працює на прийом і передачу (зайнятий під консоль розробника), а інший лише на передачу. Обов’язково почитайте документацію.

Рекомендуємо включати модуль до складу прошивки, лише якщо того вимагає ваш проект.

C-Модуль ucg

Модуль ucg є графічною бібліотекою для кольорових великоформатних TFT дисплеїв. Рекомендуємо обирати цей технологічний сценарій, лише якщо вам потрібен коштовний колір, великий кадр і пристрій буде працювати від стаціонарного джерела живлення.

Модуль до складу прошивки – якщо вимагає проект.

C-Модуль websocket

Модуль websocket ще один посеред http та mqtt, що дозволяє встановлювати сокетні з’єднання з метою прийому/передачі даних.

Рекомендуємо включати модуль до складу прошивки, лише якщо того вимагає ваш проект.

C-Модуль wifi

Модуль wifi забезпечує зв’язок засобами стеку протоколів Wi-Fi. Окремі методи модуля дозволяють керувати режимами роботи радіомодуля, що дозволяє впливати на енергоефективність пристрою в цілому.

Рекомендуємо до обов’язкового включення модуля у прошивку, навіть якщо у проекті немає потреби у зв’язку мережами Wi-Fi.

C-Модуль wps

Модуль wps реалізує механізм приєднання розумного пристрою до мережі Wi-Fi без застосування монітору та клавіатури – тобто за допомогою натискання кнопки WPS на пристрої та на роутері, як замінника процедури вибору потрібної SSID мережі та введення паролю. Вважається, що цей метод не є безпечним і тому кожен застосовує його на свій ризик. З іншого боку, якщо немає іншого способу приєднати клієнтське обладнання до мережі виходячи з обмежень розміру, ціни та іншого, то і цей спосіб стане у пригоді.

Бажано включати цей модуль до прошивки, якщо передбачається приєднання до мережі спрощеним інтерфейсом користувача.


У цій (другій) частині ми розглянули призначення ключових модулів платформи. У наступній частині ми розглянемо як обрані для включення до складу прошивки модулі, впливають на розмір двійкового файлу і чи є можливим знайти у такий спосіб шляхи для оптимізації – максимум функцій при мінімальному об’ємі.

Посилання у матеріалі:

Огляд C-модулів у складі прошивки NodeMCU з LUA. Частина 1

Офіційна документація NodeMCU

Офіційний репозиторій NodeMCU

Онлайн сервіс автоматичної побудови прошивки NodeMCU-Build

Сподіваємося, що наш огляд був корисним. Дякуємо за увагу і бажаємо успіхів!