Search Code

Bài 88: Điều khiển động cơ servo bằng hai công tắc nút nhấn

Bài 88: Điều khiển động cơ servo bằng hai công tắc nút nhấn

Dự án này trình bày cách điều khiển động cơ servo bằng hai nút nhấn với Arduino. Thay vì dựa vào chiết áp hoặc lệnh nối tiếp, bạn có thể sử dụng các công tắc cảm ứng đơn giản để di chuyển servo sang trái hoặc phải một cách thủ công. Điều này cực kỳ hữu ích cho các ứng dụng cần điều khiển vật lý trực tiếp một cơ cấu, chẳng hạn như chế tạo cánh tay robot, điều chỉnh gimbal camera hoặc tạo hệ thống xoay-nghiêng điều khiển từ xa. Các nút cho phép bạn điều chỉnh góc servo từng bước, với khả năng giữ nút để quét qua toàn bộ phạm vi chuyển động.

Dưới đây là một vài dự án thực tế bạn có thể xây dựng với thiết lập này:

  • Xây dựng bảng điều khiển thủ công cho cánh tay robot hoặc bộ kẹp.
  • Tạo thanh trượt camera hoặc đầu xoay-nghiêng điều khiển từ xa.
  • Phát triển giao diện điều khiển vật lý cho bánh lái máy bay mô hình hoặc thuyền.
  • Tạo một "bàn điều khiển dạy" đơn giản để ghi lại vị trí cho máy CNC hoặc máy in 3D.

Phần cứng và Linh kiện

Dự án này chỉ cần một vài linh kiện cơ bản, khiến nó trở thành điểm khởi đầu tuyệt vời để học về cả thiết bị đầu vào và đầu ra với Arduino.

  • Bo mạch Arduino (Uno, Nano, Mega, v.v.)
  • Động cơ servo (ví dụ: SG90 hoặc MG995)
  • Hai nút nhấn tạm thời
  • Dây jumper
  • Breadboard (tùy chọn nhưng được khuyến nghị)

Hướng dẫn Đấu dây

Trong video, việc đấu dây rất đơn giản. Chân tín hiệu của động cơ servo được kết nối với chân hỗ trợ PWM trên Arduino, là chân 9 trong ví dụ này. Nguồn và đất cho servo được kết nối với chân 5V và GND của Arduino. Hai nút nhấn được đấu dây tương tự nhau. Một chân của mỗi nút được kết nối với đất, và chân còn lại được kết nối với chân đầu vào kỹ thuật số trên Arduino (chân 2 cho nút "trái" và chân 3 cho nút "phải"). Mã sử dụng điện trở kéo lên nội bộ, vì vậy không cần điện trở ngoài cho các nút. (trong video tại 00:57)

Arduino wriing for Sevo motor with 2 push buttons
Arduino wriing for Sevo motor with 2 push buttons

Giải thích Mã

Mã được thiết kế để dễ dàng cấu hình. Các phần có thể tùy chỉnh chính nằm ở đầu sketch. Dưới đây là phân tích các biến và định nghĩa quan trọng bạn có thể muốn điều chỉnh cho dự án của riêng mình.

#include <Servo.h>

Servo myservo;  // tạo đối tượng servo để điều khiển servo
int servoPin = 9;// chân này phải là chân có PWM ~
int angle =90;    // góc ban đầu cho servo
int angleStep =5;

#define LEFT 2   // chân 2 được kết nối với nút trái
#define RIGHT  3  // chân 3 được kết nối với nút phải
  • servoPin: Biến này xác định chân Arduino mà dây tín hiệu của servo được kết nối. Điều quan trọng là phải sử dụng chân hỗ trợ Điều chế Độ rộng Xung (PWM), thường được ký hiệu bằng ký tự ~ trên bo mạch.
  • angle: Thiết lập góc ban đầu của servo khi Arduino khởi động. Giá trị mặc định là 90 độ, thường làm servo ở vị trí trung tâm.
  • angleStep: Đây là mức tăng mà góc servo thay đổi mỗi khi một nút được nhấn. Giá trị 5 nghĩa là mỗi lần nhấn sẽ di chuyển servo 5 độ. Bạn có thể tăng giá trị này để di chuyển nhanh hơn hoặc giảm để điều khiển chính xác hơn.
  • LEFTRIGHT: Các chỉ thị #define này gán các chân kỹ thuật số mà nút nhấn được kết nối. Nếu bạn đấu dây nút vào các chân khác, bạn phải thay đổi các giá trị này để khớp với thiết lập của mình.

