কোড অনুসন্ধান

পাঠ ২৯/৩১: কার-৭ রিমোট কন্ট্রোলার ব্যবহার করে SunFounder স্মার্ট কার নিয়ন্ত্রণ | Robojax

পাঠ ২৯/৩১: কার-৭ রিমোট কন্ট্রোলার ব্যবহার করে SunFounder স্মার্ট কার নিয়ন্ত্রণ | Robojax

এই পাঠে, আমরা আপনার SunFounder স্মার্ট কারকে একটি ইনফ্রারেড (IR) রিমোট ব্যবহার করে দূরবর্তী নিয়ন্ত্রিত যানে রূপান্তর করব। তারযুক্ত সংযোগ বা স্মার্টফোন অ্যাপের উপর নির্ভর না করে, আপনি শিখবেন কীভাবে একটি স্ট্যান্ডার্ড IR রিমোটের বোতামগুলিকে গাড়ির চলাচল নিয়ন্ত্রণে ম্যাপ করতে হয়—সামনে, পিছনে, বাঁক, এমনকি তির্যক কৌশল—পাশাপাশি চলার সময় গতি সামঞ্জস্য করতে। মোটর নিয়ন্ত্রণ এবং IR যোগাযোগের মৌলিক বিষয়গুলো শেখার পরে এই প্রকল্পটি একটি নিখুঁত পরবর্তী ধাপ, কারণ এটি উভয়কে একটি একক, ইন্টারেক্টিভ সিস্টেমে একত্রিত করে।

এখানে বাস্তব-বিশ্বের মূল্য হলো একটি রোবোটিক্স প্ল্যাটফর্মের জন্য একটি শক্তিশালী, ব্যবহারকারী-বান্ধব নিয়ন্ত্রণ ইন্টারফেস তৈরি করার বোঝাপড়া। আপনি যে নীতিগুলি শিখবেন তা সরাসরি বিভিন্ন প্রকল্পে প্রযোজ্য, যেমন:

  • হোম অটোমেশন কাজের জন্য দূরবর্তী নিয়ন্ত্রিত রোবট তৈরি করা, যেমন একটি ছোট ডেলিভারি বট।
  • শিক্ষামূলক রোবোটিক্স প্রতিযোগিতার জন্য একটি প্রোগ্রামযোগ্য যান তৈরি করা।
  • ক্যামেরা স্লাইডার বা প্যান-টিল্ট মেকানিজমের জন্য একটি কাস্টম রিমোট কন্ট্রোল তৈরি করা।
  • একটি বৃহত্তর, আরও জটিল স্বয়ংক্রিয় সিস্টেমের জন্য একটি ইউজার ইন্টারফেস প্রোটোটাইপ করা।

হার্ডওয়্যার এবং উপাদানসমূহ

এই প্রকল্পটি SunFounder 3-in-1 Arduino কিটের উপর ভিত্তি করে তৈরি। অনুসরণ করতে, আপনার নীচে তালিকাভুক্ত উপাদানগুলির প্রয়োজন হবে। তারের সংযোগটি সহজবোধ্য, যা কোর্সের পূর্ববর্তী পাঠ থেকে বিস্তৃত।

  • SunFounder 3-in-1 Arduino কিট: এতে স্মার্ট কার চ্যাসিস, মোটর ড্রাইভার বোর্ড এবং Arduino বোর্ড অন্তর্ভুক্ত রয়েছে।
  • ইনফ্রারেড রিমোট কন্ট্রোল: কিটের সাথে আসা স্ট্যান্ডার্ড রিমোট।
  • IR রিসিভার মডিউল: সেন্সর যা রিমোট থেকে সংকেত ডিকোড করবে।
  • LED এবং 330-ওহম রোধ: একটি কী চাপা হয়েছে তা নিশ্চিত করতে ভিজ্যুয়াল সূচক হিসাবে ব্যবহৃত হয়। (ভিডিওতে 04:08 এ)
  • জাম্পার তার: ব্রেডবোর্ডে প্রয়োজনীয় সংযোগ তৈরি করার জন্য।

ওয়্যারিং গাইড

car_9_lesson_29_wriing_for_IR

কোডে ডুব দেওয়ার আগে, আসুন নিশ্চিত করি যে হার্ডওয়্যারটি সঠিকভাবে সংযুক্ত আছে। IR রিসিভার এবং মোটর ড্রাইভারের ওয়্যারিং এই সিরিজের পূর্ববর্তী পাঠের সাথে সামঞ্জস্যপূর্ণ। প্রকল্পটিকে আরও ইন্টারেক্টিভ করতে, আমরা পিন 13-এ একটি বাহ্যিক LED-ও সংযুক্ত করব একটি ভিজ্যুয়াল ফিডব্যাক সূচক হিসাবে।

