Servolar qanday ishlaydi: impulslar, taʼminot va Timer1 tuzogʻi
Havaskorlar ishlatadigan SG90 kabi servo impulsni qanday qilib burchakka aylantiradi, Servo kutubxonasidan qanday foydalaniladi, servolarni qanday quvvatlantirish kerak va nega bu kutubxona tufayli D9 va D10 da analogWrite() ishlamay qoladi.

Foto: Lukas Ruge · CC0
Havaskorlar ishlatadigan servo (servoprivod) oʻz valini siz soʻragan burchakka buradi va uni shu holatda ushlab turadi. U datchikni kerakli tomonga qaratishi, mexanik qoʻlni harakatlantirishi yoki gʻildirakni burishi mumkin. SG90 — ommabop kichik servo, u CoreEngine simulyatoridagi detallardan biri hamdir.
Ichida nima bor
Servo bitta kichik korpusga joylashgan toʻrtta qismdan iborat:
- kichik oʻzgarmas tok motori,
- motorni sekinroq va kuchliroq qiladigan reduktor,
- chiqish valiga oʻrnatilgan va valning burchagini oʻlchaydigan potensiometr,
- kichik boshqaruv platasi.
Plata signal soʻrayotgan burchakni potensiometr oʻlchagan burchak bilan solishtiradi. Agar ular farq qilsa, plata motorni kerakli burchak tomon aylantiradi: farq qancha katta boʻlsa, shuncha kuchliroq. Burchaklar tenglashganda plata motorni toʻxtatadi. Bu — yopiq boshqaruv konturi, u Masofa saqlovchi robot loyihasidagi P-rostlagichga oʻxshaydi.
SG90 ning uchta simi bor: jigarrang sim — GND, qizil sim — taʼminot (4,8–6 V), toʻq sariq sim — signal.
Signal: har 20 ms da bitta impuls
Servo soniyasiga 50 ta impuls kutadi, yaʼni har 20 ms da bittadan. Burchakni impulslar soni emas, har bir impulsning kengligi belgilaydi. Arduino Servo kutubxonasining standart qiymatlari quyidagicha:
| Impuls kengligi | Burchak |
|---|---|
| 544 mks | 0 gradus |
| taxminan 1472 mks | 90 gradus |
| 2400 mks | 180 gradus |
Bu har bir gradusga taxminan 10 mks degani. Standart qiymatlar hamma servolarga ham aniq mos kelavermaydi. Koʻp SG90 servolari aynan 180 gradusga burilmaydi, baʼzilari esa 0 yoki 180 gradusga yetmasdan cheklagichga tiralib qoladi.
Servo oʻz burchagini faqat impulslar kelib turganda ushlab turadi. Impulslar kelmay qolsa, koʻpchilik kichik servolar oʻz motoriga tok bermay qoʻyadi va ularning richagini qoʻl bilan burish mumkin boʻladi.
Servo kutubxonasi
Kutubxona impulslarni siz uchun fon rejimida, istalgan raqamli pinda hosil qiladi:
#include <Servo.h>
Servo arm; // one Servo object for each servo
void setup() {
arm.attach(11); // signal wire (orange) on D11, a free pin on the robot car
arm.write(90); // turn to the middle
}Eng foydali chaqiruvlar:
| Chaqiruv | Nima qiladi |
|---|---|
arm.attach(11) |
D11 da standart 544–2400 mks bilan impulslar berishni boshlaydi |
arm.attach(11, 600, 2300) |
xuddi shunday, lekin 0 va 180 gradus uchun oʻzingiz tanlagan impuls kengliklari bilan (qiymatlar misol uchun berilgan) |
arm.write(45) |
45 gradusga buradi |
arm.writeMicroseconds(1500) |
impuls kengligini toʻgʻridan-toʻgʻri, mks da belgilaydi |
arm.read() |
siz oxirgi marta soʻragan burchakni qaytaradi; u hech narsani oʻlchamaydi |
arm.detach() |
impulslarni toʻxtatadi |
write() darhol tugaydi, lekin servoga yangi burchakka yetib borishi uchun vaqt kerak. Servo yangi burchakka yetdi, deb hisoblashdan oldin unga shu vaqtni bering.
Pozitsion yoki uzluksiz aylanuvchi servo
SG90 kabi oddiy, pozitsion servo taxminan 180 gradus oraligʻida buriladi, uning burchagini esa impuls belgilaydi.
Uzluksiz aylanuvchi servo tashqi koʻrinishidan xuddi shunday, lekin uning vali toʻxtovsiz aylana oladi. Uning ichida potensiometr endi val bilan birga burilmaydi, cheklagich esa olib tashlangan. Endi impuls tezlik va yoʻnalishni belgilaydi:
- oʻrtaga yaqin impuls (
write(90), taxminan 1,5 ms): toʻxtaydi, - qisqaroq impulslar: bir tomonga aylanadi,
- uzunroq impulslar: boshqa tomonga aylanadi, impuls oʻrtadan qancha uzoq boʻlsa, shuncha tez.
U biror burchakka borib toʻxtay olmaydi, chunki endi uning vali qayerda ekanini bilmaydi. Aniq toʻxtash nuqtasi har bir servoda har xil. Uni writeMicroseconds() yordamida toping yoki, agar servoda sozlash vinti boʻlsa, oʻsha vintni buring.
CoreEngine simulyatoridagi SG90 — pozitsion servo.
Taʼminot: har bir servoga 1 A moʻljallang
SG90 4,8–6 V da ishlaydi. Yuklamasiz, qimirlamay turganda u kam tok oladi. Harakatlana boshlaganda esa bir lahzaga taxminan 0,7–1 A gacha tok olishi mumkin. Bir nechta servo birga harakatlana boshlasa, shu lahzalardagi toklar qoʻshiladi.
- USB. Butun Uno USB dan jami koʻpi bilan 500 mA oladi. Stolda yuklamasiz bitta kichik servo koʻpincha ishlaydi. Bir nechta servo yoki ogʻir yuk bilan ishlayotgan bitta servo 5 V ni pasaytirib yuboradi: Uno qayta ishga tushadi yoki servolar silkinadi.
- CoreEngine robot-mashinasi. Bu robotda Unoning 5V piniga kuchlanish L298N ning kichik stabilizatoridan keladi: toʻrtta AA batareyadan taxminan 4,4 V. Bu SG90 uchun kerakli 4,8 V dan past, stabilizator esa 1 A bera olmaydi.
- Yaxshiroq taʼminot. 4,8–6 V va bir vaqtda harakatlanishi mumkin boʻlgan har bir servo uchun taxminan 1 A bera oladigan taʼminotdan foydalaning. Robot-mashinada batareya qutisining oʻzi taxminan 6 V beradi, bu SG90 ish oraligʻining yuqori chegarasi. Alohida batareya bloki ham yaraydi.
- Umumiy yer (GND). Servo taʼminotining minusini Unoning GND piniga ulang, aks holda signal nimaga nisbatan oʻlchanishi nomaʼlum boʻladi.
Servo harakatlanganda robotingiz qayta ishga tushib qolsa, Robotingiz nega qayta ishga tushib qoladi maqolasini oʻqing.
Timer1 tuzogʻi
Unodagi ATmega328P da uchta taymer bor. Ularning har biri ikkita pin uchun PWM (impuls kengligi modulyatsiyasi) signalini hosil qiladi:
| Taymer | PWM pinlari | Yana qayerda ishlatiladi |
|---|---|---|
| Timer0 | D5, D6 (taxminan 980 Hz) | millis() va delay() |
| Timer1 | D9, D10 (taxminan 490 Hz) | Servo kutubxonasi |
| Timer2 | D3, D11 (taxminan 490 Hz) | tone() |
Birorta servo pinga biriktirilishi bilanoq Servo kutubxonasi impulslar vaqtini hisoblash uchun Timer1 ni ishlatadi. Shundan keyin D9 va D10 dagi analogWrite() endi PWM bermaydi, hatto bu pinlarga servo ulanmagan boʻlsa ham. Kompilyator bu haqda ogohlantirmaydi. Odatiy belgisi: tezlik pini D9 yoki D10 ga ulangan motor siz belgilagan tezlikni eʼtiborsiz qoldiradi. Faqat 0 va 255 ishlashda davom etadi, chunki analogWrite() ularni oddiy LOW va HIGH sifatida bajaradi.
Shuning uchun CoreEngine robot-mashinasida motorlarning PWM signali (ENA va ENB) D5 va D6 pinlaridan beriladi. Keyinchalik robotga servo qoʻshilishi mumkin, motorlar esa tezlikni boshqarish imkoniyatini saqlab qoladi. D9 va D10 ga HC-SR04 ning TRIG va ECHO pinlari ulangan, lekin bular oddiy raqamli signallar: Servo kutubxonasi ishlayotganda ham bu pinlarda digitalWrite() va pulseIn() ishlayveradi.
tone() ham Timer2 bilan xuddi shunday qiladi: u D3 va D11 dagi PWM ga xalaqit beradi. Ikkita kutubxonani birga ishlatishdan oldin ularning har biri qaysi taymerdan foydalanishini tekshiring.
Titrash: servo silkinib tursa
Qimirlamay turishi kerak boʻlgan paytda titraydigan yoki silkinadigan servoda odatda quyidagi sabablardan biri boʻladi:
| Sabab | Nima yordam beradi |
|---|---|
| Kuchsiz yoki shovqinli taʼminot | kerakli tokni bera oladigan taʼminot, servoga yaqin joyda uning taʼminot simlari orasiga ulangan 100–470 mkF sigʻimli kondensator, qisqa taʼminot simlari |
| Umumiy yer yoʻq | servo taʼminotining minusini Unoning GND piniga ulang |
| Servo oʻz cheklagichiga tiralib turadi | uning haqiqiy chegaralarini writeMicroseconds() bilan toping, keyin attach(pin, min, max) dan foydalaning |
| Servo ushlab turishi kerak boʻlgan ogʻir yuk | yengilroq yuk yoki ushlab turish shart boʻlmaganda detach() (shunda servo boʻshashib qoladi) |
| Sakrab turadigan kirish qiymati | qiymatni yozishdan oldin filtrlang, masalan uchta qiymatning medianasi bilan |
| Motor simlari yonidan oʻtgan uzun signal simi | motor simlaridan uzoqroqda oʻtkazilgan qisqa signal simi |
Simulyatorda
SG90 — CoreEngine simulyatoridagi detallardan biri. Uni robotga oʻrnatib, uchta simini ulashingiz mumkin. Servoning taʼminoti yoki signal simi ulanmagan boʻlsa, ulanish tekshiruvi buni sizga aytadi. Haqiqiy servo Marketda bor.