본문 바로가기

[라즈베리파이 3B+] SPI 사용하기(SSD1306 OLED 사용)

by rudals.kim 2020. 12. 27. 댓글 개
반응형

아래 테스트는 Raspbian GNU/Linux 10 (buster)에서 테스트되었습니다.

 

라즈베리파이에서 SPI를 사용하기 위해서 먼저 터미널창에서 "ls -al /dev/spi*" 명령어를 사용하여 spi 디바이스 드라이버가 생성되어 있는지를 먼저 확인 해 봐야 합니다. 사용할 수 있는 SPI 드라이버가 현재는 없습니다.

Raspberry Pi Configuration창의 Interfaces에 있는 SPI를 활성화 합니다.

활성화 후 다시 "ls -al /dev/spi*" 명령어를 사용하면 spidev0.0/spidev0.1 이 생성되어 있습니다.

라즈베리파이와 SSD1306 OLED 디스플레이를 아래와 같이 연결합니다

I2C 테스트에서 사용한 Adafruit_Python_SSD1306 모듈을 사용하여 SPI 테스트를 해 봤으나 에러를 내면서 동작이 안되었습니다.

Adafruit_Python_SSD1306 모듈이 오래된데다가 github에서는 deprecated 되었다고 나와있습니다.

그래서 대신에 업버전인듯한 adafruit-circuitpython-ssd1306를 설치를 하여 테스트 하였습니다.

아래 명령어로 설치하면 됩니다.

 

pip3 install adafruit-circuitpython-ssd1306

 

설치 후 example/ssd1306_pillow_demo.py를 참고하여 SPI에서 동작되도록 아래와 같이 수정하였습니다.

"""
This demo will fill the screen with white, draw a black box on top
and then print Hello World! in the center of the display

This example is for use on (Linux) computers that are using CPython with
Adafruit Blinka to support CircuitPython libraries. CircuitPython does
not support PIL/pillow (python imaging library)!
"""

import board
import digitalio
from PIL import Image, ImageDraw, ImageFont
import adafruit_ssd1306

# Change these
# to the right size for your display!
WIDTH = 128
HEIGHT = 64  # Change to 64 if needed
BORDER = 5

# Use for SPI
spi = board.SPI()
oled_reset = digitalio.DigitalInOut(board.D25)
oled_cs = digitalio.DigitalInOut(board.D8)
oled_dc = digitalio.DigitalInOut(board.D24)
oled = adafruit_ssd1306.SSD1306_SPI(WIDTH, HEIGHT, spi, oled_dc, oled_reset, oled_cs)

# Clear display.
oled.fill(0)
oled.show()

# Alternatively load a different format image, resize it, and convert to 1 bit color.
image = Image.open('spi_test_img.png').resize((oled.width, oled.height), Image.ANTIALIAS).convert('1')

# Display image.
oled.image(image)
oled.show()

 

아래는 테스트용으로 사용된 이미지 입니다

제가 만든 이미지가 정상적으로 잘 나옵니다.
라즈베리파이에서 SPI가 정상적으로 동작되는것을 확인 해 보았습니다.

반응형

댓글