아두이노/테트리스[완료]

(2) 아두이노에서 초소형 테트리스를 만들어보자(2)

아크리엑터 2020. 2. 2. 14:15
반응형

한번의 광고 클릭이 저에게 도움을 줍니다. 감사합니다.


제일 먼저, 화면에 무언가 출력이 되어야하니, OLED에 출력하는 부분에 대해 간략히 설명한다.

OLED의 전체 사용법은 주변의 다양한 글들을 찾아서 보면되겠고, 여기서는 테트리스를 만들 때 사용된 코드를 위주로 설명을 한다.

OLED에 출력하기 위해서 간단하게 "Universal 8bit Graphics Library,  http://code.google.com/p/u8glib/"를 사용하였다. u8glib를 사용하면 아주 간단하게 화면에 점, 선, 도형 등을 그려 넣을 수 있다.  아두이노 -> 스케치 -> 라이브러리 포함하기 ->라이브러리 관리 메뉴에서 u8glib 을 찾아서 설치를 하면 된다.  u8glib 만 설치하면된다. 아래의 사진의 u8g2는 꼭 해야될 필요없다.

 

 

사용할 기본 코드는 다음과 같다.

#include <U8glib.h>      // 헤더를 포함하고, 

// 적용한 LCD가 1306 이어서 이것으로 설정함. 
// 다른 LCD면 다른 값으로 변경 필요함. 변경될 사항은 glib의 예제 또는 설명 자료에서 쉽게 변경 가능함
// HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are  SCK = 13 and MOSI = 11)
//
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);	


// 화면에 판을 전체 표시한다. 
// 속도 고려 없이 전체를 그림 그리는 상황을 만들었다.
void draw_board()
{
  char i, j;
  char temp;
    
  temp = u8g.getHeight()-BOARD_HEIGHT;
  u8g.drawLine(0,           u8g.getHeight()-1, 0,           temp);
  u8g.drawLine(0,           u8g.getHeight()-1, BOARD_WIDTH, u8g.getHeight()-1);
  u8g.drawLine(BOARD_WIDTH, u8g.getHeight()-1, BOARD_WIDTH, temp);

    
  for (j = 0; j < BOARD_ROW_CNT-1; j++) {
    for (i = 0; i < BOARD_COLUMN_CNT; i++) {
      
      switch (board[j][i+1])  {
        case 1: u8g.drawBox((i)*6+2, j*6+temp-1, 5, 5); break;
      }
    }
  }  
}


void setup(void) 
{
  u8g.setRot90();
  u8g.setFont(u8g_font_6x10);
  u8g.setFontPosTop();
}

void loop()
{
  // 화면에 출력... 이 부분이 제일 쉽게 구현한 곳... ^^
  // 기능 구현 측면이라서 기존 Default 기능을 그대로 적었다.
  // 화면에 출력하는 부분을 좀 개선하면 현재 속도 보다 훨씬 빠른 10여배 이상....
  // 화면 출력 속도를 보이게 할 수 있을 듯.....  물론 감이지만... ^^
  u8g.firstPage();
  
  do {
    draw_board();
  } while (u8g.nextPage());
  
}

 

 

위의 코드는 기존에 만들어둔 테트리스 코드에서 u8glib 부분만 뽑아서 온 것인다.  이것을 실행하면, OLED화면에서 테트리스의 맨 바깥쪽 박스를 그려주는 기능을 한다. 선이 그려지면 그 다음은 모두 알고리즘으로 처리를 할 부분인지라.... 아니, 버튼 처리하는 것이 있구나.... 아직 추가적인 설명이 더 필요한 부분이 있겠다.

 

다음은 조이스틱에서 키 입력을 받는 것에 대해 알아보자. 키보드 입력은 단순히 입력있다 없다고 구분하려면 좀 더 쉽게되지만, 짧게 누른 버튼, 길게누르는 버튼에 따라서 작동을 다르게 하도록 하려면 작은 코딩이 들어가야 한다. 마찬가지 왼쪽 오른쪽으로 조이스틱을 옮길 때도 타이밍에 따라 다르게 작동해야 한다.

 

반응형