Search Code

আরডুইনো সার্ভো টগল সুইচ তৈরি করুন একটি পুশ বাটন দিয়ে

আরডুইনো সার্ভো টগল সুইচ তৈরি করুন একটি পুশ বাটন দিয়ে

একটি পুশ বাটন দিয়ে আরডুইনো সার্ভো টগল সুইচ তৈরি করুন

এই প্রজেক্ট গাইড আপনাকে দেখাবে কিভাবে একটি সহজ কিন্তু অত্যন্ত কার্যকরী সার্কিট তৈরি করতে হয়: একটি সার্ভো মোটর যা একটি পুশ বাটনের প্রতিটি চাপে দুটি অবস্থানের মধ্যে টগল করে। প্রথম চাপে, সার্ভোটি মসৃণভাবে 0 থেকে 180 ডিগ্রিতে ঘুরবে। দ্বিতীয় চাপে, এটি 180 থেকে 0 ডিগ্রিতে ফিরে আসবে। এটি রোবোটিক্স এবং অটোমেশনের একটি মৌলিক ধারণা, যা স্বয়ংক্রিয় দরজার ল্যাচ, একটি সাধারণ রোবোটিক আর্ম, পতাকা ওয়েভার, বা এমন যেকোনো প্রজেক্টের জন্য উপযুক্ত যেখানে দুই-অবস্থার শারীরিক ক্রিয়া প্রয়োজন।

আমরা প্রয়োজনীয় হার্ডওয়্যার, ওয়্যারিং এবং আরডুইনো কোডের বিস্তারিত ব্যাখ্যা নিয়ে আলোচনা করব যা এটি সব কাজ করে।


হার্ডওয়্যার এবং ওয়্যারিং

এই প্রজেক্টের উপাদানগুলো ন্যূনতম এবং বেশিরভাগ আরডুইনো স্টার্টার কিটে সাধারণ। আপনার একটি আরডুইনো বোর্ড (যেমন Uno), একটি স্ট্যান্ডার্ড hobby সার্ভো মোটর (যেমন SG90), একটি পুশ বাটন এবং কয়েকটি জাম্পার তারের প্রয়োজন হবে।

ওয়্যারিং সহজবোধ্য। সার্ভোর পাওয়ার এবং গ্রাউন্ড লাইন আরডুইনোর 5V এবং GND পিনের সাথে সংযুক্ত থাকে, যখন এর সিগন্যাল লাইন একটি PWM-সক্ষম পিনের সাথে (আমাদের কোডে পিন 9) সংযুক্ত থাকে। পুশ বাটনটি ডিজিটাল পিন 2 এবং GND এর মধ্যে সংযুক্ত থাকে।

একটি আরডুইনোর সাথে সার্ভো মোটর এবং পুশ বাটন সংযোগের ওয়্যারিং ডায়াগ্রাম।

আরডুইনো কোড ব্যাখ্যা

স্কেচটি স্ট্যান্ডার্ড Servo.h লাইব্রেরি ব্যবহার করে, যা আরডুইনো IDE এর সাথে অন্তর্ভুক্ত। কোডটি পরিষ্কার এবং বোঝা সহজ করার জন্য ডিজাইন করা হয়েছে, সার্ভোর অবস্থা ট্র্যাক রাখতে ফ্ল্যাগ এবং মসৃণ ঘূর্ণন গতি তৈরি করতে `for` লুপ ব্যবহার করে।

গ্লোবাল ভেরিয়েবল এবং কনফিগারেশন

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


#include <Servo.h>

// সার্ভো এবং বাটন পিনের জন্য ভেরিয়েবল সংজ্ঞায়িত করুন
const int servoPin = 9;   // সার্ভো সিগন্যাল তারটি ডিজিটাল পিন 9 এর সাথে সংযুক্ত করুন
const int buttonPin = 2;  // পুশ বাটনটি ডিজিটাল পিন 2 এর সাথে সংযুক্ত করুন

// সার্ভো মুভমেন্ট প্যারামিটার সংজ্ঞায়িত করুন
const int initialAngle = 0;   // সার্ভোর শুরুর কোণ
const int targetAngle1 = 180; // প্রথম লক্ষ্য কোণ
const int targetAngle2 = 0;   // দ্বিতীয় লক্ষ্য কোণ
const int movingStep = 1;     // মসৃণ চলাচলের জন্য ধাপের আকার (একবারে 1 ডিগ্রি)

Servo myServo; // একটি Servo অবজেক্ট তৈরি করুন

