본문 바로가기

개인 연구실/기획실장의 연구실

프로토타입 제작과 테스트 코드 - 마리오


  주문했던 LED 스트립이 도착해서 바로 프로토타입 제작에 들어갔습니다. LED와 LED간의 간격만큼 행간을 띄워야해서 MDF를 300mm*300mm로 재단한 뒤 바둑판처럼 밑그림을 그렸습니다. 



  가로 세로로 밑그림이 완성되면 왼쪽 위에서부터 시작해서 ㄹ 자 진행으로 LED를 붙입니다. 주의할 점은 LED 스트립에 입력방향과 출력방향이 있으므로 적혀있는 글씨를 잘 보고 Din을 시작점으로 Do를 끝점으로 되도록 붙입니다.



  윗 그림처럼 오른쪽 끝부분을 보면 가운데 핀이 Do입니다. 그렇다면 그 아래줄에는 이 Do가 Din에 연결되도록 스트립을 맞춰서 붙여줘야 합니다. 스트립 부착이 완성되면, 양쪽 끝단 접점부분을 세척제로 깨끗이 닦아 주고 5V는 5V, GND는 GND, Do는 Din으로 연결되도록 납땜해 줍니다.



  이렇게 LED 메트릭스 부분을 완성하시면 됩니다. 


  제어부는 아두이노 우노를 사용해도 되지만 저는 많이 보유하고 있는 아두이노 프로미니를 전용으로 사용할 계획입니다. 그래서 작은 만능기판에 소켓없이 아두이노 프로 미니를 붙이고, 컨트롤 핀은 3번으로 결정하고 저항 470옴을 연결해서 LED 메트릭스에 연결하였습니다. 그리고, 전원도 5V 2A 어댑터를 연결하여 아두이노 프로미니 Vcc에 바로 공급하고, 또 LED 메트릭스 전원에 전해콘덴서 1000uF를 추가해서 전원의 출렁임을 완화시켰습니다.



  완성되면 아래와 같이 네오픽셀 라이브러리를 설치하면 함께 딸려오는 예제를 실행시켜 봅니다. 주의할 점은 LED 갯수와 컨트롤 포트를 정확하게 설정해주셔야 합니다. 저는 컨트롤 포트는 3, LED 갯수는 256개로 설정하였습니다.



  윗 사진은 LED가 너무 밝아서 핸드폰 카메라의 조리개가 좁아져서 전체적으로 칙칙하게 사진이 찍혔습니다만, 실제로 보면 눈이 아플 정도로 화려합니다.


  여기까지는 어렵지않게 완성되었고, 이번에는 간단한 16비트 게임캐릭터를 표시해보려고 합니다. 인터넷에서 적당한 그림을 하나 구합니다. 저는 마리오 캐릭터를 테스트로 선택하였습니다.



  모눈종이에 칸을 맞춰서 색상을 글자로 적습니다. 예를 들어 제일 윗줄은, 흰 흰 흰 빨 빨 빨 빨 빨 빨 빨 흰 흰 흰 흰 흰 흰 이 되겠습니다. 이렇게 16줄을 다 쓰면 16*16 크기의 캐릭터가 완성됩니다.


  이번에는 편의상 색깔을 제한해서 총 8개 색깔을 이름붙여 봅니다.


// define color

#define WHT 0 //white

#define RED 1 

#define BLU 2

#define COB 3 //cobalt

#define SKN 4 // skin

#define BRN 5 //brown

#define YLW 6 // yellow

#define BLK 7  // black


이렇게 정의한 색깔 이름을 이용해서 아까 만들어둔 캐릭터를 배열로 만듭니다.



