1. 디지털 센서 입력
이를 요약하면,
라즈베리파이 피코 보드에 디지털 신호 입력을 받는 것은 비교적 간단해서, 입력용 신호선을 연결할 핀을 디지털 입력용이라고 지정해 주고, 이 핀을 IRQ(Interrup request)를 이용하여 입력받으면 된다.
즉, 만일 GP13번 핀으로 디지털 센서 신호를 받으려면, 다음과 같이 해당핀을 디지털 입력으로 선언해 주고,
mysensor = machine.Pin(13, machine.Pin.IN, machine.Pin.PULL_DOWN)
(–> 센서 값 사용 방식에 따라 machine.Pin.PULL_DOWN 대신 machine.Pin.PULL_UP 사용할 수 있음)
해당 핀으로 디지털 센서 신호가 실제 입력되었을 때 동작할 IRQ handler를 선언해 준다.
def myhandler(pin):
if pin is mysensor:
print(“Sensor detected.. Please check”)
buzzer.value(1)
그리고 이렇게 작성해 둔 handler 가동을 위해 다음과 같이 IRQ를 발생시키는 명령을 넣어주면 된다.
mysensor.irq(trigger=machine.Pin.IRQ_RISING, handler=myhandler)
2. 아날로그 센서 값 입력
그런데, 많은 센서들은 디지털보다는 아날로그 신호를 제공하는 경우들도 많기 때문에, 디지털 센서가 아닌 아날로그 센서 값을 직접 입력하는 방법도 많이 필요하게 된다. 이러한 아날로그 센서들의 예로서는 조도 센서, 소리의 크기라든가, 온도/습도 등과 같은 경우를 들 수 있다.
Analog 채널과 해상도
라즈베리파이 피코 보드는 총 4개의 아날로그 채널을 사용할 수 있는데, 실제 외부 센서로부터 입력을 받을 수 있는 채널은 3개로, 각기 GP26, GP27, GP 28핀에 할당된 채널 0~2이다.
피코 보드의 4번째 채널은 피코 보드의 핵심 칩인 RP2040에 내장된 온도 센서를 위해 유보된 아날로그 채널로, 외부 센서의 입력에 사용할 수는 없다.
피코 보드의 ADC(Analog-Digital-Converter) 해상도는 12bit로 아날로그로 입력되는 신호를 12Bit (0~4095)의 값으로 입력받아 RP2040 내에서는 16비트(0~65535)로 처리한다. 참고로 아두이노 우노의 DAC는 10비트로 알려져 있다.
Analog 채널 입력 방법
라즈베리파이 피코 보드의 아날로그 입력용 핀들을 사용하려면 다음과 같이 선언해 주어야 한다.
변수명 = machine.ADC(26) <– Pin GP 번호를 넣는다.
변수명 = machine.ADC(27)
변수명 = machine.ADC(28)
변수명 = machine.ADC(4) <- RP2040에 내장된 온도센서용으로 사용 시
아날로그 센서 신호값을 읽는 방법은 다음과 같다.
변수명.read_u16( )
측정값 산출
입력된 값은 0~65535 사이의 값을 갖게 되는데, 65535가 3.3V에 해당되므로, 다음과 같은 ADC 입력값과 입력 전압 사이의 환산식을 만들 수 있고, 아날로그 입력값에 이 conversion_factor를 곱하여 입력된 전압 값을 구할 수 있다.
Conversion_factor = 3.3 / 65535
입력 전압 = 변수명 * Conversion_factor
최종적으로 측정하는 변수의 값은 이렇게 측정된 전압과, 변수와의 관계식을 이용하여 알게 된다.
예를 들어, 피코 보드에 내장된 온도센서의 경우 27도(섭씨)에서 0.706V의 입력값을 나타내며, 온도 1도가 증가할 때마다 0.001721V 감소하는 것으로 Data Sheet에 보고되어 있다. (다른 센서들도 이런 환산식이 공개되어 있거나, 필요에 따라 스스로 환산식을 회귀분석을 통해 만들 수 있다.)
주: 개인적으로 이 RP2040 내장 온도센서의 환산식에 약간(4-5도 정도)의 오차가 있는 것 같다고 생각한다.
따라서, 이를 이용하면 다음과 같은 관계식이 만들어지게 되고, 이를 이용하여 온도를 측정하게 된다.
(입력 전압 V – 0.706)
측정 온도 = 27 – ——————————–
0.001721
3. 아날로그 센서 값 입력 예제
빛의 밝기를 측정하는 다음과 같은 CdS 모듈을 이용하여 아날로그 센서 값 입력을 시도해 보았다.
다음과 같이 회로를 구성했다.
입력용 마이크로파이썬 코드는 다음과 같으며, CdS 센서를 이용한 조도계 모듈을 통해 입력되는 전압을 표시하도록 구성했다.
import machine
import utime
Light = machine.ADC(0)
conversion_factor = 3.3 / (65535)
while True:
inputvolt = Light.read_u16() * conversion_factor
print(Light)
print("input volt = " , inputvolt)
utime.sleep(1)
이 코드를 실행시켜보면 다음과 같이 주변 밝기에 따라, 아날로그 채널로 입력되는 전압 값이 변하는 것을 확인할 수 있다.
다만, 이 모듈의 경우에는 밝을수록 전압이 작게 나타나는 특징이 있어, 모듈 대신 CdS 소자를 직접 이용해서 회로를 구성해 보았다.
이 경우에도 주변 밝기에 따라 전압 값이 변하는 것을 볼 수 있었다.
다만, 이 경우 전압 값이 통상적인 실내 밝기에서 3V가 넘게 나타나서 변별력이 좀 아쉽게 느껴졌다.
이를 개선하기 위해, 다음과 같이 CdS 소자 앞에 가변 저항을 하나 추가하고, 다음과 같이 Voltage Breaker 방식으로 회로를 구성하고 중간 부분에서 신호선을 따서 CdS 소자에 연결하였다.
이렇게 하면, CdS 소자로 전달되는 전압 자체를 0V~3.3V 범위에서 비교적 자유롭게 조절이 가능하기 때문에, 최종 측정된 전압을 조절하기가 용이해지고, CdS 소자에 걸리는 전압도 좀 더 넓은 범위에서 나타날 것으로 예상되었고, 통상적인 실내 밝기에 약 2.5V 정도가 나오도록 조정한 결과, 어두운 상태에서는 1.8V 정도, 좀 더 밝은 조건에서는 2.6~2.7V 정도의 전압이 나오는 것을 확인했다.
참고로 본 회로에 아두이노에서 온도/습도 측정에 널리 사용되는 BHT 센서도 연결해 보았는데, 다음과 같이 측정값이 읽히는 것을 확인할 수 있었다.

