Автобот — ардуїновий Хижак. Частина 2: Роборука, або як я воював з сервоприводами
Хто читав першу частину — той знає що машинка вже їздить. FlySky більше не пилиться на полиці, iBUS читається, танкове керування працює. Але оскільки ми збираємо справжнього хижака, то в нього як мінімум повинна бути клешня, тож зупинятись на просто машинці за рано треба рука (клешня).

Ідея проста: поки лівий джойстик керує рухом, правий керує маніпулятором. Красиво на папері. На практиці досить заплутана пригода.
Що є в господарстві
Розклав на столі все що знайшов:
- AS3103PG — двоосьовий цифровий серво з U-подібним кронштейном. Виглядає серйозно, коштує серйозно, поводиться... нестандартно
- MG995 × 3 — клони популярного серводвигуна, 13кг/см, метал всередині
- Купа кронштейнів
- Металева клешня з серво вже всередині
Чотири серво, чотири вільних піна на Pico (GP2-GP5), чотири вільних канали на пульті. Математика сходиться. Починаємо.
Перший сюрприз: AS3103PG виявився мотором
Підключаю AS3103PG, пишу простий тест:
#include <Servo.h>
Servo test;
void setup() {
test.attach(3, 500, 2500);
test.write(0);
delay(2000);
test.write(90);
delay(2000);
test.write(180);
}
Серво радісно крутиться... і не зупиняється. Пишу write(90) — стоїть. Пишу write(0) — крутиться в один бік. Пишу write(180) — в інший.
Це 360° серво безперервного обертання. Не позиційне. Тримати кут воно не вміє взагалі — це по суті мотор з регулюванням швидкості. Щось нашаманив, зібрав, але виявилось що серво в цьому вузлі занадто слабкий.

Добре, перепризначаємо. AS3103PG іде на... поки нікуди. Відкладаємо.
Мораль: читай даташит тав прораховуй до покупки, а не після 😄, та я себе прощаю оскільки купував ту роборуку і сервоприводи років десять тому, що я міг тоді про таке знати.
Калібровка: у кожного серво свій характер
Стандартна бібліотека Servo.h дає імпульси
Рішення — вказати правильні імпульси вручну:
// Замість просто attach(пін) servo.attach(пін, 500, 2500);
Але і це не одразу. Спочатку пробував різні значення:
attach(2, 600, 2400) → серво рухається але мало
attach(2, 300, 2700) → крутиться безперервно як мотор!
attach(2, 500, 2500) → працює на всіх!
300 мкс — занадто малий імпульс, серво його не розуміє і сходить з розуму. Кажу собі запам’ятай мінімум 500 мкс, інакше серво вирішить що воно безперервне 😄. Перевіряв знов таки методом втика чи може просто перебором, ну якось так.
Ще один лайфхак при калібровці: завжди починай з write(0), а не write(90). Тоді бачиш реальний діапазон від початку.
Реальні межі кожного серво
Після годин тестування Serial Monitor:
| Серво | Пін | Мін | Макс | Функція |
|---|---|---|---|---|
| MG995 № 1 | GP2 | 0° | 160° | стріла |
| AS3103PG № 2 | GP3 | 0° | 160° | нахил |
| MG995 № 3 | GP4 | 0° | 160° | рукоять |
| MG995 № 4 | GP5 | 0° | 160° | клешня |
Клешня особлива: 0° = розкрита, 160° = закрита. Логічно.
Код: додаємо руку до машинки
// Серво піни #define SERVO_STRILA 2 // стріла — CH3 правий ↑↓ #define SERVO_RUKOYAT 3 // нахил — CH1 правий ←→ #define SERVO_KOVSH 4 // рукоять — CH5 VrA #define SERVO_KLESHNYA 5 // клешня — CH6 VrB // В setup() — транспортне положення при старті strilaServo.attach(SERVO_STRILA, 500, 2500); // ... інші attach ... delay(100); strilaServo.write(0); // всі в нуль rukoyatServo.write(0); kovshServo.write(0); kleshnyaServo.write(0); // В loop() — керування int strila = map(channels[2], 1000, 2000, 0, 160); int rukoyat = map(channels[0], 1000, 2000, 0, 160); int kovsh = map(channels[4], 1000, 2000, 0, 160); int kleshnya = map(channels[5], 1000, 2000, 0, 160);
Ліво/право джойстиком — нахил. Вперед/назад — стріла. Крутилки — рукоять і клешня. Все логічно і зручно.
Проблема яку не вирішив код
Стріла (MG995 № 1) падає під власною вагою.
MG995 має 13кг/см моменту — теоретично більш ніж достатньо. Але є нюанс: кут кріплення серво невигідний, важіль короткий, і серво працює у слабкій частині діапазону. Теж саме з AS3103PG № 2
Варіанти вирішення:
- Пружина — найдешевше, компенсує вагу механічно, (спробував резинку від рибальскої снасті, такий собі костиль)
- Сильніше серво — DS3218 (20кг/см) або JX PDI-6221MG
- Паралелограм — як у справжніх роборуках, вага розподіляється рівномірно
- Черв’ячна передача — тримає позицію без струму
Поки використовую резинку. Хотів би сказати, що це «Дешево і сердито», аале поки просто дешево 😄

