라즈베리파이 5

라즈베리 파이에서 SSD1306을 사용하는 방법: OLED 디스플레이 배선 및 예제

지구빵집 2024. 6. 19. 07:25
반응형

 

라즈베리 파이에서 SSD1306을 사용하는 방법: OLED 디스플레이 배선 및 예제 

 

 

 

이 튜토리얼에서는 프로젝트에 멋진 출력을 더할 수 있는 저렴한 가격의 OLED 디스플레이인 라즈베리 파이와 함께 SSD1306을 사용하는 방법을 보여드립니다.

 

이 튜토리얼은 라즈베리 파이 컴퓨터 보드를 위한 것입니다. 라즈베리 파이 피코와 함께 사용하려면 라즈베리 파이 피코에 OLED 디스플레이 추가하기 튜토리얼을 참조하세요.

 

OLED 디스플레이 특징

 

이미 라즈베리 파이 파이 파이코 튜토리얼에서 OLED(유기 발광 다이오드) 디스플레이의 주요 특징에 대해 설명했습니다. 따라서 여기서는 주요 개념만 다시 설명하겠습니다:

 

  • 필요한 전력: (보통) 0.04W
  • 작동 온도 범위: -40°C ~ 85°C
  • 크기 : 128×64 픽셀 (0.96 인치), 128×32 픽셀 (0.91 인치)도 전자 상점에서 구입할 수 있습니다.
  • 단색 또는 2색 화면(이 튜토리얼은 두 가지 모두에 적용됨)

 

픽셀은 데카르트 공간 참조에 의해 인덱싱되며, X축은 가로 방향으로, Y축은 세로 방향으로 이동합니다. 두 좌표 모두 화면 왼쪽 상단의 0에서 시작합니다: 

 

 

SSD1306 OLED 핀아웃

 

I2C 버전 핀은 다음 표에 따라 정의되어 있습니다: 

 

PIN Label Description
VCC This PIN goes to the positive power source
GND This PIN goes to the ground reference
SCL (or SCK) This PIN is the clock reference for I2C communication
SDA This PIN is used for data transferring according to I2C protocol

 

필요한 것

 

평소와 같이 지금부터 좋아하는 전자 상거래 장바구니에 필요한 모든 하드웨어를 추가하여 마지막에 전체 비용을 평가하고 프로젝트를 계속 진행할지 아니면 장바구니에서 제거할지 결정할 수 있도록 하는 것이 좋습니다. 따라서 하드웨어만 있으면 됩니다:

 

  • 라즈베리 파이 컴퓨터 보드(적절한 전원 공급 장치 또는 최소 3A의 스마트폰 마이크로 USB 충전기 사용 포함)
  • 고속 마이크로 SD 카드(최소 16GB, 클래스 10 이상)
  • I2C OLED 디스플레이

 

단계별 절차  

 

SSD1306과 라즈베리 파이 간 배선 준비하기

 

이 장에 설명된 대로 라즈베리 파이 핀아웃에 따라 연결을 준비하세요. 다음 표는 사용할 GPIO에 대해 설명합니다: 

 

Raspberry PISSD1306 OLED

GND GND
3.3V VDD
GPIO3/SCL (n.5) SCK
GPIO2/SDA (n.3) SDA

 

다음 그림은 배선 스키마를 보여줍니다:  

 

 

운영 체제 준비하기

 

선호하는 Raspberry PI용 운영체제 설치를 시작하세요. 저성능 Raspberry PI 컴퓨터 보드를 위한 헤드리스 환경을 제공하는 Raspberry PI OS Lite를 사용할 수 있습니다. 그러나 내부 터미널에서 작업하는 Raspberry PI OS 데스크톱을 사용할 수도 있습니다. 두 OS의 차이점은 두 배포판의 비교를 통해 확인할 수 있습니다:

 

Raspberry PI OS Lite 대 데스크톱 비교

 

이 튜토리얼에서는 Raspberry PI OS Lite 64비트를 사용하겠습니다.

 

OS를 최신 버전으로 업데이트하세요. 터미널에서 다음 명령을 사용하세요:

 

sudo apt update -y && sudo apt upgrade -y

 

sudo apt update -y && sudo apt upgrade -y

 

또한 pip(Python 패키지 관리자)와 I2C 도구가 필요합니다. 터미널에서:

 

sudo apt install python3-pip i2c-tools -y

 

sudo apt install python3-pip i2c-tools -y

 