unsigned char mario[256] = {

      WHT,WHT,WHT,RED,RED,RED,RED,RED,RED,RED,WHT,WHT,WHT,WHT,WHT,WHT,  //0

      WHT,WHT,WHT,WHT,RED,RED,RED,RED,RED,RED,RED,RED,RED,WHT,WHT,WHT,  //1

      WHT,WHT,WHT,BLK,BLK,BLK,SKN,SKN,COB,SKN,WHT,WHT,WHT,WHT,WHT,WHT,  //2

      WHT,WHT,WHT,WHT,SKN,SKN,SKN,COB,SKN,SKN,SKN,BLK,SKN,BLK,WHT,WHT,  //3

      WHT,WHT,BLK,SKN,BLK,SKN,SKN,SKN,SKN,BLK,SKN,SKN,SKN,WHT,WHT,WHT,  //4

      WHT,WHT,WHT,WHT,BLK,BLK,BLK,BLK,SKN,SKN,SKN,SKN,BLK,BLK,WHT,WHT,  //5

      WHT,WHT,WHT,WHT,SKN,SKN,SKN,SKN,SKN,SKN,SKN,WHT,WHT,WHT,WHT,WHT,  //6

      WHT,WHT,WHT,WHT,WHT,WHT,WHT,RED,RED,RED,BLU,RED,RED,WHT,WHT,WHT,  //7

      WHT,WHT,RED,RED,RED,BLU,RED,RED,BLU,RED,RED,RED,WHT,WHT,WHT,WHT,  //8

      WHT,WHT,WHT,RED,RED,RED,RED,BLU,BLU,BLU,BLU,RED,RED,RED,RED,WHT,  //9

      WHT,SKN,SKN,RED,BLU,YLW,BLU,BLU,YLW,BLU,RED,SKN,SKN,WHT,WHT,WHT,  //10      

      WHT,WHT,WHT,SKN,SKN,SKN,BLU,BLU,BLU,BLU,BLU,BLU,SKN,SKN,SKN,WHT,  //11

      WHT,SKN,SKN,BLU,BLU,BLU,BLU,BLU,BLU,BLU,BLU,SKN,SKN,WHT,WHT,WHT,  //12

      WHT,WHT,WHT,WHT,WHT,BLU,BLU,BLU,WHT,WHT,BLU,BLU,BLU,WHT,WHT,WHT,  //13

      WHT,WHT,BRN,BRN,BRN,WHT,WHT,WHT,WHT,BRN,BRN,BRN,WHT,WHT,WHT,WHT,  //14

      WHT,WHT,WHT,BRN,BRN,BRN,BRN,WHT,WHT,WHT,WHT,BRN,BRN,BRN,BRN,WHT}; //15



  이번엔 색상값을 만들어 봅시다. 네오픽셀 라이브러리를 직접 열어보면 컬러값을 조합하는 함수가 있는데 편의상 그 함수를 쓰지않고 직접 색상값을 만들면 편합니다. 인터넷을 뒤져서 위에서 결정한 8가지 색상의 RGB 값을 조합하여 32비트 색상값을 만듭니다. 최상위바이트는 0으로 하면되고 순서대로 R, G, B를 1바이트씩 써주면 됩니다. 예를 들어, 흰색이면 0xffffff, 빨강은 0xff0000 이렇게 하면 됩니다.


 

uint32_t pallet [8] ={0x444444,0xff0000,0x0000ff,0x000080,0xffb26e,0x844712,0xffff00,0x0};



위의 배열은 아까 정의한 색깔이름 순서대로 색상값을 나열하였습니다. 이를 테면, pallet[WHT] 는 pallet[0]이므로 0x444444로 하였습니다. 물론 정확한 값은 0xffffff값이 흰색이 맞습니다만, 캐릭터에서 흰색은 배경으로만 쓰이는데 배경을 회색으로 바꾸다보니 이름붙일 때의 계획과는 다르게 0x444444인 회식값을 사용하게 되었습니다. 만약 실제 표현되는 색상을 변경하고 싶으면 이 팔레트 값을 변경하면 쉽게 바꿀 수 있습니다.


자, 이제 모든 준비는 끝났으니, for문을 사용해서 0부터 256까지 LED의 색상을 지정해주고 show를 해주면 LED에 표시되게 됩니다. 자세한 건 첨부된 소스코드를 참고하면 됩니다. 네오픽셀 라이브러리를 꼭 추가하셔야 제대로 동작합니다.



  

mario_led_16bit.ino


 




  LED 빛이 너무 강해서 윗쪽 흰색은 제대로 표시되나 밑으로 갈 수록 색상이 희미해지는 경향이 강해서 소스코드에 밝기를 30으로 줄여서 설정하고, 흰색배경도 회색으로 변경하니 그럭저럭 마음에 드는 캐릭터가 되었습니다.





 LED 메트릭스 위에 올려둔 A4용지도 약간 거리를 두고 띄워 보면 빛이 더욱 산란되어 은은한 느낌이 납니다. 이 부분은 많은 테스트가 필요할 것 같습니다. 


  이상, 프로토타입 제작 및 캐릭터 표시 개발기였습니다^^