مهندس موفق الکترونیک

آموزش اتصال سروو موتور به STM32

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

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

تجهیزات مورد نیاز

  • بورد STM32F103C8 (معروف به بورد Blue pill)
  • سروو موتور (SG90)
  • 16×2 LCD
  • پتانسیومتر
  • برد بورد
  • سیم جامپر

نقشه مدار و اتصالات

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

جزئیات پایه‌های 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

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

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

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

اتصالات پتانسیومتر

همان طور که گفتیم، در این مدار از دو پتانسیومتر استفاده می‌کنیم.

  1. پتانسیومتری که در سمت راست مدار قرار دارد، برای تنظیم کنتراست LCD است. سه پایه‌ی این پتانسیومتر به این ترتیب هستند که پایه‌ی سمت چپ پایه‌ی ۵ ولت و پایه‌ی سمت راست Gnd است. پایه‌ی وسطی نیز به پین V0 از LCD متصل می‌شود.
  2. پتانسیومتر سمت چپی هم برای تغییر و کنترل زاویه‌ی شفت موتور استفاده می‌شود. پایه‌ی سمت چپ آن به یک ورودی ۳.۳ ولت، پایه‌ی سمت راست به Gnd و پایه‌ی وسطی هم به پین PA3 از میکروکنترلر وصل می‌شود.
مطلب پیشنهادی:  پروگرم کردن میکروکنترلر STM32F103C8 با استفاده از Keil uVision و STM32CubeMX

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

پروگرم کردن 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);

کد کامل و ویدئوی انجام مراحل پروژه را در این بخش می‌توانید ببینید.

مطلب پیشنهادی:  اتصال ماژول وای‌فای ESP8266 به STM32 (ایجاد یک وب‌سرور)

کد

//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
}

ویدئو

مطلب پیشنهادی:  آموزش ایجاد پروژه در Keil

امیدواریم آموزش «آموزش اتصال سروو موتور به STM32» برایتان مفید واقع شده باشد. در ادامه پیشنهاد می‌کنیم دیگر آموزش‌های STM32 را نیز مطالعه کنید.

اگر این نوشته‌ برایتان مفید بود لطفا کامنت بنویسید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *