- در جهان الکترونیک، از سروو موتورها معمولا در پروژههای رباتیک استفاده میشود چرا که هم دقیق هستند و هم استفاده و کنترل آنها راحت است. از مزایای دیگر آنها اندازهی کوچکتر نسبت به بقیه موتورها و بهینه و کارآمد بودن از لحاظ مصرف انرژی است. بر اساس ویژگیهای هر مدل، سروو موتورها میتوانند وزنهای مختلفی را با گشتاور بالا بلند کرده یا رو به جلو به حرکت درآورند. هدف ما در این آموزش آشنایی بیشتر با این موتورها و آموزش چگونگی اتصال آنها به بورد میکروکنترلر STM32 است. در مدار این اتصال از یک پتانسیومتر و یک LCD هم استفاده میکنیم. پتانسیومتر برای تغییر زاویهی شفت سروو موتور و LCD برای نمایش آن زاویه استفاده میشوند.

تجهیزات مورد نیاز
- بورد STM32F103C8 (معروف به بورد Blue pill)
- سروو موتور (SG90)
- 16×2 LCD
- پتانسیومتر
- برد بورد
- سیم جامپر
نقشه مدار و اتصالات

جزئیات پایههای STM32
در این میکروکنترلر، ۱۰ عدد پین ADC داریم (PA0-PB1) که برای انجام این پروژه تنها از یکی از آنها استفاده میکنیم و آن PA3 است. این پایه به پتانسیومتر وصل میشود و زاویه ی شفت موتور را که یک مقدار آنالوگ است، با استفاده از تابع ()analogread میخواند.
همچنین این میکروکنترلر دارای ۱۵ عدد خروجی PWM است. (PA0 ،PA1 ،PA2 ،PA3 ،PA6 ،PA7 ،PA8 ،PA9 ،PA10 ،PB0 ،PB1 ،PB6 ،PB7 ،PB8 ،PB9) که از یکی از آنها استفاده میکنیم تا پالسهای PWM را به سروو موتور ارسال کنیم. (پین PWM سروو موتور معمولا با رنگ نارنجی مشخص میشود)
اتصال بین میکروکنترلر و LCD

اتصال بین میکروکنترلر و سروو موتور

اتصالات پتانسیومتر
همان طور که گفتیم، در این مدار از دو پتانسیومتر استفاده میکنیم.
- پتانسیومتری که در سمت راست مدار قرار دارد، برای تنظیم کنتراست LCD است. سه پایهی این پتانسیومتر به این ترتیب هستند که پایهی سمت چپ پایهی ۵ ولت و پایهی سمت راست Gnd است. پایهی وسطی نیز به پین V0 از LCD متصل میشود.
- پتانسیومتر سمت چپی هم برای تغییر و کنترل زاویهی شفت موتور استفاده میشود. پایهی سمت چپ آن به یک ورودی ۳.۳ ولت، پایهی سمت راست به Gnd و پایهی وسطی هم به پین PA3 از میکروکنترلر وصل میشود.

پروگرم کردن STM32 به منظور راهاندازی سروو موتور
مانند آموزشهای قبلی در اینجا هم STM32 را با استفاده از پورت USB و Arduino IDE پروگرم میکنیم (روش این کار را در یک جلسهی جداگانه قبلا آموزش دادهایم) به این ترتیب دیگر نیازی به پروگرمر FTDI نداریم و درست مانند یک بورد آردوینو آن را پروگرم میکنیم. در ادامه به توضیح بخشهای مهم کد میپردازیم و کد کامل را هم در انتهای همین جلسه برایتان قرار دادهایم.
ابتدا کتابخانههای لازم برای استفاده از توابع مربوط به LCD و سروو موتور را قید میکنیم.
#include<Servo.h> #include<LiquidCrystal.h>
پینهای LCD را تعریف کرده و initialize میکنیم. همین طور چند پین دیگر را برای PWM و پتانسیومترها.
const int rs = PB0, en = PB1, d4 = PB10 , d5 = PB11 , d6 = PC13, d7 = PC14; LiquidCrystal lcd(rs,en,d4,d5,d6,d7); int servoPin = PA0; int potPin = PA3;
در اینجا ما یک متغیر servo تعریف کردهایم و نوع آن را هم Servo قرار میدهیم. سپس آن را به پین PWM متصل میکنیم.
Servo servo; servo.attach(servoPin);
در ادامه مقدار آنالوگ دریافت شده از پتانسیومتر را از پین PA3 میخوانیم. از آنجایی که این پین یک پین ADC است، مقدار آنالوگی که در بازهی ۰ تا ۳.۳ قرار دارد را تبدیل به معادل دیجیتال آن کرده که عددی در بازهی ۰ تا ۴۰۹۵ به ما میدهد.
analogRead(potPin);
از آنجا که خروجی دیجیتال دارای رزولوشن ۱۲ بیتی است و ما خروجیهایی در بازهی ۰ تا ۱۷۰ (درجه) نیاز داریم، پس خروجی ADC که در بازهی ۰ تا ۴۰۹۵ است را بر ۲۴ تقسیم میکنیم.
angle = (reading/24);
و دستور زیر به سروو موتور میگوید که شفت را به اندازهی زاویهی به دست آمده بچرخاند.
servo.write(angle);
کد کامل و ویدئوی انجام مراحل پروژه را در این بخش میتوانید ببینید.
کد
//INTERFACE SERVO WITH STM32
//CIRCUIT DIGEST
#include<Servo.h> //including servo library
#include<LiquidCrystal.h> //including LCD display library
const int rs = PB0, en = PB1, d4 = PB10 , d5 = PB11 , d6 = PC13, d7 = PC14; //declaring pin names and pin numbers of lcd
LiquidCrystal lcd(rs,en,d4,d5,d6,d7); //setting lcd and its paramaters
int servoPin = PA0; //declare and initialize pin for servo output PWM
int potPin = PA3; //potentiometer ADC input
Servo servo; // creating variable servo with datatype Servo
void setup()
{
lcd.begin(16,2); //setting lcd as 16x2
lcd.setCursor(0,0); //setting cursor at first row and first column
lcd.print("CIRCUIT DIGEST"); //puts CIRCUIT DIGEST in LCD
lcd.setCursor(0,1); //setting cursor at second row and first column
lcd.print("SERVO WITH STM32"); //puts SERVO WITH STM32 in LCD
delay(3000); // delays for 3 seconds
lcd.clear(); //clears lcd display
servo.attach(servoPin); //it connects pin PA0 with motor as control feedback by providing pulses
}
void loop()
{
lcd.clear(); //clears lcd
int angle; //declare varible angle as int
int reading; //declare varible reading as int
reading = analogRead(potPin); //read analog value from pin PA3
angle = (reading/24); //it divides ADC the value according to max angle 170 deg
servo.write(angle); //it puts angle value at servo
lcd.setCursor(0,0); //setting cursor at first row and first column
lcd.print("ANGLE:"); //puts ANGLE in LCD
lcd.print(angle); //puts value at angle
delay(100); //delay in time
}
ویدئو
- منبع: ترجمه از سایت circuitdigest.com
امیدواریم آموزش «آموزش اتصال سروو موتور به STM32» برایتان مفید واقع شده باشد. در ادامه پیشنهاد میکنیم دیگر آموزشهای STM32 را نیز مطالعه کنید.
اگر این نوشته برایتان مفید بود لطفا کامنت بنویسید.
آموزش طراحی و ساخت پروژه های الکترونیک و برنامه نویسی میکروکنترلر ها آموزش الکترونیک,آموزش رزبری پای,آموزش راه اندازی ماژول و سنسور,آموزش آردوینو,نرم افزار های الکترونیک, طراحیPCB,برنامه نویسی میکروکنترلرها ARM AVR PIC FPGA
سلام وقتتون بخیر
برای راه اندازی مثلا دوتا سروو موتور نیاز به درایور نداره؟
چیزی که در دیتا شیت ها نوشته سوو موتور تحت بار تا نیم آمپر یا بیشتر جریان کشی داره میکرو به تنهایی چجوری میتونه تامین کنه این مقدار رو؟
ممنون میشم اگر توضیح بدید