그러면 이와 반대로 라즈베리 파이 피코 보드에서 아날로그 값을 출력하는 것은 어떻게 할까?
방법은 PWM (Pulse Width Modulation)을 이용하는 것이다.
참고. 라즈베리파이 피코 보드에서 디지털 입력과 디지털 출력 방법
디지털 출력 : mypicoled=machine.pin(핀 번호, machine.Pin.OUT)
디지털 입력 : mysensor = machine.Pin(13, machine.Pin.IN, machine.Pin.PULL_DOWN)
라즈베리파이 피코는 내부적으로 디지털 방식으로 신호를 처리하기 때문에, 곧바로 아날로그 값을 출력할 수는 없기 때문에, 내보내어야 할 신호를 마치 수학의 미분과 유사하게 신호를 여러 개의 펄스로 나누고, 이들 각각
의 펄스의 값을 On/Off로 조절하여 아날로그와 유사한 신호를 구현하는데, PWM에서는 이들 각각의 펄스의 폭을 조절하는 방식으로 Duty를 조절하게 되므로 PWM(Pulse Width Modulation)이라고 부르며, 이러한 방법을 통해 아날로그와 유사한 신호를 출력하게 되는 것이다.
이처럼 출력신호를 1초당 몇 개의 펄스로 나누는지를 주파수 (frequency)라고 하는데, 장치별로 사용가능한 주파수가 정해져 있는 경우도 많으며, 다음과 같이 Datasheet에 해당 내용이 공개되는 게 일반적이다. 다음의 예는 SG90 서보 모터의 Datasheet에서 발췌한 내용이다.
실제로 PWM방식으로 해당 장치를 제어하려면 하나의 펄수 주기동안 얼마만큼 펄스를 유지할 것인가가 중요한데, 하나의 펄스 주기동안 얼마나 펄스를 Active 상태로 유지할 것인가를 Duty라고 하며, 이 duty 값으로 PWM 장치들을 제어하게 된다.
예를 들어, PWM을 이용하는 SG90 서보모터의 경우 다음과 같이 , datasheet에는 1msec의 폭을 갖는 펄스를 주면, 0도 위치로, 2msec의 폭을 가지는 펄스를 주면 180도 방향이 되도록 회전하게 되는 것이 제시되어 있다.
이를 이용하여 PWM출력을 하는 경우, 다음과 같이 된다.
이론상 0도로 동작되도록 PWM 핀으로 실제 출력되어야 하는 duty값은 : 65535 x 1.0 / 20 = 3276
이론상 90도로 동작되도록 PWM 핀으로 실제 출력되어야 하는 duty값은 : 65535 x 1.5 / 20 = 4915
이론상 180도로 동작되도록 PWM 핀으로 실제 출력되어야 하는 duty값은 : 65535 x 2.0 / 20 = 6553
<참고사항> 실제 test해 보면 SG90의 경우 오차 및 제작사 설게치 변경 등으로 인해 위의 값을 그대로 사용하면 0도에서 180도까지 동작하지는 않는다. 실제로는 0.5msec~2.5 msec 범위로 값을 확장해 주어야 0도에서 180도까지 동작한다. 때문에 실제로 필요한 PWM duty 출력값은 다음과 같다. 실제 0도로 동작되도록 PWM 핀으로 실제 출력되어야 하는 duty값은 : 65535 x 0.5 / 20 = 1638 보다 작은값 실제 180도로 동작되도록 PWM 핀으로 실제 출력되어야 하는 duty값은 : 65535 x 2.5 / 20 = 8192 보다 큰값 |

