라즈베리 파이 로터리 인코더

이 튜토리얼은 라즈베리 파이로 증분 회전 인코더를 사용하는 방법을 안내합니다. 다룰 내용은 다음과 같습니다:

Hardware Preparation

1×Raspberry Pi 4 Model B Amazon
1×Rotary Encoder 쿠팡 | Amazon
1×Jumper Wires Amazon
1×(추천) Screw Terminal Block Shield for Raspberry Pi 쿠팡 | Amazon
1×(추천) USB-C Power Cable with On/Off Switch for Raspberry Pi 4B Amazon
1×(추천) Plastic Case and Cooling Fan for Raspberry Pi 4B Amazon
1×(추천) HDMI Touch Screen Monitor for Raspberry Pi Amazon
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.

로터리 엔코더에 대하여

회전 운동을 신호로 변환하는 회전 손잡이는 로터리 인코더라고 불립니다. 그것은 얼마나 많이 회전했는지와 어디에 위치했는지를 보여줍니다. 주요 종류는 두 가지입니다:

  • 증분 엔코더: 이는 빠른 신호를 사용하여 얼마나 변화했는지를 측정합니다.
  • 절대 엔코더: 이 종류는 각 위치에 고유한 코드를 제공하여 전원이 꺼져도 정확히 어디에 있는지 알 수 있습니다.

이 가이드는 증분 엔코더에 집중합니다.

로터리 인코더 모듈 핀아웃

로터리 인코더 핀아웃

회전 인코더 모듈에는 4개의 핀이 있습니다:

  • CLK 핀 (출력 A): 얼마나 많은 회전이 발생했는지를 알려주는 주 펄스입니다. 노브를 한 단위(클릭)만큼 어느 방향으로 돌릴 때마다, CLK 핀은 완전한 사이클(LOW HIGH LOW)을 완료하는 신호를 출력합니다.
  • DT 핀 (출력 B): CLK 핀처럼 작동하지만, 신호가 CLK 신호보다 90도 뒤처져 출력됩니다. 회전 방향(시계 방향 또는 반시계 방향)을 알아내는 데 도움을 줍니다.
  • SW 핀: 인코더 내부의 푸시 버튼에서 나오는 출력입니다. 일반적으로 열려 있습니다. 이 핀에 풀업 저항을 사용하면, 노브가 눌리지 않았을 때 SW 핀은 HIGH, 눌렸을 때 LOW가 됩니다.
  • VCC 핀 (+): VCC(3.3~5볼트 사이)에 연결되어야 합니다.
  • GND 핀: GND(0V)에 연결되어야 합니다.

로터리 엔코더 대 포텐셔미터

회전 인코더를 포텐셔미터와 혼동할 수 있지만, 이들은 별개의 구성 요소입니다. 다음은 그들 간의 비교입니다:

  • 로터리 인코더는 현대 버전의 포텐셔미터와 같지만, 더 많은 기능을 수행할 수 있습니다.
  • 로터리 인코더는 풀 서클로 멈추지 않고 회전할 수 있지만, 포텐셔미터는 원의 약 3/4 정도만 회전할 수 있습니다.
  • 로터리 인코더는 펄스를 출력하고, 포텐셔미터는 아날로그 전압을 출력합니다.
  • 로터리 인코더는 손잡이가 얼마나 움직였는지를 파악할 때 유용하지만, 정확히 어디에 있는지를 알고 싶을 때는 포텐셔미터가 유용합니다.

로터리 인코더의 작동 원리

로터리 인코더 출력

