본문 바로가기

라즈베리파이 피코 테스트 보드 제작

by rudals.kim 2022. 8. 7. 댓글 개
반응형

라즈베리파이 피코 보드와 다른 디바이스들을 연동을 하려면 서로 간에 인터페이스로 연결을 해야 하는데 이때 기본적으로 사용되는 인터페이스로 UART/I2C/SPI 등이 있습니다. 라즈베리파이 피코 보드에서 이러한 인터페이스를 쉽고 빠르게 테스트해 보기 위해 테스트용 보드를 제작해 보았습니다. 추가적으로 몇 개의 GPIO를 할당하여 Motor driver, WS2812, LED를 추가하였습니다.

인터페이스 테스트용 PCB이다 보니 eagle CAD로 쉽게 그릴 수 있었습니다.

거버 파일을 생성 후 https://jlcpcb.com/KOR에 업로드하여 주문서를 작성하였습니다.

 

PCB Prototype & PCB Fabrication Manufacturer - JLCPCB

JLCPCB, 더 빠른 PCB & SMT 어셈블리를 위한 것이다 모든 단계에서 시간과 비용 절감한다. 클릭하시면 동영상을 볼 수 있습니다. PCBs 주문 $2

jlcpcb.com

JLCPCB에서는 거버 파일을 업로드하면 Top/Bottom/3D 이미지의 미리보기를 제공해 주고 있어서 쉽게 최종 완성된 PCB의 형태를 확인해 볼 수 있습니다. 아래는 제가 올린 거버 파일의 3D PCB 이미지입니다.

주문을 넣고 일주일 정도 지나 주문한 PCB를 받을 수 있었습니다.

사용하기 쉽게 라즈베리파이 피코와 테스트 보드에 핀헤더 및 제가 가지고 있던 부품 몇 개를 같이 납땜하였습니다.

이상하게도 실크에 핀 이름을 잘못 기재하는 실수를 종종 합니다. 이번에도 WS2812의 핀 이름을 잘못 기재하여 VCC와 GND를 반대로 적어 놓았습니다. WS2812에 역전압이 걸릴뻔했습니다. 나중에라도 기억하기 위해 붉은색 마커펜으로 표시해 놓았습니다.

핀헤더를 다 꽂아 놔서 라즈베리파이 피코와 주변장치만 연결하면 쉽게 바로 테스트가 되기 때문에 몇 가지 테스트를 해 보았습니다.

 

GPIO 테스트 (LED On/Off 테스트)

간단히 GPIO를 컨트롤하여 LED를 ON/OFF를 합니다.

import time
import board
import digitalio

led = digitalio.DigitalInOut(board.GP22)
led.direction = digitalio.Direction.OUTPUT

while True:
    led.value = True
    time.sleep(0.5)
    led.value = False
    time.sleep(0.5)

 

녹색 LED가 ON/OFF를 반복하며 정상적으로 잘 동작됩니다.

 

SPI 테스트 (MicroSD Read & Write 테스트)

adafruit circuitpython에서 제공되는 라이브러리 중 adafruit_sdcard.py를 라즈베리파이의 lib 디렉터리에 복사해 넣은 후 아래 소스를 사용하여 MicroSD 카드 테스트를 하였습니다. 

import os
import busio
import board
import digitalio
import storage
import adafruit_sdcard

def print_directory(path, tabs=0):
    for file in os.listdir(path):
        stats = os.stat(path + "/" + file)
        filesize = stats[6]
        isdir = stats[0] & 0x4000

        if filesize < 1000:
            sizestr = str(filesize) + " bytes"
        elif filesize < 1000000:
            sizestr = "%0.1f KB" % (filesize / 1000)
        else:
            sizestr = "%0.1f MB" % (filesize / 1000000)

        prettyprintname = ""
        for _ in range(tabs):
            prettyprintname += "   "
        prettyprintname += file
        if isdir:
            prettyprintname += "/"
        print("{0:<40} Size: {1:>10}".format(prettyprintname, sizestr))

        # recursively print directory contents
        if isdir:
            print_directory(path + "/" + file, tabs + 1)
            
SD_CS = board.GP17    

