8 x 8 LED Matrix 1088BS 소자 제어방법 예제 2

8 x 8 LED Matrix 1088BS 소자 제어방법 예제 2

앞선 글에서 1088BS 8×8 LED Matrix 소자에 대해 간단히 소개하고, 핀의 번호부여 및 기본적인 배선 방법을 소개한 바 있다.

https://blog.naver.com/mythee1/223191771952

본 글에서는 이를 이용하여, 라즈베리파이 피코 보드를 이용하여 동작시키는 몇 가지 기본 동작에 대해 소개한다.

기본적으로 필요한 Library는 다음과 같이 기본 동작에는 기본 라이브러리 정도만 있으면 된다.

import machine

import utime

헤더핀의 연결은 순환문 Loop에서 조작이 용이하도록, 다음과 같이 행과 열로 구분하여, 회로의 번호순으로 나열한 배열을 만들어서 출력핀 모드를 선언했다. 그리고 선언 과정에서 초기값도 0으로 설정했다.

배열 내 순서는 각각 위의 핀번호 순서대로 나열했다.

수직 방향으로 연결되는 핀들에 대한 배열

pinV=[machine.Pin(9, machine.Pin.OUT),machine.Pin(14, machine.Pin.OUT),machine.Pin(8, machine.Pin.OUT),machine.Pin(12, machine.Pin.OUT),machine.Pin(1, machine.Pin.OUT),machine.Pin(7, machine.Pin.OUT),machine.Pin(2, machine.Pin.OUT),machine.Pin(5, machine.Pin.OUT)]

수평방향으로 연결되는 핀들에 대한 배열

pinH=[machine.Pin(13, machine.Pin.OUT),machine.Pin(3, machine.Pin.OUT),machine.Pin(4, machine.Pin.OUT),machine.Pin(10, machine.Pin.OUT),machine.Pin(6, machine.Pin.OUT),machine.Pin(11, machine.Pin.OUT),machine.Pin(15, machine.Pin.OUT),machine.Pin(16, machine.Pin.OUT)]

이렇게 배열이 선언된 상태에서

  1. 첫행부터, 한 줄씩 아래로, 해당 행의 모든 LED를 순차적으로 켯다가 끄는 것은 다음과 같은 방법으로 동작시킬 수 있다.

for lines in range(len(pinV)): # 수직 Lines

pinV[lines].value(1)

utime.sleep(0.2)

pinV[lines].value(0)

2. 왼쪽 첫 열부터 오른쪽 끝의 열까지 한 줄씩 해당 열위 모든 LED를 순차적으로 켯다가 끄는 것은 다음 Code로 가능한데, 실제 켜고 끄는 것은 두 번째 Loop 내의 Code인데, 미리 수평방향 열에 연결된 핀들에 다음과 같이 미리 High 신호를 주어서 LED를 꺼두어야 한다.

for k in range(len(pinV)): # 수평이동 전 초기화

pinH[k].value(1)

pinV[k].value(1)

for cols in range(len(pinH)): # 수평 이동

pinH[cols].value(0)

utime.sleep(0.2)

pinH[cols].value(1)

3. 왼쪽 첫 열의 끝 LED (1행, 1열)의 LED부터 오른쪽 아래의 8행 8열 LED까지 대각선 방향으로 순차적으로 LED를 켯다가 끄는 것은 다음과 같이 동작시키면 된다. 실제 켜고 끄는 것은 두 번째 Loop 내의 Code인데, 미리 수평방향 열에 연결된 핀들에 다음과 같이 미리 High 신호를 주어서 LED를 꺼두어야 한다.

for lines in range(len(pinV)): # 왼쪽 위에서 오른쪽 아래로

pinH[lines].toggle()

pinV[lines].toggle()

utime.sleep(0.2)

pinH[lines].toggle()

pinV[lines].toggle()

4. 반대로 첫행 끝열 LED (1행, 8열)의 LED부터 왼쪽 1열의 가장 아래에 있는 8행의 LED(8행 1열) LED까지 대각선 방향으로 순차적으로 LED를 켯다가 끄는 것은 다음과 같이 동작시키면 된다.

