본문 바로가기
모두의 라즈베리파이

[라즈베리파이][센서][#10] 초보자를 위한 파이썬 [조이스틱(KY-023)] 활용법 완전 정복

by 로니킴 2024. 5. 21.


라즈베리 파이와 파이썬을 사용해 조이스틱(KY-023)를 쉽게 제어하는 방법을 초보자도 이해할 수 있도록 설명합니다. 시작부터 동작까지, 모든 과정을 설명하여 누구나 라즈베리파이를 이용한 조이스틱(KY-023) 제어를 마스터할 수 있습니다. 

 

목차

     

     

     


    초보자를 위한 파이썬 조이스틱(KY-023) 활용법 완전 정복

     

     

    KY-023 조이스틱 모듈은 두 축 아날로그 신호를 생성하여 Raspberry Pi와 같은 컴퓨터나 마이크로컨트롤러에 입력 장치로 사용됩니다. 이 모듈은 게임 컨트롤러나 로봇 조작에 주로 활용되며, 가격이 저렴하고 구조가 간단해 DIY 프로젝트 및 교육용으로 인기가 높습니다. 조이스틱은 선형 가변 저항기를 내장하여 조작 위치에 따라 전기 저항이 변화, 아날로그 신호로 전환됩니다. Raspberry Pi에 연결 시 아날로그-디지털 변환기(ADC)가 필요하며, Python을 이용한 프로그래밍을 통해 X축과 Y축 데이터를 처리합니다. 이를 통해 하드웨어 프로그래밍 기초를 학습하고 다양한 응용 프로그램 개발에 활용할 수 있습니다.

     

     

     

     


    (1) 조이스틱(KY-023) 란?

    조이스틱 모듈 KY-023은 소형의 아날로그 게임 조이스틱으로, 2차원의 입력 제어를 위해 설계된 전자 부품입니다. 이 모듈은 두 개의 아날로그 신호(가로와 세로 방향)와 하나의 디지털 신호(클릭 버튼)를 출력합니다. 주로 사용자의 손 조작에 따라 X축과 Y축 위치 정보를 아날로그 신호로 변환하여 마이크로컨트롤러 같은 처리 장치로 전송합니다.

    (1) 조이스틱(KY-023) 란?

     

    조이스틱은 각 축을 따라 움직이는 내부 슬라이더에 의해 컨트롤되며, 이는 가변 저항의 원리를 사용하여 위치에 따른 전압 변화를 생성합니다. 이를 통해 사용자는 로봇의 움직임, 비디오 게임 내 캐릭터 조종 등 다양한 어플리케이션에서 정밀한 제어를 수행할 수 있습니다. KY-023 조이스틱은 그 저렴한 가격과 사용의 용이성 때문에 교육용 프로젝트와 취미 생활에서도 많이 사용되고 있습니다.

     

     

     

     

     

     


    (2) 조이스틱(KY-023) 동작 원리

    KY-023 조이스틱 모듈의 핵심은 두 개의 선형 가변 저항기에 있습니다. 이들은 각각 X축과 Y축을 담당하며, 조이스틱의 물리적 위치 변화를 전기적 신호로 변환합니다. 사용자가 조이스틱을 특정 방향으로 밀면 해당 축의 가변 저항기는 기계적 위치를 변화시키고, 이에 따라 저항값이 변하게 됩니다.

     

    (2) 조이스틱(KY-023) 동작 원리

     

    저항값의 변화는 아날로그 전압 신호로 Raspberry Pi 또는 다른 마이크로컨트롤러에 전달되어, 입력으로 사용됩니다. 중심에서 조이스틱을 움직일수록 전압 변화는 더 커지고, 이 신호는 최종적으로 디지털 데이터로 변환되어 사용됩니다. 이 과정은 실시간으로 이루어져 사용자가 실제 시간에 가깝게 시스템을 조작할 수 있습니다.

     

     

    000036 - datasheet KY-023-Joy-IT.pdf
    0.68MB

     


    (3) 조이스틱(KY-023) 구입하기

    KY-023 조이스틱 모듈은 전 세계적으로 많은 전자 부품 공급업체를 통해 쉽게 구입할 수 있습니다. 이 모듈의 가격은 일반적으로 매우 저렴하며, 구매 시 검토해야 할 몇 가지 요소가 있습니다.

    (3) 조이스틱(KY-023) 구입하기

     

    우선, 모듈의 품질과 제조 업체가 중요한데, 일부 저가형 모델은 내구성이나 성능 면에서 제한이 있을 수 있습니다. 또한, 모듈이 정확한 아날로그 값을 출력하는지, 필요한 모든 핀이 포함되어 있는지 확인해야 합니다. 온라인 리뷰를 확인하거나, 기술 사양을 자세히 검토하여 최적의 제품을 선택하는 것이 좋습니다.

     

     

     

     

     


     

    (4) 조이스틱(KY-023) 하드웨어 연결

    조이스틱 모듈 KY-023을 Raspberry Pi에 연결하기 위해서는 몇 가지 기본적인 전자 부품과 연결 지식이 필요합니다. 먼저, Raspberry Pi는 기본적으로 아날로그 신호를 직접 읽을 수 없기 때문에, 아날로그 신호를 디지털 신호로 변환할 수 있는 ADC(아날로그-디지털 변환기)가 필요합니다.

     

    (4) 조이스틱(KY-023) 하드웨어 연결

     

    KY-023의 VCC와 GND는 각각 Raspberry Pi의 5V 전원과 접지에 연결하고, X축과 Y축 출력은 ADC를 통해 Raspberry Pi의 GPIO 핀에 연결합니다. 이렇게 하면 조이스틱의 위치에 따라 변하는 아날로그 신호를 Raspberry Pi가 처리할 수 있습니다.

     

     

     

    추가로, KY-023에 포함된 버튼이 있다면, 그것도 GPIO 핀에 연결하여 사용할 수 있습니다.

     

     

     

    PCF8591T 칩은 NXP Semiconductors에서 제작한 8-비트 아날로그-디지털 변환기(ADC) 및 디지털-아날로그 변환기(DAC)입니다. 이 칩은 주로 센서 신호 및 아날로그 출력을 다루는 다양한 전자 회로에서 사용됩니다. PCF8591T의 주요 특징을 아래와 같이 요약할 수 있습니다: 
    1. 다기능성: PCF8591T는 아날로그 신호를 디지털로 변환하는 ADC 기능과 디지털 신호를 아날로그로 변환하는 DAC 기능을 모두 지원합니다. 이로 인해 입력 및 출력 작업을 유연하게 처리할 수 있습니다.
    2. 채널: 이 칩은 4개의 아날로그 입력 채널을 가지고 있으며, 이들은 단일 엔디드 모드 또는 차동 입력 모드로 설정할 수 있습니다. 또한 하나의 아날로그 출력 채널(DAC)을 포함합니다.
    3. 인터페이스: I²C 버스 인터페이스를 통해 마이크로컨트롤러와 통신할 수 있어, 복잡한 연결 없이 여러 장치와 쉽게 통신할 수 있습니다.
    4. 전원 공급: 일반적으로 2.5V에서 6V 사이의 전원을 사용하여 다양한 시스템에 적용이 가능합니다.
    5. 응용 프로그램: PCF8591T는 환경 모니터링, 시스템 제어, 로봇공학 등 다양한 분야에서 사용됩니다. 예를 들어, 온도 센서나 조도 센서 등의 아날로그 신호를 읽어 마이크로컨트롤러가 처리할 수 있는 디지털 값으로 변환할 때 사용됩니다.
    PCF8591T 칩은 그 유연성과 기능성으로 인해 많은 전자 DIY 프로젝트 및 상업적 제품에서 선호되는 컴포넌트 중 하나입니다.

     

     

    PCF8591T

     

     

     

     

     


     

    (5) 조이스틱(KY-023) SW 파이썬  코딩

    조이스틱(KY-023)과 PCF8591T 칩을 사용하여 Raspberry Pi에서 소프트웨어 코딩을 진행할 때, Python을 활용한 I2C 통신을 구현하는 방법을 소개합니다. 이 과정에서 필요한 라이브러리는 smbus로, Raspberry Pi에서 I2C 기반 장치와의 통신을 지원합니다.

     

     

    [I2C 연결확인]

    • I2C 주소 확인: PCF8591T의 I2C 주소가 0x48이 맞는지 확인하세요. 이 주소는 대부분의 경우 기본 주소입니다. 만약 다른 주소를 사용하고 있다면, 코드 내의 I2C_ADDR 값을 해당 주소로 변경하세요.
    • I2C 인터페이스 활성화 확인: Raspberry Pi의 I2C 인터페이스가 활성화되어 있는지 확인하세요. raspi-config를 통해 I2C를 활성화할 수 있습니다:
    sudo raspi-config
    • 여기서 "Interfacing Options" > "I2C" > "Yes"를 선택하여 활성화한 후, 재부팅합니다.
    • I2C 도구 설치: i2c 도구를 사용하여 연결된 I2C 장치를 스캔하고 확인할 수 있습니다:
    sudo apt-get install i2c-tools
    i2cdetect -y 1

     

     

     

    [코드 작성]

    PCF8591T 칩을 사용하여 조이스틱의 아날로그 신호를 읽는 Python 스크립트를 작성합니다. 이 스크립트는 Raspberry Pi의 I2C 버스를 통해 PCF8591T로부터 데이터를 읽어와 조이스틱의 X축과 Y축 위치를 출력합니다.

     

    연결 정보를 기반으로 코드를 재작성합니다. 이제 X축 출력(VRx)은 PCF8591T의 AIN0에, Y축 출력(VRy)은 AIN1에 연결되며, 조이스틱의 키(KEY)는 Raspberry Pi의 GPIO 19번 핀에 연결됩니다. 이를 고려하여 조이스틱의 아날로그 신호를 읽고, 키 입력을 디지털 방식으로 감지하는 Python 스크립트를 작성합니다.

     

    필요 라이브러리 설치

    필요한 smbus 라이브러리를 설치하고, GPIO를 위한 RPi.GPIO 라이브러리도 필요합니다:

     

    sudo apt-get update
    sudo apt-get install python3-smbus
    sudo pip3 install RPi.GPIO

     

    조이스틱 제어를 위한 코드

     

     

    import smbus
    import RPi.GPIO as GPIO
    import time
    
    # PCF8591T 설정
    I2C_ADDR = 0x48
    bus = smbus.SMBus(1)
    
    # 입력 채널 설정
    JOYSTICK_X_CHANNEL = 0x40  # AIN0
    JOYSTICK_Y_CHANNEL = 0x41  # AIN1
    
    # GPIO 설정
    KEY_PIN = 19
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(KEY_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)  # 버튼은 풀업 저항 사용
    
    def read_analog(channel):
        """ PCF8591T에서 단일 채널의 아날로그 값을 읽어 반환 """
        bus.write_byte(I2C_ADDR, channel)
        time.sleep(0.02)  # 버스 안정화를 위한 지연 시간
        return bus.read_byte(I2C_ADDR)
    
    def check_button():
        """ 버튼 상태 반환 (눌린 상태: False, 눌리지 않은 상태: True) """
        return GPIO.input(KEY_PIN)
    
    def main():
        try:
            while True:
                x_value = read_analog(JOYSTICK_X_CHANNEL)
                y_value = read_analog(JOYSTICK_Y_CHANNEL)
                button_status = not check_button()  # 버튼 눌림 상태 반전
                print(f'X 위치: {x_value}, Y 위치: {y_value}, 버튼 상태: {"눌림" if button_status else "눌리지 않음"}')
                time.sleep(0.1)
        finally:
            GPIO.cleanup()  # 프로그램 종료 시 GPIO 정리
    
    if __name__ == "__main__":
        main()

     

    코드 설명

    1. smbus를 이용한 아날로그 읽기: read_analog 함수는 PCF8591T의 특정 아날로그 입력 채널에서 값을 읽습니다. 이 함수는 버스에 쓰기 연산 후 약간의 지연을 두고 값을 읽어 들입니다.
    2. GPIO를 이용한 버튼 상태 읽기: check_button 함수는 GPIO 19번 핀의 디지털 값을 읽어 버튼의 눌림 상태를 확인합니다. 풀업 저항을 사용하므로 버튼이 눌리면 False, 눌리지 않았을 때는 True를 반환합니다.
    3. 메인 함수: 메인 루프에서 조이스틱의 X축, Y축 위치와 버튼의 상태를 주기적으로 읽고 출력합니다. 프로그램 종료 시 GPIO 핀 상태를 정리하여 리소스를 깨끗하게 관리합니다.

    이 코드를 Raspberry Pi에 적용하고 실행하면, 조이스틱의 위치 및 버튼의 상태를 실시간으로 모니터링 할 수 있습니다.

     

    1. 라이브러리 및 전역 변수 설정

    • smbus: I2C 통신을 위한 Python 라이브러리입니다. 이 라이브러리를 사용하여 PCF8591T 칩과 통신하며, 조이스틱의 아날로그 신호를 디지털 값으로 변환합니다.
    • RPi.GPIO: Raspberry Pi의 GPIO 핀을 제어하기 위한 라이브러리입니다. 이를 통해 버튼의 입력을 감지합니다.
    • I2C_ADDR: PCF8591T의 I2C 주소입니다. 대부분의 PCF8591T 칩은 기본적으로 0x48 주소를 사용합니다.
    • JOYSTICK_X_CHANNEL, JOYSTICK_Y_CHANNEL: PCF8591T 칩의 아날로그 입력 채널입니다. JOYSTICK_X_CHANNEL은 X축 입력을, JOYSTICK_Y_CHANNEL은 Y축 입력을 각각 처리합니다.

    2. GPIO 설정

    • KEY_PIN: 조이스틱 모듈에 추가된 버튼이 연결된 GPIO 핀 번호입니다.
    • GPIO.setmode(GPIO.BCM): GPIO 핀 번호를 Broadcom SOC 채널 번호로 지정하는 설정입니다.
    • GPIO.setup(KEY_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP): 버튼 핀을 입력 모드로 설정하고, 내부 풀업 저항을 활성화하여 버튼이 연결되지 않은 상태에서도 안정적인 상태를 유지할 수 있도록 합니다. 이는 버튼이 눌리지 않았을 때 True, 눌렸을 때 False를 반환하도록 합니다.

    3. 아날로그 입력 읽기 함수 (read_analog)

    • 이 함수는 PCF8591T의 특정 아날로그 채널에서 값을 읽어 반환합니다. 처음 bus.write_byte(I2C_ADDR, channel) 호출로 해당 채널을 선택하고, 이후 bus.read_byte(I2C_ADDR)를 호출하여 실제 아날로그 값을 읽습니다. 읽기 작업 전에 time.sleep(0.02)를 추가하여 I2C 통신이 안정화될 시간을 제공합니다.

    4. 버튼 상태 검사 함수 (check_button)

    • GPIO.input(KEY_PIN) 함수를 호출하여 버튼 연결 핀의 현재 상태를 확인합니다. 풀업 저항이 설정되어 있기 때문에, 버튼이 눌리면 False, 눌리지 않으면 True 값을 반환합니다. not 연산을 사용하여 이 값을 반전시키면 버튼이 눌린 상태를 True로 표현할 수 있습니다.

    5. 메인 함수 (main)

    • 무한 루프 내에서 read_analog 함수를 사용하여 조이스틱의 X축과 Y축 위치를 주기적으로 읽고, check_button 함수를 호출하여 버튼의 상태를 검사합니다. 읽은 값을 콘솔에 출력하여 실시간으로 조이스틱의 상태를 모니터링 할 수 있습니다.
    try...finally 구문을 사용하여 프로그램이 종료될 때 GPIO.cleanup() 함수를 호출하고, 모든 GPIO 핀을 초기 상태로 복원합니다. 이는 프로그램이 예기치 않게 종료되었을 때도 GPIO 설정이 안전하게 정리되도록 보장합니다.

     


     

     

    (6) 조이스틱(KY-023) 동작확인

    하드웨어 설치와 코드 작성이 완료되면, 조이스틱의 동작을 확인하기 위해 작성한 프로그램을 실행해 봅니다. 

    (6) 조이스틱(KY-023) 동작확인

     

    Raspberry Pi에 전원을 공급하고, Python 스크립트를 실행하여 조이스틱을 다양한 방향으로 움직여 봅니다. 정상적으로 작동한다면, 터미널에 조이스틱의 X축과 Y축 위치가 실시간으로 출력될 것입니다. 이 테스트를 통해 연결 오류나 프로그래밍 오류를 발견할 수 있으며, 필요한 경우 문제를 해결하기 위해 연결을 점검하고 코드를 수정할 수 있습니다.

     

     

     


     

    (7) 마무리

    조이스틱(KY-023) 모듈을 사용한 이 프로젝트를 통해 기본적인 하드웨어 인터페이싱과 소프트웨어 프로그래밍에 대한 실습 경험을 얻을 수 있습니다. 이 경험은 다양한 전자 DIY 프로젝트나 교육적 목적으로 확장될 수 있으며, Raspberry Pi를 이용한 보다 복잡한 제어 시스템 개발의 기초가 될 수 있습니다. 계속해서 실험하고,

     

     

     

     

     

     

    반응형


    댓글