Search Code

Bài 89: Sử dụng động cơ Servo liên tục hoặc 360 | Khóa học Arduino Từng Bước

Bài 89: Sử dụng động cơ Servo liên tục hoặc 360 | Khóa học Arduino Từng Bước

Bạn đã bao giờ muốn quay một động cơ theo cả hai hướng trong thời gian tùy ý, thay vì chỉ quét qua lại như một servo tiêu chuẩn? Đây chính xác là những gì động cơ servo liên tục hoặc 360 độ mang lại. Không giống như servo tiêu chuẩn di chuyển đến một góc cụ thể (thường là 0 đến 180 độ), servo liên tục quay không ngừng theo chiều kim đồng hồ hoặc ngược chiều kim đồng hồ. Điều này làm cho nó hoàn hảo để chế tạo robot nhỏ, bệ camera, hoặc bất kỳ dự án nào yêu cầu điều khiển xoay liên tục.

Trong dự án này, chúng ta sẽ xây dựng một hệ thống điều khiển cho servo 360 độ chỉ bằng ba nút nhấn. Bạn sẽ có thể ra lệnh cho servo quay theo chiều kim đồng hồ, ngược chiều kim đồng hồ, hoặc dừng lại bất cứ lúc nào. Hướng dẫn này sẽ hướng dẫn bạn cách đấu dây, giải thích các phần có thể tùy chỉnh của mã, và cho bạn xem một buổi trình diễn trực tiếp của hệ thống hoạt động.

Dưới đây là một vài ý tưởng thực tế để sử dụng servo liên tục trong các dự án của riêng bạn:

  • Chế tạo robot hai bánh nhỏ: Sử dụng hai servo liên tục để dẫn động bánh xe, cho phép di chuyển tiến, lùi và rẽ.
  • Tạo giá đỡ camera xoay nghiêng: Sử dụng một servo liên tục để xoay toàn cảnh chậm, không ngừng cho camera an ninh hoặc động vật hoang dã.
  • Tự động hóa băng tải: Điều khiển một hệ thống băng tải nhỏ để phân loại hoặc phân phối vật phẩm.
  • Thiết kế giá trưng bày xoay: Trưng bày mô hình 3D hoặc sản phẩm trên một bệ xoay liên tục.

Phần cứng cần thiết

  • Bo mạch Arduino (Uno, Nano, v.v.)
  • Động cơ servo liên tục (360 độ) (ví dụ: FS90R, DS04-NFC)
  • 3x Nút nhấn
  • Dây jumper
  • Breadboard

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

Việc đấu dây cho dự án này khá đơn giản. Động cơ servo có ba dây: thường là một dây màu tối cho nối đất (GND), một dây ở giữa (thường màu đỏ) cho nguồn (5V), và một dây màu sáng hơn (cam, vàng hoặc trắng) cho tín hiệu. Như được hiển thị trong video, servo được đấu với Arduino như sau:

  • Dây nối đất của servo (dây màu tối): Kết nối với chân GND của Arduino.
  • Dây nguồn của servo (dây giữa/màu đỏ): Kết nối với chân 5V của Arduino.
  • Dây tín hiệu của servo (dây màu sáng): Kết nối với chân 9 của Arduino.

Đối với ba nút nhấn, mỗi nút có hai phía. Một phía của tất cả các nút được kết nối với nhau và sau đó đến chân GND của Arduino. Phía còn lại của mỗi nút được kết nối với một chân kỹ thuật số riêng biệt, như được mô tả dưới đây (trong video ở phút 03:40):

  • Nút theo chiều kim đồng hồ (CW): Kết nối với chân 2 của Arduino.
  • Nút dừng: Kết nối với chân 3 của Arduino.
  • Nút ngược chiều kim đồng hồ (CCW): Kết nối với chân 4 của Arduino.
360_Serrvo_3_push_button_wiring

Giải thích mã

Mã được thiết kế để dễ dàng cấu hình. Phần quan trọng nhất bạn cần điều chỉnh là mảng sc[], chứa các giá trị PWM cụ thể được gửi đến servo để điều khiển hành động của nó. Các giá trị này không phổ quát và phải được hiệu chỉnh cho động cơ servo cụ thể của bạn (trong video ở phút 12:23).

