شِفر (کود) جستجو

درس ۸۵: آشنایی با موتورهای سروو | دوره گامبهگام آردوینو

درس ۸۵: آشنایی با موتورهای سروو | دوره گامبهگام آردوینو

این راهنمای پروژه شما را با دنیای سروو موتورهای چرخش پیوسته، که به عنوان سرووهای ۳۶۰ درجه نیز شناخته می‌شوند، آشنا می‌کند. برخلاف سرووهای استاندارد که به یک زاویه خاص (مانند ۰ تا ۱۸۰ درجه) حرکت می‌کنند، این موتورها به طور پیوسته در هر دو جهت می‌چرخند. این ویژگی آن‌ها را برای ساخت ربات‌های کوچک، مسیرهای تانکی، یا هر پروژه‌ای که به موتورهای محرک ساده و مقرون‌به‌صرفه نیاز دارد، ایده‌آل می‌کند. این راهنما به شما نشان می‌دهد که چگونه با استفاده از یک آردوینو و چند دکمه فشاری، آن را کنترل کنید و کنترل عملی بر جهت و سرعت آن داشته باشید.

در اینجا چند کاربرد عملی برای یک سروو ۳۶۰ درجه آورده شده است:

  • ساخت یک ماشین رباتیک دو چرخ کوچک.
  • ایجاد یک پایه دوربین پن-تیلت که بی‌نهایت می‌چرخد.
  • به حرکت درآوردن یک نوار نقاله یا وینچ کوچک.
  • ساخت یک پلتفرم اسکن ساده رادار یا حساس(حس کننده).

سخت‌افزار و قطعات

برای این پروژه، به قطعات زیر نیاز دارید:

  • برد آردوینو (به عنوان مثال، Uno)
  • سروو موتور چرخش پیوسته (به عنوان مثال، FS90R یا مشابه)
  • سه دکمه فشاری
  • سیم‌های جامپر
  • بردبورد (اختیاری، برای سیم‌کشی آسان‌تر)

راهنمای سیم‌کشی

سیم‌کشی این پروژه ساده است. سروو موتور سه سیم دارد: معمولاً قهوه‌ای (زمین)، قرمز (برق) و نارنجی یا زرد (سیگنال). دکمه‌های فشاری در یک پیکربندی ساده سیم‌کشی می‌شوند.

در اینجا تفکیک اتصالات آورده شده است:

  • سروو موتور:
    • سیم قهوه‌ای (زمین) به پایه GND آردوینو متصل می‌شود.
    • سیم قرمز (برق) به پایه 5V آردوینو متصل می‌شود.
    • سیم نارنجی/زرد (سیگنال) به پایه ۹ آردوینو متصل می‌شود.
  • دکمه‌های فشاری:
    • یک طرف هر دکمه به پایه GND آردوینو متصل می‌شود.
    • طرف دیگر دکمه «پادساعتگرد» به پایه ۲ متصل می‌شود.
    • طرف دیگر دکمه «توقف» به پایه ۳ متصل می‌شود.
    • طرف دیگر دکمه «ساعتگرد» به پایه ۴ متصل می‌شود.

در ویدیو، سازنده تأکید می‌کند که سیم سیگنال سروو باید به یک پایه PWM-پشتیبانی روی آردوینو متصل شود که اغلب با علامت تیلدا (~) مشخص می‌شود. پایه ۹ یکی از این پایه‌هاست. دکمه‌های فشاری از مقاومت‌های pull-up داخلی آردوینو استفاده می‌کنند که سیم‌کشی را با حذف نیاز به مقاومت‌های خارجی ساده می‌کند (در ویدیو در ۰۷:۰۲).

توضیح شِفر (کود)

شِفر (کود) برای خواندن وضعیت سه دکمه فشاری و ارسال فرمان مربوطه به سروو موتور طراحی شده است. بیایید بخش‌های قابل تنظیم توسط کاربر را بررسی کنیم.

پیکربندی پایه‌ها و فرمان‌ها

در بالای شِفر (کود)، تعاریف پایه‌ها و مقادیر کنترل سروو را خواهید یافت. این جایی است که می‌توانید رفتار پروژه خود را سفارشی کنید.


const int servoPin = 9;    // پایه PWM برای سیگنال سروو
const int stopPin = 3;     // پایه برای دکمه توقف
const int cwPin = 4;       // پایه برای دکمه ساعتگرد
const int ccwPin = 2;      // پایه برای دکمه پادساعتگرد

این ثابت‌ها تعریف می‌کنند که کدام پایه‌های آردوینو به دکمه‌ها و سروو متصل هستند. اگر از پایه‌های متفاوتی برای دکمه‌های خود استفاده می‌کنید، باید اعداد را در اینجا تغییر دهید. servoPin باید یک پایه PWM-پشتیبانی باشد.


const int csServoCommand[3] = {106, 52, 0};  // {پادساعتگرد، توقف، ساعتگرد}
const String csServoCommandText[3] = {"پادساعتگرد", "متوقف شده", "ساعتگرد"};

