استفاده از سروو موتور در پروژه های رباتیک برای کنترل دقیق متداول است. در این آموزش قصد داریم نحوه کنترل بی سیم سروو موتور به وسیله بلوتوث و آردوینو و دستگاه اندروی را آموزش دهیم.
لیست قطعات مورد نیاز برای کنترل سروو موتور با بلوتوث و آردوینو
آردوینو UNO : 1 عدد
ماژول بلوتوث HC-05 یا HC-06 :
1 عدد
سروو موتور :
1 عدد
اپلیکیشن Roboremo :
1 عدد
بربورد :
1 عدد
سیم :
1 عدد
ماژول بلوتوث HC-06 در دو حالت کار می کند :
- حالت دستوری
- حالت عملیاتی
در حالت دستوری امکان مدیریت تنظیمات بلوتوث مانند نام، رمز عبور و baud rate آن هستیم. حالت عملیاتی، حالتی است که می توانیم بین میکروکنترلر و ماژول بلوتوث ارسال و دریافت داده داشته باشیم. در این آموزش ما فقط با حالت عملیاتی کار خواهیم کرد و حالت دستوری را با تنظیمات پیش فرض در نظر می گیریم. نام پیش فرض HC-05 یا HC-06 و رمز عبور پیش فرض ماژول بلوتوث ۰۰۰۰ یا ۱۲۳۴ و baud rate پیش فرض ۹۶۰۰ است.
این ماژول با ولتاژ ۵ ولت کار می کند. از آنجا که پین سیگنال با ولتاژ ۳٫۳ ولت کار می کند، یک رگولاتور ۳٫۳ ولتی در خود ماژول وجود دارد؛ بنابراین نیازی نیست نگران آن باشیم. از شش پین ماژول ۴ پین در حالت عملیاتی استفاده می شوند. جدول اتصال پین ها در زیر آمده است :
ردیف | پین در HC-05/HC-06 | نام پین در MCU | شماره پین در PIC |
۱ | Vcc | Vdd | ۳۱st pin |
۲ | Vcc | Gnd | ۳۲nd pin |
۳ | Tx | RC6/Tx/CK | ۲۵th pin |
۴ | Rx | RC7/Rx/DT | ۲۶th pin |
۵ | State | NC | NC |
۶ | EN (Enable) | NC | NC |
اتصالات مدار کنترل سروو موتور با بلوتوث
- پایه GND سروو موتور را به پین GND آردوینو متصل کنید.
- پایه VCC سروو موتور را به پین ۵ ولت آردوینو متصل کنید.
- پایه CTRL سروو موتور را به پین دیجیتال ورودی/خروجی شماره ۹ آردوینو متصل کنید.
- پایه GND ماژول بلوتوث را به پین GND آردوینو متصل کنید.
- پایه VCC ماژول بلوتوث را به پین ۵ ولت آردوینو متصل کنید.
- پایه TXD ماژول بلوتوث را به پین شماره ۱۱ آردوینو متصل کنید.
- پایه RXD ماژول بلوتوث را به پین شماره ۱۰ آردوینو متصل کنید.
برنامه اندروید Roboremo برای کنترل سروو موتور
مرحله اول : نرم افزار Roboremo از گوگل پلی یا اینجا دانلود و روی تلفن همراه خود نصب کنید.نرم افزار را باز کرده و سپس روی دکمه Menu کلیک کنید.
مرحله دوم: روی دکمه connect کلیک کنید. در پنجره باز شده Bluetooth RFCOMM را کلیک کرده و سپس به ماژول بلوتوث HC-06 متصل شوید.
مرحله سوم : پس از اتصال ماژول HC-06 به نرم افزار وارد صفحه منو نرم افزار شده و روی گزینه edit ul ،برای ایجاد رابط کاربری طبق نیاز خودتان، کلیک کنید.
پس از کلیک روی گزینه edit url مجدد صفحه اول برنامه نمایش داده می شود. روی هر نقطه از صفحه که کلیک کنید یک منو مانند تصویر زیر باز می شود. برای نمونه Button را انتخاب کنید.
مرحله چهارم : پس از انتخاب button ، یک دکمه قابل مدیریت روی صفحه ظاهر می شود. می توانید این دکمه را تغییر اندازه داده یا در هر نقطه از صفحه که بخواهید بکشید و رها کنید. برای تنظیم مقداری که هنگام کلیک روی دکمه باید به ماژول ارسال شود روی گزینه set press action کلیک و مقدار دلخواه خود را وارد کنید کنید. برای نمونه ما مقدار ۱ را برای چرخش سروو موتور هنگام فشردن دکمه Start در نظر می گیریم.
مرحله پنجم : پس از ساخت دکمه های مورد نیاز در نهایت رابط کاربری مورد نیاز شما آماده می شود.
برنامه نویسی ماژول بلوتوث HC-06
در این قسمت توضیحات مختصری در خصوص کارکرد برنامه می دهیم. کد کامل برنامه در آخر آموزش درج شده است.
آردوینو کتابخانه کاملی برای کنترل سروو موتور دارد و تنها کافیست زاویه چرخش را با کمک تابع write اعلام کنیم تا سروو به اندازه زاویه اعلام شده چرخش کند.
1 | servo1.write(angle); |
کتابخانه ها مورد نیاز برنامه را include می کنید. کتابخانه SoftwareSerial برای تعریف پین های Rx و Tx به کار می رود.
1 2 | #include <SoftwareSerial.h> #include <Servo.h> |
در قطعه کد زیر پین های Rx و Tx و سایر متغیرها برای سروو و … را تعریف می کنیم :
1 2 3 4 5 6 7 | Servo myServo; int TxD = 11; int RxD = 10; int servoposition; int servopos; int new1; SoftwareSerial bluetooth(TxD, RxD); |
در تابع setup همه متغیر ها را برای حالت اولیه مقدار دهی می کنیم. سروو موتور را به پین شماره ۹ آردوینو متصل کرده ایم و درجه پیش فرض سروو را ۰ در نظر گرفته ایم. Baud rate سریال مانیتور و بلوتوث روی ۹۶۰۰ تنظیم شده اند.
1 2 3 4 5 6 7 | void setup() { int pos=0; myServo.attach(9); myServo.write(0); Serial.begin(9600); // start serial communication at 9600bps bluetooth.begin(9600); } |
در تابع loop ، آردوینو مقادیر ارسال شده از گوشی را دریافت و سروو را طبق آن مدیریت می کند. اگر مقدار دریافتی ۰ باشد سروو ۰ درجه می چرخد و به همین صورت این مقادیر برای ۴۵، ۹۰، ۱۳۵ و ۱۸۰ درجه نیز در نظر گرفته شده است.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | void loop() { if (bluetooth.available()){ String value = bluetooth.readString(); servoposition = value.toInt(); if (value.toInt() == 0){ Serial.println(servoposition); myServo.write(0); } if (value.toInt() == 45){ Serial.println(servoposition); myServo.write(45); } if (value.toInt() == 90){ Serial.println(servoposition); myServo.write(90); } if (value.toInt() == 135){ Serial.println(servoposition); myServo.write(135); } if (value.toInt() == 180){ Serial.println(servoposition); myServo.write(180); } |
با فشار دادن دکمه Start در نرم افزار و دریافت مقدار ۱، سروو موتور تا زمانی که دکمه Stop یا مقدار ۲ دریافت نشود خواهد چرخید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | while(value.toInt()==1){ if (bluetooth.available()) { value = bluetooth.readString(); Serial.println(value); if (value.toInt()==2) {Serial.println("YYY"); break; } } servopos++; delay(30); Serial.println(servopos); myServo.write(servopos); if (servopos ==180 ) {servopos=0;break;} } } } |
در این پروژه، سروو موتور را به کمک یک اپلیکیشن به نام Roboremo کنترل کردیم. در این برنامه ۵ دکمه ایجاد کردیم که مقادیر اختصاص داده شده به آنها به شرح جدول زیر است :
ردیف | نام دکمه | مقدار ارسالی | توضیحات |
۱٫ | Start | ۱ | شروع چرخش سروو از ۰⁰ به ۱۸۰⁰ |
۲٫ | Stop | ۲ | توقف چرخش سروو |
۳٫ | ۰⁰ | ۰ | چرخش سروو به ۰⁰ |
۴٫ | ۹۰⁰ | ۹۰ | چرخش سروو به ۹۰⁰ |
۵٫ | ۱۸۰⁰ | ۱۸۰ | چرخش سروو به ۱۸۰⁰ |
بنابراین با فشردن دکمه در رابط کاربری ساخته شده با نرم افزار Roboremo، داده در نظر گرفته شده توسط بلوتوث تلفن همراه به ماژول بلوتوث HC-06 ارسال خواهد شد. ماژول HC-06 دیتای را دریافت و آن را بخه آردوینو تحویل می دهد. آردوینو سروو را بر اساس مقدار درخواستی مدیریت می کند. در نظر داشته باشید که در اپلیکیشن Roboremo امکان تعریف تنها ۵ دکمه وجود دارد.
کد کامل برنامه کنترل سروو موتور با بلوتوث و آردوینو :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | #include <SoftwareSerial.h> #include <Servo.h> Servo myServo; int TxD = 11; int RxD = 10; int servoposition; int servopos; int new1; SoftwareSerial bluetooth(TxD, RxD); void setup() { int pos=0; myServo.attach(9); myServo.write(0); Serial.begin(9600); // start serial communication at 9600bps bluetooth.begin(9600); } void loop() { if (bluetooth.available()) { String value = bluetooth.readString(); servoposition = value.toInt(); if (value.toInt() == 0) { Serial.println(servoposition); myServo.write(0); } if (value.toInt() == 45) { Serial.println(servoposition); myServo.write(45); } if (value.toInt() == 90) { Serial.println(servoposition); myServo.write(90); } if (value.toInt() == 135) { Serial.println(servoposition); myServo.write(135); } if (value.toInt() == 180) { Serial.println(servoposition); myServo.write(180); } while(value.toInt()==1){ if (bluetooth.available()) { value = bluetooth.readString(); Serial.println(value); if (value.toInt()==2) {Serial.println("YYY"); break; } } servopos++; delay(30); Serial.println(servopos); myServo.write(servopos); if (servopos ==180 ) {servopos=0;break;} } } } |