int sc[]={106, 58, 0};// lệnh servo theo thứ tự
        //CCW, DỪNG, CW

Mảng này là trung tâm của việc hiệu chỉnh. Các giá trị được sử dụng theo thứ tự này:

  • sc[0] = 106: Giá trị này được gửi để làm servo quay ngược chiều kim đồng hồ.
  • sc[1] = 58: Đây là giá trị "dừng". Do mạch điện bên trong, giá trị chính xác làm động cơ dừng khác nhau. Bạn có thể thấy servo của mình vẫn quay chậm ngay cả khi lệnh này được gửi, và bạn sẽ cần điều chỉnh con số này một chút để tìm giá trị "dừng hoàn toàn" thực sự cho động cơ của mình.
  • sc[2] = 0: Giá trị này làm servo quay theo chiều kim đồng hồ ở tốc độ tối đa.

Bạn có thể điều chỉnh các giá trị trong mảng sc[] để thay đổi tốc độ quay. Ví dụ, đặt sc[0] thành 70 sẽ làm cho vòng quay ngược chiều kim đồng hồ chậm hơn. Giá trị càng gần với giá trị "dừng" (58), động cơ sẽ quay càng chậm theo hướng đó. Các giá trị càng xa 58 sẽ tăng tốc độ lên đến giới hạn tối đa.

Cũng có một vài biến quan trọng khác bạn có thể cần sửa đổi. servoPin được đặt là 9, chân này phải là chân hỗ trợ PWM trên Arduino của bạn. Các chân nút được định nghĩa ở đầu mã và có thể thay đổi nếu cần.

int servoPin = 9;// chân này phải là một trong những chân có PWM ~

#define STOPpin 3 // chân nút nhấn cho DỪNG
#define CWpin 2 //  chân nút nhấn cho CW
#define CCWpin 4 // chân nút nhấn cho CCW

Cuối cùng, mảng scText[] chứa các chuỗi được in ra Serial Monitor để gỡ lỗi. Bạn có thể thay đổi chúng nếu muốn hiển thị các thông báo khác.

Cách sử dụng mã

Tải mã được cung cấp lên bo mạch Arduino của bạn. Mở Serial Monitor (đặt ở tốc độ 9600 baud) để xem các thông báo trạng thái. Bây giờ bạn có thể điều khiển servo bằng ba nút:

  • Nhấn và giữ nút CW: Servo sẽ bắt đầu quay theo chiều kim đồng hồ. Serial Monitor sẽ hiển thị "CW" và giá trị đang được gửi.
  • Nhấn và giữ nút CCW: Servo sẽ bắt đầu quay ngược chiều kim đồng hồ. Serial Monitor sẽ hiển thị "CCW" và giá trị đang được gửi.
  • Nhấn nút Dừng: Servo sẽ cố gắng dừng lại. Serial Monitor sẽ hiển thị "Stop".

Nếu servo của bạn không dừng hoàn toàn khi nhấn nút Stop, bạn sẽ cần hiệu chỉnh giá trị sc[1] trong mảng sc[]. Hãy thử thay đổi giá trị một chút (ví dụ: từ 58 xuống 54 hoặc 52) và tải lại mã cho đến khi động cơ đứng yên hoàn toàn.

Trình diễn trực tiếp

Trong video, người thuyết trình trình diễn toàn bộ hệ thống. Bạn có thể thấy servo xoay theo cả hai hướng dựa trên các lần nhấn nút. Đầu ra của Serial Monitor cũng được hiển thị, cho thấy trạng thái hiện tại ("CW", "Stop" hoặc "CCW") và giá trị cụ thể đang được gửi đến servo. Đây là công cụ tuyệt vời để gỡ lỗi và tìm giá trị hiệu chỉnh hoàn hảo cho động cơ cụ thể của bạn. Phần trình diễn cũng cho thấy việc điều chỉnh các giá trị trong mảng sc[] ảnh hưởng trực tiếp đến tốc độ của động cơ, từ chuyển động chậm rãi đến tốc độ quay tối đa.

