이전의 아날로그 입력을 받는 글에서 가변저항을 이용하여 입력값을 변화시키기 위해 다음과 같은 모양의 가변저항(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를 회전 또는 스위치를 누르면서 동작시킬 때 얻어지는 출력 모습은 다음과 같다.


