Search Code

Xây dựng Công tắc Bật/Tắt Servo Arduino với Nút Nhấn

Xây dựng Công tắc Bật/Tắt Servo Arduino với Nút Nhấn

Xây dựng Công tắc Chuyển đổi Servo Arduino bằng Nút Nhấn

Hướng dẫn dự án này sẽ chỉ cho bạn cách tạo một mạch đơn giản nhưng cực kỳ hữu ích: một động cơ servo chuyển đổi giữa hai vị trí với mỗi lần nhấn một nút bấm duy nhất. Ở lần nhấn đầu tiên, servo sẽ quét mượt mà từ 0 đến 180 độ. Ở lần nhấn thứ hai, nó sẽ quét ngược lại từ 180 về 0 độ. Đây là một khái niệm cơ bản trong robot và tự động hóa, hoàn hảo để tạo ra các cơ chế như chốt cửa tự động, cánh tay robot đơn giản, máy vẫy cờ, hoặc bất kỳ dự án nào yêu cầu hành động vật lý hai trạng thái.

Chúng tôi sẽ hướng dẫn chi tiết về phần cứng cần thiết, cách đấu dây và giải thích chi tiết về mã Arduino giúp mọi thứ hoạt động.


Phần cứng và Đấu dây

Các linh kiện cho dự án này rất tối giản và phổ biến trong hầu hết các bộ khởi động Arduino. Bạn sẽ cần một bo mạch Arduino (như Uno), một động cơ servo tiêu chuẩn (ví dụ: SG90), một nút nhấn và vài dây jumper.

Việc đấu dây rất đơn giản. Các chân nguồn và nối đất của servo kết nối với chân 5V và GND của Arduino, trong khi dây tín hiệu của nó kết nối với một chân hỗ trợ PWM (chân 9 trong mã của chúng tôi). Nút nhấn kết nối giữa chân kỹ thuật số 2 và GND.

Sơ đồ đấu dây kết nối động cơ servo và nút nhấn với Arduino.

Giải thích Mã Arduino

Chương trình sử dụng thư viện Servo.h tiêu chuẩn, được tích hợp sẵn trong Arduino IDE. Mã được thiết kế sạch sẽ và dễ hiểu, sử dụng các cờ để theo dõi trạng thái của servo và vòng lặp `for` để tạo chuyển động quét mượt mà.

Biến Toàn cục và Cấu hình

Ở đầu mã, chúng ta định nghĩa các chân và hành vi của servo. Đây là những giá trị chính bạn có thể muốn tùy chỉnh cho dự án của mình.


#include <Servo.h>

// Định nghĩa biến cho chân servo và nút bấm
const int servoPin = 9;   // Kết nối dây tín hiệu servo với chân kỹ thuật số 9
const int buttonPin = 2;  // Kết nối nút nhấn với chân kỹ thuật số 2

// Định nghĩa tham số chuyển động của servo
const int initialAngle = 0;   // Góc bắt đầu của servo
const int targetAngle1 = 180; // Góc mục tiêu đầu tiên
const int targetAngle2 = 0;   // Góc mục tiêu thứ hai
const int movingStep = 1;     // Kích thước bước cho chuyển động mượt (1 độ mỗi lần)

Servo myServo; // Tạo một đối tượng Servo

// Biến theo dõi trạng thái
int currentAngle = initialAngle;
bool buttonPressed = false;
bool servoAt180 = false;
  • servoPin: Chân kết nối với dây tín hiệu của servo. Chân này phải là chân PWM (được đánh dấu bằng `~` trên hầu hết các bo mạch Arduino).
  • buttonPin: Chân mà nút nhấn được kết nối.
  • initialAngle, targetAngle1, targetAngle2: Các giá trị này xác định điểm bắt đầu và kết thúc của chuyển động servo.
  • movingStep: Điều này kiểm soát số độ servo di chuyển trong mỗi bước của vòng lặp. Số nhỏ hơn tạo ra chuyển động mượt mà hơn, chậm hơn.

Hàm `setup()`

Hàm setup() chạy một lần khi Arduino được cấp nguồn. Nó khởi tạo servo, cấu hình chân nút bấm và đặt servo về vị trí bắt đầu.


