본문 바로가기
Arduino(아두이노) 활용 강좌

Arduino Uno 로 조이스틱 모듈(Joystick Module)을 사용해 SG90 마이크로 서보모터 제어해 보기

by 오마이엔지니어 2022. 8. 26.
반응형

Arduino Uno 로 조이스틱 모듈(Joystick Module)의 사용방법을 알아보고 SG90 마이크로 서보모터와 LED를

제어해 보는 프로젝트입니다

<아두이노 조이스틱 모듈 이미지>
조이스틱 모듈은 Arduino 또는 AVR, STM 등의 마이크로컨트롤 보드와 연결해 입력 장치로 사용할수 있습니다
X,Y 축의 움직임은 2개의 5K 전위차계를 통해서 아날로그 신호로 출력되며 Z축은 스위치 처럼 눌러서
디지털 신호로 출력 가능합니다

<SG90 마이크로 서보모터 이미지>

서보모터(Servo Motor)는 모터와 제어구동보드(적당한 제어 회로와 알고리즘)를 포함하는 것으로
모터 자체만 가지고 서보모터라고 부르지 않습니다
서보모터의 개념은 모터와 구동 시스템 까지 포함하는 것으로 흔히 볼수 있는 공작기계, CCTV 카메라, 캠코더, 프린터 등에서
사용되는 모터와 같이 명령에 따라 정확한 위치와 속도를 제어할수 있는 모터를 서보모터라고 부릅니다
서보 모터는 일반 모터와 달리 회전 반경이 정해져 있습니다종류에 따라 다르지만 일반적으로 약 0~270도 범위의 회전각을 가집니다
서보모터의 회전 각도는 아래 그림과 같이 PWM (펄스폭변조방식으로 제어합니다

다양한 종류의 서보 모터가 있지만 SG90 마이크로 서보 모터와 MG90S 메탈기어 서보모터를 사용해 보겠습니다
SG90 마이크로 서보 모터 Servo Motor 는 9g 급으로 동작 전압이 4.2V ~ 6V 로 아두이노로 테스트 하기 적합 합니다
회전각도 는 180도 이며 동작 속도는 0.1 s/60 degree 입니다

사용된 부품

Arduino Uno R3 (Italy)

브래드 보드
조이스틱 모듈

SG90 마이크로 서보모터

3색 RGB LED 캐소드 타입
점퍼케이블
5mm LED 블루, 레드, 예로우, 그린
막대저항 220 Ohm 4개

 
구성배선도-시리얼 모니터로 X_Y_Button 출력값 표시해 보기

구성배선도-4개의 LED 제어해 보기

구성배선도-3색 RGB LED 제어해 보기


구성 배선도-SG90 마이크로 서보모터와 LED 제어해 보기
 

사용된 예제소스  

Joystick.txt
0.00MB
Joystick Leds.txt
0.00MB
Joystick_Servo.txt
0.00MB


주의사항
첫번째 Joystick 예제는 조이스틱을 사용해서 아두이노 IDE 시리얼 모니터로 X_Y_Button 출력값을 
확인해 보는 예제입니다

int xPin = A1;
int yPin = A0;
int buttonPin = 6;

조이스틱 X축은 아두이노 A1, Y축은 A0, 버튼은 6번핀에 배선합니다

void setup() {
  // initialize serial communications at 9600 bps:
  Serial.begin(9600); 
  
  pinMode(xPin, INPUT);
  pinMode(yPin, INPUT);

  //activate pull-up resistor on the push-button pin
  pinMode(buttonPin, INPUT_PULLUP); 
셋업에서 xPin, yPin, buttonPin 의 입력값을 받아서 (버튼은 기본 풀업되어있습니다)

void loop() {
  xPosition = analogRead(xPin);
  yPosition = analogRead(yPin);
  buttonState = digitalRead(buttonPin);
  
  Serial.print("X: ");
  Serial.print(xPosition);
  Serial.print(" | Y: ");
  Serial.print(yPosition);
  Serial.print(" | Button: ");
  Serial.println(buttonState);

  delay(100); // add some delay between reads
}
루프에서 시리얼 모니터 X,Y,button 으로 출력해 줍니다
buttonState = digitalRead(buttonPin);
버튼은 X,Y축과는 다르게 디지털 출력이므로 0,1로 표시됩니다


두번째 Joystick Leds 예제는 조이스틱을 사용해서 5mm LED 4개 또는 3색 RGB LED를 제어하는 예제입니다

const int SW_pin = 2; // digital pin connected to switch output
const int X_pin = 0; // analog pin connected to X output
const int Y_pin = 1; // analog pin connected to Y output
조이스틱 모듈의 스위치는 아두이노 2번, X축은 아날로그 A0, Y축은 아날로그 A1에 연결합니다

#define UP_LED 8
#define RIGHT_LED 9 
#define LEFT_LED 10
#define DOWN_LED 11
UP_LED, RIGHT_LED, LEFT_LED, DOWN_LED 에 8,9,10,11 번 핀으로 LED를 연결합니다
3색 RGB LED는 캐소드 타입이므로 3색 RGB LED의 4핀중 GND핀은 GND에 연결하고
나머지 RGB 3핀을 8,9,10 또는 9,10,11로 연결해서 테스트하면 됩니다

void setup() {
  pinMode(SW_pin, INPUT);
  digitalWrite(SW_pin, HIGH);
  Serial.begin(115200);

  pinMode(UP_LED , OUTPUT);
  pinMode(RIGHT_LED , OUTPUT);
  pinMode(LEFT_LED , OUTPUT);
  pinMode(DOWN_LED , OUTPUT);
}

셋업에서 SW_pin과 UP_LED, RIGHT_LED, LEFT_LED, DOWN_LED 의 
조이스틱 입력값을 받아서 출력해 줍니다 
(스위치는 역시 X,Y축의 업다운, 라이트&레프트의 아날로그와는 다르게 디지털 출력입니다)

void loop() {
  Serial.print("Switch:  ");
  Serial.print(digitalRead(SW_pin));
  Serial.print("\n");
  Serial.print("X-axis: ");
  Serial.print(analogRead(X_pin));
  Serial.print("\n");
  Serial.print("Y-axis: ");
  Serial.println(analogRead(Y_pin));
  Serial.print("\n\n");
시리얼 모니터로 스위치와 X,Y축 출력값을 표시해 줍니다 (시리얼 통신 속도는 115200입니다)

if(analogRead(X_pin) == 1023){
  digitalWrite(UP_LED , HIGH);
if문을 사용해서 X축 아날로그 출력값이 1023이면 UP_LED에 연결된 LED가 HIGH로 켜집니다

 else if(analogRead(X_pin) == 0){
   digitalWrite(DOWN_LED , HIGH);
그밖의 X축 아날로그 출력값이 0이면 DOWN_LED에 연결된 LED가 HIGH로 켜집니다

else if(analogRead(Y_pin) == 1023){
    digitalWrite(RIGHT_LED , HIGH);
그밖의 Y축 아날로그 출력값이 1023이면 RIGHT_LED에 연결된 LED가 HIGH로 켜집니다

else if(analogRead(Y_pin) == 0){
    digitalWrite(LEFT_LED , HIGH);
그밖의 Y축 아날로그 출력값이 0이면 LEFT_LED에 연결된 LED가 HIGH로 켜집니다

else if(digitalRead(SW_pin) == 0){
digitalWrite(UP_LED , HIGH);
digitalWrite(LEFT_LED , HIGH);
digitalWrite(RIGHT_LED , HIGH);
digitalWrite(DOWN_LED , HIGH);
그밖의 SW_pin 출력값이 0이면 UP_LED,LEFT_LED,RIGHT_LED,DOWN_LED에 연결된 LED가 모두 HIGH로 켜집니다

else{
digitalWrite(UP_LED , LOW);
digitalWrite(LEFT_LED , LOW);
digitalWrite(RIGHT_LED , LOW);
digitalWrite(DOWN_LED , LOW);
그밖의 경우에는 UP_LED,LEFT_LED,RIGHT_LED,DOWN_LED에 연결된 LED가 모두 LOW로 꺼집니다


세번째 Joystick_Servo 예제는 조이스틱으로 SG90 마이크로 서보모터를 스위치로 LED를 제어해 보는

예제입니다 

SG90 마이크로 서보모터는 전압과 전류가 충분히 필요하므로 꼭 5V로 연결합니다

(테스트 동영상과 배선도를 보면 알수 있듯이 외부전원 5V로 공급하였습니다)
외부전원없이 그냥 아두이노로 전원을 공급하고자 한다면 조이스틱 모듈을 3.3V로
SG90 마이크로 서보모터는 5V로 연결하면 됩니다
대신 이경우 조이스틱 모듈의 전원이 부족해서 출력값이 줄어 서보모터의 회전각 역시

줄어들게 되므로 이점 참고해야 겠습니다

예제코드를 살펴보면
#include <Servo.h> 
Servo.h 라이브러리를 사용합니다

const int AXIS_X = A0;
const int AXIS_Y = A1;
const int SW_P = 3; 
조이스틱 모듈의 X는 아날로그 A0에, Y는 아날로그 A1에
스위치는 디지털 3번핀으로 세팅됩니다

const int servoPin = 9;
const int blueLed = 13;
서보모터는 9번핀에 블루LED는 13번핀에 세팅됩니다

m_Angle = map(analogRead(AXIS_X),0,1023,0,180);
아두이노 5V의 아날로그 출력값인 1023을 서보모터 180로 제어합니다
A0에 연결된 조이스틱 X축을 사용해서 서보모터를 제어합니다
(때문에 조이스틱 모듈을 3.3V에 연결하면 회전이 덜 할수 밖에 없습니다)

digitalWrite(blueLed,digitalRead(SW_P));
스위치 핀을 눌러서 LED를 제어합니다

프로젝트 동영상-시리얼 모니터로 X_Y_Button 출력값 표시해 보기

프로젝트 동영상-4개의 LED 제어해 보기

프로젝트 동영상3색 RGB LED 제어해 보기


프로젝트 동영상-SG90 마이크로 서보모터와 LED 제어해 보기 


이렇게 간단하게 조이스틱 모듈로 서보모터와 LED를 제어하는 방법을 확인해 보았습니다
응용해서 전원만 잘 갖춰진다면 여러개의 조이스틱 모듈도 제어할수 있지 않을까 싶습니다

반응형

댓글