تصویر شاخص نوشته: سروو موتور (Servo) چطور دقیقاً به یک زاویه می‌رود؟

سروو موتور (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 برای هر سروو کمی فرق دارد و گاهی باید کالیبره‌اش کنی.

همین حالا امتحان کن

حرکتِ سروو را توی مرورگر ببین و زاویه‌ها را عوض کن: شبیه‌ساز سروو را باز کن. برای یادگیری قدم‌به‌قدم سراغ فصل سروو برو.