I2C 활성화 SSD1306 OLED 디스플레이는 I2C 연결로 작동합니다. 따라서 내장된 "raspi-config" 도구를 사용하여 라즈베리 파이에서 이를 활성화해야 합니다:

 

sudo raspi-config

 

"인터페이스 옵션"을 선택합니다: 

 

 

 

 

 

 

 

 

 

 

다음 화면에서 예를 선택해 주세요: 

 

I2C를 활성화한 후 라즈베리 파이를 재부팅하는 것이 좋습니다.

 

sudo reboot

 

이미 배선을 연결한 경우, 다음과 같이 새로운 "i2c /dev entries 드라이버"를 식별하는 줄이 표시되어 I2C 장치를 감지할 수 있을 것입니다:

 

pi@raspberrypi:~ $ dmesg | grep i2c
[    2.840754] brcmstb-i2c 107d508200.i2c:  @97500hz registered in interrupt mode
[    2.867604] brcmstb-i2c 107d508280.i2c:  @97500hz registered in interrupt mode
[    4.266195] i2c_dev: i2c /dev entries driver

 

"i2cdetect" 도구를 사용하여 I2C 버스에서 SSD1306 주소를 감지할 수 있습니다:

 

pi@raspberrypi:~ $ i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                         -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- 3c -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

 

"3c"는 SSD1306 OLED 디스플레이를 올바르게 식별했음을 의미합니다. 다른 주소가 나오면 하드웨어가 다른 것일 수 있습니다.

 

luma.oled 라이브러리 설치

 

Python에는 SSD1306 OLED 디스플레이를 관리할 수 있는 라이브러리가 내장되어 있지 않으므로 유용한 "luma.oled" 라이브러리를 라즈베리파이에 설치해야 합니다. 이 작업을 수행하려면 Raspberry PI에서 Python 가상 환경을 만들어야 합니다(가상 환경 관리 방법을 이해하려면 참조 문서를 참조하세요):

 

python3 -m venv my_project --system-site-packages
source my_project/bin/activate

 

 

라즈베리 파이를 재부팅하거나 로그아웃한 후 스크립트를 사용할 때마다 가상 환경을 활성화해야 OLED를 사용할 수 있다는 점에 유의하세요.

 

이제 pip를 사용하여 필요한 라이브러리를 설치할 수 있습니다:

 

pip3 install luma.oled

 

 

Luma.oled를 사용하려면 사용자에게 하드웨어 인터페이스에 대한 액세스 권한이 필요합니다. 다음 명령으로 이 액세스 권한을 부여할 수 있습니다:

 

sudo usermod -a -G spi,gpio,i2c $USER

 

 

라즈베리 파이로 SSD1306 테스트

 

이제 테스트를 수행할 준비가 되었습니다. 첫 번째 테스트가 포함된 스크립트를 라즈베리 파이에 다운로드하세요:

 

wget https://peppe8o.com/download/python/oled/ssd1306-test-01.py

 

이것은 OLED 디스플레이에 메시지를 인쇄하는 매우 간단한 테스트입니다. 하지만 몇 가지 일반적인 개념을 소개하는 것이 유용합니다. 다음은 이 스크립트를 한 줄씩 설명합니다.

 

먼저 필요한 라이브러리를 가져옵니다. 결과를 볼 수 있는 충분한 시간을 제공하기 위해 디스플레이를 활성 상태로 유지하는 절전 기능도 가져옵니다(나중에 설명하겠습니다):

 

from luma.core.interface.serial import i2c
from luma.core.render import canvas
from luma.oled.device import ssd1306, ssd1325, ssd1331, sh1106
from time import sleep

 

그런 다음 SSD1306 OLED 디스플레이를 초기화합니다. luma에서 지원하는 모델과 다른 디스플레이 모델을 사용하는 경우 디스플레이 모델에 따라 "ssd1306()"을 변경할 수 있습니다. 또한 "회전" 입력을 통해 0, 1, 2, 3의 허용된 값으로 화면을 회전할 수 있습니다.

 

serial = i2c(port=1, address=0x3C)
device = ssd1306(serial, rotate=0)

 

 

그런 다음 두 개의 텍스트 줄을 그립니다. 첫 번째 텍스트 줄("Hello World")은 x=10, y=40의 데카르트 포인트에 인쇄됩니다. 이 텍스트는 흰색으로 표시됩니다(단색 디스플레이를 사용하므로 흰색은 픽셀이 켜져 있음을 의미합니다). 마찬가지로 두 번째 줄("from peppe8o.com!")은 X=10, Y=50의 지점에 인쇄됩니다.

 

