코드 검색

레슨 89: 연속 또는 360 서보 모터 사용하기 | Arduino 단계별 강좌

레슨 89: 연속 또는 360 서보 모터 사용하기 | Arduino 단계별 강좌

표준 서보모터처럼 앞뒤로만 움직이는 대신, 모터를 원하는 방향으로 원하는 시간만큼 회전시키고 싶었던 적이 있나요? 이것이 바로 연속 회전 또는 360도 서보모터가 제공하는 기능입니다. 특정 각도(일반적으로 0~180도)로 움직이는 표준 서보모터와 달리, 연속 서보모터는 시계 방향 또는 반시계 방향으로 끝없이 회전합니다. 따라서 소형 로봇, 카메라 플랫폼 또는 연속 회전 제어가 필요한 모든 프로젝트에 완벽합니다.

이 프로젝트에서는 세 개의 푸시 버튼만 사용하여 360도 서보모터용 제어 시스템을 구축합니다. 버튼을 통해 서보모터를 시계 방향, 반시계 방향으로 회전시키거나 언제든지 정지시킬 수 있습니다. 이 가이드에서는 배선 방법을 안내하고, 코드에서 사용자가 설정할 수 있는 부분을 설명하며, 시스템이 작동하는 라이브 데모를 보여드립니다.

연속 서보모터를 자신의 프로젝트에 활용할 수 있는 몇 가지 실용적인 아이디어는 다음과 같습니다:

  • 소형 2륜 로봇 제작: 두 개의 연속 서보모터로 바퀴를 구동하여 전진, 후진 및 회전 동작을 구현합니다.
  • 팬틸트 카메라 마운트 제작: 보안 카메라나 야생동물 관찰 카메라의 느리고 끝없는 패닝에 연속 서보모터 하나를 사용합니다.
  • 컨베이어 벨트 자동화: 물품 분류 또는 배출을 위한 소형 컨베이어 시스템을 제어합니다.
  • 회전 디스플레이 스탠드 설계: 3D 모델이나 제품을 연속적으로 회전하는 플랫폼에 전시합니다.

필요한 하드웨어

  • Arduino 보드 (Uno, Nano 등)
  • 연속(360도) 서보모터 (예: FS90R, DS04-NFC)
  • 푸시 버튼 3개
  • 점퍼 와이어
  • 브레드보드

배선 가이드

이 프로젝트의 배선은 간단합니다. 서보모터에는 일반적으로 접지(GND)용 어두운 색 선, 전원(5V)용 중간(보통 빨간색) 선, 신호용 밝은 색(주황색, 노란색 또는 흰색) 선의 세 가닥이 있습니다. 비디오에 표시된 대로 서보모터는 다음과 같이 Arduino에 연결됩니다:

  • 서보 접지(어두운 선): Arduino GND에 연결합니다.
  • 서보 전원(중간/빨간색 선): Arduino 5V에 연결합니다.
  • 서보 신호(밝은 선): Arduino 핀 9에 연결합니다.

세 개의 푸시 버튼의 경우, 각 버튼에는 양쪽에 두 개의 단자가 있습니다. 모든 버튼의 한쪽 단자는 서로 연결된 후 Arduino GND에 연결됩니다. 각 버튼의 다른 쪽 단자는 아래 설명과 같이 별도의 디지털 핀에 연결됩니다(비디오 03:40 참조):

  • 시계 방향(CW) 버튼: Arduino 핀 2에 연결합니다.
  • 정지 버튼: Arduino 핀 3에 연결합니다.
  • 반시계 방향(CCW) 버튼: Arduino 핀 4에 연결합니다.
360 servo 3 push button wiring

코드 설명

코드는 쉽게 설정할 수 있도록 설계되었습니다. 가장 중요한 부분은 서보모터의 동작을 제어하기 위해 전송되는 특정 PWM 값을 담고 있는 sc[] 배열입니다. 이 값은 보편적이지 않으며 사용자의 특정 서보모터에 맞게 보정해야 합니다(비디오 12:23 참조).

int sc[]={106, 58, 0};// 서보 명령은 순서대로
        //CCW, STOP,CW

