Search Code

포텐셔미터를 이용한 아두이노 서보 모터 제어

포텐셔미터를 이용한 아두이노 서보 모터 제어

이 튜토리얼에서는 아두이노를 사용하여 포텐셔미터로 서보 모터를 제어하는 방법을 탐구할 것입니다. 목표는 포텐셔미터의 회전에 따라 서보의 위치가 조정되는 간단한 회로를 만드는 것입니다. 이 프로젝트가 끝나면 포텐셔미터를 돌리면서 서보 각도를 0도에서 180도까지 부드럽게 변화시키는 작동 모델을 갖게 될 것입니다. 이는 아두이노에서 아날로그 입력과 서보 제어의 기본을 이해하는 좋은 방법입니다.

이를 달성하기 위해 우리는 아두이노 보드, 서보 모터 및 가변 저항기(포텐셔미터)를 사용할 것입니다. 포텐셔미터는 가변 저항기로 작용하여 아두이노에 아날로그 입력을 제공하고, 아두이노는 이에 따라 서보 모터의 위치를 결정합니다. 이 프로젝트는 재미있을 뿐만 아니라 전자공학 및 프로그래밍의 핵심 개념을 보여주기 때문에 교육적입니다. 더 자세한 설명을 원하신다면 비디오(비디오에서 :00)를 확인해 보세요.

하드웨어 설명

이 프로젝트의 주요 구성 요소는 아두이노 보드, 서보 모터 및 포텐셔미터입니다. 아두이노는 작동의 두뇌로, 입력을 처리하고 출력을 제어합니다. 서보 모터는 아두이노로부터 받은 명령에 따라 물리적으로 움직이는 장치입니다. 포텐셔미터는 1k 옴에서 1M 옴까지 가능하며, 사용자가 서보 모터의 움직임으로 변환되는 가변 입력을 제공할 수 있게 합니다.

서보 모터는 원하는 위치를 나타내는 PWM(펄스 폭 변조) 신호를 수신하여 작동합니다. 포텐셔미터를 돌리면 저항이 변경되고, 이는 아두이노에 아날로그 전압으로 읽힙니다. 서보 모터는 5V로 작동합니다. 3.3V에서는 작동하지 않습니다. 이 전압은 서보 모터의 움직임 범위에 매핑되어 0도에서 180도까지 부드러운 움직임을 가능하게 합니다.

SG90 서보 모터 데이터시트 세부정보

제조업체패럴랙스
부품 번호SG90
로직/입출력 전압5 V
공급 전압4.8-6 V
출력 전류 (채널당)~500 mA
채널당 피크 전류1 A
PWM 주파수 안내50 헤르츠
입력 논리 임계값0.5 V (낮음), 2.5 V (높음)
전압 강하 / RDS(온)/ 포화0.5 V에서 500 mA
열 한계0°C에서 60°C까지
패키지표준 9g 서보
노트 / 변형RC 애플리케이션에서 일반적으로 사용됨

  • 서보가 최대 전류 정격을 초과하지 않도록 하십시오.
  • 서보가 높은 하중에서 지속적으로 작동하는 경우 히트 싱크를 사용하십시오.
  • 정확한 측정을 위해 포텐셔미터를 아날로그 핀에 연결하세요.
  • 서보 제어를 위한 PWM 신호 타이밍에 주의하세요.
  • 서보의 움직임 범위를 확인하여 물리적 장애물을 피하십시오.

배선 지침

Arduino wiring for controlling Servo motor with Potentiometer
Arduino wiring for controlling Servo motor with Potentiometer
Arduino wiring for servo motor
Arduino wiring for servo motor

이 설정을 위해서는 다음과 같이 구성 요소를 연결해야 합니다:

포텐셔미터의 중간 핀(와이퍼)을 아두이노의 아날로그 핀에 연결하세요.A0가변 저항기의 다른 두 핀은 연결되어야 합니다.5V그리고GND아두이노에서. 서보 모터의 경우, 빨간색 전선을 연결합니다.5V, 검은색 전선을GND, 그리고 노란색 또는 흰색 전선을 디지털 핀에 연결합니다.9아두이노에서. 이 배치는 포텐셔미터가 아두이노에 아날로그 입력을 제공할 수 있게 하며, 아두이노는 그 입력에 따라 서보 모터의 위치를 제어합니다.

모든 연결을 확인하고 서보가 움직임 범위에서 방해받지 않도록 하십시오. 다른 아두이노 모델을 사용하는 경우 아날로그 입력 및 서보 출력의 핀 할당이 호환되는지 확인하십시오.

코드 예제 및 안내

아래는 서보를 초기화하고 포텐셔미터 값을 읽는 코드의 일부입니다:


#include 

Servo myservo;  // create servo object to control a servo
int pos = 0;    // variable to store the servo position

void setup() {
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
}

이 코드에서는 Servo 라이브러리를 포함하고 servo 객체를 생성합니다.myservo서보가 핀에 연결되어 있습니다.9이 핀을 사용하여 이를 제어할 수 있게 해줍니다.


void loop() {
  int sensorValue = analogRead(A0);  // read the potentiometer
  pos = map(sensorValue, 0, 1023, 0, 180);  // map to servo position
  myservo.write(pos);  // move servo to position
  delay(15);  // waits 15ms for the servo to reach the position
}

루프 함수에서 우리는 핀에서 가변 저항 값을 읽습니다.A0서보의 범위(0-180도)로부터 그 범위(0-1023)를 매핑합니다.myservo.write(pos)명령은 포텐셔미터의 회전에 따라 서보를 원하는 위치로 이동시킵니다.

시연 / 기대할 사항

이 프로그램을 실행하면 포텐셔미터를 돌릴 때 서보 모터가 0도에서 180도까지 부드럽게 움직이는 것을 볼 수 있어야 합니다. 서보가 예상대로 움직이지 않으면 배선을 확인하고 포텐셔미터가 제대로 작동하는지 확인하세요. 또한 아두이노에 전원이 제대로 공급되고 코드가 오류 없이 업로드되었는지 확인하세요. 서보가 포텐셔미터의 위치를 실시간으로 반영하는 것을 볼 수 있을 것입니다 (비디오에서 02:00).

비디오 타임스탬프

  • 00:00- 프로젝트 소개
  • 01:30하드웨어 설정 설명
  • 03:45- 배선 지침
  • 05:00- 코드 워크스루
  • 07:30- 완료된 프로젝트의 시연

이미지

Arduino wiring for controlling Servo motor with Potentiometer
Arduino wiring for controlling Servo motor with Potentiometer
Arduino wiring for servo motor
Arduino wiring for servo motor
11-Controlling a servo position using a potentiometer using Arduino
언어: C++
/**
*Original source: Arduino IDE
* Arduino Project: Controlling the servo position
* This code is used with a video tutorial for Robojax.com
* Published on April 24, 2017, from Ajax, ON, Canada.
* Written/Edited by Ahmad Shamshiri
* Watch the video on YouTube: https://youtu.be/kZ9b31gVemc
* View tutorial page for this code https://robojax.com/RJT8
* Controlling a servo position using a potentiometer (variable resistor)
*/



#include <Servo.h>

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

int pos = 0;    // variable to store the servo position

void setup() {
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
}

void loop() {
  for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
    // in steps of 1 degree
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }
  for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }
}

자원 및 참고자료

아직 자원이 없습니다.

파일📁

데이터시트 (pdf)