Чому я пішов з Arduino, або STM32 проти ESP32 на практиці
На самому початку свого шляху в розробці та вивченні програмування я, як і більшість початківців, створив свій перший проєкт на Arduino.
Це було рішення для конкретної проблеми у вантажному автомобілі «Газель» зі старим 402-м мотором. Гільзи поршнів у ньому знаходяться прямо в антифризі, і коли глушиш двигун, циркуляція охолоджуючої рідини повністю зупиняється. Через це рідина різко закипала та виривалася назовні.
Метою мого першого проєкту було інтегрувати цифрове керування у старий «аналоговий» автомобіль: оцифрувати сигнал стандартного датчика температури ТМ-106 та автоматично вмикати додатковий циркуляційний насос після вимкнення запалювання. Відео про цей проєкт, до речі, можна подивитися на моєму YouTube-каналі.
Кінець епохи Arduino
Це був мій останній проєкт на Arduino. І зовсім не тому, що ця платформа погана. Просто згодом я отримав доступ до потужніших мікроконтролерів — STM32 та ESP32.
У цій статті я не буду банально порівнювати сухі цифри з даташитів — цієї інформації повно в мережі, а будь-яка нейромережа видасть вам табличку за одну секунду. Я хочу поділитися саме особистим життєвим досвідом.
Міф про «непідйомний» STM32
Зараз у своїх проєктах я використовую переважно STM32, бо для моїх завдань в інших чипах просто немає потреби.
Серед розробників ходять міфи та легенди, що STM32 — це неймовірно важко, і що для роботи з ним треба ледь не ідеально знати C++. Саме тому більшість сидить на Arduino чи ESP32.
Але камон, ми живемо в епоху штучного інтелекту! Доступ до коду, прикладів та бібліотек сьогодні отримується за один запит у чат-бот. Тому складність програмування вже не є виправданням. Підбирати залізо потрібно суворо під завдання конкретного проєкту.
Розподіл ролей: «Мізки» та «М'язи»
- ESP32 — це крутий інструмент там, де критично потрібен вбудований Wi-Fi або Bluetooth (наприклад, системи «розумного будинку» або бездротові датчики, де ліньки тягнути дроти).
- Але якщо подивитися правді в очі, у 90% реальних проєктів мікроконтролер робить банальні речі: керує моторами, сервоприводами, клацає реле або зчитує сенсори.
Саме тому я обрав для себе STM32. Його плати не перевантажені зайвою бездротовою периферією, яка в силових блоках просто не потрібна.
Наразі моя улюблена архітектура для складних систем управління — це зв'язка Raspberry Pi + STM32, де вони спілкуються між собою через швидкісний інтерфейс UART (на високій частоті) або шину SPI:
- Raspberry Pi (Мізки): забирає на себе весь важкий софт — графічні інтерфейси, складні мережеві з'єднання, обробку відео, аудіо та високорівневу логіку.
- STM32 (М'язи): працює як надійний виконавець. Він не відволікається на фонові завдання операційної системи, а суворо, швидко і чітко виконує команди, які йому «спускає» одноплатник.
Чому Raspberry Pi не може бути «м'язами»?
У початківців часто виникає логічне питання: «Якщо Raspberry Pi такий потужний, чому б не підключити драйвери моторів, сервоприводи чи реле прямо до його GPIO-пінів і викинути додаткові мікроконтролери взагалі?»
Відповідь ховається в архітектурі операційної системи. На «малинці» крутиться повноцінна ОС Linux. Це система не реального часу (Non-RTOS). Вона одночасно вирішує сотні завдань: обслуговує файлову систему, підтримує мережеві з'єднання, виводить графіку на екран, записує логи. У будь-який момент ядро Linux може «відволіктися» на частку секунди, щоб обробити фоновий системний процес.
Для роботи з інтерфейсом користувача це непомітно. Але для точного заліза — це проблема:
- Збій ШІМ (PWM): Якщо Linux запізниться з генерацією сигналу хоча б на мілісекунду, мотор смикнеться, а сервопривод втратить точність позиціонування.
- Непередбачувані затримки (Jitter): Вхідні сигнали від датчиків або енкодерів мають оброблятися миттєво. Linux через свою багатозадачність не може гарантувати стабільний і фіксований час відгуку.
Роль STM32 як ідеального виконавця
Саме тут на сцену виходить STM32. На ньому немає «важкої» операційної системи. Код виконується на рівні «заліза» (або під керуванням легких RTOS), де кожна операція займає чітко визначену кількість тактів процесора.
Він бере на себе всю рутину реального часу:
- Апаратні таймери та ШІМ: Генерація сигналів для керування периферією відбувається на рівні мікросхем, абсолютно незалежно від того, що відбувається в цей момент у головній програмі. Сигнал завжди залишається ідеально рівним.
- Апаратне декодування енкодерів: Квадратурні енкодери підключаються напряму до спеціальних таймерів STM32, які рахують імпульси «в залізі», взагалі не навантажуючи обчислювальне ядро.
- Миттєва реакція на критичні події: Якщо спрацював датчик аварії, кінцевий вимикач чи термопара, STM32 за мікросекунди виконає захисний алгоритм за допомогою апаратних переривань.
Енергоспоживання та економіка проєкту
Крім архітектури, є ще два важливих фактори: енерговитрати та ціна.
- Апетит мікросхем: ESP32 — справжній «прожора». Коли в неї вмикається Wi-Fi, вона споживає струм сотнями міліампер (до 250-300 мА в піках). Для автономних пристроїв від батарейок це вирок. STM32 натомість має глибокі режими енергозбереження (Stop, Standby). Вона може «спати», споживаючи лічені мікроампери, миттєво прокидатися за сигналом від датчика і знову засинати.
- Питання бюджету: Стара 8-бітна Arduino зараз коштує невиправдано дорого для своїх скромних можливостей. Водночас китайські плати типу Blue Pill (на базі STM32F103) чи сучасні бюджетні серії STM32G0 коштують буквально копійки, але пропонують повноцінну 32-бітну архітектуру та роботу на частотах від 64-72 МГц проти всього 16 МГц в Arduino.
Підсумок: Ідеальний симбіоз
У результаті правильного проектування ми отримуємо збалансовану систему без слабких місць:
- Raspberry Pi (Мізки): думає, аналізує, працює з базами даних, хмарою, мережею та взаємодіє з користувачем.
- STM32 (М'язи): чітко, стабільно та без найменших затримок керує силовими елементами й зчитує показники датчиків.
Використовувати для таких завдань ESP32 як підпорядкований чип зазвичай немає сенсу — її вбудований радіомодуль просто «гулятиме», споживаючи зайву енергію та створюючи додаткові наведення на платі управління. А старенькій Arduino банально не вистачить швидкості, розрядності АЦП, кількості індустріальних таймерів та швидкісних шин даних (наприклад, CAN чи індустріального Ethernet).
Тому підбирайте залізо з розумом, правильно розподіляйте ролі між компонентами системи й не бійтеся STM32 — штучний інтелект завжди підстрахує вас із написанням коду!
А що обираєте ви для своїх проєктів і під які завдання? Чи згодні ви, що ера класичної Arduino для серйозних систем уже минула, чи я занадто суворий до «старенької»? Діліться своїм досвідом у коментарях, буде цікаво подискутувати!
Коментарі (1)
Гарна подача, дякую за Україньський контент, його взагалі не вистачає
Наразі немає коментарів. Будьте першим!
Залишити коментар