# Connect to the card and mount the filesystem.
spi = busio.SPI(board.GP18, board.GP19, board.GP16)
cs = digitalio.DigitalInOut(SD_CS)
sdcard = adafruit_sdcard.SDCard(spi, cs)
vfs = storage.VfsFat(sdcard)
storage.mount(vfs, "/sd")

print("Files on filesystem:")
print("====================")
print_directory("/sd")

with open("/sd/test01.txt", "w") as file:
    file.write("Hello, SD World!\r\n")

print("====================")
with open("/sd/test01.txt", "r") as file:
    data = file.read()
    print(data)
    
print("====================")
print_directory("/sd")

 

SPI와 GPIO를 동시에 테스트해 보았습니다.

Thonny의 Shell 창에 MicroSD의 파일 리스트가 출력됩니다.

WS2812 테스트

다수의 LED가 아닌 테스트용으로 1개만 연결하여 외부 전원은 연결하지 않았습니다.

import board
import neopixel

num_pixels = 1
pixels = neopixel.NeoPixel(board.GP2, num_pixels)
pixels.brightness = 0.5

while True:
	pixels.fill((255, 0, 0))

 

정상적으로 WS2812 LED가 붉은색으로 잘 켜집니다.

 

I2C 인터페이스 (SSD1306 OLED 테스트)

adafruit_ssd1306 라이브러리를 설치 후 아래 소스코드를 사용하여 SSD1306 OLED를 테스트하였습니다.

import os
import board
import busio
import adafruit_ssd1306

i2c = busio.I2C(board.GP13, board.GP12)
display = adafruit_ssd1306.SSD1306_I2C(128, 64, i2c)

display.fill(0)

logo = [
0x0f, 0x80, 0x7c, 0x00, 0x78, 0x61, 0x87, 0x80, 0x40, 0x12, 0x00, 0x80, 0x42, 0x0c, 0x00, 0x80, 
0x41, 0x84, 0x30, 0x80, 0x20, 0x44, 0xc1, 0x00, 0x20, 0x25, 0x01, 0x00, 0x10, 0x1e, 0x02, 0x00, 
0x0c, 0x3f, 0x8c, 0x00, 0x07, 0xe1, 0xf8, 0x00, 0x08, 0x00, 0x04, 0x00, 0x10, 0xc0, 0x42, 0x00, 
0x11, 0xe1, 0xf2, 0x00, 0x37, 0x1e, 0x1b, 0x00, 0x3c, 0x0c, 0x0f, 0x00, 0x68, 0x04, 0x05, 0x80, 
0xc8, 0x04, 0x04, 0x80, 0x88, 0x0c, 0x04, 0x40, 0x88, 0x1e, 0x04, 0x40, 0x8c, 0x1f, 0x0c, 0x40, 
0xdf, 0xe0, 0xfe, 0xc0, 0x7f, 0xc0, 0x73, 0x80, 0x61, 0x80, 0x61, 0x80, 0x21, 0x80, 0x41, 0x00, 
0x20, 0x80, 0x41, 0x00, 0x30, 0xc0, 0x83, 0x00, 0x10, 0xff, 0x82, 0x00, 0x0c, 0xff, 0xcc, 0x00, 
0x03, 0x80, 0x70, 0x00, 0x01, 0x80, 0x60, 0x00, 0x00, 0x61, 0x80, 0x00, 0x00, 0x1e, 0x00, 0x00 ]

display.image(logo, 0, 20, 4, 32)
display.text('Hello World!', 40, 30, 1)
display.show()

 

아래 이미지처럼 OLED에 라즈베리파이 로고와 Hello World! 문자열이 나오며 정상적으로 동작됩니다.

이번에 제작한 라즈베리파이 피코 테스트 보드에 제가 가지고 있던 부품들을 하나씩 하나씩 추가하면서 디바이스의 동작 테스트를 해 보았습니다. 간단히 인터페이스만 연결시켜 놓은 거라 잘 동작됩니다. 다른 디바이스를 사용하고 싶은 경우 이 보드에 점퍼선을 연결하여 테스트해 볼 수 있게 되어 편리할 것 같습니다.

반응형

댓글