아두이노 코딩-35: 0.96인치 모노크롬 OLED 128X64 “Steemit ”디스플레이

codingart(66)
Published in
#kr
Words
891
Reading
4 min
Listen
Play
8y

noname06.png

1602 i2c lcd 디스플레이 말고도 I2C 인터페이스를 사용하는 0.96인치(24mm) 128X64 해상도의 초소형 모노크롬 OLED 디스플레이 사용법을 알아보자. 이 정도의 해상도이면 거의 스마치 워치급으로서 아래에 언급된 예제 코드 sh1106_128x64_i2c를 실행하여 그래픽 출력 기능도 시험해 보기 바란다.

noname01.png

제품에 따라서는 동일한 디스플레이 사이즈 규격이지만 SPI 인터페이스를 적용한 사례도 있으나 여기서는 보드의 핵심 구동 칩이 SH1106인 OLED 유기발광 디스플레이로서 I2C 인터페이스에 의한 배선 사례를 대상으로 살펴본다. 참고로 OLED 디스플레이 보드의 핵심 구동 칩으로 SH1306을 사용하며 SPI 인터페이스를 사용하는 제품과는 혼동을 피하기로 하자.

이 OLED 디스플레이를 사용함에 있어서 국내 인터넷 사이트에 떠도는 정보를 바탕으로 했다가는 작동이 안 된다는 점이다. 필자도 물건을 구입했다가 라이브러리 문제로 작동이 되질 않아 반품 과정 중에서 판매상의 지원을 받아 재도전했지만 제대로 된 사용법을 알아내는데 실패했었고 약간의 힌트 정도를 얻어 상당히 많은 경우의 수를 되풀이 끝에 출력에 성공할 수 있었다. 아두이노까지는 성공했지만 라즈베리 파이도 시도해보았으나 역시 라이브러리 문제로 실패한 경험이 있다.

미국 사이트와 Github 에서 얻은 많은 정보를 얻어 적용해 보았지만 그다지 도움이 되지 않았다. 아무리 재미나 취미로 한다지만 투입한 시간 대비 소득이 거의 없을 뻔했던 과제이다.

요점은 본 블로그를 그대로 따라하면 성공적으로 디스플레이할 수 있다는 점이다, OLED 판매가격이 그리 싸지 않은 10,000원 안팎인데 거금 20,000원을 투입하여 2개를 구매하여 일주일 악전고투해서 건지는 것이 없다면 취미고 나발이고 도중하차하게 될 위험성을 지닌 시한 폭탄과도 같은 제품이다. ㅋ ㅋ

noname02.png

아두이노 우노에서 I2C 배선은 디지탈 I/O 핀들이 배치된 13, GND, AREF 다음에 위치한 SDA, SCL핀을 사용해도 되며 한편 아날로그 채널 A4, A5로 배선해도 무방하다. 이 두가지가 왜 대체가 가능한지 확인하려면 SDA 와 A4, SCL과 A5를 각각 멀티메타의 통전 기능을 사용하여 확인하면 된다.
1980년대 초창기 I2C 인터페이스 데이터 전송속도는 100 Kbits/sec 였으나 90년대에 400 Kbits/sec 로 속도가 높아졌다. 아두이노는 칩 중에서 느린 편이기에 현재 100 또는 400 의 속도로 사용된다.
속도로 사용한다. 아두이노 드론의 경우 loop() 별로 프로펠러 회전수를 제어하는데 400KHz 즉 2.5msec 한번씩 BLDC 모터의 회전수를 갱신하게 된다.

아두이노 우노 회로에서 당연히 우노가 마스터이며 나머지 매달려 있는 디바이스들 즉 센서나 디스플레이들은 슬레이브에 해당하게 된다. 여러개의 슬레이브 디바이스들이 인터페이스 될 수 있지만 가각의 주소가 있어 구별이 가능하다.

전원은 5V 와 3V3 어느 것을 사용해도 무방하다. 따라서 아두이노 우노 외에 3.3V 만 제공되는 아두이노 호환 와이파이 NodeMCU 보드에서도 사용이 가능하다.

noname03.png

I2C 인터페이스는 Wire.h 라이브러리 사용이 필수적이다.
OLED 디스플레이를 테스트하기 위해서 Adafruit 사의 라이브러리 두 개를 사용하기로 한다. Adafruit_GFX.h 는 OLED 출력에 필요한 모든 문자들의 폰트를 제공하는 라이브러리이며 Adafruit_SH1106.h 라이브러리는 SH1106 구동칩을 지원하며 내부에서 Adafruit_GFX.h를 불러다 쓰기 때문에 이 두 라이브러리 설치는 필수적이다.

Adafruit-GFX-Libray-master
Adafruit-SH1106-master

위에서 언급한 두 라이브러리는 아래의 인터넷 주소상의 블로그에 첨부된 Adafruit 사의 라이브러리를 다운받아 이용하기 바란다.
http://blog.daum.net/ejleep1/412

아래 사진은 Adafruit+SH1106-master 디렉토리의 예제 sh1106_128x64_i2c를 실행 결과이로서 출력할 수 있는 모든 ASCII 문자를 포함하였다.

noname04.png

noname05.png

