개발자/Arduino

아두이노 서보모터 제어 SG90 기초부터 전문가 까지

지구빵집 2022. 10. 21. 19:03
반응형

 

 

아이들은 처음이고 선생님도 처음이다. 아이들이 잘 몰라도, 선생님이 어버버해도 괜찮다는 말이다. 좀 더 일찍 만나 수줍은 시간과 어리숙한 시간을 보내고 좀 더 능숙한 실력으로 함께 일하는 시간을 보냈다면 처음은 아니니 지금보다는 서로에게 훨씬 더 잘했을 것이다. 모든 탁월함과 성장은 원래 이렇게 나타나는 법이다. 삶은 우리에게 무턱대고 왔지만 우리는 무턱대고 살 일은 아니다. 좀 더 친근하게 맞이하고 친절하게 대해주고 아쉬워하면서 보내줘야 한다. 그래야 남은 삶이 또 친절하게 우리를 맞이해주지 않을까?

 

아두이노 프로그래밍이 처음인 아이들과 실습을 하고 있다. 아두이노 프로그래밍을 마치면 창의적 아이디어 발상 기법 여러가지를 함께 알아보고 팁별 미팅을 진행한다. 요번 주와 다음 주 중반까지 중간고사 기간이다. 성적이나 출석, 시험이 어떤 곳에 이르기 위한 과정이라면 즐길 이유는 충분하지 않은가. 아이들이 즐겁게 받아들였으면 좋겠다. 단지 과정일 뿐이다. 쉽게 가르치지 못하면 정말 아는 게 아니다. 

 

 

오늘은 서보모터 SG90 제어에 대해 알아보는 시간을 갖겠습니다. 가장 쉬운 것부터 시작해서 나중엔 원하는 방식으로 다룰 수 있도록 실습하겠습니다. 

 

SG90 서보모터는 펄스 폭을 조절하여 각도 0도에서 180도까지 제어가 가능한 모터입니다. 실습하는 모터는 이미지는 아래와 같습니다.

 

서보모터 SG90

  

서보모터의 3개의 선 중, 적색(+), 갈색(-) 은 각각 VCC와 GND를 공급하여 서보모터에 전력을 공급한다. 

 

서보모터 Duty Cycle

우선 서보모터를 아래와 같이 연결합니다. 서보 모터의 붉은 색은 VCC +5V에 연결하고 갈색은 GND에 연결하고 신호를 입력하는 노란색 선은 7번에 연결합니다.

 

서보모터 연결. 이미지 출처: 코딩런

 

 

위 그림대로 연결하였다면 아래와 같은 코드를 입력하여 영점 조정을 실행합니다. 즉, servo.write(0) 함수를 실행하여 0도의 위치를 잡는겁니다. 0 값을 90, 180으로 입력하여 초기 상태로 방향을 잡는 것을 확인합니다.

 

#include <Servo.h>  

Servo servo; 
int servoPin = 7
void setup() {

   servo.attach(servoPin);
   servo.write(0); 
   delay(1000);
}

void loop() {

}

 

아래 코드는 회로 연결한 상태에서 각도를 바꿔가면서 회전하는 코드이다. 회전각도 중 179는 180으로 입력하여도 상관없고, 초기값을 180으로 주고 역으로 회전하는 방식이나, 초기값을 0도로 주고 증가시켜가며 회전하는 방식이나 동일하다.

 

#include<Servo.h> //Servo 라이브러리를 추가
Servo servo;      //Servo 클래스로 servo객체 생성
int value = 0;    // 각도를 조절할 변수 value

void setup() {
  servo.attach(7);     //servo 서보모터 7번 핀에 연결
                       // 이때 ~ 표시가 있는 PWM을 지원하는 디지털 핀에 연결
}

void loop() {
    value = 0;
    servo.write(value); //value값의 각도로 회전. ex) value가 90이라면 90도 회전
    delay(500);

    value = 45;
    servo.write(value);
    delay(500);

    value = 90;
    servo.write(value);
    delay(500);

    value = 135;
    servo.write(value);
    delay(500);

    value = 179;
    servo.write(value);
    delay(500);
}

 

포텐셜미터(가변 저항)을 사용해 가변 저항을 회전시키면 정확한 각도로 서보모터가 허전하는지 실습합니다. 연결은 아래와 같이 가변 저항을 연결합니다.

 

가변저항

 

- 포텐셜 미터 3개의 핀중 양 끝 2개의 핀은 VCC, GND에 연결하여 전원을 공급합니다.

- 가운데 A0 핀은 포텐셜 미터의 로터의 회전값을 전송해 주는 데이터 핀으로 아두이노의 아날로그 입력핀인 A0 ~ A5 중에 연결해 주어야 합니다.

- 포테셜 미터의 회전값은 로터의 회전 각도의 따라 0 ~ 1023 값으로 변환되어 A0에 출력됩니다. 

 

가변저항 연결도

 

 

아래 코드를 입력하여 가변 저항을 좌우로 돌리면 그에 따라 서보모터가 회전하는 것을 볼 수 있습니다. 씨리얼 모니터로 값을 확인하기 위해 넣은 코드는 빼도 상관없습니다. 

 

#include <Servo.h>
Servo myServo;      // myServo 객체 생성
int potPin = A1;    // A0를 myServo의 입력핀으로 쓴다.
int potVal;         // potVal 변수에서 포텐셜미터의 입력값을 받는다.
int angle;          // myServo에 입력할 angle.

void setup() {
  myServo.attach(9);
  Serial.begin(9600);
}

void loop() {
  // potPin에서 받아온 포텐셜 미터의 입력 값을 PotVal에 저장
  potVal = analogRead(potPin); 
  
  /* 중요 */
  // 포텐셜 미터의 입력값 potVal의 크기 범위 : 0 ~ 1023
  // 서보모터의 각도 입력값 angle의 범위 : 0 ~ 179
  // 따라서 아래와 같이 map 함수를 통해 potVal값의 크기의 비율을 조정하여 angle에 넣어줘야 한다.
  angle = map(potVal, 0, 1023, 0, 180);
  Serial.print("A0  ");
  Serial.println(potVal);
  Serial.print("angle  ");
  Serial.println(angle);

 // 0~179 크기로 변환된 angle값을 서보모터에 입력을 준다.
  myServo.write(angle);
  //delay(100);
}

 

 

 

참고

서보모터 제어하기 for 구문

 

여기까지 고생하셨습니다. ^^

 

반응형