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

درس ۸۶: کنترل موقعیت موتور سروو با استفاده از پتانسیومتر

درس ۸۶: کنترل موقعیت موتور سروو با استفاده از پتانسیومتر

تصور کنید یک دستگیره ساده را میچرخانید و یک بازوی مکانیکی را تماشا میکنید که دقیقاً از هر حرکت شما پیروی میکند. این جادوی ترکیب یک پتانسیومتر با یک سرو موتور است. این پروژه، بخشی از دوره گامبهگام آردوینو توسط Robojax، یک مفهوم بنیادی و فوقالعاده کاربردی در الکترونیک را نشان میدهد: تبدیل ورودی آنالوگ به حرکت فیزیکی دقیق. شما یاد خواهید گرفت که چگونه یک ولتاژ متغیر را از یک پتانسیومتر بخوانید، آن مقدار را به محدودهای از زاویهها نگاشت کنید، و به یک سرو موتور فرمان دهید تا به آن موقعیت دقیق بچرخد. این دروازه شما برای ساخت پروژههای شهودی و تعاملی است که در آن کنترل دستی با اتوماسیون ترکیب میشود.

کاربردهای این مهارت گسترده و عملی هستند. در اینجا فقط چند ایده برای الهام گرفتن شما آورده شده است:

  • کنترل بازوی رباتیک: از یک پتانسیومتر برای موقعیتدهی دستی هر مفصل یک بازوی رباتیک برای عملیات دقیق برداشتن و قرار دادن استفاده کنید.
  • سیستم پن و تیلت دوربین: یک پایه دوربین کنترل از راه دور برای تایملپس یا نظارت بسازید که با چرخاندن یک دستگیره به نرمی پن و تیلت میکند.
  • کپی گیج آنالوگ: یک گیج داشبورد فیزیکی (مانند سرعتسنج یا صفحه دما) بسازید که بر اساس دادههای حساس(حس کننده) حرکت میکند و پتانسیومتر به عنوان ابزار کنترل دستی یا کالیبراسیون عمل میکند.
  • نصبهای هنری تعاملی: مجسمههای جنبشی بسازید که به ورودی بیننده پاسخ میدهند، جایی که چرخاندن یک دستگیره موقعیت قطعات متحرک را تغییر میدهد.
  • فرمان وسایل نقلیه مدل: زاویه فرمان یک ماشین یا قایق مدل را از راه دور کنترل کنید و حس آنالوگ و شهودیتری نسبت به دکمههای دیجیتال فراهم کنید.

این راهنما بر اساس آموزش ویدیویی درس ۸۶: کنترل موقعیت سرو موتور با استفاده از پتانسیومتر توسط Robojax (در ویدیو در ۰۰:۰۰) است. این راهنما شما را در کل فرآیند، از درک سیمکشی تا توضیح کدی که همه چیز را کار میکند، راهنمایی میکند. بیایید شروع کنیم.

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

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

  • یک برد آردوینو (به عنوان مثال، Uno، Nano)
  • یک سرو موتور استاندارد (به عنوان مثال، SG90 یا MG996R)
  • یک پتانسیومتر (مقاومت متغیر، معمولاً ۱۰kΩ)
  • سیمهای جامپر
  • یک بردبورد (اختیاری، برای اتصالات آسانتر)

درک سیمکشی

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

یک ترفند هوشمندانه که این پروژه استفاده میکند، ایجاد یک منبع ۵ ولت اضافی روی یک پایه دیجیتال برای تغذیه پتانسیومتر است، زیرا برخی از بردهای آردوینو فقط یک پایه ۵ ولت اختصاصی دارند. این کار در شِفر (کود) با تنظیم یک پایه دیجیتال (پایه ۸) روی HIGH انجام میشود که ۵ ولت خروجی میدهد. (در ویدیو در ۰۰:۳۹)

در اینجا نمودار سیمکشی ذکر شده در ویدیو آمده است:

سیمکشی آردوینو برای سرو موتور با پتانسیومتر
سیمکشی آردوینو برای سرو موتور با پتانسیومتر

