حرکت: کنترل سروو موتور
با کتابخانهٔ Servo و پالس یک تا دو میلیثانیه، زاویهٔ یک سروو موتور را با پتانسیومتر کنترل کن.
در پایان این درس میتوانید
- تفاوت سروو موتور با موتور جریان مستقیم را از راه حلقهٔ بستهٔ بازخورد توضیح دهی.
- رابطهٔ پهنای پالس و زاویه را بنویسی و برای یک زاویهٔ دلخواه پهنای پالس را حساب کنی.
- با attach و write یک سروو موتور را راه بیندازی و زاویهاش را تعیین کنی.
- بدانی چرا کتابخانهٔ Servo خروجی PWM پایههای ۹ و ۱۰ را از کار میاندازد.
- جریان کشیدهٔ سروو موتور را تخمین بزنی و بدانی کی باید تغذیهٔ جدا با زمین مشترک بگیری.
سروو موتور یک موتور ساده نیست؛ یک بستهٔ کامل است. داخل آن پوسته چهار چیز کنار هم نشستهاند: یک موتور جریان مستقیم، یک جعبهدنده که سرعت را به گشتاور تبدیل میکند، یک پتانسیومتر چسبیده به محور خروجی که زاویهٔ واقعی بازو را میسنجد، و مداری که این زاویه را با آنچه تو خواستهای مقایسه میکند. تفاوت بنیادی با موتور جریان مستقیم همینجاست: به موتور معمولی ولتاژ میدهی و او فقط میچرخد، بیآنکه بداند کجاست؛ به سروو زاویه میدهی و او خودش میچرخد تا به آن زاویه برسد و همانجا میایستد. اگر با انگشت بازو را کج کنی، مدار داخلی خطا را میبیند و بازو را سر جایش برمیگرداند؛ به این ساختار حلقهٔ بسته میگویند.
زبانِ سروو: پهنای پالس
سروو سه سیم دارد؛ دو تا تغذیهٔ پنج ولت و زمین، و سومی سیم فرمان. زبان این سیم بسیار ساده است: سروو هر ۲۰ میلیثانیه یک پالس مثبت انتظار دارد، یعنی ۵۰ بار در ثانیه. آنچه معنا دارد نه ارتفاع پالس است و نه فاصلهٔ میان پالسها، بلکه پهنای همان پالس است. پالس یک میلیثانیهای یعنی برو به ابتدای بازه، پالس دو میلیثانیهای یعنی برو به انتهای بازه، و هر پهنای میانی زاویهای میان این دو را میسازد. رابطه خطی است، پس هر درجه معادل ۱۰۰۰ میکروثانیه تقسیم بر ۱۸۰ یعنی حدود ۵٫۶ میکروثانیه میشود. این پالسها باید پیوسته تکرار شوند؛ اگر قطع شوند بیشتر سرووها بازو را رها میکنند.
یک نمونهٔ عددی
میخواهی بازو دقیقاً وسط بازه، یعنی روی ۹۰ درجه بایستد. پهنای پالس برابر است با ۱۰۰۰ میکروثانیه بهعلاوهٔ حاصلضرب نسبت ۹۰ به ۱۸۰ در ۱۰۰۰ میکروثانیه؛ یعنی ۱۰۰۰ بهعلاوهٔ ۵۰۰ که میشود ۱۵۰۰ میکروثانیه یا همان ۱٫۵ میلیثانیه. حالا همین پالس را در دورهٔ ۲۰ میلیثانیهای ببین: چرخهٔ کار برابر ۱٫۵ تقسیم بر ۲۰ یعنی ۷٫۵ درصد است. برخلاف درس PWM که چرخهٔ کار توان متوسط را تعیین میکرد، اینجا این عدد فقط رمزی است که مدار داخلی سروو آن را به موقعیت ترجمه میکند.
کتابخانهٔ Servo
لازم نیست این پالسها را دستی بسازی. myServo.attach(9) پایه را به کتابخانه میسپارد و از آن لحظه یک تایمر سختافزاری در پسزمینه پالسها را با نظم ۵۰ هرتز تولید میکند، حتی وقتی برنامهٔ تو مشغول کار دیگری است. myServo.write() عددی بین ۰ تا ۱۸۰ میگیرد و آن را به پهنای پالس ترجمه میکند. این تابع منتظر رسیدن بازو نمیماند و فوراً برمیگردد، پس برای اطمینان از پایان حرکت باید خودت کمی مکث بگذاری. برای دقت بیشتر هم writeMicroseconds() پهنای پالس را مستقیم میگیرد.
کتابخانهٔ Servo روی برد Uno از تایمر شمارهٔ یک استفاده میکند و همین تایمر خروجی PWM پایههای ۹ و ۱۰ را میسازد. پس بهمحض اینکه اولینattach()را صدا بزنی،analogWrite()روی این دو پایه بیاثر میشود؛ فرقی هم نمیکند سروو به کدام پایه بسته باشد. کد بدون خطا کامپایل میشود و همین گمراهکننده است. اگر خروجی PWM لازم داری، پایههای ۳، ۵، ۶ و ۱۱ آزاد میمانند.
جریان، و چرا تغذیهٔ جدا
سروو یک موتور واقعی است و موتور جریان میخورد. یک سروو کوچک بیبار شاید ۱۰۰ میلیآمپر بکشد، ولی زیر بار یا در لحظهٔ راهافتادن جریانش به چند صد میلیآمپر میرسد و در حالت قفلشدگی از ۷۰۰ میلیآمپر هم میگذرد. این را با سقف برد بسنج: هر پایهٔ دیجیتال حداکثر ۲۰ میلیآمپر میدهد، پس تنها سیم فرمان به پایه میرود و سیم تغذیه هرگز نباید به پایهٔ دیجیتال برسد.
اگر سروو را از خود برد تغذیه کنی، افت ولتاژ لحظهٔ راهافتادن میتواند ولتاژ تراشه را زیر آستانه ببرد و برد را ریست کند؛ نشانهاش برنامهای است که هر بار با حرکت بازو از اول شروع میشود. راه درست یک منبع پنج ولتی جدا برای سروو است، با این شرط که زمین منبع و زمین برد به هم وصل باشند؛ وگرنه پالس فرمان مرجع مشترکی ندارد و سروو آن را نمیفهمد.
از عدد پتانسیومتر تا زاویه
در کیت این درس لغزندهٔ پتانسیومتر روی پایهٔ A0 است و analogRead() عددی بین ۰ تا ۱۰۲۳ میدهد. برای رساندن این بازه به بازهٔ ۰ تا ۱۸۰ از map() استفاده میکنیم. مثلاً ۵۱۲ ضربدر ۱۸۰ تقسیم بر ۱۰۲۳ میشود ۹۰٫۰۸ که در حساب صحیح به ۹۰ گرد میشود؛ درست وسط بازه. توجه کن که ۱۰۲۴ پله را به ۱۸۱ زاویه نگاشتهای، پس هر درجه تقریباً ۵٫۷ پلهٔ خام میگیرد و ریزنوسان طبیعی مبدل، زاویه را جابهجا نمیکند.
کجا به کار میآید
بال و سکان هواپیمای مدل، فرمان ماشین کنترلی، مفصل بازوی رباتیک و دریچهٔ هوای کولر همه سروو دارند؛ هر جا که «برو به فلان زاویه و همانجا بمان» معنا داشته باشد. اما برای چرخش پیوسته و کنترل سرعت، هنوز موتور جریان مستقیم با درایور مناسب انتخاب بهتری است.
رابطههای کلیدی
مأموریت روی میز کار
کیت را اجرا کن؛ لغزندهٔ پتانسیومتر روی پایهٔ A0 است و بازوی سروو موتور با چرخاندن آن میان صفر و ۱۸۰ درجه جابهجا میشود.
- کد را اجرا کن و پیچ پتانسیومتر را آرام از یک سر به سر دیگر ببر تا بازوی سروو موتور کل بازهٔ ۰ تا ۱۸۰ درجه را طی کند.
- پنجرهٔ سریال را باز کن و عددی را پیدا کن که زاویه را دقیقاً ۹۰ میکند؛ آن را با ۵۱۲ مقایسه کن.
- در فراخوانی map بازهٔ خروجی را از ۰ تا ۱۸۰ به ۶۰ تا ۱۲۰ تغییر بده و ببین بازو دیگر فقط در یکسوم میانی حرکت میکند.
- بهجای write از writeMicroseconds استفاده کن و سه عدد ۱۰۰۰ و ۱۵۰۰ و ۲۰۰۰ را بده تا ابتدا، وسط و انتهای بازه را ببینی.
- شرط مقایسه با زاویهٔ دور قبل را بردار و ببین فرمانهای پیاپی چطور بازو را بیقرار میکنند.
مدار و کد این درس از پیش چیده شدهاند. آزادانه تغییرشان بدهید — پروژههای خودتان دستنخورده میمانند. تمامصفحه با همین کیت
آزمون این درس
۵ پرسش چهارگزینهای. پس از ثبت، پاسخ درست و توضیح هر پرسش را میبینید. میتوانید هر چند بار که خواستید تلاش کنید؛ بهترین نمره در کارنامه ثبت میشود.