코드 검색

레슨 86: 전위차계를 사용하여 서보 모터의 위치 제어하기

레슨 86: 전위차계를 사용하여 서보 모터의 위치 제어하기

#include <Servo.h>

Servo myservo;  // 서보 모터를 제어하기 위한 서보 객체 생성

int potpin = A0;  // 가변저항을 연결한 아날로그 핀
int servoPin = 3; // 서보용 디지털 핀(PWM 지원) 정의. 핀 3, 5, 6, 9, 10, 11만 사용 가능
int VCC2 = 8;// 가변저항용 추가 VCC 정의
int val;    // 아날로그 핀에서 읽은 값을 저장할 변수

setup() 함수에서 코드는 서보를 초기화하고 추가 전원 핀을 설정합니다. myservo.attach(servoPin) 함수는 Arduino에 서보의 신호선이 연결된 핀을 알려주므로 필수적입니다.

void setup() {
  Serial.begin(9600);          //  시리얼 설정
  myservo.attach(servoPin);  // 핀 3의 서보를 서보 객체에 연결

  pinMode(VCC2, OUTPUT);// 핀 8을 출력으로 설정
  digitalWrite(VCC2, HIGH);// 핀 8을 HIGH로 설정하여 5V 핀 역할을 하게 함
}

핵심 로직은 loop() 함수에 있습니다. 가변저항의 값을 읽고, 각도로 변환한 다음, 서보를 움직이도록 명령합니다. 여기서 중요한 두 함수는 analogRead()map()입니다. (영상 04:27 부분)

void loop() {
  val = analogRead(potpin);            // 가변저항 값 읽기 (0에서 1023 사이의 값)
  val = map(val, 0, 1023, 0, 180);     // 서보에 사용할 수 있도록 값 변환 (0에서 180 사이)
  myservo.write(val);                  // 변환된 값에 따라 서보 위치 설정
  Serial.print(val);
  Serial.println();
  delay(50);                           // 서보가 해당 위치에 도달할 때까지 대기
}

작동 방식은 다음과 같습니다:

  • analogRead(potpin): 이 함수는 가변저항의 와이퍼에서 전압을 읽고 0(0V)에서 1023(5V) 사이의 값을 반환합니다.
  • map(val, 0, 1023, 0, 180): 이 함수는 전체 프로젝트의 핵심입니다. 가변저항의 원시 값(0~1023)을 비례적으로 서보 각도(0~180도)로 변환합니다. 예를 들어, 가변저항이 511(약 절반)을 읽으면 map() 함수는 90을 반환하여 서보를 중앙 위치로 이동시킵니다.
  • myservo.write(val): 이 함수는 계산된 각도(이제 val에 저장됨)를 받아 서보에 해당 위치로 회전하도록 지시합니다.
  • delay(50): 이 함수는 각 루프 끝에 짧은 일시 정지를 추가합니다. 업데이트 속도를 제어합니다. 더 긴 지연(예: 200ms)은 서보가 단계적으로 움직이게 하고, 더 짧은 지연(예: 50ms)은 움직임을 매우 부드럽게 만듭니다. 반응 속도를 변경하려면 이 값을 조정할 수 있습니다. (영상 07:26 부분)

실시간 프로젝트 시연

영상에서 프로젝트가 작동하는 모습을 볼 수 있습니다. 가변저항 손잡이를 돌리면 서보 모터의 암이 그 위치에 비례하여 따라 움직입니다. 시리얼 모니터는 현재 각도를 출력하여 매핑이 올바르게 작동하고 있음을 확인시켜 줍니다. 가변저항이 최소 위치에 있을 때 서보는 0도에 있습니다. 손잡이를 최대로 돌리면 서보가 180도까지 부드럽게 회전합니다. (영상 06:33 부분)

이 실시간 피드백 루프는 아날로그 센서와 디지털 액추에이터의 완벽한 통합을 보여주며, 반응성이 뛰어나고 직관적인 제어 시스템을 만들어 냅니다.

챕터

  • [00:00] 소개 및 프로젝트 개요
  • [01:05] 회로도 및 배선도
  • [02:07] 실제 배선 시연
  • [03:00] 코드 설명
  • [06:33] 실시간 시연 및 테스트
  • [07:26] 서보 응답 속도 조정

이미지

Arduino wiring or servo motor with pot
Arduino wiring or servo motor with pot
SG90_servo_motor-1
SG90_servo_motor-1
SG90_servo_motor-0
SG90_servo_motor-0
892-Lesson 86: Controlling a servo position using a potentiometer (variable resistor)
언어: C++
/*
 * Lesson 88: Controlling Servo motor a with Potentiometer
 * 📚⬇️ Download and resource page https://robojax.com/RJT763
 watch full video tutroial: https://www.youtube.com/watch?v=ntRW77mNFFk
 
 Controlling a servo position using a potentiometer (variable resistor)
 by Michal Rinott <http://people.interaction-ivrea.it/m.rinott>

 modified on 8 Nov 2013
 by Scott Fitzgerald
 http://www.arduino.cc/en/Tutorial/Knob

 Update by Ahmad Shamshiri on Jan 01, 2019  in Ajax, Ontario, Canada


*/

#include <Servo.h>

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

int potpin = A0;  // analog pin used to connect the potentiometer
int servoPin = 3; // define a digital pin (with PWM) for servo. Can use only pin 3, 5, 6,9, 10, 11
int VCC2 = 8;// define extra VCC for potentiometer
int val;    // variable to read the value from the analog pin

void setup() {
  //
  Serial.begin(9600);          //  setup serial
  myservo.attach(servoPin);  // attaches the servo on pin 3 to the servo object

  pinMode(VCC2, OUTPUT);// set pin 8 as output
  digitalWrite(VCC2, HIGH);// set pin 8 HIGH so it acts as 5V pin
}

void loop() {
  
  val = analogRead(potpin);            // reads the value of the potentiometer (value between 0 and 1023)
  val = map(val, 0, 1023, 0, 180);     // scale it to use it with the servo (value between 0 and 180)
  myservo.write(val);                  // sets the servo position according to the scaled value
  Serial.print(val);
  Serial.println();
  delay(50);                           // waits for the servo to get there
}
 

필요할 수 있는 것들

자원 및 참고자료

파일📁

다른 파일들