Інтерфейси для мікроконтролерів
Енкодер замість потенціометра: як одна ручка керує цілим меню
З’ясовуємо, чому дві майже однакові ручки говорять із контролером різними мовами, як канали A і B визначають напрямок та що потрібно програмі, аби один поворот став навігацією, точним регулюванням або швидким прокручуванням.
Коротка відповідь: енкодер не є цифровим потенціометром і не видає готове значення гучності, температури чи частоти. Він повідомляє лише про рух. Зате програма може вирішити, що саме цей рух означає — і тут одна ручка справді отримує майже службове підвищення до цілого пульта керування.
Зміст статті
Ручки-близнюки, але не родичі
Поставте поруч панельний потенціометр і механічний енкодер — обидва мають вал, різьбу, гайку й переконливий вигляд деталі, яку треба крутити. На цьому схожість майже закінчується.
У потенціометра положення вала пов’язане зі станом резистивного подільника. Якщо ручка повернута приблизно наполовину, контролер може виміряти відповідну частку напруги. Енкодер працює інакше: він не каже «я стою на 47%». Він каже «щойно був перехід у цей бік» — і залишає програмі всю бухгалтерію.
Енкодер може замінити потенціометр як орган керування цифрового пристрою. Але він не замінює резистивний подільник, реостат або аналоговий регулятор простим перепаюванням трьох ніжок.
Що повідомляє потенціометр
У найвідомішому режимі потенціометр — це резистивна доріжка з двома кінцями та рухомим повзунком. Між крайніми контактами подаємо напругу, а з повзунка отримуємо її частку. Вихідне відношення залежить від положення, хоча в реальному колі на нього також впливають навантаження, кінцевий опір і характеристика самої доріжки.[1]
Сильна сторона потенціометра
Положення ручки саме по собі зберігає уставку. Вимкнули живлення, повернулися завтра — вал нікуди не подівся. Фізична риска на панелі досі щось означає.
Його обмеження
Одна фізична позиція зазвичай відповідає одному значенню. Якщо програмно змінити гучність або профіль налаштувань, мітка на ручці може перестати збігатися з фактичним станом.
Тому потенціометр чудово почувається у простому аналоговому регуляторі, на панелі з підписаною шкалою або там, де пристрій має працювати без мікроконтролера. Йому не потрібне меню, щоб бути корисним. Іноді це не старомодність, а дуже здорова інженерна лінь.
Що повідомляє інкрементальний енкодер
Механічний інкрементальний енкодер зазвичай має два канали — A і B — та спільний контакт C. Під час обертання контакти перемикаються у визначеному порядку. Контролер бачить послідовність логічних станів і з неї відновлює напрямок та кількість переходів. Сам абсолютний кут така деталь не повідомляє.[2]
Після ввімкнення програмний лічильник стартує з того значення, яке призначить прошивка. Якщо попередню гучність треба пам’ятати, її зберігають у незалежній пам’яті. Якщо потрібна справжня абсолютна позиція вала, шукають абсолютний кутовий датчик або додають процедуру початкового позиціювання.
Ручку можна крутити без механічних кінцевих упорів. Це не обіцянка отримати число кута від 0° до 360°.
А де кнопка?
Багато панельних енкодерів мають окремий натискний контакт на валу. Він електрично не є частиною квадратурних каналів: це звичайна кнопка, яку програма може використати для підтвердження, входу в режим редагування або повернення. Але слово «EC11» ще не гарантує ані кнопки, ані конкретної кількості фіксацій. Офіційна серія Alps EC11E містить різні комбінації імпульсів, фіксацій і виконань із кнопкою або без неї.[4]
Чотири стани квадратури: де ховається напрямок
Два входи дають чотири можливі комбінації: 00, 01, 11 і 10. У правильному сусідньому переході змінюється лише один біт. Один умовний напрямок виглядає так:
Навчальна модель
00→01→11→10→0000→10→11→01→00Який із них фізично буде «праворуч», залежить від маркування каналів, орієнтації деталі та порядку підключення A/B.
Саме порядок станів, а не один окремий рівень, показує напрямок. У документації TI цей принцип описано як визначення того, який із двох сигналів випереджає інший.[3]
Навіщо дивитися на обидва біти
Стрибок 00 → 11 змінює обидва біти одночасно. Для ідеальної квадратури це не сусідній стан. Така подія означає, що програма пропустила проміжну вибірку, контакти створили заваду або сигнал обробляється надто грубо. Таблиця переходів дозволяє не приймати кожен фронт на віру.
Клік, імпульс, фронт і count: четверо біля однієї ручки
У картках товарів і бібліотеках ці слова часто гуляють без бейджиків. Звідси народжується дивна арифметика: той самий енкодер в одному прикладі має 20 кроків, у другому — 40, а в третьому раптом 80.
| Термін | Що це | Хто це бачить |
|---|---|---|
| Фіксація, detent | Механічне положення, яке відчувається пальцем як «клік». | Людина |
| Імпульс / цикл | Повторювана електрична форма сигналу; визначення залежить від datasheet. | Осцилограф або специфікація |
| Фронт | Одна зміна LOW→HIGH або HIGH→LOW на каналі. | GPIO, переривання |
| Count | Одиниця, яку додає програмний або апаратний декодер. | Алгоритм |
У конкретній демонстрації TI енкодер із 20 механічними фіксаціями давав чотири лічильні зміни між сусідніми фіксаціями. Це корисний приклад, але не універсальний закон для кожного KY-040 чи EC11.[3] Виробники прямо випускають моделі, де кількість фіксацій і імпульсів не збігається.[4]
Чому значення стрибає назад: брязкіт і пропущені переходи
У механічному контакті металеві поверхні не завжди переходять із розімкненого стану в замкнений одним ідеальним рухом. Вони можуть кілька разів коротко торкнутися й розійтися. На екрані це виглядає як зайві кроки, короткий рух у протилежний бік або пропущена команда. Контактні енкодери потребують debounce так само серйозно, як кнопки.[2]
Чому одного delay() мало
Глуха затримка після першого фронту може випадково приховати частину брязкоту, але разом із ним приховає і корисні переходи під час швидкого обертання. Гірше того, блокувальний код у цей час не обслуговує інші задачі.
- регулярно читати обидва канали;
- приймати лише сусідні квадратурні переходи;
- накопичувати повну валідну послідовність;
- лише після неї видавати подію меню;
- окремо фільтрувати натискну кнопку.
Апаратні C/R-ланцюги можуть допомогти, але не видають довідку про безумовне звільнення програміста від відповідальності. Alps радить враховувати швидкість обертання, час вибірки, masking time та конкретне виконання енкодера.[5]
Polling чи interrupts?
Для ручки меню регулярне неблокувальне опитування часто достатнє, якщо цикл гарантовано встигає побачити переходи. Переривання корисні, коли основний код може надовго зайняти процесор або контролер має апаратний квадратурний лічильник. Але ISR не повинна оновлювати дисплей, записувати пам’ять чи вирішувати долю всього меню. Її робота — швидко зафіксувати стан або подію.
Підтягування та логічні рівні: де 5 В перестають бути дрібницею
Механічний контакт не створює HIGH сам по собі. Коли канал розімкнений, вхід потрібно підтягнути до визначеного логічного рівня. Коли контакт замикається на common/GND, вхід стає LOW. Для кнопки між входом і GND Arduino документує той самий активний LOW із режимом INPUT_PULLUP.[7]
На ATmega328P внутрішні підтягувальні резистори мають гарантований діапазон 20–50 кОм — це параметр саме цього мікроконтролера, а не універсальна константа для всіх плат.[6]
Якщо модуль має зовнішні резистори до 5 В, його вихід може піднятися до 5 В. Це неприйнятно для GPIO, які допускають лише 3,3 В. Наприклад, офіційна документація Raspberry Pi прямо обмежує вхід GPIO максимумом 3,3 В.[8]
Перед підключенням 3,3-вольтового контролера подивіться не лише на назву модуля, а й на його схему: куди під’єднані pull-up, де common, чи є послідовні резистори та конденсатори. Механічному енкодеру живлення як таке часто не потрібне — воно потрібне платі навколо нього, щоб сформувати рівні й фільтрацію.
Коли енкодер справді кращий — а коли залишити потенціометр
| Задача | Кращий кандидат | Чому |
|---|---|---|
| Пряме аналогове регулювання | Потенціометр | Працює без прошивки та одразу формує електричне відношення. |
| Ручка зі шкалою 0…100% | Потенціометр | Фізичне положення залишається видимою уставкою. |
| Навігація дисплейним меню | Енкодер | Необмежене прокручування, контекстні команди та натискання. |
| Великий числовий діапазон | Енкодер | Програмний крок і прискорення без механічної шкали. |
| Значення змінюється також дистанційно | Енкодер | Ручка не претендує на абсолютне положення й не суперечить стану програми. |
| Уставка має пережити вимкнення без пам’яті | Потенціометр | Механічне положення зберігається фізично. |
Три модулі MyProject: схожа ручка, різні контакти
У каталозі є три модулі, які підходять для експериментів із квадратурним введенням. Тут важливіше не вгадати «найкращий», а прочитати маркування саме своєї плати.
| Модуль | Контакти на платі | Вихід кнопки | Практичний сценарій |
|---|---|---|---|
| KY-040, SKU 1228 | GND, +, SW, DT, CLK |
Окремо позначений SW |
Макетування меню з обертанням і підтвердженням. |
| EC11 на круглій PCB, SKU 1414 | GND, S1, S2, KEY, 5V |
Окремо позначений KEY |
Панельна ручка для меню; точне співвідношення кліків і переходів слід перевірити. |
| Модуль A/C/B, SKU 1702 | VCC, GND, A, C, B |
Не виведений | Обертання й регулювання; для підтвердження меню потрібна окрема кнопка. |
Для SKU 1702 постачальник заявляє виконання на 20 імпульсів за оберт. Це не слід автоматично перекладати як «20 механічних кліків»: кількість фіксацій і спосіб програмного підрахунку — окремі характеристики.
Чекліст перед першим обертанням
- Знайдіть A/B або CLK/DT і не плутайте їх із кнопкою.
- Визначте common та перевірте, куди він під’єднаний.
- З’ясуйте, до якої напруги підтягнуті виходи.
- Не подавайте 5 В на 3,3-вольтовий GPIO без перевірки.
- Зчитайте обидва біти й перевіряйте допустимі переходи.
- Не використовуйте довгий блокувальний
delay()як єдиний debounce. - Перевірте один повний оберт і порахуйте реальні події.
- Відокремте декодер від логіки дисплея та меню.
- Зберігайте уставку програмно, якщо вона має пережити вимкнення.
- Перевірте, чи кнопка справді виведена на контакти модуля.
Поширені запитання
- Чи можна під’єднати енкодер до будь-яких цифрових входів?
- Якщо ці входи підтримують потрібні логічні рівні й програма читає їх достатньо часто — так. Для переривань або апаратного квадратурного блока вибір пінів уже залежить від конкретного MCU.
- Чи обов’язково використовувати переривання?
- Ні. Для ручного введення регулярне неблокувальне опитування може бути достатнім. Важливо не саме слово «interrupt», а гарантія, що всі потрібні переходи будуть побачені.
- Чому після перезавантаження значення стало нульовим?
- Інкрементальний енкодер не зберігає абсолютне положення. Значення потрібно відновити з незалежної пам’яті або задати початково.
- Чому напрямок у моєму скетчі зворотний?
- Порядок A/B відносний. Поміняйте канали місцями або інвертуйте знак події. Це не несправність енкодера.
- Чи означає напис «20 pulses» двадцять кліків?
- Не обов’язково. Потрібно окремо знати кількість механічних фіксацій, визначення pulse у datasheet і режим підрахунку програми.
- Чи може енкодер керувати аналоговою гучністю?
- Так, але опосередковано: контролер має змінювати цифровий потенціометр, ЦАП, кодек або інший електронний регулятор. Сам механічний енкодер не стоїть у сигнальному тракті як резистивний подільник.
Головне правило ручки
Потенціометр відповідає на питання «де я стою?». Інкрементальний енкодер — «куди й наскільки щойно зрушили?». Перший зручний там, де фізичне положення саме є уставкою. Другий — там, де значення живе у програмі, змінюється з різних джерел і залежить від контексту екрана.
Щоб одна ручка справді керувала цілим меню, не потрібна таємна бібліотека. Потрібні чотири дисципліновані кроки: правильно сформувати логічні рівні, прочитати обидва канали, приймати лише валідні переходи й віддати чисті події окремому автомату меню. Решта — вже дизайн інтерфейсу, де навіть один клік має знати свою посадову інструкцію.
Технічні джерела
- Bourns — The Potentiometer Handbook — підтримує модель потенціометра як подільника, зв’язок виходу з положенням повзунка та практичні похибки.
- Texas Instruments — Incremental Rotary Encoders, SBOA200B, revised December 2021 — підтримує інкрементальну модель, двоканальне визначення напрямку та потребу debounce для контактних енкодерів.
- Texas Instruments — Quadrature Encoder Position Counter With MSP430 MCUs, SLAA795, 2017 — підтримує квадратурний автомат станів і показує межі перенесення count-per-detent між моделями.
- Alps Alpine — EC11E Series, 11 mm Size Metal Shaft Type — підтримує різноманіття фіксацій, імпульсів і виконань із кнопкою/без кнопки в одному сімействі.
- Alps Alpine — Metal Shaft Encoder Product Catalog, update 2510 — підтримує вимоги враховувати швидкість, sampling/masking time та C/R-фільтри.
- Microchip — ATmega328P Datasheet, 7810D–AVR–01/15 — підтримує параметри внутрішніх pull-up і пороги GPIO саме ATmega328P.
- Arduino — INPUT_PULLUP та Digital Input Pull-Up Resistor — підтримує активний LOW для контакту між входом і GND.
- Raspberry Pi — A history of GPIO usage on Raspberry Pi devices and current best practices — підтримує межу 3,3 В для входів GPIO Raspberry Pi.
Написати коментар