
سروو موتور (Servo) چطور دقیقاً به یک زاویه میرود؟
در فصل «Servo: اولین حرکت» با قطعهای آشنا شدی که با یک موتور معمولی فرق دارد: به یک موتور معمولی میگویی «بچرخ»، ولی به یک سروو موتور میگویی «برو دقیقاً روی زاویهی ۹۰ درجه بایست». همین توانِ رفتن به یک زاویهی مشخص، سروو را قلبِ بازوهای رباتیک و ماشینهای کنترلی کرده است.
چطور واقعاً کار میکند
اگر داخل یک سروو را باز کنی، چهار چیز میبینی که با هم یک تیم تشکیل میدهند:
- یک موتور
DCکوچک که خودش فقط بلد است تند بچرخد. - یک گیربکس (مجموعه چرخدنده) که سرعتِ زیادِ موتور را کم و در عوض زورش (گشتاور) را زیاد میکند.
- یک پتانسیومتر که به محورِ خروجی چسبیده و مثل یک حسگرِ زاویه، همیشه به مدار میگوید «الان روی چند درجه هستم».
- یک مدار کنترل که مغزِ ماجراست.
حالا فرمان چطور میرسد؟ تو هر ۲۰ میلیثانیه (یعنی ۵۰ بار در ثانیه، همان 50 Hz) یک پالسِ کوتاه میفرستی و عرضِ این پالس زاویه را تعیین میکند: پالسِ حدود ۱ میلیثانیه یعنی «برو صفر درجه»، ۱٫۵ میلیثانیه یعنی «وسط، ۹۰ درجه» و ۲ میلیثانیه یعنی «۱۸۰ درجه». دقت کن: این PWM برخلاف بازر یا LED، «قدرت» را کم و زیاد نمیکند، بلکه یک فرمانِ موقعیت است.
مدار کنترل کارِ زیبایی میکند: عرضِ پالسی که تو فرستادی را با زاویهای که پتانسیومتر گزارش میدهد مقایسه میکند. اگر فرق داشتند، موتور را میچرخاند تا این دو با هم برابر شوند و بعد نگه میدارد. به این حلقهی «مقایسه و اصلاح» میگویند کنترلِ حلقهبسته (closed-loop). برای همین است که سروو حتی اگر کسی بخواهد محورش را بچرخاند، مقاومت میکند و سر جایش میماند.
کاربردهای واقعی
- فرمان و بالهای متحرکِ ماشینها و هواپیماهای کنترلی (
RC). - مفصلهای بازوی رباتیک و پنجهی گیرندهی رباتها.
- گیمبالِ دوربین که تصویر را در حین حرکت ثابت نگه میدارد و دوربینهای چرخانِ امنیتی.
- رباتهای انیماترونیک و اسباببازیهای متحرک.
- نسخههای صنعتیِ بزرگترش (با
encoder) در بازوهای کارخانه،CNCو پرینتر سهبعدی، و حتی ردیابهای خورشیدی که پنل را به سمت آفتاب میچرخانند.
در عمل: سیمکشی و کد
سروو سه سیم دارد: سیمِ فرمان (نارنجی/زرد) به GPIO 13، سیمِ تغذیه (قرمز) به 5V و سیمِ زمین (قهوهای/مشکی) به GND. چون فرمان با عرضِ پالس مشخص میشود، یک تابعِ کوچک مینویسیم که زاویه را به duty ترجمه کند:
from machine import Pin, PWM
import time
servo = PWM(Pin(13), freq=50)
def set_angle(deg):
# 0..180 daraje -> duty
duty = int(26 + (deg / 180) * 97)
servo.duty(duty)
set_angle(0)
time.sleep(1)
set_angle(90)
time.sleep(1)
set_angle(180)
اشتباههای رایج
- تغذیه از
3V3: سروو حدود ۵ ولت و در لحظهی حرکت جریانِ زیادی میخواهد؛ اگر از پایهی ۳٫۳ ولت بگیری، ولتاژِ برد افت میکند و ممکن است برد ریست شود. - نبستنِ
GNDمشترک: اگر تغذیهی سروو جدا باشد، زمینِ آن باید حتماً به زمینِ برد وصل شود، وگرنه فرمان درست خوانده نمیشود. - فشار به مرزِ مکانیکی: سروو معمولی فقط حدود ۰ تا ۱۸۰ درجه میچرخد؛ اگر به زور بیشتر بخواهی، موتور «قفل» میکند، داغ میشود و میسوزد.
- انتظار دقتِ کامل بدون کالیبراسیون: عددِ دقیقِ
dutyبرای هر سروو کمی فرق دارد و گاهی باید کالیبرهاش کنی.
همین حالا امتحان کن
حرکتِ سروو را توی مرورگر ببین و زاویهها را عوض کن: شبیهساز سروو را باز کن. برای یادگیری قدمبهقدم سراغ فصل سروو برو.


