라즈베리 파이 OLED
이 튜토리얼은 OLED 디스플레이와 함께 Raspberry Pi를 사용하는 방법을 안내합니다. 자세히 살펴보면 다음을 배웁니다:
- OLED 디스플레이를 Raspberry Pi에 연결하는 방법.
- 텍스트와 숫자를 OLED에 표시하도록 Raspberry Pi를 프로그래밍하는 방법.
- 텍스트와 숫자를 OLED에 수직 및 수평 중앙 정렬하도록 Raspberry Pi를 프로그래밍하는 방법.
- OLED에 그리도록 Raspberry Pi를 프로그래밍하는 방법.
- OLED에 이미지를 표시하도록 Raspberry Pi를 프로그래밍하는 방법.
Hardware Preparation
1 | × | Raspberry Pi 4 Model B | Amazon | |
1 | × | SSD1306 I2C OLED Display 128x64 | Amazon | |
1 | × | SSD1306 I2C OLED Display 128x32 | Amazon | |
1 | × | Jumper Wires | Amazon | |
1 | × | (추천) Screw Terminal Block Shield for Raspberry Pi | 쿠팡 | Amazon | |
1 | × | (추천) USB-C Power Cable with On/Off Switch for Raspberry Pi 4B | Amazon | |
1 | × | (추천) Plastic Case and Cooling Fan for Raspberry Pi 4B | Amazon | |
1 | × | (추천) HDMI Touch Screen Monitor for Raspberry Pi | Amazon |
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.
OLED 디스플레이에 대하여
다양한 종류의 OLED 디스플레이가 있습니다. 라즈베리 파이와 함께 가장 많이 사용되는 OLED는 SSD1306 I2C OLED 128x64 및 128x32 디스플레이입니다.
I2C OLED 디스플레이 핀 배치
- GND 핀: Raspberry Pi의 그라운드에 연결해야 합니다.
- VCC 핀: 디스플레이의 전원 공급 핀으로 Raspberry Pi의 5볼트 핀에 연결해야 합니다.
- SCL 핀: I2C 인터페이스의 시리얼 클럭 핀입니다.
- SDA 핀: I2C 인터페이스의 시리얼 데이터 핀입니다.
※ NOTE THAT:
- OLED 모듈의 핀 배열은 제조업체와 모듈 유형에 따라 다를 수 있습니다. 항상 OLED 모듈에 인쇄된 라벨을 참조하는 것이 필수적입니다. 주의 깊게 확인하세요!
- 이 튜토리얼에서는 SSD1306 I2C 드라이버를 사용하는 OLED 디스플레이를 사용합니다. 우리는 DIYables의 OLED 디스플레이로 테스트했으며 완벽하게 작동합니다.
Wiring Diagram
- 라즈베리 파이와 OLED 128x64 간의 배선도
이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.
- 라즈베리 파이와 OLED 128x32 간의 배선도
이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.
배선 구성을 간단하고 체계적으로 만들기 위해, Raspberry Pi용 스크루 터미널 블록 실드 사용을 권장합니다. 이 실드는 아래와 같이 더욱 안정적이고 관리하기 쉬운 연결을 제공합니다:
라즈베리 파이와 OLED 디스플레이 간의 배선 테이블:
OLED Module | Raspberry Pi |
---|---|
Vin | 5V |
GND | GND |
SDA | GPIO2 (pin 3) |
SCL | GPIO3 (pin 5) |
Raspberry Pi 코드 - OLED에 텍스트 표시
Detailed Instructions
- 라즈베리 파이에 Raspbian 또는 다른 호환 운영 체제가 설치되어 있는지 확인하세요.
- PC와 동일한 로컬 네트워크에 라즈베리 파이가 연결되어 있는지 확인하세요.
- 라이브러리를 설치해야 하는 경우, 라즈베리 파이가 인터넷에 연결되어 있는지 확인하세요.
- 라즈베리 파이를 처음 사용하는 경우, 라즈베리 파이 설정 방법을 참고하세요.
- Linux 및 macOS에서는 내장된 SSH 클라이언트를 사용하고, Windows에서는 PuTTY를 사용하여 SSH로 PC를 라즈베리 파이에 연결하세요. PC를 라즈베리 파이에 SSH로 연결하는 방법을 참조하세요.
- RPi.GPIO 라이브러리가 설치되어 있는지 확인하세요. 설치되어 있지 않다면, 다음 명령어를 사용하여 설치하세요.
sudo apt-get update
sudo apt-get install python3-rpi.gpio
- Raspberry Pi에서 OLED 디스플레이를 사용하기 전에 Raspberry Pi에서 I2C 인터페이스를 활성화해야 합니다. Raspberry Pi에서 I2C 인터페이스 활성화 방법을 참조하세요.
- 다음 명령어를 실행하여 OLED 라이브러리를 설치하세요:
pip install Adafruit-SSD1306
- Python 스크립트 파일 oled.py을 생성하고 다음 코드를 추가하세요:
# 이 Raspberry Pi 코드는 newbiely.kr 에서 개발되었습니다
# 이 Raspberry Pi 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다.
# 상세한 지침 및 연결도에 대해서는 다음을 방문하세요:
# https://newbiely.kr/tutorials/raspberry-pi/raspberry-pi-oled
import time
import RPi.GPIO as GPIO
import Adafruit_SSD1306
# GPIO pin configuration for the OLED display
OLED_RESET_PIN = None # Set to GPIO pin if your display has a reset pin
OLED = Adafruit_SSD1306.SSD1306_128_64(rst=OLED_RESET_PIN)
# Initialize the OLED display
OLED.begin()
# Clear the display
OLED.clear()
OLED.display()
try:
while True:
# Clear the display
OLED.clear()
# Display "Hello World!" on OLED
OLED.draw.text((0, 0), "Hello World!", font=None, fill=255)
# Display on OLED
OLED.display()
# Delay for readability
time.sleep(1)
except KeyboardInterrupt:
print("Program terminated by user.")
finally:
GPIO.cleanup()
- 파일을 저장하고 터미널에서 다음 명령어를 실행하여 Python 스크립트를 실행하세요:
python3 oled.py
- OLED 디스플레이를 확인하세요.
스크립트는 터미널에서 Ctrl + C를 누를 때까지 무한 반복으로 실행됩니다.
라즈베리 파이 코드 – 이미지 표시
OLED에 이미지를 표시하려면 먼저 이미지를 (포맷에 관계없이) 비트맵 배열로 변환해야 합니다. 이는 이 온라인 도구를 사용하여 수행할 수 있습니다. 이를 수행하는 방법에 대한 지침은 아래 그림을 참조하십시오. 저는 이미 Raspberry Pi 아이콘을 비트맵 배열로 변환했습니다.
변환이 완료되면 배열 코드를 가져와 다음 코드 조각의 기존 ArduinoIcon 배열 코드를 교체하세요.
# 이 Raspberry Pi 코드는 newbiely.kr 에서 개발되었습니다
# 이 Raspberry Pi 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다.
# 상세한 지침 및 연결도에 대해서는 다음을 방문하세요:
# https://newbiely.kr/tutorials/raspberry-pi/raspberry-pi-oled
import time
import Adafruit_SSD1306
from PIL import Image
# GPIO pin configuration for the OLED display
OLED_RESET_PIN = None # Set to GPIO pin if your display has a reset pin
DISP = Adafruit_SSD1306.SSD1306_128_64(rst=OLED_RESET_PIN)
# Bitmap of DIYable-icon image
bitmap_width = 128 # MUST match the bitmap image size
bitmap_height = 57 # MUST match the bitmap image size
bitmap_DIYables = [
# 'DIYables Icon', 128x57px
0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xfe, 0x00, 0x03, 0xf1, 0xf8, 0x00, 0x3e,
0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xc0, 0x03, 0xf1, 0xf8, 0x00, 0x7e,
0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xf0, 0x03, 0xf0, 0xfc, 0x00, 0x7c,
0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xf8, 0x03, 0xf0, 0xfc, 0x00, 0xfc,
0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xfc, 0x03, 0xf0, 0x7e, 0x00, 0xf8,
0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xf8, 0x01, 0xfe, 0x03, 0xf0, 0x3f, 0x01, 0xf8,
0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xf8, 0x00, 0x7f, 0x03, 0xf0, 0x3f, 0x03, 0xf0,
0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xf8, 0x00, 0x3f, 0x03, 0xf0, 0x1f, 0x83, 0xe0,
0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xf8, 0x00, 0x3f, 0x83, 0xf0, 0x1f, 0x87, 0xe0,
0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xf8, 0x00, 0x1f, 0x83, 0xf0, 0x0f, 0xc7, 0xc0,
0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xf8, 0x00, 0x1f, 0x83, 0xf0, 0x07, 0xef, 0xc0,
0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xf8, 0x00, 0x1f, 0x83, 0xf0, 0x07, 0xff, 0x80,
0xf0, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xf8, 0x00, 0x1f, 0x83, 0xf0, 0x03, 0xff, 0x00,
0xfe, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xf8, 0x00, 0x1f, 0x83, 0xf0, 0x03, 0xff, 0x00,
0xff, 0xc0, 0x03, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xf8, 0x00, 0x1f, 0x83, 0xf0, 0x01, 0xfe, 0x00,
0xff, 0xe0, 0x03, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xf8, 0x00, 0x1f, 0x83, 0xf0, 0x00, 0xfe, 0x00,
0xff, 0xf8, 0x03, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xf8, 0x00, 0x1f, 0x83, 0xf0, 0x00, 0xfc, 0x00,
0xff, 0xfc, 0x03, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xf8, 0x00, 0x3f, 0x03, 0xf0, 0x00, 0xfc, 0x00,
0xff, 0xfe, 0x03, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xf8, 0x00, 0x7f, 0x03, 0xf0, 0x00, 0xfc, 0x00,
0xff, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xf8, 0x00, 0xff, 0x03, 0xf0, 0x00, 0xfc, 0x00,
0xff, 0xff, 0x83, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xf8, 0x03, 0xfe, 0x03, 0xf0, 0x00, 0xfc, 0x00,
0xff, 0xff, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xfc, 0x03, 0xf0, 0x00, 0xfc, 0x00,
0xff, 0xff, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xf8, 0x03, 0xf0, 0x00, 0xfc, 0x00,
0xff, 0xff, 0xe3, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xe0, 0x03, 0xf0, 0x00, 0xfc, 0x00,
0xff, 0xff, 0xe3, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, 0x80, 0x03, 0xf0, 0x00, 0xfc, 0x00,
0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xf8, 0x00, 0x03, 0xe0, 0x00, 0xfc, 0x00,
0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xc7, 0xff, 0x1f, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xc7, 0xff, 0x1f, 0xff, 0xff, 0xff,
0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xc7, 0xff, 0x1f, 0xff, 0xff, 0xff,
0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xc7, 0xff, 0x1f, 0xff, 0xff, 0xff,
0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0x80, 0xff, 0x9f, 0xc6, 0x7f, 0x1f, 0xdf, 0xf9, 0xff,
0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0x00, 0xfc, 0x03, 0xc0, 0x0f, 0x1e, 0x03, 0xe0, 0x3f,
0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0x00, 0xfc, 0x03, 0xc0, 0x07, 0x1c, 0x01, 0xc0, 0x3f,
0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xfe, 0x00, 0xfd, 0xf1, 0xc3, 0xc7, 0x18, 0xf8, 0x8f, 0xff,
0xff, 0xff, 0xe3, 0xff, 0xff, 0xff, 0xfe, 0x00, 0xff, 0xf1, 0xc7, 0xe3, 0x18, 0xf8, 0x8f, 0xff,
0xff, 0xff, 0xe3, 0xff, 0xff, 0xff, 0xfc, 0x00, 0xfe, 0x01, 0xc7, 0xe3, 0x18, 0x00, 0xc0, 0xff,
0xff, 0xff, 0xc3, 0xff, 0xff, 0xff, 0xfc, 0x00, 0xfc, 0x01, 0xc7, 0xe3, 0x18, 0x00, 0xe0, 0x3f,
0xff, 0xff, 0xc3, 0xff, 0xff, 0xff, 0xf8, 0x00, 0xf8, 0xf1, 0xc7, 0xe3, 0x18, 0xff, 0xfe, 0x1f,
0xff, 0xff, 0x83, 0xff, 0xff, 0xff, 0xf0, 0x00, 0xf8, 0xf1, 0xc3, 0xc7, 0x18, 0xff, 0xff, 0x1f,
0xff, 0xff, 0x03, 0xff, 0xff, 0xff, 0xe0, 0x00, 0xf8, 0x61, 0xc0, 0x07, 0x1c, 0x01, 0xc0, 0x3f,
0xff, 0xfe, 0x03, 0xff, 0xff, 0xff, 0xc0, 0x00, 0xfc, 0x01, 0xc0, 0x0f, 0x1e, 0x01, 0x80, 0x3f,
0xff, 0xfc, 0x03, 0xff, 0xff, 0xff, 0x80, 0x00, 0xfe, 0x19, 0xc4, 0x3f, 0x1f, 0x87, 0xe0, 0xff,
0xff, 0xf8, 0x03, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xe0, 0x03, 0xff, 0xff, 0xfc, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xc0, 0x03, 0xff, 0xff, 0xf0, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0x00, 0x03, 0xff, 0xff, 0xc0, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xf0, 0x00, 0x03, 0xff, 0xfc, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
]
def draw_bitmap(image, bitmap_data, width, height):
image.putdata(bitmap_data)
return image
try:
DISP.begin()
DISP.clear()
DISP.display()
# Create a blank image with mode '1' for 1-bit pixels (bitmap)
image = Image.new('1', (bitmap_width, bitmap_height))
while True:
DISP.clear()
# Display bitmap to the center
x = (DISP.width - bitmap_width) // 2
y = (DISP.height - bitmap_height) // 2
# Draw the bitmap on the image
image = draw_bitmap(image, bitmap_DIYables, bitmap_width, bitmap_height)
# Paste the image on the OLED display
DISP.image(image)
DISP.display()
time.sleep(2)
except KeyboardInterrupt:
print("Program terminated by user.")
finally:
DISP.clear()
DISP.display()
※ NOTE THAT:
- 이미지 크기는 화면 크기를 초과해서는 안 됩니다.
- OLED 128x32에 대한 코드를 사용하려면 이미지를 크기 조정하고 oled.drawBitmap(); 함수의 너비 및 높이 매개변수를 수정해야 합니다.