Logic cốt lõi trong hàm loop() kiểm tra xem một nút có được nhấn không (bằng cách đọc tín hiệu LOW do cấu hình kéo lên). Nếu nút "phải" được nhấn, nó giảm biến angle đi angleStep. Nếu nút "trái" được nhấn, nó tăng angle. Mã bao gồm các kiểm tra ranh giới để đảm bảo góc nằm trong phạm vi 0 đến 180 độ. Hàm myservo.write(angle) sau đó được sử dụng để ra lệnh cho servo di chuyển đến vị trí mới.

Trình diễn Dự án Trực tiếp

Trong video trình diễn, chức năng được hiển thị rõ ràng. Nhấn và giữ nút "trái" làm servo quét mượt mà sang trái, với góc tăng thêm 5 độ mỗi lần, cho đến khi đạt 180 độ và dừng lại. Tương tự, nhấn và giữ nút "phải" làm servo quét trở lại bên phải, giảm góc cho đến khi đạt 0 độ. Góc hiện tại được in ra Serial Monitor, cho phép bạn thấy vị trí chính xác của servo theo thời gian thực. (trong video tại 05:20)

Chương Video

  • [00:00] Giới thiệu về điều khiển servo bằng nút
  • [00:57] Hướng dẫn đấu dây cho servo và nút nhấn
  • [02:12] Giải thích mã, phần 1: Thiết lập và cấu hình
  • [03:25] Giải thích mã, phần 2: Logic vòng lặp chính
  • [05:20] Trình diễn trực tiếp dự án
  • [06:23] Kết luận và các ứng dụng tiềm năng

Hình ảnh

2 pin tactile push button switch
2 pin tactile push button switch
SG90 Mini Servo Motor
SG90 Mini Servo Motor
SG90_servo_motor-1
SG90_servo_motor-1
SG90_servo_motor-0
SG90_servo_motor-0
Arduino wriing for Sevo motor with 2 push buttons
Arduino wriing for Sevo motor with 2 push buttons
891-Lesson 88: Servo control with 2 push buttons
Ngôn ngữ: C++
/*
 * S05-05 Servo control with 2 push buttons
 * Download and resource page https://robojax.com/RJT764
 Watch video on YouTube https://www.youtube.com/watch?v=J_kbyAY1rLM
 * 
 * Written by Ahmad Shamshiri for Robojax.com 
 * on Jan 15, 2019 at 19:15 in Ajax, Ontario, Canada

  
 * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.* 
 * This code has been download from Robojax.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
/*
 Controlling a servo with two Push buttons with Arduino
 when Left  push button is pressed, the servo start moving to the left until it reaches 180( or zero) degrees
 when Right  push button is pressed, the servo start moving to the right until it reaches 180( or zero) degrees
At any instance if the button is released, servo stops

*/

#include <Servo.h>

Servo myservo;  // create servo object to control a servo
int servoPin = 9;// this pin must be of those with PWM ~
int angle =90;    // initial angle  for servo
int angleStep =5;

#define LEFT 2   // pin 2 is connected to left button
#define RIGHT  3  // pin 3 is connected to right button

void setup() {
  // Servo button demo by Robojax.com
  Serial.begin(9600);          //  setup serial
  myservo.attach(servoPin);  // attaches the servo on pin 9 to the servo object
  pinMode(LEFT,INPUT_PULLUP); // assign pin 12 ass input for Left button
  pinMode(RIGHT,INPUT_PULLUP);// assing pin 2 as input for right button
  myservo.write(angle);// send servo to the middle at 90 degrees
 Serial.println("Robojax Servo 2 Buttons ");
}

void loop() {
  // Servo button demo by Robojax.com
  while(digitalRead(RIGHT) == LOW){

    if (angle > 0 && angle <= 180) {
      angle = angle - angleStep;
       if(angle < 0){
        angle = 0;
       }else{
      myservo.write(angle); // move the servo to desired angle
      Serial.print("Moved to: ");
      Serial.print(angle);   // print the angle
      Serial.println(" degree");
       }
    }
    
  delay(100); // waits for the servo to get there
  }// while
 // Servo button demo by Robojax.com

  while(digitalRead(LEFT) == LOW){

    // Servo button demo by Robojax.com
    if (angle >= 0 && angle <= 180) {
      angle = angle + angleStep;
      if(angle >180){
        angle =180;
       }else{
      myservo.write(angle); // move the servo to desired angle
      Serial.print("Moved to: ");
      Serial.print(angle);   // print the angle
      Serial.println(" degree");
       }
    }
    
  delay(100); // waits for the servo to get there
  }// 

  
}

Tập tin📁

Các tập tin khác