산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

Arduino로 서보 모터를 제어하는 ​​방법 – 전체 가이드

<메인 클래스="사이트 메인" id="메인">

이 튜토리얼에서는 서보 모터의 작동 방식을 배웁니다. Arduino로 서보 모터를 제어하는 ​​방법 . 서보 모터는 사용하기 쉽고 뛰어난 위치 제어 기능을 제공하기 때문에 많은 Arduino 프로젝트에서 널리 사용되며 널리 사용됩니다.

서보는 로봇 공학 프로젝트, 자동화, RC 모델 등에 탁월한 선택입니다. 이미 많은 Arduino 프로젝트에서 사용했으며 여기에서 일부를 확인할 수 있습니다.

다음 비디오를 보거나 아래에 작성된 튜토리얼을 읽을 수 있습니다. Arduino와 함께 서보 모터를 사용하는 방법, 배선도 및 코드에 대한 몇 가지 예가 포함되어 있습니다. 또한 PCA9685 PWM 드라이버를 사용하여 Arduino로 여러 서보 모터를 제어하는 ​​방법에 대한 가이드가 있습니다.

서보 모터란 무엇입니까?

서보 모터는 위치 피드백을 사용하여 모션과 최종 위치를 제어하는 ​​폐쇄 루프 시스템입니다. 서보 모터에는 여러 종류가 있으며 주요 특징은 샤프트의 위치를 ​​정밀하게 제어하는 ​​기능입니다.

산업용 서보 모터에서 위치 피드백 센서는 일반적으로 고정밀 인코더인 반면, 소형 RC 또는 취미 서보에서 위치 센서는 일반적으로 단순한 전위차계입니다. 이러한 장치에 의해 캡처된 실제 위치는 목표 위치와 비교되는 오류 감지기로 피드백됩니다. 그런 다음 컨트롤러는 오류에 따라 목표 위치와 일치하도록 모터의 실제 위치를 수정합니다.

이 튜토리얼에서는 취미 서보 모터에 대해 자세히 살펴보겠습니다. 이러한 서보의 작동 원리와 Arduino를 사용하여 서보를 제어하는 ​​방법을 설명합니다.

취미 서보는 RC 장난감 자동차, 보트, 비행기 등을 제어하는 ​​데 사용되는 작은 크기의 액츄에이터입니다. 또한 로봇 공학의 프로토타이핑, 로봇 팔 제작, 생물학적 영감을 받은 로봇, 휴머노이드 로봇 등을 만들기 위해 공학도가 사용합니다.

서보 모터의 작동 원리

취미 서보 내부에는 DC 모터, 기어박스, 전위차계 및 제어 회로의 네 가지 주요 구성 요소가 있습니다. DC 모터는 고속 및 저토크이지만 기어박스는 속도를 약 60RPM으로 감소시킴과 동시에 토크를 증가시킵니다.

포텐셔미터는 최종 기어나 출력축에 부착되어 있어 모터가 회전함에 따라 포텐셔미터도 함께 회전하여 출력축의 절대각에 해당하는 전압을 발생시킨다. 제어 회로에서 이 전위차계 전압은 신호 라인에서 나오는 전압과 비교됩니다. 필요한 경우 컨트롤러는 두 신호의 차이가 0에 도달할 때까지 모터가 어느 방향으로든 회전할 수 있도록 하는 통합 H-브리지를 활성화합니다.

서보 모터는 신호 라인을 통해 일련의 펄스를 전송하여 제어됩니다. 제어 신호의 주파수는 50Hz이거나 20ms마다 펄스가 발생해야 합니다. 펄스의 폭은 서보의 각도 위치를 결정하며 이러한 유형의 서보는 일반적으로 180도 회전할 수 있습니다(이동의 물리적 한계가 있음).

일반적으로 1ms 지속 시간의 펄스는 0도 위치에 해당하고 1.5ms 지속 시간은 90도 및 2ms ~ 180도에 해당합니다. 펄스의 최소 및 최대 지속 시간은 브랜드마다 다를 수 있지만 0도의 경우 0.5ms, 180도의 경우 2.5ms가 될 수 있습니다.

