SPI OLED 디스플레이 사용방법
기존에 I2C 전용 OLED 디스플레이만 사용해왔는데 SPI/I2C 겸용 디스플레이에 대한 문의가 많아 따로 자료를 정리했습니다. 타이틀 이미지와 같이 생긴 모듈을 구매하신 분을 위한 정보입니다. 7개의 핀이 달린 모델입니다.
핀 배치 및 연결 방법
일반적으로 사용하는 SPI/I2C 핀 이름과 다르기 때문에 각 핀들의 역할을 알아둬야 합니다. 제가 가진 모듈은 7개의 핀이 있는데 경우에 따라 8개의 핀이 있는 경우도 있습니다. 이 경우 D2 핀이 추가된 경우일겁니다.
Pin Label | SPI Function | I2C Function | Notes |
---|---|---|---|
GND | Ground | Ground | 0V |
3V3 (VDD) | Power | Power | Should be a regulated 3.3V supply. |
D1 (SDI) | MOSI | SDA | Serial data in |
D0 (SCK) | SCK | SCL | SPI and I2C clock |
D2 (SDO) | MISO | — | Can be unused in SPI mode. No function for I2C. |
D/C | Data/Command | I2C address selection | Digital pin to signal if incoming byte is a command or screen data. |
RST | Reset | Reset | Active-low screen reset. |
CS | CS | — | SPI chip select (active-low) |
아두이노에서 SPI로 할당된 핀은 SPI: 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK) 입니다. 아두이노 관점에서 보자면 SPI 의 경우 아래와 같이 연결됩니다.
- D1 : MOSI – 아두이노 D11 (MOSI)
- D2 : MISO – 아두이노 D12 (MISO)
- D0 : CLK – 아두이노 D13 (SCK)
- DC : DC (Data Command) – 아두이노 D8 (임의할당)
- CS : CS (Chip select) – 아두이노 D10 (SS)
- RES : RESET – 아두이노 D9 (임의할당)
이 세팅은 보시다시피 SPI 로 사용하는 경우입니다. I2C로 사용하고 싶으신 분은 디스플레이 뒷면에 있는 점퍼 세팅을 I2C로 변경해준 다음 D1(SDA), D0(SCL), DC(I2C address selection), RST(Reset) 핀을 사용하셔야 합니다. I2C 점퍼나 사용하는 핀은 디스플레이 종류마다 조금씩 내용이 틀릴 수 있습니다.
예제 소스
먼저 Adafruit 라이브러리로 테스트 해보겠습니다. Adafruit_SSD1306 라이브러리에 포함된 ssd1306_128x64_spi.ino 예제 파일을 불러옵니다.
예제 파일에서 아래 부분을 수정해주면 됩니다.
// If using software SPI (the default case): #define OLED_MOSI 11 // D1 #define OLED_CLK 13 // D0 #define OLED_DC 8 // DC #define OLED_CS 10 // CS #define OLED_RESET 9 // RES Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
이제 예제 파일을 올려보시면 테스트 화면이 순서대로 실행 될 겁니다.
주의!! 이 예제는 SSD1306 드라이버 칩을 사용하는 경우에 해당합니다. SH1106 드라이버 칩을 사용하는 OLED의 경우는 아래 링크에 있는 SH1106 용 Adafruit 라이브러리를 사용하세요.
https://www.hardcopyworld.com/?p=1377
이제 u8glib로 테스트 해보겠습니다. 핀 연결은 똑같습니다.
u8glib 를 설치하시고(문서 끝에있는 링크 참고) GraphicsTest 예제를 불러옵니다. 아래 소스를 수정하시면 됩니다. (SSD1306 기준)
U8GLIB_SSD1306_128X64 u8g(13, 11, 10, 8); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_SSD1306_128X64 u8g(4, 5, 6, 7); // SW SPI Com: SCK = 4, MOSI = 5, CS = 6, A0 = 7 (new white HalTec OLED) //U8GLIB_SSD1306_128X64 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) //U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0); // I2C / TWI //U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_NO_ACK|U8G_I2C_OPT_FAST); // Fast I2C / TWI //U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NO_ACK); // Display which does not send AC //U8GLIB_SSD1306_ADAFRUIT_128X64 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_SSD1306_ADAFRUIT_128X64 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) //U8GLIB_SSD1306_128X32 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_SSD1306_128X32 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) //U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE); // I2C / TWI ... void setup(void) { pinMode(9, OUTPUT); digitalWrite(9, HIGH); }
u8glib는 굉장히 다양한 칩셋과 디스플레이를 지원합니다. 그래서 u8g 인스턴스를 생성할 때 적당한 생성자 코드를 활성화 해줘야 합니다.
위 코드의 첫 번째 라인과 같은 소스를 찾아 주석을 제거해주세요. 그리고 우리는 DC (Data Command) 핀을 아두이노의 D8 핀에 연결했으므로 이 부분을 똑같이 맞춰줘야 합니다. u8glib 에서는 DC 핀을 A0로 표기하고 있습니다. 이걸 8번 핀으로 변경해줍니다. 아래처럼…
U8GLIB_SSD1306_128X64 u8g(13, 11, 10, 8); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
그리고 setup() 함수안을 보시면 OLED reset 핀과 연결된 9번 핀을 HIGH 상태로 맞춰주도록 수정해 줬습니다. 이렇게 해야 정상적으로 화면이 그려질겁니다.
SH1106 칩셋 혹은 다른 칩셋을 사용하는 디스플레이는 자신에게 맞는 생성자를 찾아서 주석을 해제하고 핀 번호를 맞춰주시면 됩니다.
참고자료
Sparkfun – micro OLED hookup guide
u8glib tutorial – SPI interface