ساخت ربات بلوتوثی با آردوینو (کنترل ماشین با موبایل)

محتویات
برای سالهای متمادی، ساخت ربات موضوعی محبوب در میان دانشآموزان، علاقمندان و افراد مختلف بوده است. تصمیم گرفتیم با استفاده از آردوینو یک ماشین ربات کنترل شده با بلوتوث بی سیم بسازیم. این ربات ماشین را می توان به صورت بی سیم با بلوتوث و اپلیکیشن اندرویدی کنترل کرد و به غیر از آن LED های RGB Neopixel را در جلو، پشت و پایین ربات قرار داده ایم تا ظاهری جذاب داشته باشد. ما همچنین با MIT یک برنامه اندرویدی سفارشی خواهیم ساخت تا بتوانیم دستورات را مستقیماً از طریق بلوتوث ارسال کنیم و حرکات ربات را کنترل کنیم و همچنین LED های روی ربات را کنترل کنیم.
ساخت شاسی ربات بلوتوثی آردوینو
شاسی ربات پایه و قسمت اصلی ربات است که تمام مدارهای ربات را نگه می دارد. بنابراین، ما از تخته های PVC برای ساخت یک شاسی قابل اعتماد و قوی استفاده خواهیم کرد. این تخته ها در عین سبک بودن، محکم هستند.
قطعات با ابعاد داده شده را برش دهید:
- قطعه مستطیلی 10.5 × 13.5 سانتی متر (2 عدد)
- نوارهای 7.5 در 2.3 سانتی متر (2 عدد)
- نوار 11.5 × 2.3 سانتی متر (2 عدد)
- 4.3 × 2.3 سانتی متر (1 عدد)
- 10.5 × 3.5 سانتی متر (2 عدد)
در نهایت شبیه به این خواهد شد:
اتصال موتور ها: حالا هر چهار موتور به صورت دو جفت و هر جفت به صورت موازی به یکدیگر متصل می شوند. یعنی موتور سمت راست به موتور سمت چپ متصل میشوند.
اتصال موتور به درایور موتور: از آنجایی که ما از ماژول L298N استفاده می کنیم، برای اتصال موتورها 2 ترمینال در دو طرف داریم. فقط موتورها را به درایور متصل کنید زیرا قطبیت و جهت را می توان با استفاده از پایه های ورودی متصل به آردوینو کنترل کرد. این را در مراحل آتی مورد بحث قرار می دهیم.
قبلاً پروژههای رباتیک دیگری ساخته بودیم، اگر میخواهید چیزی متفاوت و آسانتر بسازید، میتوانید پروژههای دیگر ما را که در زیر لینک شدهاند بررسی کنید.
- قایق کنترلی با آردوینو
- ربات ضدعفونی کننده آردوینو
- ربات جاروبرقی هوشمند آردوینو
- ربات کنترل شده با وای فای آردوینو
مدار ماشین بلوتوث آردوینو
مدار کامل ماشین بلوتوث آردوینو در زیر نشان داده شده است. این مدار از اجزای عمومی ساخته شده است و می توان آن ها را از هر فروشگاه آنلاین یا محلی تهیه کرد.
قطعات مورد نیاز
- آردوینو UNO
- ماژول بلوتوث HC05
- درایور موتور L298N
- NeoPixel LED (در صورت نیاز)
- باتری لیتیوم یون 18650 با مدار حفاظتی
- موتورهای BO با چرخ * 4
- برد سوراخدار * 2
- جک مادگی DC
کار این مدار بسیار ساده و قابل درک است. اول، ما آردوینو داریم که به عنوان مغز مدار کار می کند. سپس ماژول بلوتوث را داریم. ماژول بلوتوث به پین 13 و 10 آردوینو که ما به عنوان پین های ارتباط سریال نرم افزاری از آن استفاده می کنیم متصل است. در مرحله بعد، ما از پین های 11،12،8، و 7 برای اتصال LED های RGB WS2812B خود استفاده می کنیم. در نهایت، ما از پایه های 9، 6، 5 و 4 برای اتصال آی سی درایور موتور L298N که چهار موتور ما را به حرکت در می آورد، استفاده می کنیم.
آردوینو | L298N |
3 | IN1 اگر در مورد این مطلب سوالی دارید در قسمت نظرات بپرسید |
9 | IN2 |
5 | IN3 |
6 | IN4 |
VIN | +5V |
GND | GND |
آردوینو | HC05 |
10 | Tx |
11 | Rx |
+5V | VCC |
GND | GND |
آردوینو | نئوپیکسل |
8 | Left LED |
7 | Right LED |
12 | Front LED Data |
13 | Back LED Data |
کد آردوینو ربات کنترل شونده با بلوتوث
کد آردوینو و ربات مبتنی بر بلوتوث کمی پیچیده است، بنابراین ما کل کد را به سه فایل جداگانه تقسیم می کنیم تا بتوانیم بهتر آن را متوجه شویم.
arduino_bluetooth_bot_main:
همانطور که همه ما می دانیم ماژول بلوتوث از ارتباط سریال برای برقراری ارتباط با آردوینو استفاده می کند و از آنجایی که آردوینو فقط یک پورت سریال یا TX و پورت RX دارد، باید از کتابخانه SoftwareSerial.h آردوینو برای ارتباط با ماژول بلوتوث استفاده کنیم. بنابراین در تابع void setup() سریال سخت افزاری را با 9600 baud برای اشکال زدایی پیکربندی می کنیم و سریال نرم افزاری را با 38400 baud برای ارتباط با بلوتوث پیکربندی می کنیم. سپس با ارسال فرمان AT به ماژول بلوتوث بررسی می کنیم که آیا ماژول بلوتوث کار می کند یا خیر. اگر ماژول بلوتوث پیام OK را برگرداند، یعنی همه چیز درست است. هنگامی که این کار انجام شد، تابع LED_setup() را برای تنظیم LED های نئوپیکسل فراخوانی میکنیم که در ادامه به آن خواهیم پرداخت.
#include <SoftwareSerial.h> SoftwareSerial mySerial(10, 11); // RX, TX void setup() { // ارتباط سریال Serial.begin(9600); mySerial.begin(38400); while (!Serial) { ; // صبر برای برقرای ارتباط سریال } Serial.println("Sending AT..."); mySerial.write("AT"); if (mySerial.available()>0) { Serial.write(mySerial.read()); } Serial.println("loop begins"); LED_setup(); }
در مرحله بعد، باید سه متغیر را مقداردهی اولیه کنیم، اولین متغیر rcd نام دارد و یک متغیر از نوع کاراکتر است که داده های دریافتی را از ماژول بلوتوث نگه می دارد. در مرحله بعد یک متغیر spd از نوع عدد صحیح تعریف می کنیم که داده های سرعت ماشین را نگه می دارد. سپس یک متغیر time_now از نوع long داریم که از آن برای نگهداری داده های زمان استفاده خواهیم کرد. متغیر rcd را که در حال دریافت است بررسی می کنیم و بر اساس آن یک شرط if را اجرا می کنیم. ما این روند را برای تمام LED های RGB و حرکات ربات ادامه می دهیم.
void loop() { // run over and over if (mySerial.available()) { rcd = mySerial.read(); Serial.write(rcd); } unsigned long time_now = 0; if (rcd == 'O') { R_LED(1); L_LED(1); F_LED(1); B_LED(1); } if (rcd == 'o') { R_LED(0); L_LED(0); F_LED(0); B_LED(0); } if (rcd == 'X') { L_LED(1); } if (rcd == 'x') { L_LED(0); } if (rcd == 'P') { R_LED(1); } if (rcd == 'p') { R_LED(0); } if (rcd == 'W') { F_LED(1); } if (rcd == 'w') { F_LED(0); } if (rcd == 'U') { B_LED(1); } if (rcd == 'u') { B_LED(0); } if (rcd == '0') { spd = 80; } if (rcd == '1') { spd = 100; } if (rcd == '3') { spd = 120; } if (rcd == '5') { spd = 180; } if (rcd == 'q') { spd = 255; } if (rcd == 'F') { Forward(); time_now = millis(); while (millis() < time_now + 100) {} } else if (rcd == 'B') { time_now = millis(); while (millis() < time_now + 100) {} Backward(); } else if (rcd == 'I') { time_now = millis(); while (millis() < time_now + 100) {} FdRight(); } else if (rcd == 'J') { time_now = millis(); while (millis() < time_now + 100) {} BkRight(); } else if (rcd == 'R') { time_now = millis(); while (millis() < time_now + 100) {} SharpRight(); } else if (rcd == 'L') { time_now = millis(); while (millis() < time_now + 100) {} SharpLeft(); } else if (rcd == 'G') { time_now = millis(); while (millis() < time_now + 100) {} FdLeft(); } else if (rcd == 'H') { time_now = millis(); while (millis() < time_now + 100) {} BkLeft(); } else Stop(); }
led_control:
در داخل فایل کنترلر LED، پین هایی را که LED های نئوپیکسل به آن متصل می شوند، تنظیم، اعلام و تعریف کرده ایم. برای کنترل نئوپیکسل ها از کتابخانه Adafruit_NeoPixel استفاده کرده ایم.
#include <Adafruit_NeoPixel.h> #ifdef __AVR__ #include <avr/power.h> #endif #define F_LED_PIN 12 //Front LED #define F_LED_PIXEL 6 #define B_LED_PIN 13 //Back LED #define B_LED_PIXEL 6 #define R_LED_PIN 7 //Right LED #define R_LED_PIXEL 1 #define L_LED_PIN 8 //Left LED #define L_LED_PIXEL 1 Adafruit_NeoPixel F_LED_STRIP(F_LED_PIXEL, F_LED_PIN, NEO_GRB + NEO_KHZ800); Adafruit_NeoPixel B_LED_STRIP(B_LED_PIXEL, B_LED_PIN, NEO_GRB + NEO_KHZ800); Adafruit_NeoPixel R_LED_STRIP(R_LED_PIXEL, R_LED_PIN, NEO_GRB + NEO_KHZ800); Adafruit_NeoPixel L_LED_STRIP(L_LED_PIXEL, L_LED_PIN, NEO_GRB + NEO_KHZ800);
بعد در داخل این فایل، تابع LED_setup() داریم. در داخل این تابع، ما همه LED های نئوپیکسل را مقداردهی اولیه کرده ایم و با تابع پیش فرض ارائه شده توسط Adafruit آنها را خاموش کرده ایم تا در ابتدای کد، نئوپیکسل ها به طور تصادفی روشن نشوند.
void LED_setup() { #if defined(__AVR_ATtiny85__) && (F_CPU == 16000000) clock_prescale_set(clock_div_1); #endif F_LED_STRIP.begin(); B_LED_STRIP.begin(); R_LED_STRIP.begin(); L_LED_STRIP.begin(); R_LED_STRIP.clear(); L_LED_STRIP.clear(); F_LED_STRIP.clear(); B_LED_STRIP.clear(); }
در مرحله بعد، ما چهار تابع دیگر داریم که همه LED ها را کنترل می کند. این توابع به ربات متصل هستند و به ترتیب R_LED، L_LED، F_LED، B_LED نامیده می شوند.
void R_LED(int a) { if(a==1) { R_LED_STRIP.clear(); R_LED_STRIP.setPixelColor(0, R_LED_STRIP.Color(0, 255, 255)); R_LED_STRIP.show(); // Send the updated pixel colors to the hardware. } else { R_LED_STRIP.clear(); R_LED_STRIP.show(); } } void L_LED(int a) { if(a==1) { L_LED_STRIP.clear(); L_LED_STRIP.setPixelColor(0, L_LED_STRIP.Color(0, 255, 255)); L_LED_STRIP.show(); // Send the updated pixel colors to the hardware. } else { L_LED_STRIP.clear(); L_LED_STRIP.show(); } } void F_LED(int a) { if(a==1) { F_LED_STRIP.clear(); F_LED_STRIP.setPixelColor(0, F_LED_STRIP.Color(255, 255, 255)); F_LED_STRIP.setPixelColor(1, F_LED_STRIP.Color(0, 0, 50)); F_LED_STRIP.setPixelColor(2, F_LED_STRIP.Color(0, 0, 50)); F_LED_STRIP.setPixelColor(3, F_LED_STRIP.Color(0, 0, 50)); F_LED_STRIP.setPixelColor(4, F_LED_STRIP.Color(0, 0, 50)); F_LED_STRIP.setPixelColor(5, F_LED_STRIP.Color(255, 255, 255)); F_LED_STRIP.show(); // Send the updated pixel colors to the hardware. } else if(a==0) { F_LED_STRIP.clear(); F_LED_STRIP.show(); } } void B_LED(int a) { if(a==1) { B_LED_STRIP.clear(); B_LED_STRIP.setPixelColor(0, B_LED_STRIP.Color(255, 0, 0)); B_LED_STRIP.setPixelColor(1, B_LED_STRIP.Color(0, 50, 0)); B_LED_STRIP.setPixelColor(2, B_LED_STRIP.Color(0, 50, 0)); B_LED_STRIP.setPixelColor(3, B_LED_STRIP.Color(0, 50, 0)); B_LED_STRIP.setPixelColor(4, B_LED_STRIP.Color(0, 50, 0)); B_LED_STRIP.setPixelColor(5, B_LED_STRIP.Color(255, 0, 0)); B_LED_STRIP.show(); // Send the updated pixel colors to the hardware. } else if(a==0) { B_LED_STRIP.clear(); B_LED_STRIP.show(); } }
Movements:
در این فایل خاص، ما توابعی را برای کنترل حرکت ربات تعریف کرده ایم. در تابع نشان داده شده در زیر، از تابع analogWrite(5, spd)
استفاده کرده ایم و پین و مقدار سرعت را ارسال کرده ایم تا بتواند سیگنال PWM تولید کند. پس از آن، ما یک آی سی درایور موتور را کنترل میکنیم و این موتور را به حرکت در می آورد.
void Forward() { analogWrite(5, spd); digitalWrite(6, 0); analogWrite(9, spd); digitalWrite(3, 0); // delay(50); } void Backward() { digitalWrite(5, 0); analogWrite(6, spd); digitalWrite(9, 0); analogWrite(3, spd); } void Stop() { analogWrite(5, 0); digitalWrite(6, 0); analogWrite(9, 0); digitalWrite(3, 0); } void FdRight() { analogWrite(5, spd); digitalWrite(6, 0); digitalWrite(9, 0); analogWrite(3, 0); } void BkRight() { analogWrite(5, 0); digitalWrite(6, 0); digitalWrite(9, 0); analogWrite(3, spd); } void SharpRight() { analogWrite(5, spd); digitalWrite(6, 0); digitalWrite(9, 0); analogWrite(3, spd); } void SharpLeft() { digitalWrite(5, 0); analogWrite(6, spd); analogWrite(9, spd); digitalWrite(3, 0); } void BkLeft() { digitalWrite(5, 0); analogWrite(6, spd); analogWrite(9, 0); digitalWrite(3, 0); } void FdLeft() { digitalWrite(5, 0); analogWrite(6, 0); analogWrite(9, spd); digitalWrite(3, 0); }
ساخت برنامه اندروید برای ربات بلوتوثی
ساخت اپلیکیشن اندروید با اپلیکیشن ساز ها بسیار ساده است. ابتدا رابط کاربری را طراحی میکنیم. ما از نرم افزار MIT برای ساخت این نرم افزار اندروید استفاده کرده ایم. در تصویر زیر میتوانید ظاهر گرافیکی این برنامه را مشاهده کنید.
در بخش منطقی، چیز زیادی وجود ندارد. ما از روشهای استاندارد app inventor برای اتصال به بلوتوث HC-05 استفاده میکنیم و هنگامی که اتصال انجام شد، فقط دستورات خاصی را برای حرکت ربات و کنترل LED های ربات ارسال میکنیم. فایل aia برای برنامه اندروید در انتهای صفحه قرار داده شده است که می توانید آن را دانلود کرده و به دلخواه خود ویرایش کنید. اسکرین شات قسمت منطقی در زیر آورده شده است.
ما در حال به پایان رساندن پروژه خود مبتنی بر آردوینو، اندروید و ماشین ربات کنترلشده بلوتوث هستیم. امیدوارم از خواندن این مطلب لذت برده باشید و چیز مفیدی یاد گرفته باشید. حالا وقت آن است که خودتان آن را بسازید. اگر سوالی دارید، می توانید از انجمن ما برای ارتباط با ما استفاده کنید.
موارد موجود در فایل : سورس
برای دانلود فایل ها باید حساب کاربری داشته باشید ثبت نام / ورود
سلام خسته نباشید وقتی کد رو وارد میکنم ورفای میگیرم ارور میده
سلام
من این ماشین رو درست کردم ولی با ماژول Hc_06 به گوشی وصل میشه ولی توی برنامه کار نمیکنه
مشکل از ماژول هست یا نه؟؟؟
ترو خدا بگیددددد
سلام
من تازه برنامه نویسی اردوینو یاد گرفتم.
میخوام این ربات رو درست کنم ولی نمیدونم چطوری کد ها رو وارد برنامه کنم.
کسی هست از اول تا اخر ساخت ربات کمکم کنه؟
@mohammadrezagholampour ایدی ایتا
ممنون
سلام عزیز
اگر برنامه نویسی را بلد نیستید میتوانید از دوره آموزش آردوینو ما استفاده کنید.
سلام ماژول لوتوثی من کار نمیکند چجوری اشکال ان را رفع کنم ممنون
سلام
تصویر مدار خود را در انجمن ارسال کنید
سلام خسته نباشید
حداکثر برد مفید این چقدر است ؟
یعنی بدون اینکه خطا و تاخیری داشته باشد
و اینکه آیا میشه با ماژول سیم کارت و از طریق اینترنت سیم کارت این پروژه رو راه انداخت تا برد بیشتری داشته باشد ؟
سلام وعرض ادب خدمت مهندس گرامی
مهندس من رباتی که ساختم مشکلش این هست که یک ربات ۲ کاره هست هم بلوتوثی و هم اتشنشان فقط متاسفانه زمانی که گاز میدهیم که ۴ ارمیچر راه بیافتند امپر زیادی میکشه و سنسور ها خطا میدن به نظرتون چیکار کنم و چه خازنی سر راه ارمیچر ها قرار بدم؟
سلام و درود وقتتون بخیر
من در کد به مشکل خوردم ولی خوشبختانه رفع شد .
به نطرم باید به شما هم میگفتم که شما هم گیر نکنید.
در اردوینو از من یه ارور درباره ی (spd) و (rcd) میگرفت که برایحلش باید بری بالا ترین قسمت اردوینو و (spd) و (rcd) با (int) تعریف کنی .
سلام من سورس کد رودانلود کردم اما فایل aia نبود لطفا کمک کنید من این ربات رو نیاز دارم
سلام ببخشید اون بلوک هایی که تو ساخت برنامه ازش استفاده کردید نیستش
سلام وقت بخیر من اگه بخوام بگم تاوقتی که من دستم روی دکمه هست موتور روشن شه ودر غیر این صورت موتور خاموش شه باید چه کدی رو بنویسم
سلام عزیز
برای یادگیری برنامه نویسی آردوینو میتوانید دوره آموزش آردوینو را تهیه کنید
سلام ببخشید میشه توی این پروژه از arduino mini هم استفاده کرد؟!
سلام عزیز
بهتر هست آردوینو اونو یا نانو استفاده کنید
فایل aiaبرای اندروید برای من دانلود نمیشه
به نام خدا
سلام مجدد
برنامه ساخت ربات بلوتوثی با آردوینو (کنترل ماشین با موبایل) در آردینو اجرا کردم متأسفانه در خط 16 آردینو LED_setup اشکال میگیرد
سلام عزیز
متن ارور را ارسال بفرمایید
سلام جناب یعنی باید هر سه کد را باهم کپی کنم
این کار را کرده ام و ارور میده
سلام خسته نباشید
ببخشید این کد هایی که برای دانلود گذاشتید
چطوری باید وارد نرمافزار آردوینو بکنیم؟؟
سلام عزیز
کپی پیست!
اگر در کار با آردوینو تازه وارد هستید بهتر هست ابتدا دوره آموزش آردوینو را ببینید.
فایل نرم افزار اندرویدی موجو نیست
سلام
میشه از برنامه اندرویدی دیگه برای هدایت کردن این ربات استفاده کرد؟
سلام عزیز
اگر به کنترل ربات از طریق موبایل علاقه دارید دوره آموزش آردوینو را مشاهده کنید
به طور کامل ساخت ربات بلوتوثی و استفاده از نرم افزار ها آموزش داده شده است.
سلام خسته نباشید کدنویسی هایی که تو فایل گفتید آخر مطالب هست رو سه قسمت داره باید تو وارد کردن کد ها به ترتیب بزاریم؟
سلام خسته نباشید میشه لطفا راهنماییم کنید که چجوری برنامه رو برای این ربات دانلود کنم
سلام عزیز
لینک دانلود در انتهای مطلب قرار گرفته کافی هست وارد حساب کاربری خود شوید لینک را مشاهده میکنید
میشه بهش دوربین هم وصل کرد ؟ و توی صفحه نمایش گوشی دید
سلام وقت بخیر
آردوینو برای این کار مناسب نیست بهتر هست از رزبری پای استفاده کنید
سلام مجدد میشه از فوم فشزده برای قطعه مستطیلی استفاده کرد یا اینکه می تو نیم از مواد دیگه دریت کنیم اش؟ لطفا اگه از مواد دیگری هم میشه به من بگید
سلام عزیز
از هر ماده ای که بخواهید میتونید استفاده کنید
بعد از یه نرم افزار دیگه که آماده بود استفاده کردم اونم میتونه موثر باشه یا ربطی نداره
سلام ببخشید من کد رو روی آردینو پروگرام گردم اتصالات هم درسته فقط چرا موتور ها درایو نمی شن
عالی دستتون درد نکنه من 15 سالمه و برنامه نویسی بلدم ولی در mit app ضعیف ممنون از شما
سلام عزیز
خوشحالم که براتون مفید بوده
سلام اگه میشه برای اپ بلوتوث یه برنامه معرفی کنید و چجوری میشه یه اسپیکر بلوتوث کوچیک هم بهش وصل کنم و راه اندازی کنم اسپیکر رو اگه میشه راهنمایی کنید ممنون
سلام عزیز
برای یادگیری ارتباط بلوتوث با آردوینو میتونید دوره آموزش آردوینو را مشاهده کنید
سلام و خسته نباشید
سورس های برنامه app-inventor را برای اتصال ماژول بلوتوث رو میشه بگزارید ؟
ممنون
سلام میشه روش ساخت اپلیکیشن برا کنترل را توضیح بدین ممنون
سلام عزیز
نقشه ساخت اپلیکیشن قرار داده شده است فقط باید مشابه با آن موارد را قرار دهید و خروجی بگیرید
سلام
خسته نباشید
میشه برنامه اندرویدی ساخت که دستورات صوتی را تبدیل کنه به فرکانس و برای hc-05 ارسال کنه
لطفا اگه میشه راهنماییم کنید
ممنون از آموزش های خوبتون
سلام عزیز
بله میتونید به برنامه نویس های اندروید سفارش ساخت این نرم افزار رو بدید