Arduino 프로젝트를 위한 인기 있는 RC / 취미 서보

RC 또는 취미에는 다양한 모델과 제조업체가 있습니다. 서보 모터를 선택할 때 주요 고려 사항은 토크, 작동 전압, 전류 소모 및 크기입니다.

다음은 제조사들 사이에서 가장 인기 있는 두 가지 서보 모델인 SG90 Micro Servo와 MG996R입니다.

SG90 마이크로 서보 기술 사양:

스톨 토크 1.2kg·cm @4.8V, 1.6kg·cm @6V,
작동 전압 3.5 – 6V
현재 부하 없음 100mA
현재 중단 650mA
최대 속도 60도(0.12초)
무게 9g

MG996R 서보 기술 사양:

스톨 토크 11kg.cm @4.8v, 13kg.cm @6V
작동 전압 4.8 – 7.2V
현재 부하 없음 220mA @4.8V, 250mA @6V
현재 중단 650mA
최대 속도 60도(0.20초)
무게 55g

Arduino 서보 모터 제어

아두이노를 이용하여 취미용 서보를 제어하는 ​​실제 예를 테스트하고 만들어 봅시다. 스톨 토크가 10kg-cm인 메탈 기어링이 특징인 하이 토크 서보인 MG996R을 사용하겠습니다. 높은 토크에는 대가가 따르며 서보의 스톨 전류는 2.5A입니다. 작동 전류는 500mA ~ 900mA이고 작동 전압은 4.8 ~ 7.2V입니다.

현재 정격에 따르면 이 서보를 Arduino에 직접 연결할 수는 없지만 별도의 전원 공급 장치를 사용해야 합니다.

회로도

다음은 이 예의 회로도입니다.

서보의 제어 핀을 Arduino 보드의 디지털 핀에 연결하고 접지와 양극을 외부 5V 전원 공급 장치에 연결하고 Arduino 접지도 서보 접지에 연결하기만 하면 됩니다.

더 작은 취미용 서보인 S90 Micro Servo를 사용하는 경우 5V Arduino 핀에서 직접 전원을 공급할 수 있습니다.

S90 Micro Servo는 소비 전류가 약 100-200mA 무부하 작동 전류이지만 약 500-700mA 스톨 전류를 가지고 있습니다. 반면에 Arduino 5V 핀은 USB를 통해 전원이 공급되는 경우 약 500mA만 출력하거나 배럴 커넥터를 통해 전원이 공급되는 경우 최대 1A를 출력할 수 있습니다.

이 9g 서보 모터를 Arduino에 직접 실행할 수는 있지만 보다 안정적인 작업을 위해서는 항상 외부 전원 공급 장치를 사용하는 것이 좋습니다.

아래 링크에서 이 예시에 필요한 구성요소를 얻을 수 있습니다.

  • MG996R 서보 모터 ...........................................
  • 또는 S90 마이크로 서보 .....................................................................
  • 아두이노 보드 ...........................................................
  • 5V 2A DC 전원 공급 장치 ...........................................................

서보 모터 제어 Arduino 코드

이제 서보 모터를 제어하기 위한 Arduino 코드를 살펴보겠습니다. 코드는 매우 간단합니다. 서보가 연결되는 핀을 정의하고 해당 핀을 출력으로 정의하고 루프 섹션에서 앞에서 설명한 대로 특정 지속 시간과 주파수로 펄스를 생성하기만 하면 됩니다.

/*
     Servo Motor Control - 50Hz Pulse Train Generator
           by Dejan, https://howtomechatronics.com
*/

#define servoPin 9

void setup() {
  pinMode(servoPin, OUTPUT);
}

void loop() {
   // A pulse each 20ms
    digitalWrite(servoPin, HIGH);
    delayMicroseconds(1450); // Duration of the pusle in microseconds
    digitalWrite(servoPin, LOW);
    delayMicroseconds(18550); // 20ms - duration of the pusle
    // Pulses duration: 600 - 0deg; 1450 - 90deg; 2300 - 180deg
}Code language: Arduino (arduino)