بیایید اتصالات را تجزیه کنیم:

  • سرو موتور:
    • برق (سیم قرمز) ← پایه ۵ ولت آردوینو
    • زمین (سیم قهوهای/سیاه) ← پایه GND آردوینو
    • سیگنال (سیم نارنجی/زرد) ← پایه ۳ آردوینو (یک پایه با قابلیت PWM)
  • پتانسیومتر:
    • پایه چپ ← پایه GND آردوینو
    • پایه وسط (خروجی) ← پایه آنالوگ A0 آردوینو
    • پایه راست ← پایه ۸ آردوینو (که در شِفر (کود) به عنوان VCC2 تعریف شده است)

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

شِفر (کود) این پروژه به شکلی زیبا ساده است. این شِفر (کود) از چند تابع کلیدی آردوینو برای خواندن پتانسیومتر و کنترل سرو موتور استفاده میکند. بیایید روی بخشهای قابل تنظیم توسط کاربر تمرکز کنیم که میتوانید برای پروژههای خودتان تنظیم کنید. (در ویدیو در ۰۳:۰۰)

در بالای اسکچ، پینها را تعریف کرده و شیء سرو را ایجاد میکنید. اینها متغیرهای اصلی هستند که بر اساس سیمکشی خود تغییر خواهید داد:

#include <Servo.h>

Servo myservo;  // ایجاد شیء سرو برای کنترل یک سرو

int potpin = A0;  // پایه آنالوگ مورد استفاده برای اتصال پتانسیومتر
int servoPin = 3; // تعریف یک پایه دیجیتال (با PWM) برای سرو. فقط میتوانید از پینهای ۳، ۵، ۶، ۹، ۱۰، ۱۱ استفاده کنید
int VCC2 = 8;// تعریف VCC اضافی برای پتانسیومتر
int val;    // متغیر برای خواندن مقدار از پایه آنالوگ

در اینجا توضیح هر بخش آمده است:

  • Servo myservo;: این خط یک شیء به نام myservo ایجاد میکند که برای کنترل سرو موتور خاص خود استفاده خواهیم کرد. میتوانید آن را تغییر نام دهید، اما باید از همان نام بعداً در شِفر (کود) استفاده کنید.
  • int potpin = A0;: این تعریف میکند که خروجی پتانسیومتر به کدام پایه آنالوگ متصل است. اگر سیم را به یک پایه آنالوگ دیگر منتقل کنید، باید این عدد را بهروزرسانی کنید.
  • int servoPin = 3;: این پایه دیجیتال را برای سیم سیگنال سرو تنظیم میکند. استفاده از یک پایه با قابلیت PWM (معمولاً آنهایی که با '~' روی برد مشخص شدهاند) بسیار مهم است. کامنت پینهای معتبر را برای اکثر آردوینوها فهرست میکند.
  • int VCC2 = 8;: این پینی است که به عنوان منبع ۵ ولت ثانویه برای پتانسیومتر استفاده میکنیم. اگر برد شما چندین پایه ۵ ولت دارد، میتوانید آن را مستقیماً وصل کنید و این بخش از شِفر (کود) را حذف کنید.

در تابع setup()، شِفر (کود) سروو را مقداردهی اولیه کرده و پایه برق اضافی را تنظیم می‌کند. تابع myservo.attach(servoPin) ضروری است زیرا به آردوینو می‌گوید کدام پایه به سیم سیگنال سروو متصل است.

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

  pinMode(VCC2, OUTPUT);// پایه ۸ را به عنوان خروجی تنظیم می‌کند
  digitalWrite(VCC2, HIGH);// پایه ۸ را HIGH می‌کند تا به عنوان پایه ۵ ولت عمل کند
}

منطق اصلی در تابع loop() قرار دارد. مقدار پتانسیومتر را می‌خواند، آن را به زاویه تبدیل می‌کند و به سروو فرمان حرکت می‌دهد. دو تابع حیاتی در اینجا analogRead() و map() هستند. (در ویدیو در ۰۴:۲۷)

void loop() {
  val = analogRead(potpin);            // مقدار پتانسیومتر را می‌خواند (مقدار بین ۰ و ۱۰۲۳)
  val = map(val, 0, 1023, 0, 180);     // آن را برای استفاده با سروو مقیاس می‌کند (مقدار بین ۰ و ۱۸۰)
  myservo.write(val);                  // موقعیت سروو را بر اساس مقدار مقیاس‌شده تنظیم می‌کند
  Serial.print(val);
  Serial.println();
  delay(50);                           // منتظر می‌ماند تا سروو به آنجا برسد
}