앞서의 예제 코드들이 잘 작동하면 OzLED 라이브러리도 다운 받아 사용해도 무방하다. 필자의 경험에 의하면 처음부터 OzLED를 사용할 경우 출력을 볼 수 없어 OLED 의 작동 여부를 알 수 없으니 주의 바란다. OzLED 라이브러리는 필요 시 인터넷에서 검색하여 다운 받기 바란다.
참고로 Adafruit_SH1106.h 라이브러리 내용을 보면 SH1306을 대상으로 작성된 라이브러리를 SH1106 용으로 전환하였으며 특히 SH1306에서 지원했던 scroll 기능이 SH1106에서는 지원되지 않는다는 점을 지적해둔다. scroll 기능이 지원되지 않으므로 OLED 화면이 가득 차면 화면 반드시 Clear 작업을 하고 새로 출력하도록 코딩을 해야 한다.

Adafruit_SH1106 의 display 클래스 명령인 display.begin()의 0x3C는 OLED 디스플레이 디바이스의 I2C 인터페이스를 위한 16진법 주소를 뜻한다.
display.display() 명령은 OLED의 이미지 버퍼의 내용을 디스플레이하는 명령으로서 현 위치에서 명령을 실행할 경우 Adafruit 사의 로고가 뜬다. 그래서 항상 출력 내용물이 확정되면 이미지 버퍼에 저장된 내용을 볼 수 있도록 이 명령을 주기적으로 사용해야한다.

display 클래스 명령 몇 가지만 더 알아보자.
display.Clear()는 출력된 이미지를 지운다.
display.setTextSize()는 폰트 크기를 설정한다.
display.setTextColor()는 모노크롬의 경우 WHITE 값을 사용한다.
display.setCursor()는 출력물의 그래픽의 시작점을 정의한다.
display.println((int) i)는 정수를 출력한다.
OLED의 이미지 버퍼에 이런 출력 과정이 끝난 후 display.display() 명령을 통해 OLED 화면에 이미지를 보여 주게 되며 다음 출력으로 넘어가기 전에 display.clearDisplay() 명령을 실행하도록 한다.

noname06.png

//Oled_characters_01

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH1106.h>

#define OLED_RESET 4
Adafruit_SH1106 display(OLED_RESET);

void setup() {
Serial.begin(9600);
display.begin(SH1106_SWITCHCAPVCC, 0x3C);
display.clearDisplay();

// text display tests
Steemitdrawchar();
display.display();
delay(5000);
display.clearDisplay();

}

void Steemitdrawchar(void) {
display.setTextSize(3);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Steemit");
display.display();

display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(0,30);
display.println("Steemit");
display.display();

display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,55);
display.println("Steemit");
display.display();
}

void loop() {
}//끝

OLED에서 UINT_8 t 문자 출력 루틴 즉 ASCII 문자 출력을 시험해 보자. testdrawchar() 루틴을 호출하면 된다. 이 루틴은 텍스트의 폰트 사이즈, 컬러, 출력 위치를 설정한 후 for loop를 통해 정수형 변수 i를 0∼167까지 display.write(i) 하면 OLED 한 페이지를 문자로 가득 메우는 화면을 보여준다. 여기서는 i 의 범위를 65∼90까지 한정하여 좀 큰 폰트 사이즈 2로 하여 ABC⚫⚫⚫MNZ 까지 시험 출력하였다.

noname07.png

텍스트 폰트 사이즈가 1 일 때에 for loop 문에서 정수형 변수 i 값이 21로 나누어 떨어지면 즉 I%21 == 0 이 성립한다면 display.println() 명령을 실행하고 줄 바꿈을 하게 된다. 다시 돌아와서 i 값이 줄 바꿈하여 그 값이 ‘\n’이면 UINT_8t 문자를 출력한다.

이와 같이 하여 한 페이지 분량의 문자 출력이 이루어지면 display.display() 명령 실행에 의해서 OLED 디스플레이 상에서 출력된 글자를 볼 수 있게 된다.

0.96인치 oled 사용을 위한 라이브러리 설치는 상당히 골치가 아픈 편인데 결론은 제대로 살행 되는 것만이 정답일 수밖에 없다. 그러한 측면에서 아두이노 우노 보드에 한정해서는 Adafruit_ SH1106-master 라이브러리를 사용하는 것이 128x64 해상도를 살리는 좋은 방안이다.

그밖에 중요한 참고 사항으로는 이러한 라이브러리들이 아두이노 무선 와이파이 코딩을 위한 NodeMCU 보드에서 작동되지 않는다는 점이다. NodeMCU 보드에서 0.96 OLED를 작동시키기 위한 코딩은 별도로 취급하기로 한다. 앞으로 관심가지게 될 WeMos 보드도 마저 체크가 이루어져야 할 것이다.

//Oled_alphabet_capital_01
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH1106.h>

#define OLED_RESET 4
Adafruit_SH1106 display(OLED_RESET);

void setup() {
Serial.begin(9600);
display.begin(SH1106_SWITCHCAPVCC, 0x3C);
display.clearDisplay();

// text display tests
testdrawchar();
display.display();
delay(2000);
display.clearDisplay();
}
void testdrawchar(void) {
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(0,0);
// for (uint8_t i=0; i < 168; i) {
for (uint8_t i=65; i < 91; i
) {
if (i == '\n') continue;
display.write(i);
if ((i > 0) && (i % 21 == 0))
display.println();
}
display.display();
}
void loop() {
}//끝

아두이노 코딩-35: 0.96인치 모노크롬 OLED 128X64 “Steemit ”디스플레이 | Ecency