몇 가지 테스트 후에 나는 내 서보와 함께 작동하는 펄스의 지속 시간에 대해 다음 값을 생각해 냈습니다. 0.6ms 지속 시간의 펄스는 0도 위치에 해당하고 1.45ms는 90도, 2.3ms는 180도에 해당합니다.

전류 드로우를 확인하기 위해 서보와 직렬로 멀티미터를 연결했습니다. 내가 알아차린 최대 전류 소모량은 실속 시 최대 0.63A였습니다. 이것은 원래 TowerPro MG996R 서보가 아니라 더 저렴한 복제품이기 때문입니다. 분명히 성능은 더 좋지 않습니다.

그럼에도 불구하고 Arduino를 사용하여 서보를 제어하는 ​​더 편리한 방법을 살펴 보겠습니다. 아두이노 서보 라이브러리를 사용하고 있습니다.

/*
     Servo Motor Control using the Arduino Servo Library
           by Dejan, https://howtomechatronics.com
*/

#include <Servo.h>

Servo myservo;  // create servo object to control a servo

void setup() {
  myservo.attach(9,600,2300);  // (pin, min, max)
}

void loop() {
  myservo.write(0);  // tell servo to go to a particular angle
  delay(1000);
  
  myservo.write(90);              
  delay(500); 
  
  myservo.write(135);              
  delay(500);
  
  myservo.write(180);              
  delay(1500);                     
}Code language: Arduino (arduino)

여기서 라이브러리를 포함하고 서보 객체를 정의하고 attach() 함수를 사용하여 서보가 연결된 핀을 정의하고 펄스 지속 시간의 최소값과 최대값을 정의하기만 하면 됩니다. 그런 다음 write() 함수를 사용하여 서보의 위치를 ​​0도에서 180도까지 설정하기만 하면 됩니다.

Arduino로 여러 서보 모터 제어

Arduino 서보 라이브러리는 대부분의 Arduino 보드에서 최대 12개의 서보를 동시에 제어하고 Arduino Mega 보드를 사용하여 48개의 서보를 제어할 수 있습니다. 게다가 Arduino로 여러 개의 서보 모터를 제어하는 ​​것은 하나의 서보 모터를 제어하는 ​​것만큼 쉽습니다.

다음은 여러 서보를 제어하기 위한 예제 코드입니다.

/*
     Controlling multiple servo motors with Arduino
     by Dejan, https://howtomechatronics.com
*/

#include <Servo.h>

Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;
Servo servo5;

void setup() {
  servo1.attach(8);
  servo2.attach(9);
  servo3.attach(10);
  servo4.attach(11);
  servo5.attach(12);
}

void loop() {
  // move all servos to position 0
  servo1.write(0);
  servo2.write(0);
  servo3.write(0);
  servo4.write(0);
  servo5.write(0);
  delay(2000);

  // move all servos to position 90
  servo1.write(90);
  servo2.write(90);
  servo3.write(90);
  servo4.write(90);
  servo5.write(90);
  delay(2000);

  // move all servos to position 180
  servo1.write(180);
  servo2.write(180);
  servo3.write(180);
  servo4.write(180);
  servo5.write(180);
  delay(2000);
}Code language: Arduino (arduino)

따라서 각 서보 모터에 대한 Servo 클래스에서 객체를 생성하고 어떤 Arduino 핀이 연결되는지 정의하면 됩니다. 물론, 우리는 언제든지 모든 위치로 이동하도록 모든 서보를 설정할 수 있습니다.

예를 들어 Arduino MEGA 보드를 사용하여 22개의 서보 모터를 제어한 Arduino Ant Hexapod Robot 프로젝트를 확인할 수도 있습니다.

Arduino 및 PCA9685 PWM/서보 드라이버