Kết luận

Dự án này cung cấp một cách đơn giản và hiệu quả để điều khiển động cơ servo liên tục. Bằng cách hiểu quy trình hiệu chỉnh giá trị "dừng", bạn có thể đảm bảo điều khiển chính xác trong các dự án robot và tự động hóa của riêng mình.

Chương mục video

  • [00:05] Giới thiệu về Động cơ Servo Liên tục
  • [02:02] Tổng quan phần cứng của Servo
  • [02:40] Sơ đồ đấu dây và kết nối
  • [05:07] Giải thích mã: Biến và Thiết lập
  • [08:03] Giải thích mã: Logic vòng lặp chính
  • [09:56] Hàm servoCommand()
  • [10:54] Trình diễn trực tiếp và đầu ra Serial Monitor
  • [12:23] Hiệu chỉnh tốc độ Servo và giá trị dừng

Hình ảnh

360_Serrvo_3_push_button_wiring
360_Serrvo_3_push_button_wiring
209-How to control a 360 servo with push buttons
Ngôn ngữ: C++
++
/*
 *  S05-13 Servo with 3 push buttons
 *  Demonstration of Controlling a Continuous Servo (360 servo)
 *  This code allows you to control a 360-degree servo using push buttons
 *
 * Modified by Ahmad Shamshiri for Robojax Robojax.com
 * on Jan 17, 2019 at 22:42 in Ajax, Ontario, Canada
 Watch the video instruction for this sketch: https://youtu.be/hVe4TSRV4ww

 Watch Introduction to  360 Servo video with code: https://youtu.be/b_xvu6wWafA
 You can get the wiring diagram from my Arduino Course at Udemy.com
 Learn Arduino step by step with all libraries, codes, and wiring diagrams all in one place
 visit my course now http://robojax.com/L/?id=62

 If you found this tutorial helpful, please support me so I can continue creating
 content like this. 
 or make a donation using PayPal http://robojax.com/L/?id=64

 Original code by BARRAGAN <http://barraganstudio.com>
 *
 * Code is available at http://robojax.com/learn/arduino

 * 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 downloaded 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/>.

*/

#include <Servo.h>

Servo myservo;  // create servo object to control a servo
// twelve servo objects can be created on most boards

int servoPin = 9;// this pin must be one of those with PWM ~


#define STOPpin 3 // push button pin  for STOP
#define CWpin 2 //  push button for CW
#define CCWpin 4 // push button for CCW

int sc[]={106, 58, 0};// servo commands are in order
        //CCW, STOP,CW

String scText[]={"CCW","Stop","CW"};// define texts for 3 actions
int statusText;
int CWBS, CCWBS, SBS;
      //CW button status (CWBS)
      //CCW button status (CCWBS)
      //stop button status (SBS)

void setup() {
  Serial.begin(9600);
  pinMode(STOPpin,INPUT_PULLUP);// set pin for push button STOP
  pinMode(CCWpin,INPUT_PULLUP);// set pin for push button CCW
  pinMode(CWpin,INPUT_PULLUP);// set pin for push button CW

  myservo.attach(servoPin);  // attaches the servo on pin 9 to the servo object
  myservo.write(sc[1]);// send STOP command
  statusText=1;// initial value is STOP
}



void loop() {

    CCWBS = digitalRead(CCWpin);// read status of button CCW
    SBS = digitalRead(STOPpin);// read status of button STOP
    CWBS = digitalRead(CWpin);// read status of button CW

    if(CCWBS ==LOW)
    {
      servoCommand(0);
    }else if(SBS ==LOW)
    {
      servoCommand(1);
    }else if(CWBS ==LOW)
    {
      servoCommand(2);
    }

  Serial.println(scText[statusText]);
  delay(50);
}// loop



void servoCommand(int n)
{
   statusText = n;
   myservo.write(sc[n]);
   Serial.print("Going to  ");
   Serial.print(scText[n]);
   Serial.print( "(");
   Serial.print(sc[n]);
   Serial.println(")");
}

Nghĩ bạn có thể cần

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

Tập tin📁

Các tập tin khác