좀 더 큰 화면(1.3인치)의 OLED 디스플레이
이전 글에서 SSD1306 Controller 칩을 사용하는 0.96인치 크기의 OLED 디스플레이인 SSD1306 OLED를 라즈베리파이 피코 보드에서 활용하는 방법과 관련 라이브러리를 소개한 바 있었다. https://blog.naver.com/mythee1/223193377274
그런데, 이 SSD1306 OLED 소자는 저렴하고, 128×64의 해상도를 가지는 장점이 있기는 하지만, 글자가 조금 작아 아쉬울 때가 있었다. 이 때문에 좀 더 큰 화면의 디스플레이를 찾는 과정에서 1.3인치의 크기를 가지는 OLED 디스플레이를 발견하게 되었고, 호환성 등에 대한 별도 표시가 없어 별 문제가 없는 것으로 생각하고 구입했다.
제품을 받고 살펴보니, 다음 사진에서 왼쪽이 기존의 0.96인치 크기인 SSD1306 OLED이고, 오른쪽이 새로 발견한 1.3인치 OLED (SSH1106 컨트롤러를 사용해서 SSH1106 OLED라고 불린다는 것을 구입 후 알게 되었음)인데, 화면의 대각선 길이가 약 35% 정도 화면이 확연하게 커진 것을 볼 수 있었고, 그밖에는 두 제품 모두 I2C 통신방식인 점은 동일했다.
다만 자세히 살펴보면, I2C의 핀 배열이 다소 다르게 배치되어 있었다.
실제 구입한 제품의 전면 및 후면 모습은 다음과 같다.
SH1106 라이브러리
구입 시 판매 사이트에서는 이 제품의 실제 사용에 대해서는 I2C 통신을 한다는 것과, 128×64화소라는 것 외에는 아무런 정보가 없었다. 때문에, 당연하게도 동일한 해상도인 0.96인치 OLED와 동일한 SSD1306 컨트롤러 칩을 쓰리라 예상했고, 기존과 동일한 방법으로 구동이 되리라고 생각했다.
그런데 이전 글에서 사용한 SSD1306 라이브러리와 코드를 이용해서 동작시켜본 결과, 다음과 같이 표시되었다.
결국 이리저리 자료를 찾다가, 이 사이즈의 OLED 제품은 1306컨트롤러가 아니라, SSH1106컨트롤러를 사용하는 경우가 많음을 알게 되었고, SSH1106은 SSD1306과 호환되기도 한다는 것을 알게 되었다. 다만, 해상도를 다르게 설정해야 한다는 등의 정보들도 있었으나, 결과적으로는 모두 정상적으로 동작하지 않았다.
해결책은 Github에서 찾았는데, Github 검색 중에 다음 라이브러리를 찾게 되었다. 내가 시도했던 여러 방법들 중에는 유일하게 다음 라이브러리가 가장 확실하게 동작했다.
참고로, 해당 라이브러리 파일을 첨부해둔다. Github에서 직접 찾으려는 경우 https://github.com/robert-hh/SH1106를 이용하면 된다.
이 라이브러리를 피코 보드에 미리 업로드해 둔 후, 다음과 같은 코드로,
드디어 이 1.3인치 SSH1106 OLED에 글자를 성공적으로 깨끗하게 표시할 수 있게 되었다.
전체 표시 가능한 글자 수를 알기 위해 출력해 보니, 다음과 같이 8×8 Dot로 구성되는 글자를 16×8자 만큼 출력할 수 있어서 1306 OLED와 해상도 및 글자 출력 수는 완전히 동일함을 알 수 있었다.
freq 설정
그런데 시험 사용 중 발견한 것 중 한 가지 주의할 점은 i2c를 선언할 때 frequency를 너무 낮게 설정하면 ( <25000~30,000보다 작았을 때) 잘 동작하던 화면이 다음처럼 비정상 상태가 되는 것이었다.
freq 값을 5000 단위로 바꾸어가면서 테스트 한 결과, 25000까지는 다음과 같았고, 30000 이상부터는 정상적으로 동작했다.
다양한 OLED 동작 Demo
이전 글에서 SSD1306 OLED를 test 할 때 사용하던 코드 중 라이브러리 사용과 oled 선언만 변경해서, 다음과 같은 동작 test를 위한 코드를 준비해서 적용해 보았다.
from machine import Pin, I2C, ADC
import utime
from sh1106 import SH1106_I2C
WIDTH = 128
HEIGHT = 64 (SSH1111 (SS
i2c=I2C(0, scl=Pin(1),sda=Pin(0),freq=200000)
oled = SH1106_I2C(WIDTH, HEIGHT, i2c)
while True:
oled.fill(0)
oled.text("Hello!", 0, 0)
oled.show()
utime.sleep(2)
oled.fill(0)
oled.text("OLED Clearing", 0, 0)
oled.show()
utime.sleep(2)
for k in range(9):
oled.fill(0)
oled.text("< Normal mode >",0,0)
oled.text("Contrast Setting",0,16)
oled.text(str(k),0,32)
oled.contrast(k)
oled.show()
utime.sleep(0.5)
oled.invert(1)
for k in range(9):
oled.fill(0)
oled.text("< Invert mode >",0,0)
oled.text("Contrast Setting",0,16)
oled.text(str(k),0,32)
oled.contrast(k)
oled.show()
utime.sleep(0.5)
oled.invert(0)
oled.fill(0)
oled.text("OLED Turning off", 0, 0)
oled.show()
utime.sleep(2)
oled.poweroff()
utime.sleep(2)
oled.poweron()
oled.fill(0)
oled.text("OLED Turned on", 0, 0)
oled.show()
utime.sleep(2)
oled.fill(0)
oled.text("123456789012345678",0,0)
oled.text("012345678901234567",0,8)
oled.text("901234567890123456",0,16)
oled.text("890123456789012345",0,24)
oled.text("789012345678901234",0,32)
oled.text("678901234567890123",0,40)
oled.text("567890123456789012",0,48)
oled.text("456789012345678901",0,56)
oled.text("345678909876543210",0,64)
oled.show()
utime.sleep(9)
for k in range(6):
oled.fill(0)
oled.hline(0,k*10,126,1)
oled.show()
utime.sleep(0.2)
for k in range(12):
oled.fill(0)
oled.vline(k*10,0, 64,1)
oled.show()
utime.sleep(0.2)
oled.fill(0)
oled.line(10,10,120,64,1)
oled.line(120,10,10,64,1)
oled.show()
utime.sleep(2)
oled.fill(0)
oled.rect(0,0,128,64,1)
oled.show()
utime.sleep(2)
그 결과, 기존에 사용하던 OLED 동작 함수들이 정상적으로 동작한다.
동작하는 모습은 다음과 같다. 기존 0.96인치 화면보다 화면이 커서 보기에 시원시원하게 느껴진다.