Arduino로 서보를 제어하는 ​​또 다른 방법이 있는데 PCA9685 서보 드라이버를 사용하는 것입니다. 이것은 I2C 버스를 사용하여 Arduino와 통신하는 16채널 12비트 PWM 및 서보 드라이버입니다. 시계가 내장되어 있어 16개의 서보를 자유롭게 구동하거나 Arduino와 독립적으로 구동할 수 있습니다.

더 멋진 것은 단일 I2C 버스에서 최대 62개의 이러한 드라이버를 데이지 체인 방식으로 연결할 수 있다는 점입니다. 따라서 이론적으로 Arduino 보드에서 2개의 I2C 핀만 사용하여 최대 992개의 서보를 제어할 수 있습니다. 6개의 주소 선택 핀은 각 추가 드라이버에 대해 다른 I2C 주소를 설정하는 데 사용됩니다. 이 표에 따라 솔더 패드를 연결하기만 하면 됩니다.

다음은 회로도이며 서보에 별도의 전원 공급 장치가 필요하다는 것을 다시 한 번 알 수 있습니다.

아래 링크에서 이 예시에 필요한 구성요소를 얻을 수 있습니다.

  • MG996R 서보 모터 ...........................................
  • PCA9685 PWM 서보 드라이버
  • 아두이노 보드 ...........................................................
  • 5V 6A DC 전원 공급 장치 ...........................................................................

이제 아두이노 코드를 살펴보자. 이 서보 드라이버를 제어하기 위해 GitHub에서 다운로드할 수 있는 PCA9685 라이브러리를 사용할 것입니다.

Arduino 및 PCA9685 코드

/*
     Servo Motor Control using Arduino and PCA9685 Driver
           by Dejan, https://howtomechatronics.com
           
     Library: https://github.com/NachtRaveVL/PCA9685-Arduino
*/

#include <Wire.h>
#include "PCA9685.h"

PCA9685 driver;

// PCA9685 outputs = 12-bit = 4096 steps
// 2.5% of 20ms = 0.5ms ; 12.5% of 20ms = 2.5ms
// 2.5% of 4096 = 102 steps; 12.5% of 4096 = 512 steps
PCA9685_ServoEvaluator pwmServo(102, 470); // (-90deg, +90deg)

// Second Servo
// PCA9685_ServoEvaluator pwmServo2(102, 310, 505); // (0deg, 90deg, 180deg)


void setup() {
  Wire.begin();                 // Wire must be started first
  Wire.setClock(400000);        // Supported baud rates are 100kHz, 400kHz, and 1000kHz
  driver.resetDevices();        // Software resets all PCA9685 devices on Wire line

  driver.init(B000000);         // Address pins A5-A0 set to B000000
  driver.setPWMFrequency(50);   // Set frequency to 50Hz
}
void loop() {
  driver.setChannelPWM(0, pwmServo.pwmForAngle(-90));
  delay(1000);
  driver.setChannelPWM(0, pwmServo.pwmForAngle(0));
  delay(1000);
  driver.setChannelPWM(0, pwmServo.pwmForAngle(90));
  delay(1000);
}Code language: Arduino (arduino)

따라서 먼저 라이브러리를 포함하고 PCA9685 개체를 정의해야 합니다. 그런 다음 Servo_Evaluator 인스턴스를 사용하여 펄스 지속 시간 또는 드라이버의 PWM 출력을 정의합니다. 출력은 12비트 또는 4096단계의 분해능입니다. 따라서 0.5ms 또는 0도 위치의 최소 펄스 지속 시간은 102단계에 해당하고 2.5ms 또는 180도 위치의 최대 펄스 지속 시간은 512단계에 해당합니다. 그러나 앞에서 설명한 것처럼 이 값은 서보 모터에 따라 조정되어야 합니다. 나는 0에서 180도 위치에 해당하는 102에서 470 사이의 값을 가졌습니다.

설정 섹션에서 I2C 클럭 속도를 정의하고 드라이버 주소를 설정하고 주파수를 50Hz로 설정해야 합니다.