void setup() {
  myServo.attach(servoPin); // Gắn servo vào chân của nó
  pinMode(buttonPin, INPUT_PULLUP); // Đặt chân nút bấm làm đầu vào với điện trở kéo lên nội bộ
  myServo.write(initialAngle);      // Di chuyển servo đến vị trí ban đầu
  Serial.begin(9600);               // Bắt đầu serial để gỡ lỗi
}

Chúng tôi sử dụng INPUT_PULLUP cho chân nút bấm. Điều này kích hoạt một điện trở nội bộ trong Arduino, giữ trạng thái của chân ở mức CAO khi nút không được nhấn. Khi nút được nhấn, nó kết nối chân với đất, làm cho trạng thái ở mức THẤP. Tính năng hữu ích này có nghĩa là bạn không cần thêm điện trở kéo lên bên ngoài vào mạch của mình.

Vòng lặp `loop()` - Logic Cốt lõi

Vòng lặp chính liên tục kiểm tra việc nhấn nút. Khi phát hiện một lần nhấn, nó di chuyển servo đến vị trí mục tiêu tiếp theo.


void loop() {
  // Đọc trạng thái của nút
  int buttonState = digitalRead(buttonPin);

  // Kiểm tra nếu nút được nhấn (THẤP) và nó chưa được giữ trước đó
  if (buttonState == LOW && !buttonPressed) {
    delay(50); // Độ trễ chống nhiễu để ngăn kích hoạt nhiều lần
    if (digitalRead(buttonPin) == LOW) { // Kiểm tra lại trạng thái nút
      buttonPressed = true; // Đánh dấu nút đã được nhấn

      if (!servoAt180) {
        // Nếu chưa ở 180, di chuyển đến 180
        for (int angle = currentAngle; angle <= targetAngle1; angle += movingStep) {
          myServo.write(angle);
          delay(15); // Độ trễ giữa các bước để kiểm soát tốc độ
        }
        currentAngle = targetAngle1;
        servoAt180 = true; // Cập nhật trạng thái
      } else {
        // Nếu đang ở 180, di chuyển ngược về 0
        for (int angle = currentAngle; angle >= targetAngle2; angle -= movingStep) {
          myServo.write(angle);
          delay(15);
        }
        currentAngle = targetAngle2;
        servoAt180 = false; // Cập nhật trạng thái
      }
    }
  }

  // Đặt lại cờ nhấn nút khi nút được nhả ra
  if (buttonState == HIGH) {
    buttonPressed = false;
  }
}

Mã sử dụng một cờ boolean, servoAt180, để ghi nhớ vị trí cuối cùng của servo. Khi nút được nhấn, nó kiểm tra cờ này: nếu servo không ở 180 độ, nó sẽ di chuyển đến đó; ngược lại, nó sẽ di chuyển về 0. Các vòng lặp for tạo ra chuyển động quét mượt mà, di chuyển servo từng độ một với một khoảng trễ nhỏ giữa mỗi bước.


Cách Hoạt Động

Khi bạn tải mã lên và cấp nguồn cho Arduino, servo sẽ di chuyển đến vị trí ban đầu 0 độ.

  1. Lần Nhấn Đầu Tiên: Khi bạn nhấn nút, mã sẽ phát hiện tín hiệu đầu vào và bắt đầu di chuyển servo từ 0 đến 180 độ, từng độ một.
  2. Lần Nhấn Thứ Hai: Sau khi servo đã đạt 180 độ, lần nhấn nút tiếp theo sẽ khiến nó quét ngược từ 180 về 0 độ.

Chu kỳ này sẽ lặp lại với mỗi lần nhấn nút tiếp theo, tạo ra một cơ chế chuyển đổi đáng tin cậy và dễ dự đoán cho dự án của bạn.

787-Servo with Push button each push moves the servo to final position and stop SPB-180
Ngôn ngữ: 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;
  }
}

Tài nguyên & tài liệu tham khảo

Chưa có tài nguyên nào.

Tập tin📁

Bảng dữ liệu (pdf)