디스플레이 인쇄는 "with canvas(device)...." 블록의 끝에 효과적으로 나타납니다. 따라서 라이브러리는 이 블록 안에 있는 모든 명령을 가져와서 모두 함께 인쇄합니다:

 

with canvas(device) as draw:
    draw.text((10, 40), "Hello World", fill="white")
    draw.text((10, 50), "from peppe8o.com!", fill="white")

 

마지막 "sleep" 줄은 디스플레이 출력을 5초 동안 지속시킵니다:

 

sleep(5)

 

OLED 디스플레이를 사용하면 파이썬 스크립트가 끝날 때까지 또는 다른 "with canvas(device)...." 블록을 실행할 때까지 인쇄된 출력이 활성 상태로 유지됩니다. 새 블록은 새 블록을 인쇄하기 전에 기존 개체를 모두 지웁니다. "device.clear()" 명령을 사용하여 디스플레이를 강제로 지울 수도 있습니다.

 

이 스크립트는 다음 명령어로 실행할 수 있습니다:

 

python3 ssd1306-test.py

 

다음과 같은 출력이 표시됩니다: 

 

 

 

추가 팁으로, "\n" 이스케이프 문자를 사용하여 여러 줄을 작성할 수도 있습니다. 따라서 "Hello World"와 "from peppe8o.com!"을 서로 다른 두 줄에 인쇄하는 것은 한 줄에 "Hello World\nfrom peppe8o.com!"을 인쇄하는 것과 완전히 동일합니다. 두 개의 draw.text 문에서 "quite"를 사용하면 두 줄 사이의 간격을 제어할 수 있지만 이스케이프를 사용하면 라이브러리 기본 간격이 사용됩니다.

 

이제 luma.oled 라이브러리 사용의 기본 사항을 살펴보았으니 이제 사용할 수 있는 몇 가지 기본 양식을 추가로 보여드리겠습니다. 이 경우에도 동일한 "가져오기" 섹션과 동일한 직렬/장치 변수 초기화가 필요합니다.

 

프리미티브 폼

 

간단한 텍스트 외에도 여러 가지 기본 양식을 그릴 수 있습니다. 이 장에서는 관련 명령어 및 옵션과 함께 이러한 양식을 보여드리겠습니다. 이러한 모든 양식을 함께 보여주는 파이썬 스크립트를 다음과 같이 얻을 수 있습니다:

 

https://peppe8o.com/download/python/oled/ssd1306-test-02.py

 

파이썬 명령으로 실행할 수 있습니다:

 

python3 ssd1306-test-02.py

 

점(또는 점의 목록) 그리기

 

with canvas(device) as draw:
    draw.point([(20, 20)], fill="white")

 

다음과 같이 [ (x, y) ]와 유사한 목록 객체 내에 점 좌표를 제공하여 단일 점을 그릴 수 있습니다:

 

캔버스(장치)를 draw로 사용합니다:

 

draw.point([(20, 20)], fill="white")

 

다음과 같이 동일한 목록 객체 내에 좌표를 추가하여 여러 점을 그릴 수도 있습니다.

 

[ (x_1, y_1), (x_2, y_2), (x_3, y_3), (x_4, y_4), ... ]와 같이.

 

와 유사합니다:

 

canvas(device)를 draw로 사용합니다:

 

with canvas(device) as draw:
    draw.point([(20, 20), (70, 60)], fill="white")

 

결과는 다음 그림과 같습니다: 

 

 

선 그리기

 

이전 예제에서 보았던 것과 유사한 좌표로 선의 시작과 끝에 있는 두 점을 정의하여 선을 그릴 수 있습니다. 선으로 선 너비를 정의하여 선의 굵기를 더 두껍게 만들 수도 있습니다:

 

with canvas(device) as draw:
    draw.line([(0,0), (70,60)], fill="white", width = 5)

 

결과는 다음과 같습니다:

 

 

직사각형 그리기

 

선의 경우 직사각형은 좌표에서 두 점(왼쪽 상단 모서리와 오른쪽 하단 모서리)으로 정의됩니다. 직사각형을 사용하면 '채우기'라는 새 변수를 사용하여 양식 내부의 색상을 제어할 수 있습니다:

 

with canvas(device) as draw:
    draw.rectangle([(20, 0), (70, 60)], outline="white", fill="black")

 

 