সংযোগগুলির জন্য এখানে একটি ধাপে ধাপে নির্দেশিকা রয়েছে:

  1. IR রিসিভার: IR রিসিভারের তিনটি পিন রয়েছে। ধনাত্মক পিনটি ব্রেডবোর্ডের 5V রেলের সাথে সংযুক্ত হয়। গ্রাউন্ড পিনটি GND রেলের সাথে সংযুক্ত হয়। সিগন্যাল পিন, যা শেষ পিন, আপনার Arduino বোর্ডের ডিজিটাল পিন 11-এর সাথে সংযুক্ত হয়। (ভিডিওতে 05:29 এ)
  2. বাহ্যিক LED: 330-ওহম রোধের একটি পা Arduino-এর ডিজিটাল পিন 13-এর সাথে সংযুক্ত করুন। রোধের অন্য পাটি LED-এর লম্বা (অ্যানোড) পায়ের সাথে সংযুক্ত করুন। LED-এর ছোট (ক্যাথোড) পাটি ব্রেডবোর্ডের GND রেলের সাথে সংযুক্ত হওয়া উচিত। (ভিডিওতে 04:08 এ)
  3. মোটর ড্রাইভার: মোটর ড্রাইভারের চারটি পিন (A_1B, A_1A, B_1B, B_1A) যথাক্রমে Arduino-এর পিন 5, 6, 9 এবং 10-এর সাথে সংযুক্ত। এই সেটআপটি পূর্ববর্তী পাঠে আলোচনা করা হয়েছে। (ভিডিওতে 06:44 এ)

এই সংযোগগুলির একটি ভিজ্যুয়াল রেফারেন্সের জন্য, অনুগ্রহ করে নীচের ওয়্যারিং ডায়াগ্রামটি দেখুন।

কোড ব্যাখ্যা

এই প্রকল্পের কোডটি স্বজ্ঞাত হওয়ার জন্য ডিজাইন করা হয়েছে। এটি IR সংকেত ডিকোড করার জটিল কাজটি পরিচালনা করতে IRremote লাইব্রেরি ব্যবহার করে। আসুন ব্যবহারকারী-কনফিগারযোগ্য অংশগুলি ভেঙে দেখি যা আপনি আপনার নিজের প্রকল্পগুলির জন্য সামঞ্জস্য করতে চাইতে পারেন।

স্কেচের শীর্ষে, আপনি পিন সংজ্ঞাগুলি পাবেন। আপনি যদি আপনার উপাদানগুলিকে এই উদাহরণে ব্যবহৃত পিনগুলির চেয়ে ভিন্ন পিনে সংযুক্ত করে থাকেন তবে এগুলি প্রথম জিনিস যা আপনার পরীক্ষা করা উচিত।

const int IR_RECEIVE_PIN = 12;  // IR সেন্সরের জন্য পিন নম্বর সংজ্ঞায়িত করুন
const int A_1B = 5;
const int A_1A = 6;
const int B_1B = 9;
const int B_1A = 10;
  • IR_RECEIVE_PIN: এই ধ্রুবকটি আপনার IR রিসিভারের সিগন্যাল পিনের সাথে সংযুক্ত ডিজিটাল পিনটি সংজ্ঞায়িত করে। আপনি যদি এটি একটি ভিন্ন পিনে সংযুক্ত করেন তবে আপনি এখানে নম্বরটি পরিবর্তন করবেন।
  • A_1B, A_1A, B_1B, B_1A: এই ধ্রুবকগুলি আপনার মোটর ড্রাইভারের চারটি নিয়ন্ত্রণ পিনে ম্যাপ করে। তারা বাম এবং ডান মোটরগুলির গতি এবং দিক নিয়ন্ত্রণ করে।

এরপরে, আপনি একটি গুরুত্বপূর্ণ ভেরিয়েবল পাবেন যা গাড়ির আচরণ নিয়ন্ত্রণ করে।

int speed = 150;
  • speed: এই ভেরিয়েবলটি গাড়ির প্রাথমিক গতি নির্ধারণ করে। মানটি 0 থেকে 255 পর্যন্ত হতে পারে। এই প্রকল্পে, আপনি রিমোটের "+" এবং "-" কী ব্যবহার করে এটি পরিবর্তন করতে পারেন। কোডটিতে গতি 255 অতিক্রম করা বা 0-এর নীচে নামা রোধ করার যুক্তিও অন্তর্ভুক্ত রয়েছে। (ভিডিওতে 09:22 এ)

রিমোট কন্ট্রোলের মূল যুক্তিটি loop() ফাংশনে পরিচালিত হয়। যখন একটি কী চাপা হয়, decodeKeyValue() ফাংশনটি কাঁচা IR কোডটিকে একটি সাধারণ স্ট্রিংয়ে অনুবাদ করে যেমন সামনের জন্য "2" বা গতি বাড়ানোর জন্য "+"। এটি নিম্নলিখিত if বিবৃতিগুলি পড়া এবং পরিবর্তন করা খুব সহজ করে তোলে। (ভিডিওতে 07:58 এ)

