블로그 이미지
조이키트 블로그
아두이노, 라즈베리파이, 반도체 센서/모듈 활용

calendar

1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

Notice

250x250
728x90
반응형

 

조이스틱 모듈은 아두이노나 라즈베리 파이와 같은 마이크로컨트롤러와 같이 단일 보드 컴퓨터에 사용하여 입력 장치로 활용할 수 있다. 일반적으로 조이스틱 모듈은 두 개의 아날로그 축(X, Y)과 하나의 디지털 버튼으로 구성되어 있다.

 

조이스틱 모듈 핀 기능 : 

+ 5V VCC (전원 5V)
GND GND (접지 -)
VRx X축 아날로그 출력
VRy Y축 아날로그 출력
SW 버튼 디지털 출력

 

실습 예제 : 

조이스틱 모듈의 방향에 따라 LED 다이오드를 제어하는 방법을 설명하겠다. 

예들 들어 조이스틱을 위로 움직일 때는 빨간색 LED가 켜지고, 아래로 움직일 때는 파란색 LED를, 왼쪽으로 움직일 때는  녹색 LED, 오른쪽으로 움직일 때는 노란색 LED를 켜지는 식으로 구현하였다. 그리고 조이스틱 버튼이 눌리었을 때는 4개의 LED가 전부 켜지도록 하였다.

 

필요한 부품 : 

구성품으로는 아두이노 우노 R3, 조이스틱 모듈, LED 다이오드 4개 (빨간색, 파란색, 녹색, 노란색), 저항 4개(220Ω) 등이 쓰인다.

 

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

https://link.coupang.com/a/b2S1uP

 

아두이노 PS2 조이스틱 모듈 l Joystick Module - 액세서리 | 쿠팡

쿠팡에서 0.0 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 0 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

https://link.coupang.com/a/b2vSOT

 

ATmega328P 마이크로 컨트롤러가 있는 아두이노 우노 R3 개발 보드 - 액세서리 | 쿠팡

쿠팡에서 0.0 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 0 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

https://link.coupang.com/a/b2vTO0

 

아두이노 LCD1602 16x2 4핀 디스플레이 모듈/ Arduino LCD1602 Module - 액세서리 | 쿠팡

쿠팡에서 0.0 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 0 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

 

아두이노 우노 R3 조이스틱 모듈 LED다이오드(Red, Bule, Green, Yellow)

 

회로 연결 : 

조이스틱 모듈 회로도

 

구성품이 준비되면 위의 회로도와 아래 표를 참고하여 회로를 연결한다.

아두이노 우노 조이스틱 모듈 LCD1602 Red다이오드 Blue다이노드 Green다이오드 Yellow다이오드
+ 5V +5V VCC        
GND GND GND        
A0 VRx          
A1 VRy          
D8 SW          
A4   SDA        
A5   SCL        
D3     +Pin      
D4       +Pin    
D5         +Pin  
D6           +Pin

 

조이스틱 LED 제어 회로연결

 

 

위와 같이 회로 연결이 전부 끝나면 아두이노 IDE에 다음과 같이 코드를 작성한다.

 

코드 설명 : 

  1. VRx, VRy, SW, redLED, blueLED, greenLED, yellowLED 핀 번호를 설정한다
  2. setup() 함수에서 시리얼 통신을 시작하고, 버튼 핀과 LED 핀을 설정한다.
  3. loop() 함수에서 주기적으로 X축, Y축, 버튼 값을 읽는다.
  4. 버튼 상태를 확인하여 버튼이 눌렸을 때 모든 LED를 켠다.
  5. 버튼이 눌리지 않았을 때는 조이스틱의 방향에 따라 해당 LED를 켜고 끈다.

먼저 아두이노 IDE에 LCD1602 라이브러리를 설치한다. (LiquidCrystal_I2C)

다음 조이스틱 모듈 핀설정을 진행한다.

const int VRx = A0;  // X축 아날로그 핀
const int VRy = A1;  // Y축 아날로그 핀
const int SW = 8;    // 버튼 디지털 핀

 

LED 다이오드 핀을 정의한다.

const int redLED = 3;     // 빨간 LED 핀
const int blueLED = 4;    // 파란 LED 핀
const int greenLED = 5;   // 녹색 LED 핀
const int yellowLED = 6;  // 노란 LED 핀
 

1. LCD1602를 초기화하고 백라이트를 켜지게 설정한다. 

2. 시리얼 통신은 9600으로 설정

3. 조이스틱 버튼은 입력으로 설정하고, LED 핀을 출력으로 설정한다.

void setup() {
  lcd.init();    // LCD 초기화 
  lcd.backlight();  // LCD 백라이트 켬

  Serial.begin(9600);  // 시리얼 통신 시작
  pinMode(SW, INPUT_PULLUP);  // 버튼 핀을 풀업 저항과 함께 입력으로 설정
  pinMode(redLED, OUTPUT);  // LED 핀을 출력으로 설정
  pinMode(blueLED, OUTPUT);
  pinMode(greenLED, OUTPUT);
  pinMode(yellowLED, OUTPUT);
}

 

 x축 함수 : xValue, y축 함수 : yValue, 버튼함수 : buttonState 로 정의한다.

  int xValue = analogRead(VRx);  // X축 값 읽기
  int yValue = analogRead(VRy);  // Y축 값 읽기
  int buttonState = digitalRead(SW);  // 버튼 상태 읽기
 

조이스틱 모듈의 버튼이 눌리었을 때는 4개의 LED가 전부 켜지고, 버튼이 눌리지 않았을 때는 조이스틱 방향에 따라 LED 다이오드가 켜진다.