흔히 디스플레이 전체에 프레임을 만들어야 하는 경우가 있습니다. 이 경우 디스플레이 시작과 끝의 좌표를 제공하는 대신 "device.bounding_box" 변수를 사용할 수 있습니다:

 

with canvas(device) as draw:
    draw.rectangle(device.bounding_box, outline="white", fill="black")

 

 

 

마지막 직사각형 옵션을 사용하면 반경 변수를 설정하여 양식의 둥근 모서리를 만들 수 있습니다:

 

with canvas(device) as draw:
    draw.rounded_rectangle([(20, 0), (70, 60)], radius=10, fill=None, outline="white", width=1, corners=None)

 

 

타원 그리기

 

타원은 직사각형으로 닫힌 형태로 상상할 수 있습니다. 따라서 직사각형 좌표를 식별하고 채우기 및 윤곽선 색상과 테두리 너비를 지정하여 그릴 수 있습니다:

 

with canvas(device) as draw:
    draw.ellipse([(0, 0), (70, 60)], fill="white", outline="black", width=1)

 

 

호 그리기

 

마찬가지로 호를 동일한 타원의 일부로 상상할 수 있습니다. 차이점은 시작 각도와 끝 각도를 명시한다는 점이며, 여기서 0은 타원의 오른쪽 가운데를 의미합니다. 다음 예는 0도에서 90도까지의 호를 보여줍니다. 다른 옵션은 이전 예제와 동일합니다:

 

with canvas(device) as draw:
    draw.arc([(0, 0), (70, 60)], 0, 90, fill="white", width = 1)

 

 

Chord 그리

 

코드를 사용하면 해당 호의 시작점과 끝점을 연결하는 선이 자동으로 표시됩니다:

 

with canvas(device) as draw:
    draw.chord([(0, 0), (70, 60)], 0, 90, outline="white", fill="black", width = 1)

 

 

파이 슬라이스 그리기

 

파이 슬라이스는 여전히 호 형태와 유사합니다. 코드와 달리 시작점과 끝점이 모두 아웃바운드 양식의 중앙에 연결되어 있습니다:

 

with canvas(device) as draw:
    draw.pieslice([(20, 0), (70, 60)], 0, 90, fill="white", outline=None, width=1)

 

 

다각형 그리

 

마지막 원시 형태는 다각형입니다. 다각형은 일련의 선으로, 마지막 선 끝이 첫 번째 선의 시작점에 자동으로 연결됩니다:

 

with canvas(device) as draw:
    draw.polygon([(20, 0), (70, 10), (60, 60), (15, 63)], fill=None, outline="white", width=1)

 

 

함수 그리기

 

테스트할 수 있는 또 다른 재미있는 예는 데카르트 차트에 함수를 그리는 것입니다. 저는 이런 식으로 스크립트를 정렬하여 사인 곡선을 그렸습니다.

 

Python 스크립트는 다운로드 영역에서 사용할 수 있습니다:

 

wget https://peppe8o.com/download/python/oled/ssd1306-test-03.py

 

결과는 다음과 같으며, 왼쪽에서 오른쪽으로 점이 하나씩 나타납니다:

 

 

루마 예제 실행하기

 

Luma 깃허브 페이지에는 실행할 수 있는 여러 가지 멋진 예제가 포함되어 있어 재미있는 애니메이션을 만드는 방법도 배울 수 있습니다. 제공된 모든 예제가 SSD1306 OLED 디스플레이에서 작동하는 것은 아니지만, 시도해 볼 만한 예제가 많이 있습니다.

 

예제를 사용하기 전에 먼저 git을 설치해야 합니다:

 

sudo apt install git -y

 

Luma 예제를 사용하려면 몇 가지 추가 패키지를 설치해야 합니다:

 

sudo apt install python3-dev python3-pip python3-numpy libfreetype6-dev libjpeg-dev build-essential libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev libportmidi-dev -y

 

이 시점에서 "git clone" 명령으로 GitHub에서 luma 예제 폴더의 완전한 복제본을 얻을 수 있습니다:

 

git clone https://github.com/rm-hull/luma.examples.git

 

이제 라즈베리파이 스토리지에서 관련 폴더로 들어가면 실행할 예제를 찾을 수 있습니다:

 

cd luma.examples/examples/ 

 

라즈베리파이 프로젝트 많은 곳 https://peppe8o.com/ssd1306-raspberry-pi-oled-display/ 

 

 

반응형