루프 섹션에서 setChannelPWM() pwmForAngle() 원하는 각도로 서보를 설정하기만 하면 됩니다.

두 번째 서보를 드라이버에 연결했는데 예상대로 첫 번째 서보와 같은 위치가 아니었고, 제가 사용하는 서보가 싸구려 사본이고 신뢰할 수 없기 때문입니다. 그러나 Servo_Evaluator를 사용하기 때문에 큰 문제는 아닙니다. 예를 들어 각 서보에 대해 다른 출력 설정을 지정할 수 있습니다. 정확히 중앙에 있지 않은 경우 90도 위치를 조정할 수도 있습니다. 그렇게 하면 모든 서보가 동일하게 작동하고 정확한 각도로 위치하게 됩니다.

Arduino 및 PCA9685 드라이버로 많은 서보 제어

여러 개의 연결된 PCA9685 드라이버로 많은 서보를 제어하는 ​​예를 하나 더 살펴보겠습니다.

이를 위해 드라이버를 서로 연결하고 적절한 주소 선택 솔더 패드를 연결해야 합니다. 다음은 회로도입니다.

이제 아두이노 코드를 살펴보자.

/*
     Servo Motor Control using Arduino and PCA9685 Driver
           by Dejan, https://howtomechatronics.com
           
     Library: https://github.com/NachtRaveVL/PCA9685-Arduino
*/

#include <Wire.h>
#include "PCA9685.h"

PCA9685 driver;

// PCA9685 outputs = 12-bit = 4096 steps
// 2.5% of 20ms = 0.5ms ; 12.5% of 20ms = 2.5ms
// 2.5% of 4096 = 102 steps; 12.5% of 4096 = 512 steps
PCA9685_ServoEvaluator pwmServo(102, 470); // (-90deg, +90deg)

// Second Servo
PCA9685_ServoEvaluator pwmServo2(102, 310, 505); // (0deg, 90deg, 180deg)


void setup() {
  Wire.begin();                 // Wire must be started first
  Wire.setClock(400000);        // Supported baud rates are 100kHz, 400kHz, and 1000kHz
  driver.resetDevices();        // Software resets all PCA9685 devices on Wire line

  driver.init(B000000);         // Address pins A5-A0 set to B000000
  driver.setPWMFrequency(50);   // Set frequency to 50Hz
}
void loop() {
  driver.setChannelPWM(0, pwmServo.pwmForAngle(-90));
  delay(1000);
  driver.setChannelPWM(0, pwmServo.pwmForAngle(0));
  delay(1000);
  driver.setChannelPWM(0, pwmServo.pwmForAngle(90));
  delay(1000);
}Code language: Arduino (arduino)

따라서 각 드라이버에 대해 별도의 PCA9685 개체를 만들고 각 드라이버에 대한 주소를 정의하고 주파수를 50Hz로 설정해야 합니다. 이제 setChannelPWM() 및 pwmForAngle() 함수를 사용하여 모든 드라이버에서 원하는 각도로 모든 서보를 설정할 수 있습니다.

문제 해결

서보 모터 지터 및 내 Arduino 보드 재설정

이것은 취미 서보 모터인 SG90 Micro Servo 및 MG996R의 일반적인 문제입니다. 그 이유는 앞서 언급했듯이 부하가 걸려 있을 때 상당한 양의 전류를 끌어올 수 있기 때문입니다. 특히 Arduino 5V 핀에서 직접 서보에 전원을 공급하는 경우 Arduino 보드가 재설정될 수 있습니다.

이 문제를 해결하기 위해 GND와 5V 핀에 커패시터를 사용할 수 있습니다. DC 모터가 시작될 때 시작 시 시스템에 추가 전류를 제공하는 디커플 커패시터 역할을 합니다.

서보 모터가 0도에서 180도까지 전체 범위를 움직이지 않음

이것은 이러한 취미 서보의 또 다른 일반적인 문제입니다. 앞에서 설명한 것처럼 펄스 폭 1ms(0.5ms)는 0도 위치에 해당하고 2ms(2.5ms)~180도는 위치에 해당합니다. 그러나 이러한 값은 서보마다 그리고 제조업체마다 다를 수 있습니다.