این مهم‌ترین بخش برای درک و تنظیم است. آرایه csServoCommand مقادیری را که به سروو ارسال می‌شوند نگه می‌دارد. برای یک سروو پیوسته، این مقادیر یک زاویه را نشان نمی‌دهند بلکه سرعت و جهت را نشان می‌دهند.

  • ۱۰۶ مقدار برای چرخش پادساعتگرد با سرعت کامل است.
  • ۵۲ مقدار برای توقف کامل است.
  • ۰ مقدار برای چرخش ساعتگرد با سرعت کامل است.

این مقادیر جهانی نیستند. به دلیل تفاوت‌های تولید، مقدار «توقف» (۵۲) ممکن است نیاز به تنظیم داشته باشد. اگر سروو شما هنگام فشار دادن دکمه توقف به آرامی حرکت کرد، باید این مقدار را دقیق تنظیم کنید. ویدیو این فرآیند را نشان می‌دهد و نحوه تأثیر تغییر مقدار به ۵۴ یا ۵۱ بر رفتار موتور را نمایش می‌دهد (در ویدیو در ۱۳:۴۵).

همچنین می‌توانید مقادیر چرخش را برای تغییر سرعت موتور تنظیم کنید. به عنوان مثال، تنظیم مقدار پادساعتگرد به ۷۰ باعث می‌شود کندتر از ۱۰۶ بچرخد (در ویدیو در ۱۲:۲۳).

آرایه csServoCommandText رشته‌های متنی را نگه می‌دارد که برای نمایش وضعیت فرمان فعلی به Serial Monitor چاپ می‌شوند.

تابع سفارشی: servoCommand()

شِفر (کود) از یک تابع سفارشی برای مدیریت منطق فرمان استفاده می‌کند. این تابع یک عدد (۰، ۱، یا ۲) را به عنوان آرگومان می‌گیرد، متن وضعیت را به‌روزرسانی می‌کند و فرمان مربوطه را به سروو ارسال می‌کند.


void servoCommand(int n) {
  statusText = csServoCommandText[n];
  myservo.write(csServoCommand[n]);
  Serial.println(csServoCommandText[n]);
  Serial.println(csServoCommand[n]);
}

این تابع از حلقه اصلی زمانی که یک دکمه فشار داده می‌شود فراخوانی می‌شود. منطق به‌روزرسانی نمایشگر و کنترل سروو را متمرکز می‌کند و شِفر (کود) را تمیزتر و اصلاح آن را آسان‌تر می‌کند.

پروژه زنده و نمایش

در ویدیو، سازنده پروژه را در حال عمل نشان می‌دهد. فشار دادن دکمه «ساعتگرد» مقدار ۰ را به سروو ارسال می‌کند و باعث چرخش آن در یک جهت می‌شود. فشار دادن دکمه «پادساعتگرد» مقدار ۱۰۶ را ارسال می‌کند و آن را در جهت دیگر می‌چرخاند. دکمه «توقف» مقدار ۵۲ را ارسال می‌کند که باید موتور را متوقف کند.

نمایشگر مسلسل برای نمایش وضعیت فعلی و مقدار دقیقی که به سروو ارسال میشود استفاده میشود. این امر برای اشکالزدایی و یافتن مقدار «توقف» ایدهآل برای موتور خاص شما بسیار ارزشمند است. همانطور که در ویدیو ذکر شد، فرمان توقف ممکن است به دلیل مدار داخلی سروو کاملاً دقیق نباشد و ممکن است حرکت آهسته یا لرزش مشاهده کنید. این ویژگی رایج سرووهای پیوسته ارزانقیمت است و میتوان با تنظیم مقدار توقف در شِفر (کود) (در ویدیو در زمان ۰۱:۱۵) آن را به حداقل رساند.

فصلها

  • [۰۰:۰۵] معرفی موتور سروو چرخشی ۳۶۰ درجه
  • [۰۲:۰۲] مرور قطعات و سختافزار
  • [۰۲:۴۰] نمودار اتصالات و سیمکشی دقیق
  • [۰۵:۰۷] توضیح شِفر (کود): ثابتها، آرایهها و راهاندازی
  • [۰۹:۵۶] توضیح شِفر (کود): تابع servoCommand
  • [۱۰:۵۴] نمایش زنده و خروجی نمایشگر مسلسل
  • [۱۲:۲۳] تنظیم سرعت سروو و مقادیر توقف

تصاویر

