본문 바로가기

Raspberry Pi Pico에서 OLED 사용하기 (I2C 사용)

by rudals.kim 2022. 4. 3. 댓글 개
반응형
Adafruit CircuitPython 7.2.3 / Raspberry Pi Pico with rp2040 에서 테스트 되었습니다.

 

Raspberry Pi Pico와 SSD1306을 사용하는 OLED를 I2C로 연결하여 동작 테스트를 해 보았습니다.

검색해 보니 많은 게시글들이 MicroPython의 경우 Thonny의 Package Manager를 사용하여 MicroPython-SSD1306 라이브러리를 사용하여 동작시키고 있었고, CircuitPython의 경우에는 adafruit_displayio_ssd1306 라이브러리를 설치하여 테스트를 한 게시글들을 보았습니다.

 

제 경우에는 처음부터 CircuitPython만을 사용해 왔기 때문에 이 환경에서 테스트해 보려고 합니다.

사용할 라이브러리도 adafruit_displayio_ssd1306를 사용하지 않고 가장 간단한 구조라 생각되는 adafruit_ssd1306와 adafruit_framebuf 라이브러리를 가지고 테스트해 보았습니다. 

 

아래 CircuitPython 홈페이지에서 Bundle로 제공되는 라이브러리를 다운로드 받습니다.

 

CircuitPython - Libraries

The easiest way to program microcontrollers

circuitpython.org

제 경우 현재 최신 버전인 adafruit-circuitpython-bundle-py-20220402.zip를 다운로드 받았습니다.

압축을 해제 후 lib 디렉터리를 보면 adafruit_ssd1306.py와 adafruit_framebuf.py를 라즈베리파이 피코의 lib 디렉터리에 복사해 넣습니다. 만약 adafruit-circuitpython-bundle-7.x-mpy-20220402.zip를 다운로드한 경우에는 adafruit_ssd1306.mpy와 adafruit_framebuf.mpy를 복사해 넣으시면 됩니다.

 

하드웨어 연결

 

아래 표와 이미지를 참고하여 4개의 선을 연결하면 됩니다.

라즈베리파이 피코 OLED
GND GND
3V3(OUT) VCC
GP5 SCL
GP4 SDA

 

테스트용 소스코드

 

아래 소스는 i2c를 초기화 후 화면을 지우고 간단한 텍스트를 보여주는 코드입니다.

import os
import board
import busio
import adafruit_ssd1306

i2c = busio.I2C(board.GP5, board.GP4)
display = adafruit_ssd1306.SSD1306_I2C(128, 64, i2c)

display.fill(0)
display.show()

display.text('rudalskim.tistory.com', 0, 0, 1)
display.show()

 

회로를 구성후 Thonny를 사용하여 위 소스 코드를 code.py로 저장 후 실행시키면 아래와 같은 화면이 나옵니다.

(0,0) 좌표를 시작으로 간단한 text가 표시됩니다.

이번에는 여분의 코드를 추가하여 화면에 이미지와 텍스트를 디스플레이해 보았습니다.

제가 adafruit_framebuf 라이브러리에 logo bitmap을 그리기 위해 display.pixel() 함수를 사용하여 한 픽셀씩 그려 넣는 image API를 추가하여 테스트하였습니다.

import os
import board
import busio
import adafruit_ssd1306

i2c = busio.I2C(board.GP5, board.GP4)
display = adafruit_ssd1306.SSD1306_I2C(128, 64, i2c)

display.fill(0)
display.show()

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, 10, 4, 32)
display.text('Hello World!', 40, 0, 1)
display.text('SSD1306 tested', 35, 15, 1)
display.text('on ' + os.uname()[0] + ' with', 35, 25, 1)
display.text('CircuitPython', 35, 35, 1)
display.text('rudalskim.tistory.com', 0, 55, 1)

display.show()

 

실행해 보면 아래와 같이 잘 동작되어 화면에 보여줍니다.

라즈베리파이 로고 이미지와 os.uname, 기타 text 등의 문자열이 잘 보여지네요.

Raspberry Pi Pico 보드에 OLED를 I2C로 연결하여 가장 기본적인 테스트를 해 보았습니다.

반응형

댓글