شِفر (کود) جستجو

درس ۲۹/۳۱: ماشین-۷ کنترل ماشین هوشمند SunFounder با استفاده از کنترل از راه دور | روبوجَکس

درس ۲۹/۳۱: ماشین-۷ کنترل ماشین هوشمند SunFounder با استفاده از کنترل از راه دور | روبوجَکس

در این درس، خودروی هوشمند SunFounder خود را با استفاده از یک کنترل از راه دور مادون قرمز (IR) به یک وسیله نقلیه کنترل از راه دور تبدیل خواهیم کرد. به جای اتکا به اتصال سیمی یا برنامه گوشی هوشمند، یاد خواهید گرفت که چگونه دکمه‌های یک کنترل مادون قرمز استاندارد را برای کنترل حرکت خودرو — جلو، عقب، چرخش و حتی مانورهای مورب — و همچنین تنظیم سرعت آن در لحظه، نگاشت کنید. این پروژه گام بعدی عالی پس از یادگیری اصول کنترل موتور و ارتباط مادون قرمز است، زیرا هر دو را در یک سیستم تعاملی واحد ترکیب می‌کند.

ارزش دنیای واقعی در اینجا در درک چگونگی ایجاد یک رابط کنترل کاربرپسند و مقاوم برای یک پلتفرم رباتیک نهفته است. اصولی که یاد خواهید گرفت مستقیماً در طیف گسترده‌ای از پروژه‌ها قابل استفاده هستند، مانند:

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

سخت‌افزار و قطعات

این پروژه بر اساس کیت ۳ در ۱ آردوینو SunFounder ساخته شده است. برای دنبال کردن، به قطعات ذکر شده در زیر نیاز دارید. اتصالات ساده هستند و از درس‌های قبلی دوره گسترش می‌یابند.

  • کیت ۳ در ۱ آردوینو SunFounder: این شامل شاسی خودروی هوشمند، برد درایور موتور و برد آردوینو است.
  • کنترل از راه دور مادون قرمز: کنترل استانداردی که با کیت ارائه می‌شود.
  • ماجیول گیرنده مادون قرمز: سنسوری که سیگنال‌های کنترل را رمزگشایی می‌کند.
  • LED و مقاومت ۳۳۰ اهم: به عنوان نشانگر بصری برای تأیید فشار دادن کلید استفاده می‌شود. (در ویدیو در ۰۴:۰۸)
  • سیم‌های جامپر: برای ایجاد اتصالات لازم روی بردبورد.

راهنمای اتصالات

car_9_lesson_29_wriing_for_IR

قبل از ورود به شِفر (کود)، بیایید اطمینان حاصل کنیم که سخت‌افزار به درستی متصل شده است. اتصالات گیرنده مادون قرمز و درایور موتور با درس‌های قبلی این سری سازگار است. برای تعاملی‌تر کردن پروژه، یک LED خارجی نیز به پایه ۱۳ به عنوان نشانگر بازخورد بصری متصل خواهیم کرد.

در اینجا راهنمای گام‌به‌گام اتصالات آمده است:

  1. گیرنده مادون قرمز: گیرنده مادون قرمز سه پایه دارد. پایه مثبت به ریل ۵ ولت روی بردبورد متصل می‌شود. پایه زمین به ریل GND متصل می‌شود. پایه سیگنال، که آخرین پایه است، به پایه دیجیتال ۱۱ روی برد آردوینو شما متصل می‌شود. (در ویدیو در ۰۵:۲۹)
  2. LED خارجی: یک پایه مقاومت ۳۳۰ اهم را به پایه دیجیتال ۱۳ روی آردوینو متصل کنید. پایه دیگر مقاومت را به پایه بلندتر (آند) LED متصل کنید. پایه کوتاه‌تر (کاتد) LED باید به ریل GND روی بردبورد متصل شود. (در ویدیو در ۰۴:۰۸)
  3. درایور موتور: چهار پایه برای درایور موتور (A_1B، A_1A، B_1B، B_1A) به ترتیب به پایه‌های ۵، ۶، ۹ و ۱۰ روی آردوینو متصل می‌شوند. این تنظیمات در درس‌های قبلی پوشش داده شده است. (در ویدیو در ۰۶:۴۴)