인코더 내부에는 슬롯이 있는 디스크가 C라고 불리는 핀에 연결되어 있으며, 이는 공통 접지와 같습니다. A와 B라는 두 개의 핀이 더 있습니다.

  • 노브를 돌릴 때, 핀 A와 B는 공통 그라운드 핀 C와 접촉하지만, 노브를 어느 방향으로 돌리느냐에 따라 특정 순서로 접촉합니다 (시계 방향 또는 반시계 방향).
  • 이러한 접촉은 두 개의 신호를 생성합니다. 두 신호는 타이밍이 약간 다릅니다. 하나의 핀이 다른 핀보다 먼저 그라운드에 접촉하기 때문입니다. 두 신호는 서로 90도 어긋나 있으며, 이를 쿼드러처 인코딩이라고 합니다.
  • 노브를 시계 방향으로 돌리면, 핀 A가 핀 B보다 먼저 그라운드에 접촉합니다. 노브를 반시계 방향으로 돌리면, 핀 B가 핀 A보다 먼저 그라운드에 접촉합니다.
  • 각 핀이 그라운드와 접촉하거나 떨어지는 시점을 감지함으로써, 우리는 노브가 어느 방향으로 돌고 있는지 알아낼 수 있습니다. 이는 핀 A가 변할 때 핀 B에 어떤 변화가 있는지를 확인함으로써 이루어집니다.
로터리 엔코더의 작동 원리

A가 LOW에서 HIGH로 상태가 변경될 때:

  • B가 LOW이면 노브를 시계 방향으로 돌립니다.
  • B가 HIGH이면 노브를 반시계 방향으로 돌립니다.

※ NOTE THAT:

핀 A와 B는 CLK 및 DT 핀에 연결됩니다. 그러나 제조사에 따라 순서가 다를 수 있습니다. 아래 제공된 코드는 DIYables의 로터리 인코더로 테스트되었습니다.

로터리 엔코더 프로그래밍 방법

  • CLK 핀의 신호를 확인하십시오.
  • LOW에서 HIGH로 상태가 변경되면, DT 핀의 상태를 확인하십시오.
    • DT 핀의 상태가 HIGH이면, 노브가 반시계 방향으로 회전하였으며, 카운터를 1 증가시키세요.
    • DT 핀의 상태가 LOW이면, 노브가 시계 방향으로 회전하였으며, 카운터를 1 감소시키세요.

Wiring Diagram

라즈베리 파이 로터리 엔코더 배선도

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.

배선 구성을 간단하고 체계적으로 만들기 위해, Raspberry Pi용 스크루 터미널 블록 실드 사용을 권장합니다. 이 실드는 아래와 같이 더욱 안정적이고 관리하기 쉬운 연결을 제공합니다:

Raspberry Pi Screw Terminal Block Shield

라즈베리 파이 코드 – 로터리 인코더

다음 Raspberry Pi 코드는:

  • 인코더의 회전 방향과 회전량을 감지합니다.
    • 노브가 시계 방향으로 한 덴트(클릭)만큼 회전했을 경우, 카운터를 하나 증가시킵니다.
    • 노브가 반시계 방향으로 한 덴트(클릭)만큼 회전했을 경우, 카운터를 하나 감소시킵니다.
  • 버튼이 눌렸는지 감지합니다.

Detailed Instructions

  • Raspberry Pi에 Raspbian 또는 기타 Raspberry Pi 호환 운영 체제가 설치되어 있는지 확인하십시오.
  • Raspberry Pi가 PC와 동일한 로컬 네트워크에 연결되어 있는지 확인하십시오.
  • 라이브러리를 설치해야 하는 경우 Raspberry Pi가 인터넷에 연결되어 있는지 확인하십시오.
  • Raspberry Pi를 처음 사용하는 경우, Raspberry Pi 설정 방법을 참조하십시오.
  • Linux 및 macOS에서는 내장된 SSH 클라이언트 또는 Windows에서는 PuTTY를 사용하여 SSH를 통해 PC를 Raspberry Pi에 연결하십시오. PC를 SSH를 통해 Raspberry Pi에 연결하는 방법을 참조하십시오.
  • RPi.GPIO 라이브러리가 설치되어 있는지 확인하십시오. 설치되어 있지 않으면 다음 명령을 사용하여 설치하십시오.
sudo apt-get update sudo apt-get install python3-rpi.gpio
  • Python 스크립트 파일 rotary_encoder.py을(를) 생성하고 다음 코드를 추가하십시오:
# 이 Raspberry Pi 코드는 newbiely.kr 에서 개발되었습니다 # 이 Raspberry Pi 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. # 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: # https://newbiely.kr/tutorials/raspberry-pi/raspberry-pi-rotary-encoder import RPi.GPIO as GPIO import time # Pin numbers on Raspberry Pi CLK_PIN = 7 # GPIO7 connected to the rotary encoder's CLK pin DT_PIN = 8 # GPIO8 connected to the rotary encoder's DT pin SW_PIN = 25 # GPIO25 connected to the rotary encoder's SW pin DIRECTION_CW = 0 DIRECTION_CCW = 1 counter = 0 direction = DIRECTION_CW CLK_state = 0 prev_CLK_state = 0 button_pressed = False prev_button_state = GPIO.HIGH # Configure GPIO pins GPIO.setmode(GPIO.BCM) GPIO.setup(CLK_PIN, GPIO.IN) GPIO.setup(DT_PIN, GPIO.IN) GPIO.setup(SW_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) # Read the initial state of the rotary encoder's CLK pin prev_CLK_state = GPIO.input(CLK_PIN) try: while True: # Read the current state of the rotary encoder's CLK pin CLK_state = GPIO.input(CLK_PIN) # If the state of CLK is changed, then pulse occurred # React to only the rising edge (from LOW to HIGH) to avoid double count if CLK_state != prev_CLK_state and CLK_state == GPIO.HIGH: # If the DT state is HIGH, the encoder is rotating in counter-clockwise direction # Decrease the counter if GPIO.input(DT_PIN) == GPIO.HIGH: counter -= 1 direction = DIRECTION_CCW else: # The encoder is rotating in clockwise direction => increase the counter counter += 1 direction = DIRECTION_CW print("Rotary Encoder:: direction:", "CLOCKWISE" if direction == DIRECTION_CW else "ANTICLOCKWISE", "- count:", counter) # Save last CLK state prev_CLK_state = CLK_state # State change detection for the button button_state = GPIO.input(SW_PIN) if button_state != prev_button_state: time.sleep(0.01) # Add a small delay to debounce if button_state == GPIO.LOW: print("The button is pressed") button_pressed = True else: button_pressed = False prev_button_state = button_state except KeyboardInterrupt: GPIO.cleanup() # Clean up GPIO on program exit
  • 파일을 저장하고 터미널에서 다음 명령어를 실행하여 Python 스크립트를 실행하세요:
python3 rotary_encoder.py
  • 노브를 시계 방향으로 돌린 다음, 반시계 방향으로 돌리세요.
  • 노브를 누르세요.
  • 터미널에서 결과를 확인하세요.
PuTTY - Raspberry Pi
DIRECTION: Clockwise | COUNTER: 1 DIRECTION: Clockwise | COUNTER: 2 DIRECTION: Clockwise | COUNTER: 3 DIRECTION: Clockwise | COUNTER: 4 DIRECTION: Clockwise | COUNTER: 5 DIRECTION: Counter-clockwise | COUNTER: 4 DIRECTION: Counter-clockwise | COUNTER: 3 DIRECTION: Counter-clockwise | COUNTER: 2 DIRECTION: Counter-clockwise | COUNTER: 1 DIRECTION: Counter-clockwise | COUNTER: 0 The button is pressed

코드 설명

코드의 각 줄에 대한 주석을 확인하세요.

Raspberry Pi 로터리 인코더 어플리케이션

로터리 인코더를 사용하여 우리는 다음과 같은 응용 프로그램을 수행할 수 있습니다. 단, 이에 국한되지는 않습니다:

  • Raspberry Pi - 회전 인코더로 서보 모터 위치 제어
  • Raspberry Pi - 회전 인코더로 LED 밝기 제어
  • Raspberry Pi - 회전 인코더로 스테퍼 모터 속도 제어

Video Tutorial

비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.

관련 튜토리얼