행복한 하루

RaspberryPi Pico에 i2c 0.96 인치 OLED 출력하기("ssd1306.py", line 118, in __init__ 에러 확인) 본문

RaspberryPi

RaspberryPi Pico에 i2c 0.96 인치 OLED 출력하기("ssd1306.py", line 118, in __init__ 에러 확인)

변화의 물결 2021. 10. 14. 00:04

 

 

안녕하세요.

 

  RaspberryPi Pico와 0.96인치 OLED를 연결해서 문자열을 출력하는 것을 해보겠습니다. 그러나 모든 것이 한 번에 잘 되면 문제가 없지만 설정을 잘못했다면 이상하게 에러가 계속 발생할 수 있기 있습니다. 그래서 한번 참조 삼아 보면 좋지 않을까 합니다.

 

1. 하드웨어 구성 및 핀 연결

 - RaspberryPi Pico와 0.96인치 OLED를 I2C핀에 맞게 연결합니다.

 - I2C0를 사용하여 GP0핀을 SDA로 GP1핀을 SCL로 3.3V 출력 핀과 GND 핀을 연결해줍니다.

 

 

2. ssd1306 라이브러리 설치

 - "ssd1306"으로 PyPi에서 검색합니다.

 

- micropython-ssd1306를 클릭합니다. 한 후 Install 합니다.

 

 

 

- 설치 완료가 되면 목록에 나타나고 삭제도 할 수 있습니다.

 

 - 위의 라이브러리를 설치하면 Raspberry Pico Flash Memory에 lib 폴더가 생성이 되고 그 안에 ssd1306.py 파일이 생성됩니다.

3. OLED 프로그래밍

1) ssd1306 소스 프로그래밍

 - 머신(machine) 라이브러리에서 oled와 통신을 위한 I2C class와 핀을 제어하기 위한 Pin 클래스를 임포트(Import) 해줍니다.

 

from machine import Pin, I2C

   

- 다운로드한 ssd1306 라이브러리를 추가해줍니다. 

from ssd1306 import SSD1306_I2C

 

- I2C를 위한 오브젝트를 생성하는데 sda는 pin0번과 scl은 Pin1으로 활성화시켜줍니다.

  (핀 맵을 보면 gp0=pin0, gp1=pin1이라고 확인할 수 있습니다.) 

i2c=I2C(0,sda=Pin(0), scl=Pin(1), freq=400000)

 

- oled를 제어할 수 있는 객체를 만들어 주되, 화면 크기와 i2c 설정값이 저장된 객체를 전달해줍니다. 

oled = SSD1306_I2C(128, 64, i2c)

 

- oled.text("출력할 내용")을 넣고, show() 함수를 호출해서

- 참고로 str(i2c)를 출력하면 현재 설정한 값들을 볼 수 있습니다.

print("I2C : " + str(i2c))

 - 전체소스

 

from machine import Pin, I2C
from ssd1306 import SSD1306_I2C

i2c=I2C(0,sda=Pin(0), scl=Pin(1), freq=100000)
print("I2C : " + str(i2c))
oled = SSD1306_I2C(128, 64, i2c)

oled.text("Thank you", 10, 10)
oled.show()

 

 

2) 발생 가능한 에러

(1) ssd1306.py 파일이 없을 경우

 

 - 위의 ssd1306 패키지를 설치했는데도 문제가 발생한다고 하면 Thonny을 "File->New" 생성한 후 github에서 ssd1306.py 내용을 복사 붙여넣기 한 후 RaspberryPi Pico에 "ssd1306.py"로 저장해놓습니다.

 https://github.com/micropython/micropython/blob/master/drivers/display/ssd1306.py

 

  

(2) I2C 관련 문제 ( File "ssd1306.py", line 118, in __init__ )

 - 처음에 해결되지 않아서 구글링을 해보았지만, OLED가 고장이다, Delay 시간이 문제다 등 확실한 답을 찾지 못했습니다.  모든 경우에 다 맞지 않겠지만, 테스트하면서 확인한 문제는 I2C 통신 문제 때문에 발생하는 것으로 확인되었습니다.

 

 

 - 첫 번째 원인으로는 I2C 핀 설정으로 sda=Pin(0), scl=Pin(1)로 했다가 핀번호를 바꾼 다음 원래 핀으로 와서 실행시켜도 동일한 위와 같은 에러가 발생합니다.

  => 해결방법 : 물리적 핀 번호에 맞게 연결 후 전원 제거 후 다시 인가하여 실행하면 정상 적으로 값을 얻어 올 수 있습니다.

 

- 두 번째 원인으로 첫 번째와 비슷하지만, Pico Flash Memory 상에 main.py 소스가 I2C0가 동작하고 있는데 I2C0를 다른 핀으로 설정하는 경우 에러가 발생합니다.

  => 해결방법 : main.py 소스를 맞게 연결된 핀에 맞게 수정 후 다시 저장 한 다음 재부팅합니다.

4. 실행 결과

 - 소스 프로그램을 실행시키면 I2C 설정된 값이 나오고 OLED 화면에 값이 출력됩니다.

 

 - 입력한 문자가 OLED 화면에 출력되는 것을 확인할 수 있습니다.

 

 

감사합니다.

 

 

<참조 사이트>

1. micropython/drivers/display/

https://github.com/micropython/micropython/blob/master/drivers/display/ssd1306.py

2. Rpi pico micropython ssd1306 OSError: 5

https://raspberrypi.stackexchange.com/questions/123791/rpi-pico-micropython-ssd1306-oserror-5

3. Raspberry Pi Pico + 128x64 I2C SSD1306 OLED (MicroPython)

https://www.youtube.com/watch?v=vVS4gFI5gjM  

 

 

Comments