이 배열은 보정의 핵심입니다. 값은 다음 순서로 사용됩니다:

  • sc[0] = 106: 이 값은 서보모터를 반시계 방향으로 회전시키기 위해 전송됩니다.
  • sc[1] = 58: 이 값은 "정지" 값입니다. 내부 회로로 인해 모터를 정지시키는 정확한 값은 서보모터마다 다릅니다. 이 명령을 보내도 서보모터가 천천히 회전할 수 있으며, 실제 "완전 정지" 값을 찾으려면 이 숫자를 약간 조정해야 할 수 있습니다.
  • sc[2] = 0: 이 값은 서보모터를 최대 속도로 시계 방향으로 회전시킵니다.

sc[] 배열의 값을 조정하여 회전 속도를 변경할 수 있습니다. 예를 들어, sc[0]을 70으로 설정하면 반시계 방향 회전이 더 느려집니다. 값이 "정지" 값(58)에 가까울수록 해당 방향으로 모터가 더 천천히 회전합니다. 58에서 멀어질수록 최대 한도까지 속도가 증가합니다.

수정해야 할 다른 주요 변수도 몇 가지 있습니다. servoPin은 9로 설정되어 있으며, 이는 Arduino에서 PWM을 지원하는 핀이어야 합니다. 버튼 핀은 코드 상단에 정의되어 있으며 필요에 따라 변경할 수 있습니다.

int servoPin = 9;// 이 핀은 PWM ~ 기능이 있는 핀이어야 합니다.

#define STOPpin 3 // 정지용 푸시 버튼 핀
#define CWpin 2 //  CW용 푸시 버튼
#define CCWpin 4 // CCW용 푸시 버튼

마지막으로, scText[] 배열은 디버깅을 위해 시리얼 모니터에 출력되는 문자열을 담고 있습니다. 다른 메시지를 표시하려면 이 값을 변경할 수 있습니다.

코드 사용 방법

제공된 코드를 Arduino 보드에 업로드합니다. 시리얼 모니터(9600 baud로 설정)를 열어 상태 메시지를 확인합니다. 이제 세 개의 버튼으로 서보모터를 제어할 수 있습니다:

  • CW 버튼을 길게 누르기: 서보모터가 시계 방향으로 회전하기 시작합니다. 시리얼 모니터에 "CW"와 전송 중인 값이 표시됩니다.
  • CCW 버튼을 길게 누르기: 서보모터가 반시계 방향으로 회전하기 시작합니다. 시리얼 모니터에 "CCW"와 전송 중인 값이 표시됩니다.
  • 정지 버튼 누르기: 서보모터가 정지하려고 시도합니다. 시리얼 모니터에 "Stop"이 표시됩니다.

서보 모터가 정지 버튼을 눌렀을 때 완전히 멈추지 않으면 sc[] 배열의 sc[1] 값을 보정해야 합니다. 값을 약간 변경하고(예: 58에서 54 또는 52로) 모터가 완전히 멈출 때까지 코드를 다시 업로드해 보세요.

실시간 데모

영상에서 발표자는 전체 시스템을 시연합니다. 버튼 입력에 따라 서보가 양방향으로 회전하는 것을 볼 수 있습니다. 또한 시리얼 모니터 출력이 표시되어 현재 상태("CW", "Stop" 또는 "CCW")와 서보로 전송되는 특정 값을 보여줍니다. 이는 디버깅과 특정 모터에 맞는 완벽한 보정 값을 찾는 데 매우 유용한 도구입니다. 데모에서는 sc[] 배열의 값을 조정하면 모터 속도가 느린 움직임부터 최대 회전 속도까지 어떻게 직접적으로 영향을 받는지도 보여줍니다.

결론

이 프로젝트는 연속 회전 서보 모터를 제어하는 간단하고 효과적인 방법을 제공합니다. "정지" 값의 보정 과정을 이해하면 자신만의 로봇 공학 및 자동화 프로젝트에서 정밀한 제어를 보장할 수 있습니다.

비디오 챕터

  • [00:05] 연속 회전 서보 모터 소개
  • [02:02] 서보 하드웨어 개요
  • [02:40] 배선도 및 연결
  • [05:07] 코드 설명: 변수 및 설정
  • [08:03] 코드 설명: 메인 루프 로직
  • [09:56] servoCommand() 함수
  • [10:54] 실시간 데모 및 시리얼 모니터 출력
  • [12:23] 서보 속도 및 정지 값 보정

이미지

360 servo 3 push button wiring
360 servo 3 push button wiring
209-How to control a 360 servo with push buttons
언어: 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(")");
}

필요할 수 있는 것들

자원 및 참고자료

파일📁

다른 파일들