라즈베리파이 피코 보드에서 Rotary Encoder의 사용 방법

라즈베리파이 피코 보드에서 Rotary Encoder의 사용 방법

이전의 아날로그 입력을 받는 글에서 가변저항을 이용하여 입력값을 변화시키기 위해 다음과 같은 모양의 가변저항(Varistor)을 사용한 바 있었다. ( https://kongyine.com/223185316470 )

​

그런데 가변저항이 아날로그 입력값을 조절하는데 반하여, 디지털 신호로 신호를 입력하면서 Step 수를 세는 방식으로 제어하는 Rotary Encoder라는 장치가 있어 소개한다.

​

Rotary Encoder는 양방향으로 무한 회전이 가능하며, 1회전이 20개 step으로 구성되어 있어 이릉 이용하여 회전수를 역산할 수도 있으며, 또한 회전 축에는 버튼형 스위치가 내장되어 있어 선택 스위치로도 사용이 가능한데, 회전에 따라 몇 Step이나 이동했는지를 숫자로 돌려줄 수 있게 되어 있다.

​

​

또한 회전 시의 사용 느낌도, 각 스텝마다 고급 앰프들의 볼륨 조절용 손잡이 등에서 느껴지는 가벼운 딸깍거림 같은 감각이 있어 가변저항을 사용할 때의 밋밋한 느낌과도 많이 다르고 훨씬 고급스럽게 느껴지기도 한다.

​

​

​

​

핀은 전원 선을 제외하고는 크게 버튼스위치와 연결된 SW 단자와, 회전수 산출에 필요한 DT와 CLK 단자가 있다.

​

​

본 예에서는 다음과 같이 배선했는데,

SW는 20번, DT는 GP19, CLK은 GP 18 핀을 이용하여 연결하였다.

다른 GP 번호를 사용해도 무방하다.

​

​

Rotary Encoder를 사용하려면, 다음 링크로 Github에서 다운로드할 수 있는 2개의 라이브러리 파일이 필요하다.

https://github.com/ramjipatel041/Raspberry-pi-pico-and-Rotary-encoder

​

​

다음 2개의 파일을 그대로 다운로드 또는 복사 등의 방법으로 피코 보드에 동일한 이름으로 저장 하주 면 된다.

이 2개의 라이브러리 중 우리가 작성하는 프로그램에서 직접 사용을 선언해 주어야 하는 파일은 rotary_irq_rp2이다.

​

참고로, 이 라이브러리는 MIT에서 개발한 것으로 기재되어 있다. 또한 2개 파일 중 나머지 파일인 rotary.py는 우리가 사용을 선언해 준 rotary_irq_rp2 라이브러리 파일 내에 사용이 이미 선언되어 있어 우리가 작성하는 프로그램에서 별도로 사용 선언을 할 필요는 없다.

​

​

프로그램 예제는 다음과 같다.

​

먼저 스위치를 위해 배선한 GP20 핀을 디지털 입력 모드로 선언해 주고,

SW=machine.Pin(20,machine.Pin.IN,machine.Pin.PULL_UP)

​

​

라이브러리에서 선언된 IRQ를 이용하기 위해, 다음과 같이 선언해 준다. DT 단자와 CLK 단자에 연결해준 GP19, GP 18 번호가 기재된 점에 주의한다. 만일 다른 핀을 사용한다면 이 부분도 바뀌어야 한다.

​

rstep = RotaryIRQ(pin_num_dt=19, pin_num_clk=18, min_val=0, reverse=False,

range_mode=RotaryIRQ.RANGE_UNBOUNDED)

​

​

​

본 예제를 위해 만들어진 Code는 다음과 같으며,

import machine
import utime  
from rotary_irq_rp2 import RotaryIRQ  

SW=machine.Pin(20,machine.Pin.IN,machine.Pin.PULL_UP)  
rstep = RotaryIRQ(pin_num_dt=19, pin_num_clk=18, min_val=0, reverse=False, range_mode=RotaryIRQ.RANGE_UNBOUNDED)
step_old = rstep.value()
while True:  
   step_new = rstep.value()
if step_old != step_new:  
    step_old = step_new  
    print('step =', step_new)
if SW.value()==0 :
print("Switch Pressed. Selected step number is : ",step_new)
     utime.sleep(0.5) 

​

​

Rotary Encoder를 회전 또는 스위치를 누르면서 동작시킬 때 얻어지는 출력 모습은 다음과 같다.

​