سرو موتور Servo motor یک قطعه مکانیکی است که قابلیت چرخش در زوایای مختلف بسته به نوع سرو موتور دارد. این زاویه بین ۰ تا ۳۶۰ درجه در مدل های مختلف متفاوت است. جهت تشخیص زاویه سرو موتور کافیست شافت را تغییر دهید تا زاویه مشخص شود. در این آموزش توسط یک پتانسیومتر سرو موتور را در زاویه مشخصی قرار داده و سپس مقدار زاویه را در نمایشگر OLED نمایش میدهیم. در ادامه با مرجع تخصصی آردوینو به زبان فارسی، دیجی اسپارک همراه باشید.
سرو موتور Servo motor
توسط شافت سرو موتور میتوانید وسیله های مختلفی را در زاویه مورد نظر قرار دهید. انتخاب نوع سرو موتور بسته به ایده ای که دارید، کاملا متفاوت خواهد بود. سرو موتورها در نوع ظاهر، ابعاد، زاویه چرخش و ولتاژ کاری و جریان مورد نیاز بسیار متفاوت هستند. سرو موتورهای ۱۸۰ درجه زاویه پذیر هستند و امکان تعیین زاویه مشخص بین ۰ تا ۱۸۰ برای سرو موتور فراهم است. سرو موتورها همگی دارای ۳ پایه هستند. سیم نارنجی، سیم قرمز و در نهایت سیم قهوه ای:
- سیم نارنجی: پایه سیگنال PWM است که به پایه های PWM برد های آردوینو و ESP8266 متصل میشود.
- سیم قرمز: پایه VCC پایه تغذیه است و به ۵ ولت متصل میشود. بسته به نوع انتخاب سرو موتور ولتاژ کاری متفاوت است.
- سیم قهوه ای: پایه GND است و به پایه GND برد آردوینو و ESP8266 متصل میشود.
با اعمال ولتاژ ۵ ولت و GND به سرو موتور، میتوان سرو موتور را با سیگنال PWM کنترل کرد. زاویه سرو موتور توسط سیگنال PWM مشخص میشود.
- (Period of PWM (PERIOD = مدت دوره PWM
- (Minimum width of PWM (WIDTH_MAX = حد بالای PWM
- (Maximum width of PWM (WIDTH_MIN = حد پایین PWM
پایه PWM بردهای میکروکنترلر
اکثر بردهای میکروکنترلر مانند آردوینو Arduino، برد ESP8266 از پایه های PWM پشتیبانی میکنند و امکان تولید پهنای باند PWM برای سرو موتور ها از طریق پایه های PWM فراهم است. بردهای آردوینو مانند Arduino UNO، Arduino Mega2560، Arduino NANO و بردهای ESP8266 مانند Nodemcu، Wemos d1 mini با سرو موتورها سازگاری داشته و توسط پایه های PWM قابلیت تست و راه اندازی دارد. توسط جدول زیر با توجه به نوع برد مورد استفاده پایه های PWM را تشخیص داده و سرو موتور را فقط به پایه PWM اتصال دهید.
اتصالات سرو موتور به آردوینو
در این پروژه به دلخوه از آردوینو Arduino UNO استفاده شده است. با توجه به اینکه سرو موتور از طریق پایه های PWM دیتا ارسال میکند بایستی از پایه های PWM در برد آردوینو UNO استفاده کرد. پایه PWM در برد آردوینو UNO به ترتیب ۳/۵/۶/۹/۱۰/۱۱ است که در کد برنامه آردوینو از پایه شماره ۹ استفاده شده است. دو پایه دیگر VCC و GND به تغذیه متصل میشود.
نکته مهم: با توجه به اینکه سرو موتور نیاز به جریان کافی در مدار دارد در اثر اتصال سرو موتور Servo motor به صورت مستقیم به پایه ۵ ولت آردوینو با نویز در مدار رو به رو خواهید شد. جهت برطرف شدن این مشکل کافیست از یک تغذیه جداگانه برای سرو موتور استفاده کنید.
نمایشگر OLED به دلیل پشتیبانی از پروتکل I2C ارتباط دو سیمه داشته و فقط کافیست از رابط I2C و پایه هایی که در برد آردوینو از I2C پشتیبانی میکند، استفاده کنید. در برد آردوینو UNO، NANO پایه های I2C به ترتیب SDA = A4 و پایه SCL = A5 آنالوگ آردوینو میباشد. دو پایه دیگر به ترتیب به ۵ ولت یا ۳٫۳ ولت و GND آردوینو متصل میشود.
در این آموزش برای انتخاب زاویه از ولوم پتانسیومتر استفاده شده است. پتانسیومتر همانند مقاومت متغیر عمل میکند. پتانسیومتر یک نوع مقاومت متغیر قابل تنظیم است و مقدار مقاومت با چرخش شافت پتانسیومتر در جهت ساعتگرد و پادساعتگرد تغییر میکند. پتانسیومتر از سه پایه VCC GND OUT تشکیل شده است. از قابلیت های خاص آن میتوان به انتخاب دلخواه افزایش و کاهش مقاومت اشاره کرد. به این صورت که اگر پایه سمت راست را به عنوان ۵ ولت در نظر بگیرید با چرخش در جهت ساعتگرد و راست مقاومت افزایش پیدا میکند و بالعکس. پایه وسط پایه مقاومت متغیر است و برای اتصال به بردهای میکروکنترلر مانند Arduino, Nodemcu , Wemos d1 mini از پایه های ADC آنالوگ Analog استفاده میکند. در این آموزش با چرخش شافت پتانسیومتر در جهت پادساعتگرد و ساعتگرد زاویه سرو موتور از ۰ تا ۱۸۰ درجه تغییر میکند.
نمایشگر LCD
LCD کاراکتری ۱۶X۲ یکی از پایهای ترین نمایشگرهای الکترونیکی میباشد. ال سی دی کارکتری در بسیاری از مدارها کاربرد دارد. یکی از دلایل پر مصرف بودن این مدل ال سی دی در مقابل نمایشگرهایی همچون سون سگمنت، عدم محدودیت در نمایش کاراکترها میباشد. همچنین توانایی ساختن کارکترهای دلخواه را دارند. آموزش کار با ال سی دی کاراکتری در قبلا در سایت منتشر شده است و کافیست طبق آموزش مراحل نصب کتابخانه LiquidCrystal را انجام داده و طبق جدول زیر اتصالات مربوط به ال سی دی را انجام دهید. آموزش راه اندازی LCD 16X2
کتابخانه LiquidCrystal به صورت زیر است. از همان مسیر Arduino / Tools / Library آن را نصب کنید.
روش اتصال ال سی دی به آردینو به صورت زیر است. نوع آردوینو مورد استفاده مهم نیست و تنها بایستی طبق جدول پیش روید.
اتصال سرو موتور و ولوم ۱۰ کیلو طبق جدول زیر است.
کد آردوینو نمایش زاویه سرو موتور
برای اجرای این پروژه از آردوینو نانو استفاده شده است. نرم افزار آردوینو را باز کرده و یک تب جدید ایجاد کنید. سپس کد را کپی و به نرم افزار انتقال دهید. کد زیر را کپی و به نرم افزار آردوینو Arduino انتقال دهید. جهت آپلود برنامه در ابتدا بر روی Verify کلیک کنید تا از نصب کتابخانه و انتقال صحیح کدها اطمینان کسب کنید. سپس برنامه را آپلود کنید.
#include <LiquidCrystal.h> #include <Servo.h> #include <SPI.h> #include <Wire.h> Servo myServo; LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // پایه آردینو متصل به ال سی دی void setup() { Serial.begin(9600); myServo.attach(9); lcd.begin(16, 2); // نوع ال سی دی ۱۶ در ۲ است. } void loop() { int analogValue = analogRead(A0); int angle = map(analogValue, 0, 1023, 0, 180); myServo.write(angle); lcd.clear(); lcd.setCursor(0,0); lcd.print("Angle"); lcd.setCursor(0,10); lcd.print(angle); Serial.print("Analog: "); Serial.print(analogValue); Serial.print(", Angle: "); Serial.println(angle); lcd.setCursor(8,0); lcd.print("Analog"); lcd.setCursor(10,60); lcd.print(analogValue); delay(500 ); }
در این مرحله توسط کلیدهای میانبر کد را Verify و سپس Upload کنید.
تحلیل کد آردوینو
در مرحله اول جهت اجرای برنامه به کتابخانه سرو موتور Servo motor و کتابخانه LCD LiquidCrystal داریم که به صورت زیر در برنامه فراخوانی میشود.
#include <LiquidCrystal.h> #include <Servo.h> #include <SPI.h> #include <Wire.h>
سپس از تابع ثابت برای مشخص کردن توابع ال سی دی و توابع مربوط به سرو موتور استفاده میکنیم. همچنین توابع فراخوانی هر دو کتابخانه قبل از void setup نوشته میشود:
Servo myServo; LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // پایه آردینو متصل به ال سی دی void setup() { Serial.begin(9600); myServo.attach(9); lcd.begin(16, 2); // نوع ال سی دی ۱۶ در ۲ است. }
نمایش محتوا در ال سی دی LCD : برای اینکار کافیست از دستورات زیر استفاده کنیم و سپس با انتخاب مکان نمای مناسب برای نمایش محتوا متن را وارد میکنیم:
#include <LiquidCrystal.h> #include <Servo.h> #include <SPI.h> #include <Wire.h> Servo myServo; LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // پایه آردینو متصل به ال سی دی void setup() { Serial.begin(9600); myServo.attach(9); lcd.begin(16, 2); // نوع ال سی دی ۱۶ در ۲ است. } void loop() { int analogValue = analogRead(A0); int angle = map(analogValue, 0, 1023, 0, 180); myServo.write(angle); lcd.clear(); lcd.setCursor(0,0); lcd.print("Angle"); lcd.setCursor(0,10); lcd.print(angle); Serial.print("Analog: "); Serial.print(analogValue); Serial.print(", Angle: "); Serial.println(angle); lcd.setCursor(8,0); lcd.print("Analog"); lcd.setCursor(10,60); lcd.print(analogValue); delay(500 ); }
استفاده از تابع MAP ریاضی
توسط تابع map یک مقدار دلخواه از یک بازه به بازه دیگر نگاشت میشود. از این تابع برای اعمال زاویه به سرو موتور استفاده شده است. فرمول تایع map به صورت زیر است:
map(value, fromLow, fromHigh, toLow, toHigh)
که به ترتیب به صورت زیر است:
- From low: حد پایین رنج فعلی
- From high: حد بالا رنج فعلی
- To low: حد پایین رنج جدید
- To high: حد بالا رنج جدید
در این برنامه حد بالا برای پتانسیومتر ۱۰۲۳ و حد پایین ۰ است. برای سرو موتور حد بالا ۱۸۰ و حد پایین ۰ است. در کد آردوینو پس از دریافت و خواندن دیتا از پایه ADC توسط پتانسیومتر ولتاژی که در پایه آنالوگ آردوینو نمایش داده شده است توسط تابع ADC دریافت شده و به صورت عدد در خروجی نمایش داده میشود. در این بخش میخواهیم با چرخش شافت پتاسیومتر و تغییر مقدار ADC از ۰ به ۱۰۲۳ زاویه سرو موتور بین ۰ درجه تا ۱۸۰ درجه تغییر کند. برای این روش از تایع map نگاشت استفاده میکنیم. به این صورت ورودی بر روی خروجی نگاشت شده و دیتا به صورت Analogvalue برای ما نمایش دادهه میشود:
int analogValue = analogRead(A0); int angle = map(analogValue, 0, 1023, 0, 180); myServo.write(angle);
همچنین جهت نمایش دیتا در سریال مانیتور از ابتدا باد ریت را مشخص کرده و سپس توابع زیر را در حلقه فراخوانی کنید:
Serial.print("Analog: "); Serial.print(analogValue); Serial.print(", Angle: "); Serial.println(angle);
بخش دوم نمایش زاویه روی OLED
محبوب ترین ماژول OLED که در حال حاضر در صنعت الکترونیک و بردهای توسعه میکروکنترلر استفاده میشود، نمایشگر OLED با درایور قدرتمند SSD1306 است که در ظاهرهای مختلف به بازار ارائه شده است. چیپ SSD1306 یک کنترل کننده درایور قدرتمند CMOS است. این درایور از پروتکل های ارتباطی I2C و SPI پشتیبانی میکند و با توجه به اینکه در پروتکل I2C تنها با دو پایه برای اتصال نیاز دارد، برای اتصال OLED به میکروکنترلرها از این پروتکل بیشتر استفاده خواهیم کرد. ولتاژ کاری نمایشگر ۳٫۳ و ۵ ولت است و از هر دو پایه های تعذیه میکروکنترلر میتوانید استفاده کنید. زاویه دید نمایشگر ۱۶۰ درجه است و ابعاد آن ۰٫۹۶ اینچ است. نمایشگر دارای ۸ سطر و ۱۲۸ ستون است. با توجه به اینکه پروتکل ارتباطی نمایشگر ماژول OLED به صورت I2C است، با تمامی میکروکنترلرهایی که از پروتکل I2C پشتیبانی میکنند قابل تست و راه اندازی است و بدون نگرانی با نصب کتابخانه های مرتبط میتوانید ماژول نمایشگر را راه اندازی و استفاده کنید. در آموزش معرفی نمایشگر OLED به معرفی پایه ها، روش نصب کتابخانه، روش اتصال OLED به انواع میکروکنترلرها پرداخته شده است و کافیست طبق آموزش مراحل را یاد گرفته و سپس ادامه این آمورش را انجام دهید. آموزش راه اندازی ماژول OLED با بردهای آردوینو درایور SSD1306 و رفع مشکلات
در این آموزش برای نمایش زوایه سرو موتور Servo motor از نمایشگر OLED استفاده شده است. این نمایشگر به دلیل پشتیبانی از پروتکل I2C ارتباط دو سیمه داشته و اتصالات را بسیار کاهش داده است. با توجه به اینکه نمایشگر OLED دارای ۸ سطر و ۱۲۸ ستون است به راحتی با انتخاب مکان نمای مناسب میتوانید دیتای مورد نظر را در OLED جایگذاری کرده و نمایش دهید. تمامی این دستورات در کتابخانه OLED آموزش داده شده است و در آموزش لینک شده نحوه ی نمایش دیتا به روش های گوناگون یاد داده شده است.
اتصالات OLED , Servo
برای سهولت در اتصالات با توجه به اینکه به چندین پایه VCC و GND نیاز است، میتوانید از شیلد پروتوتایپ آردوینو Arduino UNO و یا برد بورد استفاده کنید. تمامی برد بوردها دارای نوار + – است و میتوانید از چندین پایه اشتراک گرفته و به پایه ۵ ولت برد آردوینو اتصال دهید. در جدول زیر اتصالات نوشته شده است:
کد آردوینو زاویه سرو موتور
نرم افزار آردوینو را باز کرده و کد را از طریق کلیدهای میانبر کپی و در یک تب جدید کپی کنید.
محدودیت در دسترسی کامل به این مجموعه آموزش
دسترسی کامل به آموزش برای اعضای دیجی اسپارک امکان پذیر است. بخش اصلی آموزش شامل سورس کدهای توسعه داده شده توسط مهندسهای دیجی اسپارک است. به همین دلیل این آموزش خاص و یکتاست. برای استفاده از آن بایستی عضویت تهیه کنید. تبادل نظر با کاربران و پرسش سوال رایگان است و میتوانید از بخش نظرات همین آموزش اقدام کنید. |
تحلیل کد آردوینو
در ادامه به معرفی تمامی توابع Servo، توابع OLED و دستورات برنامه نویسی ریاضی جهت خواندن دیتا و نمایش در OLED میپردازیم:
فراخوانی کتابخانه Library
در این کد از دو کتابخانه سرو موتور servo motor و کتابخانه OLED و یا همان Adafruit SSD1306 استفاده شده است. کتابخانه سرو موتور به صورت پیش فرض در لیست کتابخانه های نرم افزار آردوینو Arduino قرار دارد و تنها کافیست در کدها فراخوانی شود. جهت نصب کتابخانه Adafruit SSD1306 و کتابخانه Adafruit_GFX از مسیر زیر کتابخانه را فیلتر و سپس install کنید.
Arduino/Tools/ Maneg Librraies
سپس در صفحه باز شده کتابخانه Adafruit SSD1306 را جست و جو و نصب کنید:
پس از نصب کتابخانه به صورت زیر در برنامه فراخوانی کنید.
محدودیت در دسترسی کامل به این مجموعه آموزش
دسترسی کامل به آموزش برای اعضای دیجی اسپارک امکان پذیر است. بخش اصلی آموزش شامل سورس کدهای توسعه داده شده توسط مهندسهای دیجی اسپارک است. به همین دلیل این آموزش خاص و یکتاست. برای استفاده از آن بایستی عضویت تهیه کنید. تبادل نظر با کاربران و پرسش سوال رایگان است و میتوانید از بخش نظرات همین آموزش اقدام کنید. |
جمع بندی لیدی پای
کار با سرو موتورها در ابتدا ساده به نظر میرسد اما برای اختصاص زاویه مورد نظر و قرار گرفتن شافت در محل بایستی کدنویسی دقیقی داشته باشید. استفاده از توابع ریاضی در کدنویسی علاوه بر افزایش دقت و کدنویسی اصولی با دنیای متفاوتی از برنامه نویسی آشنا خواهید شد. دقت داشته باشید این برنامه فقط با سرو موتورهای ۱۸۰ درجه قابل اجرا است و سرو موتورهای ۳۶۰ درجه زاویه پذیر نیستند. با کمی خلاقیت در کدنویسی از این برنامه میتوانید در ربات mearm ایده پردازی کرده و توسط جوی استیک راه اندازی کنید. همانطور که اعلام شد پیشنهاد میشود در صورت استفاده مداوم تغذیه سرو موتور به صورت جداگانه اعمال شود تا از نویز پذیری در حرکت شافت سرو موتور کاسته شود.
وسایل مورد نیاز
نمایشگر OLED با درایور SSD1306
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.
سلام
چقدر وقت بود دنبال این آموزش بودم برای کیت ربات mearm خیلی ممنونم و آروزی موفقیت دارم
با سلام
بله این کد برای راه اندازی mearm بسیار کاربردی است.
سلام و وقت به خیر. با سپاس از مطالب اموزنده ای که منتشر می فرمایید. در مطلب مربوط به سرو موتور بجای Angle – زاویه – به عمد از واژه Angel – فرشته – استفاده شده است؟ هم در کد دستوری و هم در نمایشگر. ضمن این که میزان کاراکتر OLED نیز ۸*۱۲۸ قید شده است و در جایی دیگر ۸*۲۸٫ سوالی دیگر هم داشتم که ایا در بخش نمایش انالوگ میزان اهم پتانسیومتر نمایش داده می شود یا چیز دیگری است. با سپاس.
با سلام
ممنون از اطلاع رسانی شما دو کلمه به این صورت نوشته شده بود که اصلاح شد.
در خصوص OLED هم عدد ۱ جا مانده بود که اصلاح شد.
خیر میزان اهم نیست، پتانسیومتر ADC را نمایش میدهد.
با سلام خدمت شما
من مهندسی برق قدرت خوندم،و خیلی علاقمند به برنامه نویسی AVR,ARM هستم و مطالب شما بسیارشیوا وعالی بود،میخواستم بدونم اگر بخوام شروع کنم از صفر وبصورت کامل به یادگیری برنامه نویسی،میتونین کتابهایی رو معرفی کنین تا من شروع کنم به یادگیری
سپاسگزارم
با سلام
ضمن تشکر از شما کتابی برای یادگیری آردوینو نمیشناسم و در حال حاضر کتاب کاملی برای آن وجود ندارد. سریع ترین روش یادگیری به صورت آنلاین است. در هر آموزش کدهای برنامه تحلیل شده است و کافیست با نویسنده پیش رفته و سوالات را در بخش دیدگاه ها بپرسید.
با سلام و خسته نباشد
میشه به جا سروmg90 ازsg90 استفده کرد؟
با سلام
بله تفاوتی ندارد.
سلام ببخشید برا اردوینو uno هم این کد رو میشه اپلود کرد؟
با سلام
بله تفاوتی ندارد.
سلام وقتتون بخیر
میخواستم بدونم چطوری باید یه شیلد ECG/EMG رو به یه UNO R3 و یه شیلد درایور موتور L293D متصل کنم ؟
چون فقط میشه یکی از شیلد ECG/EMG یا شیلد درایور موتور L293D به UNO R3 متصل کنم… سیم کشی کنم یا میتونم با ای
ممنون میشم راهنماییم کنید.
با سلام
هر دو با هم امکان پذیر نیست.