- در جهان الکترونیک، از سروو موتورها معمولا در پروژههای رباتیک استفاده میشود چرا که هم دقیق هستند و هم استفاده و کنترل آنها راحت است. از مزایای دیگر آنها اندازهی کوچکتر نسبت به بقیه موتورها و بهینه و کارآمد بودن از لحاظ مصرف انرژی است. بر اساس ویژگیهای هر مدل، سروو موتورها میتوانند وزنهای مختلفی را با گشتاور بالا بلند کرده یا رو به جلو به حرکت درآورند. هدف ما در این آموزش آشنایی بیشتر با این موتورها و آموزش چگونگی اتصال آنها به بورد میکروکنترلر 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 را نیز مطالعه کنید.
اگر این نوشته برایتان مفید بود لطفا کامنت بنویسید.