برای مرجع بصری این اتصالات، لطفاً به نمودار اتصالات زیر مراجعه کنید.

توضیح شِفر (کود)

شِفر (کود) این پروژه به گونه‌ای طراحی شده است که بصری باشد. از کتابخانه IRremote برای مدیریت کار پیچیده رمزگشایی سیگنال‌های مادون قرمز استفاده می‌کند. بیایید بخش‌های قابل تنظیم توسط کاربر را که ممکن است بخواهید برای پروژه‌های خودتان تنظیم کنید، تجزیه و تحلیل کنیم.

در بالای اسکچ، تعاریف پایه را پیدا خواهید کرد. اینها اولین چیزهایی هستند که باید بررسی کنید اگر قطعات خود را به پایه‌های متفاوتی نسبت به موارد استفاده شده در این مثال متصل کرده‌اید.

const int IR_RECEIVE_PIN = 12;  // Define the pin number for the IR Sensor
const int A_1B = 5;
const int A_1A = 6;
const int B_1B = 9;
const int B_1A = 10;
  • IR_RECEIVE_PIN: این ثابت پایه دیجیتال متصل به پایه سیگنال گیرنده مادون قرمز شما را تعریف می‌کند. اگر آن را به پایه متفاوتی متصل کرده‌اید، باید عدد را در اینجا تغییر دهید.
  • A_1B، A_1A، B_1B، B_1A: این ثابت‌ها به چهار پایه کنترل روی درایور موتور شما نگاشت می‌شوند. آنها سرعت و جهت موتورهای چپ و راست را کنترل می‌کنند.

در ادامه، یک متغیر حیاتی پیدا خواهید کرد که رفتار خودرو را کنترل می‌کند.

int speed = 150;
  • speed: این متغیر سرعت اولیه خودرو را تنظیم می‌کند. مقدار می‌تواند از ۰ تا ۲۵۵ باشد. در این پروژه، می‌توانید آن را با استفاده از کلیدهای "+" و "-" روی کنترل تغییر دهید. شِفر (کود) همچنین شامل منطقی برای جلوگیری از تجاوز سرعت از ۲۵۵ یا افت زیر ۰ است. (در ویدیو در ۰۹:۲۲)

منطق اصلی کنترل از راه دور در تابع loop() مدیریت می‌شود. وقتی کلیدی فشار داده می‌شود، تابع decodeKeyValue() شِفر (کود) خام مادون قرمز را به یک رشته ساده مانند "2" برای جلو یا "+" برای افزایش سرعت ترجمه می‌کند. این کار دستورهای if زیر را بسیار خوانا و قابل تغییر می‌کند. (در ویدیو در ۰۷:۵۸)

توابع سفارشی مانند moveForward()، turnRight() و moveLeft() جایی هستند که کنترل موتور انجام می‌شود. هر تابع سرعت فعلی speed را به عنوان آرگومان دریافت می‌کند. برای مثال، moveForward(speed) هر دو موتور را با سرعت مشخص‌شده به جلو می‌راند. تفاوت کلیدی بین «چرخش» و «حرکت» این است که چرخش هر دو چرخ را در جهت‌های مخالف می‌چرخاند و باعث می‌شود ماشین در محل بچرخد، در حالی که حرکت فقط یک چرخ را می‌چرخاند و باعث می‌شود ماشین حول چرخ ثابت قوس بزند. (در ویدیو در 10:14)

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