Є питання або теж воювали з MG995? Пишіть в коментарях, разом розберемось!
FPV або як я підключив «очі»
Машинка їздить. Рука хапає. Але навіщо це все тре було, якщо ти будеш ходити за ним? І як він буде полювати, оператор розлякає усіх Чужих. Рішення очевидне додати камеру. В одній з коробок знайшовся цілий FPV комплект який чекав свого часу.

Що знайшлось в ящику
- JINJIEAN B19 — мініатюрна аналогова камера
- TS5828L 40CH 5.8GHz 600mW — відеопередавач
- EWRF 5.8G OTG Receiver — приймач для телефону

Це класичний аналоговий FPV комплект з дронів. Простий як двері: камера знімає, передавач передає по 5.8GHz, приймач на телефоні показує. Ніякого WiFi, ніякого Bluetooth, ніякого затримки.
Перший сюрприз: живлення
Дивлюсь на камеру — написано 5-20V. Відмінно, від павербанку 5V живитиму.
Дивлюсь на передавач TS5828L — написано 7-24V.
Ось тобі і павербанк 😄 До речі павербанк використовую власної збірки, розробив корпус в блендер, роздрукував і зібрав, вже три роки виручають під час блекаутів.

600mW передавач — це серйозна штука, не іграшка. Йому потрібне нормальне живлення. На щастя завалявся саморобний безперебійник на 12V ідеально для обох пристроїв. До речі використовував зарядний модуль DC 12V Charging Step Up Booster Module для 18650 Lithium Battery UPS

|
Безперебійник 12V
├── Камера JINJIEAN B19 (5-20V ✅)
└── Передавач TS5828L (7-24V ✅)
|
Один блок живлення на обох — зручно.
Другий сюрприз: роз’єм
Камера має JST PH 2.0
- Купити JST конектор (~$1 на Алі, чекати 3 тижні)
- Акуратно розібрати роз’єм голкою
- Просто відрізати і підпаяти дроти напряму
Обрав третій варіант. Різати — значить різати 😄
|
Червоний → +12V
Чорний → GND
Жовтий → Video → жовтий дріт TS5828L
|
OSD: бонус якого не очікував
На камері є окремий роз’єм OSD з кнопкою. OSD (On-Screen Display) — це накладання інформації прямо на відео
Кнопкою можна прямо під час польоту (або їзди) перемикати канали, налаштовувати потужність і навіть виводити напругу батареї. Дуже зручно щоб знати коли заряджати.
Підключення приймача на телефон
EWRF OTG Receiver підключається до телефону через OTG кабель. Встановлюєш додаток з Play Store і все. Що правда поки ту рекламу передивишся, ох... прийдеться мабуть і свій додаток написати.
Додаток автоматично сканує всі 40 каналів і знаходить сигнал. Налаштовувати нічого не треба — просто підключи і дивись.
Де розмістити камеру
Варіантів багато:
- Спереду машинки — класика, бачиш куди їдеш
- На стрілі — бачиш що хапаєш
- На клешні — максимально близько до об’єкту
Обрав біля клешні — найцікавіше бачити що саме ти хапаєш. Камера маленька, кріпиться легко. Примотав зеленою ізолентою, тимчасово

Підсумок двох частин
За кілька вихідних з нуля:
✅ iBUS протокол — один дріт, шість каналів
✅ TB6612FNG — чотири мотори, танкове керування
✅ Чотири серво — маніпулятор з клешнею
✅ FPV камера — бачимо очима Автобота
Що далі, можливо:
- Автопілот з HC-SR04 ультразвуковим датчиком
- Уникнення перешкод
- Може LiPo батарея замість безперебійника 😄
- Придбаю потужні сервоприводи і зроблю нормальну функціональну робоклешню.
Дякую всім хто читав і коментував попередні частини. Навіть тим хто писав про ефект Дунінга-Крюгера — ви мотивуєте продовжувати 😄
Код проекту і схеми підключення — в коментарях.
P.S. Ще не осів пил від коліс Хижака мого проєкту на Pi Pico RP2040 Arm Cortex-M0+, яку я програмував на Arduino платформі, з радіокерованою машинкою на приймачі FS iA6B, а я вже дивився на нову плату на столі. Хижак їздить, працює, гештальт закрито. Далі готую серію постів «Це не Raspberry Pi. І саме тому це цікаво.» , де розповім вам про новий гештальт — власну IP-камеру, не купити готову, не взяти Raspberry Pi з туторіалом, а взяти за $15 embedded плату і камеру і зробити з того справжню IP камеру з дашбордом і іншими плюшками. ;)
Сподобалась стаття? Підписуйтесь на автора, щоб отримувати сповіщення про нові публікації на пошту.
31 коментар
Додати коментар Підписатись на коментаріВідписатись від коментарів