// অবস্থা-ট্র্যাকিং ভেরিয়েবল
int currentAngle = initialAngle;
bool buttonPressed = false;
bool servoAt180 = false;
  • servoPin: সার্ভোর সিগন্যাল তারের সাথে সংযুক্ত পিন। এটি অবশ্যই একটি PWM পিন হতে হবে (বেশিরভাগ আরডুইনো বোর্ডে `~` দিয়ে চিহ্নিত)।
  • buttonPin: পুশ বাটনটি যে পিনে সংযুক্ত।
  • initialAngle, targetAngle1, targetAngle2: এগুলি সার্ভোর চলাচলের শুরু এবং শেষ বিন্দু নির্ধারণ করে।
  • movingStep: এটি নিয়ন্ত্রণ করে লুপের প্রতিটি ধাপে সার্ভো কত ডিগ্রি moves। একটি ছোট সংখ্যা মসৃণ, ধীর গতি তৈরি করে।

`setup()` ফাংশন

setup() ফাংশনটি আরডুইনো চালু হলে একবার চলে। এটি সার্ভো শুরু করে, বাটন পিন কনফিগার করে এবং সার্ভোকে তার শুরুর অবস্থানে সেট করে।


void setup() {
  myServo.attach(servoPin); // সার্ভোকে তার পিনের সাথে সংযুক্ত করে
  pinMode(buttonPin, INPUT_PULLUP); // বাটন পিনটি অভ্যন্তরীণ pull-up সহ ইনপুট হিসাবে সেট করুন
  myServo.write(initialAngle);      // সার্ভোকে তার প্রাথমিক অবস্থানে সরান
  Serial.begin(9600);               // ডিবাগিংয়ের জন্য সিরিয়াল শুরু করুন
}

আমরা বাটন পিনের জন্য INPUT_PULLUP ব্যবহার করি। এটি আরডুইনোতে একটি অভ্যন্তরীণ রোধ সক্রিয় করে, যা বাটন চাপা না হলে পিনের অবস্থা HIGH রাখে। যখন বাটন চাপা হয়, এটি পিনটিকে গ্রাউন্ডের সাথে সংযুক্ত করে, অবস্থা LOW করে। এই দরকারী বৈশিষ্ট্যটির অর্থ হল আপনার সার্কিটে একটি বাহ্যিক pull-up রোধ যোগ করার প্রয়োজন নেই।

`loop()` - মূল লজিক

মূল লুপটি ক্রমাগত বাটন চাপ পরীক্ষা করে। যখন একটি চাপ সনাক্ত করা হয়, এটি সার্ভোকে তার পরবর্তী লক্ষ্য অবস্থানে নিয়ে যায়।


void loop() {
  // বাটনের অবস্থা পড়ুন
  int buttonState = digitalRead(buttonPin);

  // বাটন চাপা হয়েছে কিনা (LOW) এবং এটি আগে থেকে ধরে রাখা ছিল না কিনা তা পরীক্ষা করুন
  if (buttonState == LOW && !buttonPressed) {
    delay(50); // একাধিক ট্রিগার প্রতিরোধ করতে ডিবাউন্স বিলম্ব
    if (digitalRead(buttonPin) == LOW) { // বাটনের অবস্থা পুনরায় পরীক্ষা করুন
      buttonPressed = true; // বাটন চাপা হিসাবে চিহ্নিত করুন

      if (!servoAt180) {
        // 180 এ না থাকলে, 180 এ সরান
        for (int angle = currentAngle; angle <= targetAngle1; angle += movingStep) {
          myServo.write(angle);
          delay(15); // গতি নিয়ন্ত্রণ করতে ধাপগুলির মধ্যে বিলম্ব
        }
        currentAngle = targetAngle1;
        servoAt180 = true; // অবস্থা আপডেট করুন
      } else {
        // 180 এ থাকলে, 0 এ ফিরে যান
        for (int angle = currentAngle; angle >= targetAngle2; angle -= movingStep) {
          myServo.write(angle);
          delay(15);
        }
        currentAngle = targetAngle2;
        servoAt180 = false; // অবস্থা আপডেট করুন
      }
    }
  }

  // বাটন ছাড়া হলে বাটন চাপা ফ্ল্যাগটি রিসেট করুন
  if (buttonState == HIGH) {
    buttonPressed = false;
  }
}

