This tutorial is part of: Động cơ servo
Tất cả các video liên quan đến động cơ servo đều được liệt kê ở đây. Các liên kết đến các video khác nằm bên dưới bài viết này.
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.
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 độ.
- 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.
- 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.
This tutorial is part of: Động cơ servo
- Controlling a Servo with Push Buttons Using Arduino
- Control a Servo Motor with a Push Button: Move Servo and Return SPB-1
- Control a Servo Motor with a Push Button: Move Servo in One Direction SPB-2
- Controlling a Servo Motor with a Push Button: Move Servo While Button Is Pressed (SPB-3)
- Controlling a Servo with a Potentiometer Using Arduino
- Controlling a Servo with Potentiometer and LCD1602 using Arduino
- Controlling Servo Motors Using an Infrared Remote with Arduino
- Điều khiển động cơ servo Arduino bằng cách sử dụng biến trở
- Điều khiển vị trí servo bằng cử chỉ tay cho Arduino
- Controlling Two or More Servos with Potentiometers Using an Arduino
- How to Control a 360° Servo with Three Push-Button Switches
- Cách sử dụng Servo 360° liên tục với Arduino
- Arduino Code and Video for PCA9685 16-Channel 12-Bit Servo Controller V1
/*
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)
-
sg90_serveo_motor_datasheet
sg90_serveo_motor_datasheet.pdf0.13 MB