아두이노에서 OLED 제어하기.
이전에 알리 익스프레스에서 구입한 OLED 사용기(http://dev.re.kr/47)에서 OLED 제어에 대하여 간략하게 올린적이 있습니다만 그것보다 더 편리한 u8glib 사용에 대하여 정리해 보도록 하겠습니다. 좀 더 자세한 튜토리얼과 레퍼런스는 이 곳 https://code.google.com/p/u8glib/wiki/u8glib?tm=6 페이지 에서 확인 할 수 있습니다.
우선 제어하려고 하는 OLED 가 SPI 로 통신하는지 I2C 로 통신하는지부터 알아야 하며, 내장 컨트롤러에 대한 정보도 알아야 한다. OLED 를 판매하는 인터넷 쇼핑몰 페이지의 상세 정보나 데이터시트를 참고하거나, 모델명으로 구글링해보면 OLED 컨트롤러에 대한 정보를 얻을 수 있다.
지금 테스트 해보려는 OLED 는 아래 사진과 같이 두 가지 종류이며 모두 알리 익스프레스에서 구매하였다. 아래 왼쪽 사진의 것은 I2C 를 이용하여 통신을 하고 SSD1306 컨트롤러를 사용하며 128x64 의 해상도를 갖고 있고, 오른쪽 사진의 것은 0.5" 에 SPI 를 이용하여 통신을 하고 LD7032 컨트롤러를 사용하며 60x32 의 해상도를 사용하고 있다.
http://www.aliexpress.com/item/0-5-inch-OLED-display-shield-for-Arduino-OCELL/1944014364.html
(판매가 종료되면 링크가 잘릴수도 있습니다.)
연결 방법은 다음과 같다.
I2C 의 경우 -
OLED - 아두이노(UNO 기준)
VCC - 5v 혹은 3.3v
GND - GND 단자.
SCL - A5
SDA - A4
와 같은 순서로 연결하고,
SPI 일 경우는
OLED - 아두이노(UNO 기준)
VCC - 3.3v (OLED 종류에 따라 혹은 5v)
GND - GND 단자.
SCK (Clock) - 13
MOSI (Data in) - 11
CS (Chip select) - 10 또는 다른 임의의 포트.
A0 - 9 또는 다른 임의의 포트.
Reset - 임의의 포트.
와 같은 순서로 연결한다.
이제 OLED 를 u8glib 라는 라이브러리에 포함되어 있는 간단한 예제 코드를 돌려보도록 하겠다.
우선 https://code.google.com/p/u8glib/ 으로 들어가서 메인 페이지 중간쯤에 있는 U8glib for Arduino 라는 글씨 오른쪽에 있는 다운로드 버튼을 눌러 라이브러리 파일을 다운 받는다.
다운로드가 완료되면 압축을 풀어서 아두이노 라이브러리 폴더 내부에 압축을 푼 라이브러리 파일이 들어있는 폴더를 통째로 아두이노의 라이브러리 폴더로 복사하고 아두이노툴 상단 메뉴에서 스케치 -> 라이브러리 가져오기 -> Add Library 를 통하여 방금 아두이도 라이브러리 폴더 내에 복사한 U8glib 라이브러리의 폴더를 선택하여 추가한다.
그리고 라이브러이와 같이 포함된 예제 코드(파일 -> 예제 를 통하여 불러올 수 있음) 중에 HelloWorld를 한 번 실행시켜보자.
아마 컴파일시에 error 가 떨어질 것이다. 포함된 예제 코드에서는 u8g 라는 변수가 선언되지 않았기 때문이다.
sketch_aug19a:133: error: 'u8g' was not declared in this scope
(위와 같은 에러가 발생한다.)
예제 코드에서 u8g 라는 변수의 메소드(함수)등을 통하여 OLED 를 제어하는 것을 확인할 수 있다.
이 변수를 선언하기 위하여 아래와 같이 조금 번거롭지만 중요한 과정이 필요하다.
우선 다음 페이지에서 https://code.google.com/p/u8glib/wiki/device 제어 하려는 OLED 의 컨트롤러 이름과 해상도를 이용하여 거기에 맞는 생성자를 찾아야 한다.
예를 들어 위에 OLED 사진중에 왼쪽에 있는 기기의 컨트롤러는 SSD1306 이며, 128x64 해상도, 그리고 I2C 를 사용하므로 디바이스 이름은 u8g_dev_ssd1306_128x64_i2c 가 되고 따라서 생성자는 U8GLIB_SSD1306_128X64(U8G_I2C_OPT_NONE) 가 된다.
그리고 표의 가장 우측 부분에 나와있는 아두이노의 지원 여부에 대하여 확인 해야한다.
(위 표를 통하여 드라이버 컨트롤러 이름과 해상도를 통하여 지원되는 OLED 기기와 생성자를 확인해야 한다. )
U8GLIB_SSD1306_128X64(U8G_I2C_OPT_NONE)
이제 생성자를 알았으니 예제 코드 윗 부분 전역 변수 선언부에
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);
를 추가시켜 주면 된다. 그리고 예제를 실행 시키면 아래 사진처럼 잘 동작하는 것을 볼 수 있다.
위 OLED 사진의 오른쪽에 있는 기기는 LD7032 컨트롤러와 SPI 를 사용하고 60x32 픽셀을 사용하며 기본(하드웨어) SPI포트를 사용하므로 아래와 같은 생성자를 사용하면 된다.
U8GLIB_LD7032_60x32(cs, a0 [, reset])
이 생성자에 첫 번째 인자값은 SPI 로 통신하는 OLED 에 연결한 cs 의 포트 번호를 입력하면 되고, 두 번째 인자로 a0 에 연결한 포트 번호, 세 번째 인자로 reset 에 연결한 포트 번호를 입력하면 된다. reset은 옵션이다. 사용하는 환경에 따라서 넣지 않아도 된다.
만약 점퍼 케이블을 이용하여 OLED 의 cs 단자를 아두이노의 10 포트에, a0 을 9번 포트에, 그리고 reset 을 2번 포트에 연결할 경우 다음과 같이 사용하여 변수를 생성할 수 있다.
U8GLIB_LD7032_60x32 u8g(10, 9 , 2);
마찬가지로 위의 코드를 전역변수 선언부에 추가한다.
업로드 하면 예제 코드가 정상적으로 실행되는 것을 확인할 수 있다.
만약 여러분이 이 포스팅에서 언급한 OLED 와 다른 기기를 갖고 있어도 컨트롤러 이름과 해상도등 몇 가지 사양을 알고 있다면, 이 곳 https://code.google.com/p/u8glib/wiki/device 에서 지원 디바이스 목록을 확인한 뒤에 제공되는 생성자를 이용하여 언제든지 활용할 수 있다.
아래는 테스트 영상. u8glib 에 들어있는 예제 코드 일부를 돌려본 영상이다.