자작 정수기용 컨트롤러 3, 디스플레이 모듈(OLED9664)

2015. 9. 17. 23:07

Project/Water Purifier

자작 정수기 컨트롤러용 디스플레이 OLED9664



  컨트롤러에 디스플레이 장치가 필요한데, 저는 OLED 모듈을 사용할 예정입니다. 원래는 7 Segment LED(7 FND)를 사용할 생각이었습니다. 정수기를 사용할 때마다 물 사용량(리터)을 출력할 생각인데, 7 Segment LED를 사용하면 주유소의 주유기처럼 효과를 낼 수 있어 보기 좋을 듯 했습니다. 그런데, 제가 가진 부품들 중엔, 이번에 사용할 케이스에 맞는 사이즈가 없네요! 컨트롤러가 싱크대 위쪽에 고정될 것이기에 너무 크면 보기 싫을 것 같습니다.




  7 Segment LED입니다. MAX7219 칩을 사용해서 다섯 개의 핀만 연결하면 되는데, 크기가 안맞네요....




  급하지도 않은 부품들을 눈에 보이는대로 이것저것 구입했더니 맞는 사이즈의 7 Segment LED가 여러개 있긴 하지만, 사용하려면 LED 컨트롤러 등 별도의 회로를 구성해야 해서 제외시켰습니다. SPI나 I2C 로 간편하게 연결할 부품을 찾다가 아래 제품을 골랐습니다.




  제가 사용할 제품은 DFRobot사의 OLED9664 color display module로 아래 사이트에서 확인할 수 있습니다.


 DFRobot OLED9664 color display module(http://www.dfrobot.com/index.php?route=product/product&path=156_53_143&product_id=817#.Vfq7VPntlBc)





  OLED 디스플레이는 다들 잘 아시겠지만, 자체 발광소자를 사용해서 별도의 백라이트(Back Light)가 필요없습니다. 그래서 기존 LCD보다 더 선명하고 밝습니다. 특히, 검은색 표현이 좋구요! 가격도 훨씬 비싸서 솔직히 여기에 쓰기엔 좀 아깝긴 하네요!^^;; 내용물은 보이는게 다 입니다. 저 케이블은 ".NET Gadgeteer" 연결커넥터라서 저는 사용하지 않습니다.





  뒷면입니다.  ".NET Gadgeteer Compatible" 소켓이 2개 보이고, 아두이노(Arduino)와는 SPI 인터페이스를 통해 연결됩니다. 통신을 위해 5핀, 전원 관련 2핀입니다. 전원은 5V 또는 3.3V 둘 다 가능하고, 드라이버 칩은 SSD1331 이며 라이브러리가 있어서 쉽게 사용할 수 있습니다. 화면크기는 0.96인치로 꽤 작고, 제품 홈에서 가져온 스펙은 아래와 같습니다.

 
  • Working Voltage: 5v or 3.3v
  • integrated 14v power boost from 3.3 or 5v power source for driving oled
  • Max power consumption: 150mA@3v
  • Connection & interface
    • .NET gadgeteer connector (IDC10) - Socket: S type
    • SPI interface for Arduino - 2.54mm pins x6
  • 96x64 pixel resolution, 256 or 65K true to life colours Enhanced OLED screen
  • 0.96" oled display module
  • Support Dreamer Mega controller and .NET Gadgeteer-compatible mainboard
  • Directly support Arduino controllers
  • simple to use library functions can produce text in a variety of sizes as well as draw shapes
  • Size: 42x32x8mm





  연결을 위해 핀헤더를 납땜했습니다. 많이 해보질 않아서 아직 예쁘게 못합니다.^^;



  아래 표는 DFRobot 홈에서 제공하는 핀 연결 구성입니다. 저는 Adafruit에서 제공하는 라이브러리 예제를 그대로 사용하기 위해 핀 연결을 약간 바꿨습니다. 표 아래쪽이 Adafruit Tutorial에서 제시한 구성입니다. 기본적으로 SPI 통신을 위해 SCK, MOSI(SI) , OCS(CS) 핀은 동일하게 구성하고 나머지 핀은 바꾸셔도 됩니다.


OLED 9664 moduleArduino Uno
3.3V3.3V
5V5V
GGND
RSTD6
SCKD13
SID11
CSD10
DC

D7



- Adafruit 예제 핀 구성

  • GND (G) - Gnd (Black Wire)
  • VCC (+) - 5v (Red Wire)
  • SDCS (SC) - skip
  • OCS (OC) - Digital #10 (Orange Wire)
  • RST (R) - Digital #9 (Green Wire)
  • D/C (DC) - Digital #8 (Brown Wire)
  • SCK (CK) - Digital #13 (White Wire)
  • MOSI (SI) - Digital #11 (Blue Wire)
  • MISO (SO) - skip
  • CD (CD) - skip







  연결된 모습입니다. 사진상으로는 전원부쪽으로 3.3V, 5V 둘 다 연결되어 있지만, 하나만 연결하시면 됩니다.



  이제 테스트할 차례입니다. 라이브러리 및 예제 소스는 Adafruit 사에서 제공하는 것을 사용합니다. 아래 링크 가시면, 자세한 Tutorial과 라이브러리 다운로드 링크까지 제공하고 있습니다.


OLED9664(SSD1331 driver) Tutorial (https://learn.adafruit.com/096-mini-color-oled)





  Adafruit 튜토리얼에서 제공하는 라이브러리 다운로드 링크입니다. 둘 다 다운 받습니다.





  압축 풀어서, 아두이노 라이브러리 폴더에 복사했습니다.







  예제를 불러왔습니다. 핀만 맞으면 잘 돌아가네요! 아래 동영상을 참고하세요!







  그 다음에, 위 예제 코드를 조금씩 고쳐서 만든 예제입니다. 라이브러리에서 제공하는 대부분의 함수는 필요 없고, 그저 숫자만 출력되는 단순한 구조라서 아래와 같이 수정해 봤습니다.



소스에서 가장 먼저 나오는 코드는 연결 핀 설정입니다.


#define sclk 13

#define mosi 11

#define cs   10

#define rst  9

#define dc   8


  위 코드가 디폴트값이고, 원하는대로 바꾸셔도 괜찮습니다. 다만, 아두이노의 하드웨어 SPI 핀을 사용하면 처리속도의 이득이 있으므로  sclk = 13, sid = 11, cs=10으로 설정하는게 좋습니다.



// Color definitions

#define BLACK           0x0000

#define BLUE            0x001F

#define RED             0xF800

#define GREEN           0x07E0

#define CYAN            0x07FF

#define MAGENTA         0xF81F

#define YELLOW          0xFFE0  

#define WHITE           0xFFFF


  색상값을 정의해 놓은 것으로, 기본적으로 65K 색상을 표시할 수 있지만, 제가 사용할 색상은 위에 것으로 충분합니다.



#include <Adafruit_GFX.h>

#include <Adafruit_SSD1331.h>

#include <SPI.h>


  OLED를 위해서 3개의 헤더파일이 필요합니다. SPI 통신을 위한 헤더 외에, Adafruit SSD1331은 SSD1331 드라이버이고, Adafruit GFX는 Adafruit 사에서 판매하는 디스플레이 장치들을 위한 그래픽 라이브러리로 다양한 함수를 제공하여 모듈 사용을 편하게 만들어 줍니다.


Adafruit_SSD1331 display = Adafruit_SSD1331(cs, dc, rst);

//Adafruit_SSD1331 display = Adafruit_SSD1331(cs, dc, mosi, sclk, rst);


  클래스 인스턴스를 생성하는 부분입니다. 디폴트값인 하드웨어 SPI 핀을 사용할 경우 윗줄, 핀값을 변경했을 경우 아랫 줄을 쓰시면 됩니다.



void setup(void) {

  display.begin();

  delay(1000);

}


  setup함수에서는 해당 클래스를 시작하고,



display.setTextColor(BLUE);

display.setTextSize(2);

display.fillScreen(BLACK);

display.setCursor(0, 0);

display.println(i);


  이 예제에서 사용된 전용함수들입니다. setTextColor() 함수는 인수값으로 다음에 출력될 문자의 색상을 지정하는데, 라이브러리 소스를 살펴보니, 색상값 2개를 인수로 주면, 두번째 색상값은 글자배경색이 됩니다. setTextSize() 함수는 다음 출력될 글자의 크기를 지정하고, fillScreen()은 지정된 색상값으로 전체를 채웁니다. 검은색을 인수로 주면 화면 전체를 지우는 효과로 쓸 수 있습니다. setCursor() 함수는 입력될 위치를 좌표값으로 지정하는데, 화면사이즈가 96*64이므로 0 ~ 95, 0 ~ 63 사이에서 움직일 수 있습니다.


  아래 소스는 0 부터 999까지 반복해서 출력하는 간단한 예제입니다. 



#define sclk 13

#define mosi 11

#define cs   10

#define rst  9

#define dc   8


// Color definitions

#define BLACK           0x0000

#define BLUE            0x001F

#define RED             0xF800

#define GREEN           0x07E0

#define CYAN            0x07FF

#define MAGENTA         0xF81F

#define YELLOW          0xFFE0  

#define WHITE           0xFFFF


#include <Adafruit_GFX.h>

#include <Adafruit_SSD1331.h>

#include <SPI.h>


Adafruit_SSD1331 display = Adafruit_SSD1331(cs, dc, rst);


void setup(void) {

  display.begin();

  delay(1000);

}


void loop() {


  int i;

  

  display.setTextColor(BLUE);

  display.setTextSize(2);


  for ( i=0 ; i < 1000 ; i++ )

  {


      display.fillScreen(BLACK);

      display.setCursor(0, 0);

      display.println(i);


      delay(150);

      

  }

}




  결과는 동영상으로 확인하세요!


이상입니다.


Comments