현재 모델링 완료되어 3D 프린팅 가공 의뢰 맡겨둔 상태입니다. 이번에는 강성 문제도 크게 걱정 없도록 적당히 무식하게 만들었고, 공차 역시 고려해서 너무 꽉 끼는 문제가 없도록 했습니다. 결과가 잘 나올 것 같습니다. (괜찮을거야...아마....) 문제 없이 잘 나와야 할텐데 말이죠. 걱정은 되지만 이건 걱정한다고 더 잘 나오고 그런 영역이 아니니...그냥 잘 뽑히기만을 기다리는 수 밖에 없겠습니다.
모델링이 완료되니 갑자기 할 일이 없어지는데, 그동안 계획했던 대로 짐벌에 장착할 짐벌 관리 소프트웨어를 만들기로 했습니다. 사실 짐벌 관리 장치를 위한 공간은 모델링할 때 따로 고려하지 않았습니다. 소프트웨어는 있어도 그만, 없어도 그만이고 제작 과정에서 어떤 기능이 필요할지도 고민해보지 않았기 때문이죠. 일단 소프트웨어를 만들어보고, 필요한 기능과 적절한 위치를 찾아서 새로 프린팅 의뢰를 맡기면 될 듯 합니다.
짐벌 관리 소프트웨어라니, 이름은 참 거창한데, 사실 뭐 별 건 없습니다. 아두이노 이용해서 시간 표시해주고, 배터리 잔량 표시해주고, 조이스틱 방향 표시해주는 정도...?인데, 기술적으로 구현이 그렇게 어려운 것도 아니고.. 할 만 합니다. 기능적인 표현은 제목과 같이 128*64 OLED 모듈을 사용할 겁니다.
(저 디자인이 진정 쓸모 있었다면 아마 디스플레이가 저렇게 들어갔을겁니다.)
128*64 OLED 모듈은 아두이노 스토리 에서 5400원 정도로 매우 저렴하게 구할 수 있습니다.(2018.1.9기준) 저는 이걸 2017년 10월에 구입했었습니다. 제가 구입할 때는 I2C 방식이었는데 지금 보니 SPI 방식으로 된 제품을 판매하고 있는 것 같습니다.
핀 연결하기
핀 연결은 OLED의 통신 방식에 따라 달라집니다. I2C(TWI) 방식의 OLED 모듈의 경우 SDA->A4, SCL->A5 로 연결하면 되고, SPI 방식의 경우 조금 더 복잡한데, 와 같이 연결하면 됩니다. 저의 경우 아두이노 레오나르도의 소형 버전인 Arduino Pro Micro를 사용하고 있는데, 혹시 Pro Micro를 사용하고 계시다면 SDA->D2, SCL->D3 에 연결하면 되겠습니다. I2C 방식의 경우 선 연결이 간단하기에 사용하기 쉽지만 통신속도가 느리다는 단점이 있습니다. 반대로 SPI 방식은 선 연결은 다소 복잡하지만 통신속도가 빠르다는 이점이 있지요. 이 부분은 후술할 내용에서 계속하도록 하겠습니다.
코드 짜기_SSD1306
코드 짜는 것은 원래 어려운 일이지만, 다행히 이 OLED에 대한 라이브러리를 사용할 수 있습니다. 크게 u8glib와 SSD1306 라이브러리로 나누어지는데, 우선 SSD1306라이브러리를 이용해 스크린을 띄워보겠습니다. SSD1306라이브러리는 Adafruit에서 제공하는 라이브러리로서, 두 라이브러리를 다운받아 설치해야 합니다. 각 라이브러리는 아래에서 다운로드할 수 있습니다.
라이브러리를 설치한 후 파일>예제>Adafruit SSD1306에 들어가시면 4가지 종류의 OLED 모듈에 대한 예제들이 준비되어 있을 겁니다. 저의 경우는 ssd1306_128*64_i2c가 적절하겠습니다.
*128x64 OLED 모듈의 경우 바로 예제를 업로드하면 height incorrect 에러가 발생합니다. 예제파일은 128*64 사이즈가 선택되었지만, 헤더파일은 여전히 128*32로 세팅되어 있기에 발생하는 문제인데요. 그렇기에 헤더파일을 약간 수정해줘야합니다. 그렇게 어려운 과정은 아니고, 단순히 주석처리와 주석 해제만 해주면 됩니다.
Adafruit_SSD1306.h 파일에서
#define SSD1306_128_64 //이 구문 주석 해제하고
#define SSD1306_128_32//이 구문 주석처리
#define SSD1306_96_16//이 구문 주석처리
ssd1306_128x64_i2c 예제에서
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif// 이 구문 위에
#define SSD1306_LCDHEIGHT 64 //구문 추가
이정도의 수정만 해주시면 됩니다. 이 상태에서 컴파일 해주시면 문제없이 업로드 되며, 예제로 몇 가지 데모를 확인하실 수 있습니다. 다음은 스크린이 동작하기 위한 가장 최소한의 코드입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | #include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define OLED_RESET 4 Adafruit_SSD1306 display(OLED_RESET); #define NUMFLAKES 10 #define XPOS 0 #define YPOS 1 #define DELTAY 2 #define LOGO16_GLCD_HEIGHT 16 #define LOGO16_GLCD_WIDTH 16 //static const unsigned char PROGMEM logo[] = {}; #define SSD1306_LCDHEIGHT 64 #if (SSD1306_LCDHEIGHT != 64) #error("Height incorrect, please fix Adafruit_SSD1306.h!"); #endif void setup() { // by default, we'll generate the high voltage from the 3.3v line internally! (neat!) display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3D (for the 128x64) // init done // Clear the buffer. display.clearDisplay(); // text display tests display.setTextColor(WHITE); display.setTextSize(2); display.setCursor(30,10); display.println("Hello world!"); display.display(); delay(1000); display.clearDisplay(); } | cs |
간단하게 hello world! 하나 출력하려는데 꽤나 복잡해 보입니다. 사실 initializing 부분이 약간 어려운 것 뿐이니 너무 겁먹지 않고 시작하면 크게 어렵지 않을 겁니다. 예제를 차근차근 보면서 분석해보시면 많이 늘 것 같습니다. 추가적인 SSD1306라이브러리 활용법에 대해서는 나중에 자세히 설명하겠습니다.
코드 짜기_u8glib
u8glib는나중에 하는 걸로 하겠습니다.