কোডটি একটি বুলিয়ান ফ্ল্যাগ, servoAt180, ব্যবহার করে সার্ভোর শেষ অবস্থান মনে রাখার জন্য। যখন বোতাম চাপা হয়, এটি এই ফ্ল্যাগটি পরীক্ষা করে: যদি সার্ভোটি ১৮০ ডিগ্রিতে না থাকে, তবে এটি সেখানে সরিয়ে নেয়; অন্যথায়, এটি এটিকে ০-এ ফিরিয়ে আনে। for লুপগুলোই মসৃণ সুইপিং গতি তৈরি করে, সার্ভোটিকে এক ডিগ্রি করে সরিয়ে, প্রতিটি ধাপের মধ্যে সামান্য বিলম্ব সহ।


এটি কীভাবে কাজ করে

একবার আপনি কোডটি আপলোড করে আপনার Arduino-তে পাওয়ার চালু করলে, সার্ভোটি তার প্রাথমিক ০-ডিগ্রি অবস্থানে চলে যাবে।

  1. প্রথম চাপ: যখন আপনি বোতামটি চাপবেন, কোডটি ইনপুট শনাক্ত করে এবং সার্ভোটিকে ০ থেকে ১৮০ ডিগ্রির দিকে, এক ডিগ্রি করে সরানো শুরু করে।
  2. দ্বিতীয় চাপ: সার্ভোটি ১৮০ ডিগ্রিতে পৌঁছানোর পরে, পরবর্তী বোতাম চাপলে এটি ১৮০ থেকে ০ ডিগ্রির দিকে ফিরে সুইপ করবে।

এই চক্রটি প্রতিটি পরবর্তী বোতাম চাপের সাথে পুনরাবৃত্তি হবে, যা আপনার প্রকল্পের জন্য একটি নির্ভরযোগ্য এবং অনুমানযোগ্য টগল প্রক্রিয়া তৈরি করবে।

787-Servo with Push button each push moves the servo to final position and stop SPB-180
ভাষা: C++
/*
This code is provided by robojax.com
you can view the wiring diagram and details of this tutorial 
here https://robojax.com/T661
*/
#include <Servo.h>

// Define variables for servo and button pins
const int servoPin = 9;   // Connect servo signal wire to digital pin 9
const int buttonPin = 2;  // Connect push button to digital pin 2

// Define servo movement parameters
const int initialAngle = 0;   // Servo's starting angle
const int targetAngle1 = 180; // First target angle
const int targetAngle2 = 0;   // Second target angle (same as initial in this case)
const int movingStep = 1;     // Step size for smooth movement (e.g., 1 degree at a time)

Servo myServo; // Create a Servo object

int currentAngle = initialAngle; // Variable to keep track of the servo's current angle
bool buttonPressed = false;      // Flag to track button state
bool servoAt180 = false;         // Flag to track if the servo is at 180 degrees

void setup() {
  myServo.attach(servoPin); // Attaches the servo on the servoPin to the servo object
  pinMode(buttonPin, INPUT_PULLUP); // Set the button pin as input with internal pull-up resistor
  myServo.write(initialAngle);      // Set the servo to its initial angle
  Serial.begin(9600);              // Start serial communication for debugging
}

void loop() {
  // Read the state of the button
  int buttonState = digitalRead(buttonPin);

  // Check if the button is pressed (LOW because of INPUT_PULLUP) and it was not pressed before
  if (buttonState == LOW && !buttonPressed) {
    delay(50); // Debounce delay
    if (digitalRead(buttonPin) == LOW) { // Confirm button press after debounce
      buttonPressed = true; // Set flag to indicate button is currently pressed

      if (!servoAt180) {
        // Move servo to 180 degrees
        Serial.println("Moving to 180 degrees");
        for (int angle = currentAngle; angle <= targetAngle1; angle += movingStep) {
          myServo.write(angle);
          delay(15); // Adjust this delay for desired speed
        }
        currentAngle = targetAngle1;
        servoAt180 = true;
      } else {
        // Move servo to 0 degrees
        Serial.println("Moving to 0 degrees");
        for (int angle = currentAngle; angle >= targetAngle2; angle -= movingStep) {
          myServo.write(angle);
          delay(15); // Adjust this delay for desired speed
        }
        currentAngle = targetAngle2;
        servoAt180 = false;
      }
    }
  }

  // Reset buttonPressed flag when button is released
  if (buttonState == HIGH) {
    buttonPressed = false;
  }
}

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

এখনো কোনো সম্পদ নেই।

ফাইলসমূহ📁

ডেটাশিট (পিডিএফ)