SG90 Mini Servo Motor
SG90 Mini Servo Motor
SG90_servo_motor-1
SG90_servo_motor-1
115-Arduino code to control continuous 360° servo from serial monitor command
زبان: C++
/*
 * نمایش کنترل سروو پیوسته (سروو ۳۶۰ درجه)  
 * این شِفر (کود) به شما اجازه می‌دهد تا یک سروو ۳۶۰ درجه را با یک فرمان از مانیتور سری کنترل کنید.  
 * این موتور سروو ۳۵۰ فقط برای سرگرمی است. نمی‌توان از آن در کاربردهای واقعی که نیاز به موقعیت‌یابی دقیق دارند استفاده کرد. موتور پله‌ای یا موتور سروو گران‌قیمت بگیرید.  
 * 
 * تغییر یافته توسط احمد شمشیری برای Robojax.com  
 * در روز یکشنبه، ۱ ژوئیه ۲۰۱۸، ساعت ۱۱:۰۹ صبح در اِجَکس، انتاریو، کانادا  
 * ویدئوی آموزشی این پروژه را تماشا کنید: https://youtu.be/b_xvu6wWafA  
 * این شِفر (کود) را از Robojax.com دریافت کنید  
 * 
 * شِفر (کود) اصلی توسط BARRAGAN <http://barraganstudio.com>  
 * این شِفر (کود) نمونه در دامنه عمومی است.  
 * تغییر یافته در ۸ نوامبر ۲۰۱۳  
 * توسط اسکات فیتزجرالد  
 * http://www.arduino.cc/en/Tutorial/Sweep
 */
#include <Servo.h>

Servo myservo; // یک شیء سروو ایجاد کنید تا یک سروو را کنترل کند.
 // در بیشتر بردها می‌توان دوازده شیء سروو ایجاد کرد.

int pos = 0; // متغیر برای ذخیره موقعیت سروو
int incomingByte = 0; // برای داده‌های سریال ورودی

void setup() {
  Serial.begin(9600);
  myservo.attach(9); // سرو را به پایه ۹ متصل می‌کند به شیء سرو
}



void loop() {

 // فقط زمانی داده ارسال کنید که داده‌ای دریافت کرده‌اید:
        if (Serial.available() > 0) {
 // بایت ورودی را بخوانید:
                incomingByte = Serial.read();

 // بگو چه چیزی داری:
                Serial.print("received: ");
                Serial.print (incomingByte);
                if(incomingByte == 108){
                 Serial.println(" sent 0 Rotating CW ");
                 myservo.write(0);
                }else if(incomingByte == 114){
                  Serial.println(" sent 180 Rotating CCW ");
                  myservo.write(180);
                }else if(incomingByte == 60){
                  Serial.println(" sent Stopped ");
                  myservo.write(60);
                }else{
                  Serial.println(" moving Randomly");
                  myservo.write(incomingByte);
                }


        }


}
893-Arduino code to control continuous 360° servo from serial monitor command (Code 2)
زبان: C++
/* 
 *  
 *  Demonstration of Controlling Continuous Servo (360 servo)
360 Servo -2
 *  This code allows you to control a 360-degree servo by a command from the Serial Monitor.
* this 350 servo motor is a just for fun. it can't be used for real application where you need exact positioning. get stepper motor or expensive servo motor. 
📚⬇️ Download and resource page https://robojax.com/RJT762
 *  
 * Modified by Ahmad Shamshiri for Robojax.com
 * on Sunday, July 1, 2018, at 11:09 AM in Ajax, Ontario, Canada
 * Watch a video instruction of this project: https://youtu.be/b_xvu6wWafA
 * Get this code from Robojax.com
 * 
 Original code by BARRAGAN <http://barraganstudio.com>
 This example code is in the public domain.
 Modified 8 Nov 2013
 by Scott Fitzgerald
 http://www.arduino.cc/en/Tutorial/Sweep
*/

#include <Servo.h>

Servo myservo;  // create servo object to control a servo
// twelve servo objects can be created on most boards

int servoPin = 9;// this pin must be of those with PWM ~
int pos = 0;    // variable to store the servo position
int incomingByte = 0;   // for incoming serial data
int CWBS, CCWBS, SBS;

void setup() {
  Serial.begin(9600);
 pinMode(2,INPUT_PULLUP);// set pin for push button STOP
  pinMode(3,INPUT_PULLUP);// set pin for push button CCW  
  pinMode(4,INPUT_PULLUP);// set pin for push button CW
   
  myservo.attach(servoPin);  // attaches the servo on pin 9 to the servo object
}



void loop() {
    CCWBS = digitalRead(2);// read status of button CCW
    SBS = digitalRead(3);// read status of button STOP
    CWBS = digitalRead(4);// read status of button CW
                 if(CCWBS == LOW){
                 Serial.println(" sent 0 Rotaing CW "); 
                 myservo.write(0); 
                }else if(CWBS == LOW){
                  Serial.println(" sent 180 Rotaing CCW "); 
                  myservo.write(180); 
                }else if(SBS == LOW){
                  Serial.println(" sent Stopped "); 
                  myservo.write(60); 
                }else{
                  Serial.println(" moving Random"); 
                  myservo.write(48); 
                }
                  


  
}// loop 

مواردی که ممکن است به آن‌ها نیاز داشته باشید

فایل‌ها📁

سایر فایل‌ها