이 문제를 해결하려면 Arduino를 사용하여 서보 모터에 보내는 펄스 폭을 조정해야 합니다. 운 좋게도 Arduino Servo 라이브러리를 사용하면 attach()에서 펄스 폭 값을 쉽게 조정할 수 있습니다. 기능.

첨부() 함수는 두 개의 추가 매개변수를 취할 수 있으며 이는 마이크로초 단위의 최소 및 최대 펄스 폭입니다. 기본값은 최소(0도) 각도의 경우 544마이크로초(0.544밀리초)이고 2400마이크로초(2.4ms)입니다. 따라서 이 값을 조정하여 서보의 모멘트 범위를 미세 조정할 수 있습니다.

  myservo.attach(9,600,2300);  // (pin, min, max)Code language: Arduino (arduino)

치수 및 3D 모델

가장 인기 있는 두 서보 모터인 SG90 Micro Servo와 MG996R 서보 모터의 3D 모델을 만들었습니다. 아래 링크에서 다운로드할 수 있습니다.

SG90 마이크로 서보

3D 모델:Thangs에서 다운로드

치수:

MG996R 서보 모터

MG996R 서보 모터 3D 모델:Thangs에서 다운로드

치수:

결론

그래서 우리는 Arduino와 함께 서보 모터를 사용하는 것에 대해 알아야 할 거의 모든 것을 다루었습니다. 물론 이러한 취미 또는 RC 서보 모터의 제조업체와 모델이 많이 있으며 각각 고유한 기능이 있으며 위에서 설명한 것과 다를 수 있습니다.

모터를 사용하여 멋진 로봇 공학, 자동화 및 RC 프로젝트를 생성할 수 있는 가능성은 무한하지만 애플리케이션에 적합한 모델을 선택하는 것이 매우 중요합니다.

이 튜토리얼을 즐기고 새로운 것을 배웠기를 바랍니다. 아래의 댓글 섹션에서 언제든지 질문하고 내 Arduino 프로젝트 컬렉션을 사용할 수 있는지 확인하십시오.

자주 묻는 질문(FAQ)

Arduino에서 서보 모터를 사용하려면 어떻게 해야 하나요?

Arduino와 함께 서보 모터를 사용하는 것은 매우 쉽습니다. 서보 모터는 3선으로 되어 있는데 그 중 2선은 GND와 5V 전원 공급용이고 3선은 아두이노 보드로 가는 제어선입니다.

Arduino에서 서보 모터를 실행할 수 있나요?

Arduino에서 직접 서보 모터를 실행할 수 있지만 전원 문제가 있을 수 있습니다. 서보 모터가 500mA 이상의 전류를 소비하면 Arduino 보드가 전원을 잃고 재설정될 수 있습니다. 서보 모터는 항상 별도의 전원을 사용하는 것이 좋습니다.

Arduino는 몇 개의 서보 모터를 제어할 수 있나요?

Arduino Servo 라이브러리를 사용하면 대부분의 Arduino 보드에서 최대 12개의 서보 모터를 제어할 수 있고 Arduino Mega 보드에서는 최대 48개의 서보 모터를 제어할 수 있습니다. 물론 서보 모터 전용 전원을 사용해야 합니다.


제조공정

  1. Arduino로 코인 억셉터 제어
  2. 서보 모터로 로봇을 피하는 장애물
  3. Bluetooth가 탑재된 Arduino로 LED 제어!
  4. Arduino Nano:조이스틱으로 2개의 스테퍼 모터 제어
  5. Arduino 및 MPU6050으로 서보 모터 제어
  6. ThimbleKrox - 손가락으로 마우스 제어
  7. Arduino로 음악을 만드는 방법
  8. Arduino와 함께 NMEA-0183을 사용하는 방법
  9. 알루미늄을 납땜하는 방법 - 완전한 안내서
  10. 클러치 작동 방식:완전한 가이드