در اینجا نحوه عملکرد آن آمده است:

  • analogRead(potpin): این تابع ولتاژ را از لغزنده پتانسیومتر می‌خواند و مقداری بین ۰ (۰ ولت) و ۱۰۲۳ (۵ ولت) برمی‌گرداند.
  • map(val, 0, 1023, 0, 180): این کلید اصلی کل پروژه است. مقدار خام پتانسیومتر (۰ تا ۱۰۲۳) را گرفته و آن را به‌طور متناسب به زاویه سروو (۰ تا ۱۸۰ درجه) تبدیل می‌کند. به عنوان مثال، اگر پتانسیومتر ۵۱۱ (حدود نصف) را بخواند، تابع map() مقدار ۹۰ را برمی‌گرداند و سروو را به موقعیت مرکزی خود می‌برد.
  • myservo.write(val): این تابع زاویه محاسبه‌شده (که اکنون در val ذخیره شده) را گرفته و به سروو می‌گوید به آن موقعیت بچرخد.
  • delay(50): این یک مکث کوچک در پایان هر حلقه اضافه می‌کند. نرخ به‌روزرسانی را کنترل می‌کند. تأخیر بیشتر (مانند ۲۰۰ میلی‌ثانیه) باعث می‌شود سروو به صورت پله‌ای حرکت کند، در حالی که تأخیر کمتر (مانند ۵۰ میلی‌ثانیه) حرکت را بسیار نرم می‌کند. می‌توانید این را برای تغییر پاسخ‌گویی تنظیم کنید. (در ویدیو در ۰۷:۲۶)

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

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

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

فصل‌ها

  • [۰۰:۰۰] مقدمه و نمای کلی پروژه
  • [۰۱:۰۵] شماتیک و نمودار سیم‌کشی
  • [۰۲:۰۷] نمایش سیم‌کشی فیزیکی
  • [۰۳:۰۰] توضیح شِفر (کود)
  • [۰۶:۳۳] نمایش زنده و آزمایش
  • [۰۷:۲۶] تنظیم سرعت پاسخ سروو

تصاویر

Arduino wiring or servo motor with pot
Arduino wiring or servo motor with pot
SG90_servo_motor-1
SG90_servo_motor-1
SG90_servo_motor-0
SG90_servo_motor-0
892-Lesson 86: Controlling a servo position using a potentiometer (variable resistor)
زبان: C++
/*
 * Lesson 88: Controlling Servo motor a with Potentiometer
 * 📚⬇️ Download and resource page https://robojax.com/RJT763
 watch full video tutroial: https://www.youtube.com/watch?v=ntRW77mNFFk
 
 Controlling a servo position using a potentiometer (variable resistor)
 by Michal Rinott <http://people.interaction-ivrea.it/m.rinott>

 modified on 8 Nov 2013
 by Scott Fitzgerald
 http://www.arduino.cc/en/Tutorial/Knob

 Update by Ahmad Shamshiri on Jan 01, 2019  in Ajax, Ontario, Canada


*/

#include <Servo.h>

Servo myservo;  // create servo object to control a servo

int potpin = A0;  // analog pin used to connect the potentiometer
int servoPin = 3; // define a digital pin (with PWM) for servo. Can use only pin 3, 5, 6,9, 10, 11
int VCC2 = 8;// define extra VCC for potentiometer
int val;    // variable to read the value from the analog pin

void setup() {
  //
  Serial.begin(9600);          //  setup serial
  myservo.attach(servoPin);  // attaches the servo on pin 3 to the servo object

  pinMode(VCC2, OUTPUT);// set pin 8 as output
  digitalWrite(VCC2, HIGH);// set pin 8 HIGH so it acts as 5V pin
}

void loop() {
  
  val = analogRead(potpin);            // reads the value of the potentiometer (value between 0 and 1023)
  val = map(val, 0, 1023, 0, 180);     // scale it to use it with the servo (value between 0 and 180)
  myservo.write(val);                  // sets the servo position according to the scaled value
  Serial.print(val);
  Serial.println();
  delay(50);                           // waits for the servo to get there
}
 

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

فایل‌ها📁

سایر فایل‌ها