본문 바로가기
아두이노 (Arduino)

아두이노 - 서보모터 SG90 & 조이스틱 모듈

by JaeBaek 2020. 10. 2.

Flickr

서보모터

 서보모터는 로봇의 관절 등에 많이 사용이 되는 부품으로서 표준 서보모터와 연속회전 서보모터로 나뉩니다. 표준서보모터는 0~180도의 회전을 하지만 연속회전은 360도로 계속해서 회전이 가능합니다. 그리고 서보모터의 3개의 선은 각각 다음과 같이 연결이 됩니다. SG90 같은 경우 0~180도를 회전하는 서보모터입니다.

노란색 SIG(제어신호)
빨간색 VCC
갈색 GND

 

 서보모터를 사용하기 위해서 다음과 같은 기본적인 코드들을 알고 있어야 합니다.

<Servo.h> 헤더파일 선언
Servo 변수 Servo 자료형에서 쓸 변수 선언
변수.attach() 변수에서 쓸 디지털 핀 설정
변수.datch() 서보 모터의 연결 해제
변수.write() 서보모터의 특성을 살리기 위한 위치를 넣음으로써 각도를 조절
변수.read() 서보모터의 현재 값 읽어 들이기

 

■ 서보모터

① 회로 구성

 

② 소스 코드

#include <Servo.h> //서보 모터에 해당하는 헤더파일 선언
Servo servo; //Servo 자료형에 servo 변수 선언

int pos; // 서보 모터의 각도 조절 변수

void setup() {
  servo.attach(7); // 디지털 핀 7번에 연결
}

void loop() {
  for (pos=0; pos<=180;pos+=1){
    servo.write(pos); // 서보모터 pos에 값들을 넣어 실행
    delay(5);
  }
}

 

조이스틱 모듈 (Joystick Module)

 조이 스틱은 축의 변화에 따라서 가변되는 전압을 출력하는 디바이스 입니다. 그 값을 이용해서 위치를 얻고, 가변저항을 이용합니다. 값이 싸다는 장점이 있지만 이력현상에 의한 위치 포인팅이 어렵다는 단점도 있습니다. 5핀으로 구성이 되어 있고, 아두이노 보드나 MCU를 통해서 3차원 아날로그 값을 출력하여 상,하,좌,우 위치를 입력받아 사물을 이동시킬 수 있습니다. 

GND 접지(Gound)
5V 전원입력
VRx x좌표 출력
VRy y좌표 출력
SW z좌표 출력

 

■ 조이스틱

① 회로 구성

② 소스 코드

  int pin_x=0; // x : 아날로그 A0
  int pin_y=1; // y : 아날로그 A1
  int pin_z=2; // z : 아날로그 A2
  int value_x; // x의 조이스틱 변수값
  int value_y; // y의 조이스틱 변수값
  int value_z; // z의 조이스틱 변수값
  
void setup(){
  
  Serial.begin(9600); // 시니얼 모니터 출력
}

void loop(){
  value_x=analogRead(pin_x); // 아날로그 A0 핀으로 부터 값을 가져옴.
  value_y=analogRead(pin_y); // 아날로그 A1 핀으로 부터 값을 가져옴.
  value_z=analogRead(pin_z); // 아날로그 A2 핀으로 부터 값을 가져옴.
  
  // 조이스틱에 대한 x value값 출력
  Serial.print("x : ");
  Serial.print(value_x);
  Serial.print("\n\n");
  delay(10);

  // 조이스틱에 대한 y value값 출력
  Serial.print("y : ");
  Serial.print(value_y);
  Serial.print("\n\n");
  delay(10);

  // 조이스틱에 대한 z value값 출력
  Serial.print("z : ");
  Serial.print(value_z);
  Serial.print("\n\n");
  delay(10);
}

※ result

다음 그림과 같이 시리얼 모니터에서 조이스틱의 위치를 바꿀 때마다 값이 바뀌는 것을 확인 할 수 있습니다. 

 

 

■ SG90 & 조이스틱

서보모터와 조이스틱을 이용하여 조이스틱의 x축에 대해서 변하는 값에 따라 회전방향을 바꾸는 회로를 구성해서 작동시켜보도록 하겠습니다. 

 

① 회로 구성

 

 

② 소스 코드

#include <Servo.h>

Servo servo; // 서보모터를 'servo' 로 정의
int angle = 90; // angle(각도) 정수변수 정의
int Servo_pin = 7; //변수 Servo_pin을 7로 선언
int Joystick_pin = A2; // 변수 Joystick_pin을 A2로 선언

void setup() {
  servo.attach(Servo_pin); // servo 7번에 연결
  servo.write(angle); // servo 를 중간 점으로 지정 (중간 = 90)
}

void loop() {

  int value; // 조이스틱의 아날로그 값
  value = analogRead(Joystick_pin); // A2에서 읽어온 값을 value로 선언

  if (value < 500) // 조이스틱 X축 값이 500 미만 일 때
  {
    if (angle < 180) // angle(각도)이 180보다 작을 때
    {
      servo.write(angle++); // angle 증가
      delay(5); //속도 조절용 딜레이
    }
    else if (angle == 180)
    {} // angle 변수값이 180도가 되었을 때, 대기
  }

  else if (value > 600) //조이스틱 X축 값이 600 초과 일 때
  {
    if (angle > 0) //각도가 0보다 크면
    {
      servo.write(angle--); //angle 감소
      delay(5); //속도 조절용 딜레이
    }
    else if (angle = 0)
    {} // angle 변수값이 0도가 되었을 때 대기
  }
}

 

 

 

댓글