آموزش آردوینوپروژه های آردوینو

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

برای سال‌های متمادی، ساخت ربات موضوعی محبوب در میان دانش‌آموزان، علاقمندان و افراد مختلف بوده است. تصمیم گرفتیم با استفاده از آردوینو یک ماشین ربات کنترل شده با بلوتوث بی سیم بسازیم. این ربات ماشین را می توان به صورت بی سیم با بلوتوث و اپلیکیشن اندرویدی کنترل کرد و به غیر از آن 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 برای برنامه اندروید در انتهای صفحه قرار داده شده است که می توانید آن را دانلود کرده و به دلخواه خود ویرایش کنید. اسکرین شات قسمت منطقی در زیر آورده شده است.

بخش منطقی MIT App Inventor

ما در حال به پایان رساندن پروژه خود مبتنی بر آردوینو، اندروید و ماشین ربات کنترل‌شده بلوتوث هستیم. امیدوارم از خواندن این مطلب لذت برده باشید و چیز مفیدی یاد گرفته باشید. حالا وقت آن است که خودتان آن را بسازید. اگر سوالی دارید، می توانید از انجمن ما برای ارتباط با ما استفاده کنید.

موارد موجود در فایل : سورس

دانلود فایل های پروژه

5/5 - (1 امتیاز)

برای دریافت مطالب جدید کانال تلگرام یا پیج اینستاگرام آیرنکس را دنبال کنید.
تصویر از محمد رحیمی

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید قرار بدهم. سوالات مربوط به این مطلب را در قسمت نظرات همین مطلب اعلام کنید. سعی میکنم در اسرع وقت به نظرات شما پاسخ بدهم.

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

نشانی ایمیل شما منتشر نخواهد شد.