با آپلود شِفر (کود) و روشن بودن ماشین، کنترل از راه دور رابط اصلی شما می‌شود. نمایش در ویدیو چند رفتار کلیدی را برجسته می‌کند:

  • کنترل سرعت: فشار دادن کلید «+» سرعت را ۵۰ واحد افزایش می‌دهد، در حالی که کلید «-» آن را کاهش می‌دهد. سرعت برای محافظت از موتورها در ۲۵۵ محدود و در ۰ متوقف می‌شود. (در ویدیو در 11:56)
  • حرکت لحظه‌ای: وقتی کلید جهتی مانند «۲» (جلو) یا «۸» (عقب) را فشار می‌دهید، ماشین به مدت یک ثانیه حرکت می‌کند و سپس به طور خودکار می‌ایستد. این یک ویژگی ایمنی است که در شِفر (کود) تعبیه شده است. (در ویدیو در 13:09)
  • چرخش و مانور: کلیدهایی که به شکل ضربدر روی کنترل چیده شده‌اند مانند یک جوی‌استیک عمل می‌کنند. فشار دادن «۴» یا «۶» ماشین را در محل به چپ یا راست می‌چرخاند. فشار دادن کلیدهای مورب، مانند «۱» یا «۳»، یک «حرکت به چپ» یا «حرکت به راست» انجام می‌دهد که چرخش تندتری است و در آن یک چرخ ثابت می‌ماند. (در ویدیو در 16:42)

یک نکته که ممکن است متوجه شوید این است که ماشین همیشه در یک خط کاملاً مستقیم حرکت نمی‌کند. این اغلب به دلیل تفاوت‌های جزئی در موتورها یا کشش مونتاژ ماشین است که ویژگی رایج و طبیعی این کیت‌هاست. (در ویدیو در 15:14)

فصل‌ها

  • [00:00] مقدمه‌ای بر کنترل از راه دور مادون قرمز برای ماشین هوشمند
  • [01:15] پیش‌نیازها و درس‌های قبلی مورد نیاز
  • [01:56] مرور مستندات پروژه
  • [02:29] درک عملکرد کلیدهای کنترل از راه دور
  • [03:29] راهنمای گام‌به‌گام سیم‌کشی برای گیرنده مادون قرمز و LED
  • [05:51] باز کردن و بارگذاری شِفر (کود) پروژه
  • [07:41] توضیح شِفر (کود): حلقه، رمزگشایی کلید و اقدامات
  • [09:22] محدودیت سرعت و ویژگی‌های ایمنی در شِفر (کود)
  • [10:08] توضیح توابع حرکت موتور
  • [11:49] نمایش زنده: امتحان کنترل سرعت و چشمک زدن LED
  • [13:27] نمایش زنده: حرکت به جلو، عقب و چرخش
  • [14:31] نمایش کامل ماشین با برق و حرکت

تصاویر

Car 9 lesson 29 wiring for IR
Car 9 lesson 29 wiring for IR
896-Lesson 29/31: Car-7 Controlling SunFounder Smart Car using Remote Controller
زبان: C++
/*
Lesson 29/31: Car-7 Controlling SunFounder Smart Car using Remote Controller
Get this code and watch video Download and resource page https://robojax.com/RJT612

*/
#include <IRremote.h>

const int IR_RECEIVE_PIN = 12;  // Define the pin number for the IR Sensor

const int A_1B = 5;
const int A_1A = 6;
const int B_1B = 9;
const int B_1A = 10;


int speed = 150;

void setup() {
  Serial.begin(9600);

  //motor
  pinMode(A_1B, OUTPUT);
  pinMode(A_1A, OUTPUT);
  pinMode(B_1B, OUTPUT);
  pinMode(B_1A, OUTPUT);

  //IR remote
  IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);  // Start the IR receiver // Start the receiver
  Serial.println("REMOTE CONTROL START");

}

