레슨 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] 서보 응답 속도 조정
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
}
필요할 수 있는 것들
-
아마존
-
아마존
-
이베이
-
알리익스프레스Purchase SG90 servo motor 180 or 360 from AliExpresss.click.aliexpress.com
자원 및 참고자료
파일📁
다른 파일들
-
SG90 Seroo 모터 데이터시트
robojax-servo-SG90_datasheet.pdf0.12 MB