بشر روز به روز خلاق تر اما تنبل تر میشود. با پیشرفت تکنولوژی شاید گاهی با خود فکر کنید اگر رباتی وجود داشته باشد که اجسام را برای شما جابه جا کنه وجسم را به مقصد مورد نظرتون ببرد ایده جذابی باشه و کمکی زیادی به شما کنه. در این اموزش قصد دارم نحوه ساخت این ربات را به کمک میکروکنتلر اردوینو به شما اموزش دهم. آموزش ماشین کنترلی بلوتوثی شامل سه مرحله است. ساخت سازه و مکانیک آن، مدارات و سیم کشی آن به اردوینو و برنامه نویسی. جنس بدنه مورد استفاده شده در این سازه فوم برد است. و شما میتوانید با دیدن ویدیویی که توسط اقای اویسی تهیه شده قطعات استفاده شده و اتصالات آنهارا مشاهده کنید. اندازه ها کاملا دلخواه هست و شما میتوانید سازه مورد نظر را کوچک یا بزرگ بسازید. در ادامه با مرجع تخصصی اردوینو به زبان فارسی، دیجی اسپارک همراه باشید. در ابتدا از مهندسان آینده کشور قدر تشکر دارم که باعث شدند , ساخت این سازه را به صورت تیمی به پایان برسانیم.
راهاندازی DC موتور
برای راه اندازی موتور های جریان مستقیم (DC) میتوانید از درایورهای گوناگونی استفاده کنید. درایورها برای ما راه اندازی این موتورها را آسانتر میکنند. طوری که شما میتوانید جهت و سرعت این نوع موتورها را مطابق با نیاز خود تغییر دهید. درایوری که ما در این آموزش استفاده میکنیم, ماژول l298 است. ولتاژ کاری این ماژول برای عملگرها میتوان تا ۴۶ ولت داد و مقدار جریانی که میتوانیم از این ماژول به دست آوریم ۰٫۶ آمپر است. و این اعداد برای راه اندازی موتور های DC کافی هست. البته بستگی به نوع موتوری که شما استفاده میکنید دارد. موتور های جریان مستقیم مختلفی برای حرکت کردن این ربات وجود دارد. مانند۵۰۰rpm ، ۱۰۰rpm ۲۵۰rpm و… که شما میتوانید با توجه به نیازی که دارید (موتور سرعتی یا قدرتی) را تهیه کنید. موتور پیشنهادی برای ساخت این ربات، همان موتور زرد های معمولی تک شفت هستند.
اطلاعات ماژول L298
در پروژه ساخت ماشین کنترلی بلوتوثی از درایور L298 استفاده میکنیم. به طوری که هر کدام از پایه های enable مربوط به یک موتور یا موتور های یک سمت است. البته منظور از جملات بالا که مربوط به موتور های یک سمت هست , میباست همان طور که گفته شد موتور مناسبی انتخاب کنید که این ماژول توانایی راه اندازی آن هارا داشته باشد. با توجه به اعداد ارقام گفته شده در بخش اطلاعات ماژول. همچنین تعداد موتور محدودیت آمپر ایجاد میکنه در نتیجه تعداد موتوری هم که استفاده میکنید توجه کنید. البته همان طور که مشاهده کردید ما در این پروژه از ۴ موتور DC استفاده کردیم.
Inputs : این پایه ها که از ۱ تا ۴ هست , برای تغییر جهت چرخش موتور هست. این پایه ها به گونی است که : ورودی های ۱و۲ مربوط به یک موتور یا موتور های یک سمت هست و ورودی های ۳و۴ هم به این حالت هست. که در این پروژه از ورودی های ۱و۲ برای تغییر جهت موتور های سمت چپ و از ورودی های ۳و۴ برای تغییر جهت دو موتور سمت راست سازه استفاده کردیم.
۱Enableو۲ : این دو پایه برای کنترل سرعت ربات هستند که به صورت آنالوگ از ۰ تا ۲۵۵ درجه بندی میشه و سرعت موتور شما را تعیین میکنه.
VS : این پایه مربوط به ولتاژ کاری موتور ها هستش, که بستگی به موتوری که شما استفاده میکنید دارد. به عنوان مثال موتوری که بنده استفاده کردم ۱۲ ولتی بوده و درنتیجه به این پایه ۱۲ ولت میدهیم.
اتصالات ماژول L298
در این قسمت enable همان EN و input همان IN نوشته بر روی ماژول است.
- پایه enable1 به پایه شماره ۳ اردوینو متصل میشود.
- پایه enable2 به پایه شماره ۵ اردوینو متصل میشود.
- پایه input1 به پایه شماره ۲ اردوینو متصل میشود.
- پایه input2 به پایه شماره ۴ اردوینو متصل میشود.
- پایه input3 به پایه شماره ۶ اردوینو متصل میشود.
- پایه input4 به پایه شماره ۷ اردوینو متصل میشود.
- پایه GND به پایه GND اردوینو متصل میشود.
- پایه +۱۲ به سرمثبت باطری ۱۲ ولتی باتری مورد نظر خود متصل کنید.
اطلاعات ماژول بلوتوث
پروتکل این ماژول uart هست. ولتاژ کاری این ماژول ۳٫۳ ولت هست اما با وجود رگولاتور به کار رفته داخل ماژول شما میتوانید به ۵ ولت اردوینو هم متصل کنید. اگر قصد تغییر نام ماژول و یا رمز آن را دارید, میتوانید در آموزش این کار را نیز انجام دهید.
- پایه RX : دریافت کننده اطلاعات
- پایه TX :فرستنده اطلاعات
اتصالات ماژول بلوتوث
توجه داشته باشید در این پروژه ما از TX و RX مجازی استفاده کردیم. همچنین پایه RX ماژول بلوتوس را میتوانید به هیچ پایه ای از اردویینو متصل نکنید زیرا این پایه مربوط به فرستنده این ماژول هست و اگر هم متصل نباشه مشکلی پیش نمیاد.
- پایه TX به پایه شماره ۸ اردوینو متصل میشود.
- پایه RX به پایه شماره ۱۳ اردوینو متصل میشود.
- پایه GND به پایه شماره GND اردوینو متصل میشود.
- پایه +۵v به پایه شماره +۵v اردوینو متصل میشود.
اطلاعات سروو موتور
یکی از خصوصیات سروو موتورها که که خود را از بقیه موتور ها متمایز کرده این است که این خانواده از موتور ها درجه بندی شده اند . به طوری که شما میتوانید این موتور را از ۰ تا ۱۸۰ درجه بچرخانید. البته در بعضی از انواع آن از ۰ تا ۳۶۰ درجه هم درجه بندی شده. در این پروژه نیازربات تا ۱۸۰ درجه هستش.
اتصالات سروو موتور
سروو موتورها دارای ۳ سیم هستند که عبارتند از تیره ترین سیم مربوط به GND، سرخ ترین سیم مربوط به VCC و سیم اخر که اغلب زرد یا سبز هست مربوط به کنترل موتور هست که این سیم را به پایه دیجیتال میکرو مورد نظر یعنی اردویینو میدهیم. ما در این برنامه سه سروو برای گیریپر مورد نظر داریم. سروو موتوری هایی که به پایه های ۱۱ و ۹ اردویینو متصل شدن مربوط به گیریپر ربات میباشد که به صورت افقی باز بسته میشوند. و سروو موتوری که به پایه ۱۰ آردویینو متصل شده مربوط به جا به جایی عمودی گریپر میباشد به طوری جسم مورد نظر را به بالا یا پایین جا به جا میکنید.
نکاتی در مورد کدهای پروژه
همان طور که مشاهده میکنید این برنامه از سه تابع مختلف تشکیل شده هستش که عبارتند از:
Print : با فعال کردن این تابع شما میتوانید متوجه شوید که ارتباط گوشی با ماژول بلوتوس برقرار است یا خیر , و پیام هایی که شما به این ماژول میدهید بر روی پنجره سریال مانیتور آردویینو به شما نمایش میدهد. برای فعال کردن پنجره سریال پرینت اردووینو : control+shift+m
motor : با فعال کردن این تابع شما میتوانید از درستی کارکرد موتور های خود تست بگیرید. به طوری که از سرعت و درستی جهت چرخش موتورها با خبر شید. این تابع به گونه ایست که حداکثریت سرعت حرکت عقب و جلوربات بین بازده ۰ تا ۱۰۰ هستش. به طوری که با قرار دادن عدد ۱۰۰ داخل پرانتز ربات با حداکثریت مشخص شده به جلو حرکت میکند با قرار دادن عدد ۱۰۰- داخل پرانتز ربات با تمام سرعت مشخص شده به عقب حرکت میکند.
نکته : در هنگام سریال پرینت بادرید باید بر روی عدد ۹۶۰۰ نیز باشد.
منظور از سرعت مشخص شده چیست؟
همان طور که مستحضر هستید در توابع motorl و motorr طوری کدها نوشته شده شما بتوانید در دستور مپ محدودیتی برای سرعت موتور مشخص کنید که بنده در این برنامه به صورت پیش فرض حداکثریت سرعت را تا عدد ۲۰۰ قرار دادم که شما میتوانید این عدد را از ۰ تا ۲۵۵ نیز تغییر دهید.
Bluetooth : این تابع, تابع اصلی برنامه هستش که به صورت پیش فرض این تابع اجرا میشود. تابع به گونه است که شما با فرستادن برخی از حروف انگلیسی میتوانید ربات را کنترل کنید:
- تازمانی که حرف “a” را به ماژول میفرستید , ربات به جلو حرکت میکند و به محظه این که دستتان را از دکمه بردارید ربات متوقف میشود.
- تازمانی که حرف “b” را به ماژول میفرستید , ربات به سمت راست حرکت میکند و به محظه این که دستتان را از دکمه بردارید ربات متوقف میشود.
- تازمانی که حرف “c” را به ماژول میفرستید , ربات به عقب حرکت میکند و به محظه این که دستتان را از دکمه بردارید ربات متوقف میشود.
- تازمانی که حرف “d” را به ماژول میفرستید , ربات به سمت چپ حرکت میکند و به محظه این که دستتان را از دکمه بردارید ربات متوقف میشود.
در ادامه برنامه کنترل سه سروو موتور را کدنویسی کردیم ولتاژ کاری ربات، به طوری که:
- شما هربار با فرستادن حرف “e” بازو ربات به صورت عمودی به سمت پایین حرکت میدهید.
- همچنین شما هربار با فرستادن حرف “f” بازو ربات به صورت عمودی به سمت پایین حرکت میدهید.
- علاوه بر این شما هربار با فرستادن حرف “g” بازو ربات به صورت افقی میبندید.
- و در آخر شما هربار با فرستادن حرف “h” بازو ربات به افقی باز میکنید.
نکته بسیار بسیار مهم : اگر در این پروژه مواجه شدید که ولتاژ کاری ربات کافی نیست و خرجی لازم رو از ربات مورد نظر نمیگیرید , در تغذیه اردویینو علاوه براینکه باطری ۹ ولت به جک متصل هست پاور بانک یا منبع تغذیه هم به قسمت کابل آردویینو متصل کنید.
در صورت ارتباط بین گوشی و ماژول بلوتوس میتوانید از اپلیکیشن : Arduinio RC استفاده کنید. در ادامه ویدیو آموزش اتصال ماژول بلوتوس به دستگاه شما را نیز قرار داده ایم. در طراحی و ساخت پروژه ماشین کنترلی بلوتوثی آقایان مسعود اطلس باف , محمد مهدی اویسی و آرمان حاجی علینقی به عنوان هم تیمی زحمت کشیدند.
کد پروژه ماشین کنترلی بلوتوثی
کدهای زیر را در نرم اقزار آردوینو IDE وارد کرده و پس از کامپایل کردن، اقدام به آپلود روی برد آردوینو کنید. اگر راجع به این مراحل سوالی دارید و یا ابهامی وجود دارد، از بخش نظرات همین آموزش میتوانید پیگیری کنید.
#include<SoftwareSerial.h>; SoftwareSerial bluetooth(8, 13); //TX,RX //***********************SERVO #include<Servo.h>; Servo myservo; Servo servoH; Servo servoh; int degree; int degry; int degryy; //************************Motor Left int enable1 = 3; int input1 = 2; int input2 = 4; //************************Motor Right int enable2 = 5; int input3 = 6; int input4 = 7; void setup() { //********************************Motor Left pinMode(enable1, OUTPUT); pinMode(input1, OUTPUT); pinMode(input2, OUTPUT); //*****************************Motor Right pinMode(enable2, OUTPUT); pinMode(input3, OUTPUT); pinMode(input4, OUTPUT); //***********************************SERVO myservo.attach(10); servoH.attach(11); servoh.attach(9); Serial.begin(9600); bluetooth.begin(38400); //******************************** setup servo myservo.write(100); delay(500); myservo.write(30); delay(200); servoH.write(180); delay(300); servoH.write(50); servoh.write(180); delay(300); servoh.write(50); } void loop() { // Print(); // motor(); Bluetooth(); degree = myservo.read(); degry = servoH.read(); degryy = servoh.read(); } void Print() { if (bluetooth.available()) { char shazam = (char)bluetooth.read(); Serial.println(shazam); } } void motor() { motorl(100); motorr(-100); } void Bluetooth() { if (bluetooth.available()) { char shazam = (char)bluetooth.read(); if (shazam == 'a') { motorl(100); motorr(100); delay(85); motorl(0); motorr(0); } if (shazam == 'b') { motorl(-100); motorr(100); delay(85); motorl(0); motorr(0); } if (shazam == 'c') { motorl(-100); motorr(-100); delay(85); motorl(0); motorr(0); } if (shazam == 'd') { motorl(100); motorr(-100); delay(85); motorl(0); motorr(0); } if (shazam == 'e') { degree = degree - 10; myservo.write(degree); } if (shazam == 'f') { degree = degree + 10; myservo.write(degree); } if (shazam == 'g') { degry = degry - 10; servoH.write(degry); degryy = degryy - 10; servoh.write(degryy); } if (shazam == 'h') { degry = degry + 10; servoH.write(degry); degryy = degryy + 10; servoh.write(degryy); } } } void motorl(int Speed) { if (Speed >= 0) { Speed = map(Speed, 0, 100, 0, 200); analogWrite(enable1, Speed); digitalWrite(input1, LOW); digitalWrite(input2, HIGH); } else if (Speed < 0) { Speed *= -1; Speed = map(Speed, 0, 100, 0, 200); analogWrite(enable1, Speed); digitalWrite(input1, HIGH); digitalWrite(input2, LOW); } } void motorr(int Speed) { if (Speed >= 0) { Speed = map(Speed, 0, 100, 0, 200); analogWrite(enable2, Speed); digitalWrite(input3, LOW); digitalWrite(input4, HIGH); } else if (Speed < 0) { Speed *= -1; Speed = map(Speed, 0, 100, 0, 200); analogWrite(enable2, Speed); digitalWrite(input3, HIGH); digitalWrite(input4, LOW); } }
آموزش تصویری راهاندازی پروژه
وسایل مورد نیاز
جمع بندی
با استفاده از پروژه ماشین کنترلی بلوتوثی شما میتوانید اجسام را به صورت بلوتوثی جا به جا کرده و ربات را کنترل کنید. در این پروژه با استفاده از فوم برد، بدنه و بازو ربات را ساخته و همچنین با استفاده از نرم افزار Arduino ide و برد آردوینو دستورات ربات برنامه نویسی کردیم. امیدوارم از خواندن این آموزش لذت برده باشید. در صورت ایجاد هرگونه سوال ، در بخش دیدگاه های همین آموزش سوال خود را مطرح و در سریع ترین زمان پاسخ خود را دریافت کنید.
سلام خسته نباشید،
ببخشید میشه اسم اون نرم افزار که در اون شبیه سازی کردید چیه؟
و برای راه اندازی نرم افزار به اینترنت هم نیاز است؟
سلام جناب وقت بخیر
بنده در این آموزش از برنامه شبیه سازی استفاده نکردم
تتها اپلیکیشنی که استفاده شده ، اپلیکیشن arduino rc برای اتصال ماژول بلوتوث به تلفن همراه و کنترل ربات
سلام خیلی خوب بود عالی
فقط چرا وسط های دستور یهو گیر میکنه و موتورها از کار نمی افتن. ممنون میشم جواب بدین.
جناب متوجه سوالتون نشدم ممکنه
اما نکته ای که میتونم بگم الگوریتم این ربات به این شکل هست که:تا زمانی که دستون روی دکمه در اپلیکیشن نگه داشتین موتور ها حرکت میکنه و به محض اینکه ، دستتون رو از دکمه برداشتین حرکت موتورها متوقف میشه
سلام زمانی که کد کامپایل میکنم ارور مشکل در کد میده انگار جایی از کد اشکال داره
با سلام
لطفا متن ارور را ارسال کنید.
سلام من دقیقا همین پروژه رو انجام دادم و از اتصالات مطمئن ام. حتی برای تست کردن موتور ها از تابع motor();
هم استفاده کردم و کار کرد اما وقتی با بلوتوث میزنم هیچ اتفاقی نمی افته. از تابع Print(); هم استفاده کردم و کار میکرد اما وقتی در برنامه arduino rc میزنم هیچ اتفاقی نمی افته
کلید های arduino rc رو a,b,c,d قرار دادم بازم کار نکرد و هیچ اروری هم نمیده
اگه میشه هر چه زودتر کمک کنید
سلام خسته نباشید ببخشید
من بازو نمیخواهم ، باید قسمت سرو را پاک کنم؟؟
سلام خسته نباشید
ببخشید بنده بازو را نمیخواهم
باید در برنامه نویسی کجا را پاک کنم؟؟
با سلام
به این صورت نیست، بایستی کدها را بازنویسی کنید.