if (buttonState == HIGH) {  // 버튼이 눌렸을 때
    digitalWrite(redLED, HIGH);
    digitalWrite(blueLED, HIGH);
    digitalWrite(greenLED, HIGH);
    digitalWrite(yellowLED, HIGH);
    lcd.setCursor(0,1);            // LCD 1행 2열에 출력
    lcd.print("ALL LED ON");  
  } else {
    // 버튼이 눌리지 않았을 때 조이스틱 방향에 따라 LED 제어
    if (xValue < 400) {  // 왼쪽
      digitalWrite(greenLED, HIGH);
      lcd.setCursor(0,1);     // LCD 1행 1열에 출력  
      lcd.print("Left_Green"); 
    } else {
      digitalWrite(greenLED, LOW);
    }

    if (xValue > 600) {  // 오른쪽
      digitalWrite(yellowLED, HIGH);
      lcd.setCursor(0,1);            // LCD 1행 2열에 출력
      lcd.print("Right_Yellow");  
    } else {
      digitalWrite(yellowLED, LOW);
    }

    if (yValue < 400) {  // 위쪽
      digitalWrite(redLED, HIGH);
      lcd.setCursor(0,1);            // LCD 1행 2열에 출력
      lcd.print("Up_Red");  
    } else {
      digitalWrite(redLED, LOW);
    }

    if (yValue > 600) {  // 아래쪽
      digitalWrite(blueLED, HIGH);
      lcd.setCursor(0,1);            // LCD 1행 2열에 출력
      lcd.print("Down_Blue");  
    } else {
      digitalWrite(blueLED, LOW);
    }
  }

 

 

전체 코드 : 

#include <LiquidCrystal_I2C.h> 

const int VRx = A0;  // X축 아날로그 핀
const int VRy = A1;  // Y축 아날로그 핀
const int SW = 8;    // 버튼 디지털 핀

const int redLED = 3;     // 빨간 LED 핀
const int blueLED = 4;    // 파란 LED 핀
const int greenLED = 5;   // 녹색 LED 핀
const int yellowLED = 6;  // 노란 LED 핀

LiquidCrystal_I2C lcd (0x27,16,2);   // LCD1602 hexa값, 2행 16열 설정

void setup() {
  lcd.init();    // LCD 초기화 
  lcd.backlight();  // LCD 백라이트 켬

  Serial.begin(9600);  // 시리얼 통신 시작
  pinMode(SW, INPUT_PULLUP);  // 버튼 핀을 풀업 저항과 함께 입력으로 설정
  pinMode(redLED, OUTPUT);  // LED 핀을 출력으로 설정
  pinMode(blueLED, OUTPUT);
  pinMode(greenLED, OUTPUT);
  pinMode(yellowLED, OUTPUT);
}

void loop() {
  int xValue = analogRead(VRx);  // X축 값 읽기
  int yValue = analogRead(VRy);  // Y축 값 읽기
  int buttonState = digitalRead(SW);  // 버튼 상태 읽기

  lcd.setCursor(0,0);            // LCD 1행 2열에 출력
  lcd.print("JOYSTIC_CONTROL");  

  if (buttonState == HIGH) {  // 버튼이 눌렸을 때
    digitalWrite(redLED, HIGH);
    digitalWrite(blueLED, HIGH);
    digitalWrite(greenLED, HIGH);
    digitalWrite(yellowLED, HIGH);
    lcd.setCursor(0,1);            // LCD 1행 2열에 출력
    lcd.print("ALL LED ON");  
  } else {
    // 버튼이 눌리지 않았을 때 조이스틱 방향에 따라 LED 제어
    if (xValue < 400) {  // 왼쪽
      digitalWrite(greenLED, HIGH);
      lcd.setCursor(0,1);     // LCD 1행 1열에 출력  
      lcd.print("Left_Green"); 
    } else {
      digitalWrite(greenLED, LOW);
    }

    if (xValue > 600) {  // 오른쪽
      digitalWrite(yellowLED, HIGH);
      lcd.setCursor(0,1);            // LCD 1행 2열에 출력
      lcd.print("Right_Yellow");  
    } else {
      digitalWrite(yellowLED, LOW);
    }

    if (yValue < 400) {  // 위쪽
      digitalWrite(redLED, HIGH);
      lcd.setCursor(0,1);            // LCD 1행 2열에 출력
      lcd.print("Up_Red");  
    } else {
      digitalWrite(redLED, LOW);
    }

    if (yValue > 600) {  // 아래쪽
      digitalWrite(blueLED, HIGH);
      lcd.setCursor(0,1);            // LCD 1행 2열에 출력
      lcd.print("Down_Blue");  
    } else {
      digitalWrite(blueLED, LOW);
    }
  }

  delay(100);  // 100ms 지연
  lcd.clear();  // LCD 클리어
}

 

코드 작성이 전부 끝나면 아두이노에 컴파일하여 업로드 하여준다.

사용법 : 

  1. 아두이노 IDE를 열고, 위의 코드를 복사하여 붙여 넣는다.
  2. 아두이노 보드를 컴퓨터에 연결하고, 보드와 포트를 선택한 후 코드를 업로드 한다.
  3. 조이스틱을 움직여 각 방향에 따라 LED가 켜지고, 버튼을 누르면 모든 LED가 켜지는 것을 확인한다.

출력 결과 : 

https://www.youtube.com/watch?v=SDMUSQWB1_I

위의 영상에서 본것과 같이 조이스틱 모듈의 버튼을 눌렀을 때 모든 LED가 켜지고, 버튼을 누르지 않았을 때는 조이스틱 방향에 따라 LED가 켜지는 동작에 대해 알아 보았다.

 

 

728x90
반응형
posted by 조이키트 블로그