for lines in range(len(pinV)):

pinH[7-lines].toggle()

pinV[lines].toggle()

utime.sleep(0.2)

pinH[7-lines].toggle()

pinV[lines].toggle()

5. 첫 번째 LED(1행, 1열)의 LED부터 마지막 LED(8행 8열) LED까지 하나씩 차례대로 LED를 켯다가 끄는 것은 다음과 같이 2중 Loop를 이용하여 동작시키면 된다.

for vert in range(len(pinV)):

pinV[vert].toggle()

for lines in range(len(pinH)):

pinH[lines].toggle()

utime.sleep(0.2)

pinH[lines].toggle()

pinV[vert].toggle()

6. 특정 위치의 LED는 다음과 같이 해당 LED의 배열 순서에 해당되는 LED를 지정해서 양극 쪽에는 high를 음극 쪽에는 low를 만들어주면 해당 위치의 LED가 첫 번째 LED(1행, 1열)의 LED부터 마지막 LED(8행 8열) LED까지 하나씩 차례대로 LED를 켯다가 끄는 것은 다음과 같이 2중 Loop를 이용하여 동작시키면 된다.

한 가지 기억할 것은 배열의 번호는 1이 아니라 0부터 시작하는 것을 기억해야 한다.

pinV[0].value(1)

pinV[7].value(1)

pinH[0].value(0)

pinH[7].value(0)

utime.sleep(4)

그리고, 동작 이후 뒤따라 오는 동작들이 정상적으로 작동하게 하려면, 적절하게 해당 핀들의 신호들을 초기화시키거나, 동작전의 상태로 돌려놓는 것이 필요하다.

이들 동작 모두를 모은 Code는 다음과 같다.

import machine
import utime
  
pinV=[machine.Pin(9, machine.Pin.OUT),machine.Pin(14, machine.Pin.OUT),machine.Pin(8, machine.Pin.OUT),machine.Pin(12, machine.Pin.OUT),machine.Pin(1, machine.Pin.OUT),machine.Pin(7, machine.Pin.OUT),machine.Pin(2, machine.Pin.OUT),machine.Pin(5, machine.Pin.OUT)]
pinH=[machine.Pin(13, machine.Pin.OUT),machine.Pin(3, machine.Pin.OUT),machine.Pin(4, machine.Pin.OUT),machine.Pin(10, machine.Pin.OUT),machine.Pin(6, machine.Pin.OUT),machine.Pin(11, machine.Pin.OUT),machine.Pin(15, machine.Pin.OUT),machine.Pin(16, machine.Pin.OUT)]
while True:
for k in range(len(pinV)):
        pinH[k].value(0)
        pinV[k].value(0)
for lines in range(len(pinV)):
        pinV[lines].value(1)
        utime.sleep(0.2)
        pinV[lines].value(0)
for k in range(len(pinV)):
        pinH[k].value(1)
        pinV[k].value(1)
for cols in range(len(pinH)):
        pinH[cols].value(0)
        utime.sleep(0.2)
        pinH[cols].value(1)
for k in range(len(pinV)):
        pinH[k].value(1)
        pinV[k].value(0)
for lines in range(len(pinV)):
        pinH[lines].toggle()
        pinV[lines].toggle()
        utime.sleep(0.2)
        pinH[lines].toggle()
        pinV[lines].toggle()
for lines in range(len(pinV)):
        pinH[7-lines].toggle()
        pinV[lines].toggle()
        utime.sleep(0.2)
        pinH[7-lines].toggle()
        pinV[lines].toggle()
for vert in range(len(pinV)):
        pinV[vert].toggle()
for lines in range(len(pinH)):
            pinH[lines].toggle()
            utime.sleep(0.2)
            pinH[lines].toggle()
        pinV[vert].toggle()
        
    pinV[0].value(1)
    pinV[7].value(1)
    pinH[0].value(0)
    pinH[7].value(0)
    utime.sleep(1)