콘텐츠로 이동

4.7 LED 스트립 점등과 소등

오프라인 Upload 모드·Live 모드 공통

사이버파이 본체에는 RGB LED가 5개 있다. 더 많은 LED로 측정값을 표시하려면 포켓쉴드(Pocket Shield)에 LED 스트립(LED strip)을 연결한다. 이 절에서는 LED 스트립을 점등·소등하는 함수를 실습하고, 조도 센서 측정값에 따라 점등 개수를 변경하는 막대 표시기를 작성한다. 7.4절의 소음 신호등과 12.1절의 날씨 신호등은 이 절의 코드를 기반으로 한다.

포켓쉴드와 LED 스트립 연결

포켓쉴드는 사이버파이 아래에 결합하는 확장 보드로, 배터리 전원을 공급하고 DC 모터 포트 2개와 디지털 서보 포트 2개(S1·S2)를 제공한다. 디지털 서보 포트에는 LED 스트립이나 LED 링을 연결할 수 있다.

  1. 사이버파이를 포켓쉴드에 결합한다.
  2. LED 스트립 케이블을 포켓쉴드의 S1 포트에 연결한다.
  3. 포켓쉴드의 전원 스위치를 켠다.
항목 값
연결 포트 "s1" 또는 "s2" ("all"은 두 포트 동시 제어)
제어 가능한 LED 수 포트당 최대 36개
LED 위치 번호 1부터 시작(첫 번째 LED가 1)

이 절의 예제는 LED 12개짜리 스트립을 S1 포트에 연결한 구성을 기준으로 한다. LED 개수가 다르면 코드의 N 값을 변경한다.

LED 스트립 제어 함수

cyberpi.pocket 모듈이 LED 스트립 제어 함수를 제공한다.

함수 기능
led_on(r, g, b, id, port) id 위치(1~36 또는 "all")의 LED를 RGB 색으로 점등
led_show(color, port) 색 약어 목록 문자열로 LED 전체 색을 한 번에 지정
led_off(id, port) id 위치의 LED 소등
led_set_bri(brightness, port) 밝기를 0~100(%)으로 지정
led_move(step, cycle, port) 색 배열을 step칸 이동

led_show의 색 약어는 다음과 같다. k(검정)는 소등과 같다.

약어 색 약어 색 약어 색
r 빨강 y 노랑 b 파랑
o 주황 g 초록 p 보라
c 청록 w 흰색 k 검정(소등)

점등과 소등 실습

다음 프로그램은 LED 전체를 빨간색으로 점등하고, 12개의 색을 각각 지정한 뒤, 3번째 LED만 소등하고, 마지막으로 전체를 소등한다.

import cyberpi
import time

PORT = "s1"

cyberpi.pocket.led_set_bri(30, PORT)               # 밝기 30%
cyberpi.pocket.led_on(255, 0, 0, "all", PORT)      # 전체 빨간색
time.sleep(1)

cyberpi.pocket.led_show("r o y g c b p w r o y g", PORT)  # 12개 색 개별 지정
time.sleep(1)

cyberpi.pocket.led_off(3, PORT)                    # 3번째 LED 소등
time.sleep(1)

cyberpi.pocket.led_off("all", PORT)                # 전체 소등

밝기 설정

LED 스트립은 최대 밝기에서 눈부심과 전력 소비가 크다. 실습실에서는 led_set_bri로 20~40% 범위를 사용한다.

조도 막대 표시기

조도 센서 측정값 cyberpi.get_bri()는 0~100 범위의 정수를 반환한다. 측정값을 LED 개수 비율로 환산하면 밝을수록 많은 LED가 점등되는 막대 표시기가 된다.

import cyberpi
import time

PORT = "s1"
N = 12                                   # LED 개수

cyberpi.pocket.led_set_bri(30, PORT)
while True:
    bri = cyberpi.get_bri()              # 0~100
    n = round(bri / 100 * N)             # 점등할 LED 개수
    colors = ["g"] * n + ["k"] * (N - n)
    cyberpi.pocket.led_show(" ".join(colors), PORT)

    cyberpi.display.clear()
    cyberpi.display.show_label(str(bri), 32, "center")

    if cyberpi.controller.is_press("a"):  # A 단추로 종료
        cyberpi.pocket.led_off("all", PORT)
        break
    time.sleep(0.2)

colors는 점등할 개수만큼 "g"를, 나머지는 "k"를 배치한 리스트다. " ".join(colors)는 리스트 요소를 공백으로 연결해 led_show가 요구하는 문자열 형식으로 변환한다. 손으로 센서를 가리거나 휴대폰 조명을 비추면서 점등 개수가 변화하는지 확인한다.

연습 문제

  1. 막대 표시기에서 점등 개수가 4개 이하이면 빨강, 5~8개이면 노랑, 9개 이상이면 초록으로 표시하도록 수정하시오.
  2. led_move를 사용해 "r k k k k k k k k k k k" 배열의 빨간 점이 한 칸씩 이동하는 프로그램을 작성하시오.
  3. 조도 대신 cyberpi.get_loudness("maximum")(소리 크기)을 사용하도록 변경하고, 박수 소리에 따른 점등 개수 변화를 관찰하시오.

초안 확인 사항

함수 이름과 인자는 Makeblock mCode 공식 문서(Pocket Shield, cyberpi API)를 기준으로 작성했다. 실습용 LED 스트립 실물에서 포트 표기(소문자 "s1")와 LED 위치 번호를 확인한 뒤 확정한다.