[Arduino] OLED 0.96'' 12864 모듈과 Arduino UNO 연결하기

2017. 4. 6. 14:06프로그래밍

반응형


오늘 쓰게된 글은, 아두이노 우노와 OLED 모듈을 연결하여, 가장 기초적인 출력 테스트를 하는 내용이다.


실질적으로 부품을 테스트하는 과정이라, 원리나 구성코드에 대한 이해는 아직 전무하다. 하지만, 


OLED 모듈을 구매하여 출력을 해보고 싶은 독자들에게 최대한 시행착오를 겪지 않도록 하기 위해 이글을 남긴다.


(참고로 본인은 이 글을 쓰기까지 구글링에 약 4시간을 투자하였다.)




1. 준비물





2. 결선 방법


(http://www.electroschematics.com/11150/cheap-oled-displays-arduino/ 참고)



OLED 핀

Arduino 핀 

 GND

GND

 VCC

5V 

 SCK

Digital Pin 5 

 SDA

Digital Pin 4 

 RST

Digital Pin 3

 DC

Digital Pin 2






3. Arduino UNO에 업로드하기

3-1. U8glib를 설치


아두이노 IDE 내에 U8glib(Universal Graphics Library for 8bit Embedded Systems) 라이브러리를 먼저 추가해야한다. 


라이브러리는 아래 그림과 같이 라이브러리 관리로 들어가서 U8glib를 검색하여 설치하면 된다.



3-2. Test 코드 실행


(출처 : U8glib 내의 소스 코드)

/*

  GraphicsTest.pde    >>> Before compiling: Please remove comment from the constructor of the   >>> connected graphics display (see below).    Universal 8bit Graphics Library, http://code.google.com/p/u8glib/    Copyright (c) 2012, olikraus@gmail.com  All rights reserved.

  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND   CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF   MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE   DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT   NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;   LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER   CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,   STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF   ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 

*/


#include "U8glib.h"

U8GLIB_SSD1306_128X64 u8g(5, 4, 10, 2, 3);      // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9


void u8g_prepare(void) {
  u8g.setFont(u8g_font_6x10);
  u8g.setFontRefHeightExtendedText();
  u8g.setDefaultForegroundColor();
  u8g.setFontPosTop();
}

void u8g_box_frame(uint8_t a) {
  u8g.drawStr( 0, 0, "drawBox");
  u8g.drawBox(5,10,20,10);
  u8g.drawBox(10+a,15,30,7);
  u8g.drawStr( 0, 30, "drawFrame");
  u8g.drawFrame(5,10+30,20,10);
  u8g.drawFrame(10+a,15+30,30,7);
}

void u8g_disc_circle(uint8_t a) {
  u8g.drawStr( 0, 0, "drawDisc");
  u8g.drawDisc(10,18,9);
  u8g.drawDisc(24+a,16,7);
  u8g.drawStr( 0, 30, "drawCircle");
  u8g.drawCircle(10,18+30,9);
  u8g.drawCircle(24+a,16+30,7);
}

void u8g_r_frame(uint8_t a) {
  u8g.drawStr( 0, 0, "drawRFrame/Box");
  u8g.drawRFrame(5, 10,40,30, a+1);
  u8g.drawRBox(50, 10,25,40, a+1);
}

void u8g_string(uint8_t a) {
  u8g.drawStr(30+a,31, " 0");
  u8g.drawStr90(30,31+a, " 90");
  u8g.drawStr180(30-a,31, " 180");
  u8g.drawStr270(30,31-a, " 270");
}

void u8g_line(uint8_t a) {
  u8g.drawStr( 0, 0, "drawLine");
  u8g.drawLine(7+a, 10, 40, 55);
  u8g.drawLine(7+a*2, 10, 60, 55);
  u8g.drawLine(7+a*3, 10, 80, 55);
  u8g.drawLine(7+a*4, 10, 100, 55);
}

void u8g_triangle(uint8_t a) {
  uint16_t offset = a;
  u8g.drawStr( 0, 0, "drawTriangle");
  u8g.drawTriangle(14,7, 45,30, 10,40);
  u8g.drawTriangle(14+offset,7-offset, 45+offset,30-offset, 57+offset,10-offset);
  u8g.drawTriangle(57+offset*2,10, 45+offset*2,30, 86+offset*2,53);
  u8g.drawTriangle(10+offset,40+offset, 45+offset,30+offset, 86+offset,53+offset);
}

void u8g_ascii_1() {
  char s[2] = " ";
  uint8_t x, y;
  u8g.drawStr( 0, 0, "ASCII page 1");
  for( y = 0; y < 6; y++ ) {
    for( x = 0; x < 16; x++ ) {
      s[0] = y*16 + x + 32;
      u8g.drawStr(x*7, y*10+10, s);
    }
  }
}

void u8g_ascii_2() {
  char s[2] = " ";
  uint8_t x, y;
  u8g.drawStr( 0, 0, "ASCII page 2");
  for( y = 0; y < 6; y++ ) {
    for( x = 0; x < 16; x++ ) {
      s[0] = y*16 + x + 160;
      u8g.drawStr(x*7, y*10+10, s);
    }
  }
}

void u8g_extra_page(uint8_t a)
{
  if ( u8g.getMode() == U8G_MODE_HICOLOR || u8g.getMode() == U8G_MODE_R3G3B2) {
    /* draw background (area is 128x128) */
    u8g_uint_t r, g, b;
    b = a << 5;
    for( g = 0; g < 64; g++ )
    {
      for( r = 0; r < 64; r++ )
      {
        u8g.setRGB(r<<2, g<<2, b );
        u8g.drawPixel(g, r);
      }
    }
    u8g.setRGB(255,255,255);
    u8g.drawStr( 66, 0, "Color Page");
  }
  else if ( u8g.getMode() == U8G_MODE_GRAY2BIT )
  {
    u8g.drawStr( 66, 0, "Gray Level");
    u8g.setColorIndex(1);
    u8g.drawBox(0, 4, 64, 32);   
    u8g.drawBox(70, 20, 4, 12);
    u8g.setColorIndex(2);
    u8g.drawBox(0+1*a, 4+1*a, 64-2*a, 32-2*a);
    u8g.drawBox(74, 20, 4, 12);
    u8g.setColorIndex(3);
    u8g.drawBox(0+2*a, 4+2*a, 64-4*a, 32-4*a);
    u8g.drawBox(78, 20, 4, 12);
  }
  else
  {
    u8g.drawStr( 0, 12, "setScale2x2");
    u8g.setScale2x2();
    u8g.drawStr( 0, 6+a, "setScale2x2");
    u8g.undoScale();
  }
}


uint8_t draw_state = 0;

void draw(void) {
  u8g_prepare();
  switch(draw_state >> 3) {
    case 0: u8g_box_frame(draw_state&7); break;
    case 1: u8g_disc_circle(draw_state&7); break;
    case 2: u8g_r_frame(draw_state&7); break;
    case 3: u8g_string(draw_state&7); break;
    case 4: u8g_line(draw_state&7); break;
    case 5: u8g_triangle(draw_state&7); break;
    case 6: u8g_ascii_1(); break;
    case 7: u8g_ascii_2(); break;
    case 8: u8g_extra_page(draw_state&7); break;
  }
  delay(10);
}

void setup(void) {

  // flip screen, if required
  //u8g.setRot180();

 
  pinMode(13, OUTPUT);           
  digitalWrite(13, HIGH); 
}

void loop(void) {
 
  // picture loop 
  u8g.firstPage(); 
  do {
    draw();
  } while( u8g.nextPage() );
 
  // increase the state
  draw_state++;
  if ( draw_state >= 9*8 )
    draw_state = 0;
 
  // rebuild the picture after some delay
  //delay(150);

}

4. 실행 결과






쓰고보니, 투자한 시간은 분명 많았는데, 별로 한게 없어보인다 !

하지만 다 배경지식으로 쌓일 것이라고 생각하며,

이상으로 포스팅을 마치겠다.


반응형