아두이노 레시피

아두이노 레시피 : 가변저항으로 서보모터 제어하기 - 초중급편

arduinochef 2025. 2. 25. 09:28

 

# Recipe 13. 서보모터 응용 편 1.

가변저항과 서보모터를 이용하면 모형 팔을 이용해 로봇 팔을 조종할 수 있어요!

by LittleBot instructables

안녕하세요~ 아두이노셰프입니다. 제가 어릴 적 퍼시픽림이란 영화를 봤었는데, 거기 나오는 로봇들이 너무 멋있더라고요. 그래서 콘셉트설계도를 찾아서 열심히 상상을 펼쳤던 적이 있었네요.ㅎㅎ ‘내가 움직이는 대로 로봇을 움직일 수 있게 해 보자’라는 상상에서 시작된 프로젝트들이 있었어요. 마침 아두이노를 공부하고 있었거든요. 오늘은 그중 하나를 소개해볼까 합니다. 가변저항이 움직이는 대로 서보모터도 똑같이 움직일 수 있도록 할 거예요. 관절에 가변저항을 연결하면 로봇을 똑같이 움직일 수 있지 않을까요? (어릴 적에는 그렇게 상상했네욯ㅎ) 서보모터의 응용 편으로 가변저항을 이용해 보겠습니다.

기존의 서보모터 코드에 한 줄 정도만 추가해서 바로 만들 수 있어요. 그럼 시작해 볼까요?

오늘의 재료 Ingredient


<메인 재료>

서보모터(모델명 : SG90), 가변저항(저항크기는 상관없어요!)

 

<그 외 재료>

아두이노 우노

브레드보드

수-수 케이블(8개)


메이킹 방법 Steps

Step 1. 선 연결하기 Wiring

a. 서보모터 데이터핀(노랑)은 아두이노의 D9번 핀에,

b. 가변저항의 가운데 핀은 아두이노의 A0번 핀에,

c. 나머지 전원부는 브레드보드로 연결해 주세요

(그림을 참고해 주세요!)

- - - - - - - - - -

Step 2. 아두이노 코드 Code review

여러분의 요리가 훨씬 간편해질 수 있도록, 숙성이 필요한 코드는 언제나 제가 준비할게요ㅎㅎ

 
#include <Servo.h>//서보모터를 사용하게 해주는 코드모음(라이브러리)을 가져왔어요
Servo myservo; //가져온 라이브러리를 사용하기위해 servo라는 이름의 Servo클래스를 생성하는건데, 몰라도 좋아요.

#define servoPin 9 //앞으로 D9번을 servoPin이라고 부를게요.
#define potPin A0 // 앞으로 A0번을 potPin이라고 부를게요.

int angle = 0;//변화하는 서보모터의 각도를 저장하기위해 angle이란 이름의 변수를 만들고 0으로 초기화해줄게요. 

void setup() { //여기있는 코드는 한번만 실행됩니다.
  myservo.attach(servoPin); //서보의 컨트롤핀을 servoPin으로 설정합니다.
}

void loop() { //setup()이 실행된 이후, loop()가 무한반복 실행됩니다.
  
  angle = map(analogRead(potPin), 0, 1023, 0, 180);
  //가변저항으로부터 0~1023 범위의 값이 들어올 텐데, 이를 0~180범위로 변환하라는 뜻이에요.
 
  myservo.write(angle); //서보모터를 angle(변환된 값)만큼 움직일게요.
  delay(15); // 15밀리세컨드 만큼 기다립니다.

}

Step 3. 동작시키기 Working

● 코드를 아두이노 우노에 업로드해 주세요.

● 가변저항을 돌려보세요. 서보모터가 어떻게 움직이나요?


오늘의 레시피는 여기까지입니다~ 프로젝트는 과학시즈닝이 없습니다.

모듈의 원리가 궁금하신 분들은 서보모터 기초 편 포스팅을 참고해 주세요~


코드의 동작 알고리즘

(주석을 참고해 주세요.)

알고리즘은 쉬운 말로 ‘진행절차’라고 할 수 있습니다.

코드가 어떻게 동작되는지 알아볼까요?

"가변저항으로부터 값을 읽는다."->

"들어오는 값을 0~180 사이의 값으로 변환한다."->

"변환된 값을 서보모터의 각도로 출력한다."

우리가 원하는 건

"가변저항을 움직이는 대로 서보모터를 움직이기"잖아요?

그럼 가변저항의 값과 서보모터의 각도를 일치시킬 필요가 있어요.

가변저항은 아날로그 값으로 0~1023까지의 범위를 가지는데,

이를 그대로 모터로 출력할 수는 없잖아요.

서보모터는 0~180까지가 한계니까요.

그래서 이를 위해 map()이라는 함수가 등장합니다.

변환할 값의 최소, 최댓값과

바꿀 최소, 최댓값을 적어주면

알아서 비율을 계산하고, 변환해 준답니다.

map(변환할 데이터, 데이터의 최솟값, 데이터의 최댓값, 변환하고 싶은 최솟값, 변환하고 싶은 최댓값)

이렇게 사용하면 돼요.(뭔가 어렵나요..?)

map(analogRead(A0), 0, 1023 ,0 ,180);

이렇게요.

이 함수 덕분에 가변저항을 돌리는 대로

아두이노는 이를 각도로 인식할 수 있답니다.

map() 함수로 변환된 값을

서보모터의 write함수에 집어넣으면

우리가 실시간으로 저항을 돌리는 대로

서보모터가 돌아가게끔 만들 수 있는 것이죠.

(처음의 사진처럼, 가변저항을 로봇팔의 관절로 만들면,

모형 팔을 조종함으로써 로봇팔도 같이 조종할 수 있겠죠?

한 번 따라 해 보세욬ㅋ 재밌어요.)