moveForward(), turnRight() এবং moveLeft() এর মতো কাস্টম ফাংশনগুলোতে মোটর নিয়ন্ত্রণ ঘটে। প্রতিটি ফাংশন বর্তমান speed একটি আর্গুমেন্ট হিসেবে নেয়। উদাহরণস্বরূপ, moveForward(speed) নির্দিষ্ট গতিতে উভয় মোটরকে সামনের দিকে চালাবে। "টার্ন" এবং "মুভ"-এর মধ্যে মূল পার্থক্য হলো, টার্নে উভয় চাকা বিপরীত দিকে ঘোরে, যার ফলে গাড়িটি জায়গায় ঘুরে যায়, যখন মুভে শুধুমাত্র একটি চাকা ঘোরে, যার ফলে গাড়িটি স্থির চাকার চারপাশে বাঁক নেয়। (ভিডিওতে ১০:১৪ মিনিটে)

লাইভ প্রজেক্ট প্রদর্শন

কোড আপলোড এবং গাড়ি চালু হওয়ার সাথে সাথে রিমোট কন্ট্রোল আপনার প্রধান ইন্টারফেস হয়ে ওঠে। ভিডিওতে প্রদর্শনটি কয়েকটি মূল আচরণ তুলে ধরে:

  • গতি নিয়ন্ত্রণ: "+" কী চাপলে গতি ৫০ বৃদ্ধি পায়, আর "-" কী চাপলে তা হ্রাস পায়। মোটর সুরক্ষার জন্য গতি সর্বোচ্চ ২৫৫ এবং সর্বনিম্ন ০-এ সীমাবদ্ধ। (ভিডিওতে ১১:৫৬ মিনিটে)
  • ক্ষণস্থায়ী চলাচল: আপনি যখন "২" (সামনে) বা "৮" (পিছনে) এর মতো দিকনির্দেশক কী চাপেন, গাড়িটি এক সেকেন্ডের জন্য চলবে এবং তারপর স্বয়ংক্রিয়ভাবে থেমে যাবে। এটি কোডে তৈরি একটি নিরাপত্তা বৈশিষ্ট্য। (ভিডিওতে ১৩:০৯ মিনিটে)
  • বাঁক নেওয়া এবং চালনা: রিমোটে ক্রস প্যাটার্নে সাজানো কীগুলো জয়স্টিকের মতো কাজ করে। "৪" বা "৬" চাপলে গাড়িটি জায়গায় বাম বা ডানে ঘুরবে। "১" বা "৩" এর মতো কর্ণের কী চাপলে "বামে মুভ" বা "ডানে মুভ" হবে, যা একটি তীক্ষ্ণ বাঁক যেখানে একটি চাকা স্থির থাকে। (ভিডিওতে ১৬:৪২ মিনিটে)

আপনি লক্ষ্য করতে পারেন যে গাড়িটি সবসময় পুরোপুরি সোজা লাইনে চলে না। এটি প্রায়শই মোটরগুলির সামান্য পার্থক্য বা গাড়ির সমাবেশের টানের কারণে ঘটে, যা এই কিটগুলির একটি সাধারণ এবং স্বাভাবিক বৈশিষ্ট্য। (ভিডিওতে ১৫:১৪ মিনিটে)

অধ্যায়সমূহ

  • [০০:০০] স্মার্ট কারের জন্য IR রিমোট কন্ট্রোলের ভূমিকা
  • [০১:১৫] পূর্বশর্ত এবং প্রয়োজনীয় পূর্ববর্তী পাঠ
  • [০১:৫৬] প্রজেক্ট ডকুমেন্টেশনের ওভারভিউ
  • [০২:২৯] রিমোট কন্ট্রোল কী ফাংশন বোঝা
  • [০৩:২৯] IR রিসিভার এবং LED-এর জন্য ধাপে ধাপে ওয়্যারিং গাইড
  • [০৫:৫১] প্রজেক্ট কোড খোলা এবং লোড করা
  • [০৭:৪১] কোড ব্যাখ্যা: লুপ, কী ডিকোডিং এবং অ্যাকশন
  • [০৯:২২] কোডে গতি সীমাবদ্ধকরণ এবং নিরাপত্তা বৈশিষ্ট্য
  • [১০:০৮] মোটর চলাচল ফাংশনের ব্যাখ্যা
  • [১১:৪৯] লাইভ প্রদর্শন: গতি নিয়ন্ত্রণ এবং LED ব্লিংক পরীক্ষা
  • [১৩:২৭] লাইভ প্রদর্শন: সামনে, পিছনে এবং বাঁক নেওয়া
  • [১৪:৩১] পাওয়ার এবং চলাচলসহ সম্পূর্ণ গাড়ির প্রদর্শন

ছবি

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";
    }
}

আপনাকে যা প্রয়োজন হতে পারে

সম্পদ ও রেফারেন্সসমূহ

ফাইলসমূহ📁

আর্ডুইনো লাইব্রেরি (জিপ)