본문 바로가기
오픈소스하드웨어/마이크로:비트

[마이크로 비트 with 파이썬] 확장보드를 이용한 숨쉬는 LED

by 북마크한 취미생활 2020. 5. 12.

오픈소스 하드웨어를 처음 접했을 때 개인적으로 가장 먼저 만들어 보고 싶었던 것은 흔히 '숨 쉬는 LED'라고 말하는 'LED dimming'이었습니다. 지금 생각해보면 딱히 어떤 이유가 있었던 것은 아니었고, LED 빛이 서서히 밝아지고, 서서히 어두워지는 것에 힐링이 되었던 것 같은데, 아직도 왜 그런 마음을 가지게 되었는지는 모르겠습니다.

사설이 길었습니다. 오늘은 저의 추억이 묻어 있는 숨 쉬는 LED(LED dimming)을 마이크로 비트(micro:bit)로 어떻게 구현을 하는지 소개해 드리도록 하겠습니다.

| PWM에 대해

지금 설명해 드리는 것은 굳이 알고 있지 않아도 되는 것입니다. 읽고 어렵다고 느끼시면 다음에 생각날 때 읽어보시길 바랍니다.

사실 숨 쉬는 LED의 구현은 PWM 기능이 지원되어야 가능합니다. PWM이라고 이야기드리니 뭔가 전문적이고 기술적인 용어라 잔뜩 겁을 먹을 수도 있는데, 별것 아니니 안심하시길 바랍니다.

PWM을 이해하려면 먼저 아날로그라는 것을 이해해야 합니다. 아날로그라는 것은 쉽게 연속된 값으로 설명할 수 있습니다. 예를 들면 시곗바늘이 움직이는 것이라는지, 수은주로 온도를 나타내는 온도계를 생각하시면 이해가 쉽게 됩니다. 초 시계를 보면 급작스럽게 10초에서 20초로 가지 않고, 20초를 가기 위해서 단계적으로 11, 12, 13를 거쳐 20초로 가게 됩니다. 수은주 온도계도 0도에서 10도까지 간다고 하면 서서히 수은주가 움직여 10도까지 가게 됩니다. 이렇게 단계적으로 값이 변하는 것이 바로 아날로그 형태의 값이라고 보면 됩니다.

우리가 사용하는 마이크로 비트는 디지털 기기로 0v와 3.3v를 0과 1로 인식을 하고 이를 처리합니다. 하지만 우리가 살아가는 세계는 아날로그 세계로 아날로그의 표현인 0과 1로 표현할 수 없는 것들이 많이 있습니다. 그렇기 때문에 마이크로 비트에서 아날로그 형태처럼 표현하는 것이 필요한데, 그것이 바로 PWM입니다. 

PWM을 이해하기 위해 꼭 기억할 것은 일정한 시간 간격으로 동일한 상태가 반복되는 '주기'와 3.3V를 유지하는 시간을 의미하는 '듀티'(duty)입니다. 주기와 duty를 가지고 어떻게 '숨 쉬는 LED' 가능한지는 예제를 통해서 설명드리도록 하겠습니다.

| 회로 구성

숨 쉬는 LED를 만들기 위해서는 아래와 같이 회로를 구성하면 됩니다.

LED의 연결은 꼭 1번 pin에 할 필요는 없으며 확장 보드에 ~표시가 되어 있는 pin에 연결하면 됩니다. 참고로 말씀드리면 대부분 확장 보드는 아날로그 기능을 사용할 수 있는 pin에 알아보기 쉽게 ~로 표기를 합니다.

| 숨 쉬는 LED 파이썬 코드

from microbit import *

while True:
    for x in range(1023):
        pin1.write_analog(x)
        sleep(1)
    for x in range(1023) :
        pin1.write_analog(1023 - x)
        sleep(1)

| write_analog( ) 함수 설명

write_analog() 함수는 동일한 시간 간격인 주기를 생성합니다. 그리고 0~1023 사이의 값 설정을 통해 high를 유지하는 시간을 설정할 수 있습니다. 즉, 한 칸(주기)을 1024 등분을 하여 설정한 값만큼 high 값을 유지하겠다는 의미입니다.

이 값을 512(1023의 절반) 값을 주면 한 주기의 50%의 값을 가진 형태를 볼 수 있습니다. 또는 255(2013의 25%) 값으로 설정하면 25%의 duty 값을 주게 됩니다. 이렇게 high를 유지하는 값을 줄이게 되면 아래와 같이 LED의 밝기가 변하게 됩니다.

▲ 설정값에 따른 duty의 변화

이렇게 되는 이유는 write_analog() 함수에 PWM 기능이 있고, 이는 동일한 시간에 output pin을 통해 나가는 에너지의 양이 달라지고, 이로 인해 pin과 연결된 LED의 밝기가 달라지게 됩니다. 즉, write_analog() 함수의 설정값을 크게 하면, high의 duty 길이가 길어지고, output으로 나가는 에너지가 많아지게 됨으로 LED가 밝아지게 됩니다.

▲ write_analog() 값을 1023, 512, 0으로 설정했을때 LED의 밝기 변화

쉽게 설명드린다고 했는데, 이해가 되셨나요? 제 설명 능력이 부족해서 설명이 잘 됐는지 모르겠습니다. 만약 설명이 이해가 되지 않으시면 'PWM란 대중 이런 원구나' 정도로 생각하시고, 단순하게 write_analog() 함수의 값을 크게 주면 밝게 작게 주면 어둡게 된다는 정도만 이해하셔도 됩니다. 우리는 마이크로 비트를 이용하여 원하는 것을 만들기만 하면 되니까요.

| 실행 모습

해당 코드를 마이크로 비트에 업로드하고 마이크로 비트(micro:bit)를 실행을 하면 아래와 같이 LED가 어두워지고 밝아지는 것이 반복되는 것을 볼 수 있습니다.

긴 글 읽어 주셔서 감사합니다.

반응형

댓글