void loop() {

  if (IrReceiver.decode()) {
    //    Serial.println(results.value,HEX);
    String key = decodeKeyValue(IrReceiver.decodedIRData.command);
    if (key != "ERROR") {
      Serial.println(key);

      if (key == "+") {
        speed += 50;
      } else if (key == "-") {
        speed -= 50;
      } else if (key == "2") {
        moveForward(speed);
        delay(1000);
      } else if (key == "1") {
        moveLeft(speed);
      } else if (key == "3") {
        moveRight(speed);
      } else if (key == "4") {
        turnLeft(speed);
      } else if (key == "6") {
        turnRight(speed);
      } else if (key == "7") {
        backLeft(speed);
      } else if (key == "9") {
        backRight(speed);
      } else if (key == "8") {
        moveBackward(speed);
        delay(1000);
      }

      if (speed >= 255) {
        speed = 255;
      }
      if (speed <= 0) {
        speed = 0;
      }
      delay(500);
      stopMove();
    }

    IrReceiver.resume();  // Enable receiving of the next value
  }
}

void moveForward(int speed) {
  analogWrite(A_1B, 0);
  analogWrite(A_1A, speed);
  analogWrite(B_1B, speed);
  analogWrite(B_1A, 0);
}

void moveBackward(int speed) {
  analogWrite(A_1B, speed);
  analogWrite(A_1A, 0);
  analogWrite(B_1B, 0);
  analogWrite(B_1A, speed);
}

void turnRight(int speed) {
  analogWrite(A_1B, speed);
  analogWrite(A_1A, 0);
  analogWrite(B_1B, speed);
  analogWrite(B_1A, 0);
}

void turnLeft(int speed) {
  analogWrite(A_1B, 0);
  analogWrite(A_1A, speed);
  analogWrite(B_1B, 0);
  analogWrite(B_1A, speed);
}

void moveLeft(int speed) {
  analogWrite(A_1B, 0);
  analogWrite(A_1A, speed);
  analogWrite(B_1B, 0);
  analogWrite(B_1A, 0);
}

void moveRight(int speed) {
  analogWrite(A_1B, 0);
  analogWrite(A_1A, 0);
  analogWrite(B_1B, speed);
  analogWrite(B_1A, 0);
}

void backLeft(int speed) {
  analogWrite(A_1B, speed);
  analogWrite(A_1A, 0);
  analogWrite(B_1B, 0);
  analogWrite(B_1A, 0);
}

void backRight(int speed) {
  analogWrite(A_1B, 0);
  analogWrite(A_1A, 0);
  analogWrite(B_1B, 0);
  analogWrite(B_1A, speed);
}

void stopMove() {
  analogWrite(A_1B, 0);
  analogWrite(A_1A, 0);
  analogWrite(B_1B, 0);
  analogWrite(B_1A, 0);
}


String decodeKeyValue(long result)
{
  switch(result){
    case 0x16:
      return "0";
    case 0xC:
      return "1"; 
    case 0x18:
      return "2"; 
    case 0x5E:
      return "3"; 
    case 0x8:
      return "4"; 
    case 0x1C:
      return "5"; 
    case 0x5A:
      return "6"; 
    case 0x42:
      return "7"; 
    case 0x52:
      return "8"; 
    case 0x4A:
      return "9"; 
    case 0x9:
      return "+"; 
    case 0x15:
      return "-"; 
    case 0x7:
      return "EQ"; 
    case 0xD:
      return "U/SD";
    case 0x19:
      return "CYCLE";         
    case 0x44:
      return "PLAY/PAUSE";   
    case 0x43:
      return "FORWARD";   
    case 0x40:
      return "BACKWARD";   
    case 0x45:
      return "POWER";   
    case 0x47:
      return "MUTE";   
    case 0x46:
      return "MODE";       
    case 0x0:
      return "ERROR";   
    default :
      return "ERROR";
    }
}

مواردی که ممکن است به آن‌ها نیاز داشته باشید

فایل‌ها📁

کتابخانه‌های آردوینو (zip)