[64호]실험용 온도계 (Temperature Data logger)
ICT 융합 프로젝트 공모전 장려상
실험용 온도계 (Temperature Data logger)
글 | 포항공과대학교 김재유
1. 심사평
칩센 작품 개발의 의도가 조금 이해되지 않습니다. 하드웨어 개발을 위한 프레임 구성 및 각 메인 시스템과 외부 Peripheral 에 대한 Modulation 이라고 한다면 오픈 하드웨어 모듈레이션의 개념으로 접근하는건 어땠을까 합니다. 외관상 모듈레이션이 된것처럼 보이긴 하지만 내부 연결 방식이 모듈 블록간에 헤더핀과 Wire로 연결되어 다른 모듈 블록으로 교체하려면 케이스를 오픈해야하는 구조로 보입니다. 메인 시스템 기구 구성시에 각 Port를 특정 기능으로 매핑하고 B2B Connector 또는 Peripheral 전용 Connector Type으로 구성을 하였더라면 어땠을까요?
펌테크 실용적인 제품이라고 생각되며 전체적으로 꼼꼼하게 잘 기획되었고, 간결하게 잘 구성한 작품이라고 생각합니다.
위드로봇 아두이노의 모듈화를 꾀한 작품입니다. 인터페이스 커넥터에 대한 고민이 더 있으면 좋겠습니다.
2. 작품개요
2.1. 개발 동기
최근 과학자들도 과학실험을 할 때 아두이노를 요긴하게 이용하곤 한다. 가격이 저렴하고 개발이 빠르고 쉽기 때문이다. 그런데 어떤 경우에는 배보다 배꼽이 더 커질 때도 있다. 다시 말해 간단히 작동할 수 있는 디바이스를 빨리 만들려다가 생각보다 너무 많은 시간이 소모되는 것이다. 지난 몇 년간 아두이노를 가지고 여러 장치를 개발해보며 그 원인에 대해서 생각하게 되었다.
보통 어떤 디바이스를 개발하려면 기계분야, 전자, 컴공분야가 힘을 합치곤 한다. 아두이노는 전자, 컴공분야에 대해서 비전공자도 쉽게 개발을 할 수 있도록 길을 열어주었다. 그런데 기계분야에 대해서는 별다른 길이 열리지 않은 것 같다. 그래서 사람들은 각자 자신이 자주 이용하던 방식으로 소위 “프레임”을 만들어서 아두이노를 설치하곤 한다. 알루미늄 프로파일을 이용하거나 철판을 절곡해서 박스를 만들기도 하고, 목공을 잘 하시는 분은 목공으로도 박스를 만들기도 하고 패브릭, 도자기 등 기상천외한 방법들이 사용된다. 전통적인 방식의 빵판(Bread Board)을 남는 목재로 만들어서 나름대로 아두이노로 무엇을 개발할 때 프레임을 만들어 기계적 완성도를 높이려곤 했었다. 그러나 위와 같은 방법은 생각보다 안정성이 높지 않았다. 그래서 아두이노 프로젝트의 기계적 완성도를 높이고 개발을 효율적으로 빠르게 할 수 있도록 모듈화를 해보면 어떨까 생각해보게 되었다.
2.2. 개발의 목적
개발의 목적은 아래와 같이 두 가지로 요약할 수 있다.
① 아두이노 및 센서별 프레임 모듈화
② 아두이노 모듈화 시스템을 활용할 수 있는 방안 연구
3. 작품 설명
3.1. 주요 동작 및 특징
이 작품은 아두이노 우노를 중심으로 3가지 센서, 액추에이터를 쉽고 빠르게 연결하여 개발의 수월성을 높이는 모듈이다. 이 작품은 전자보드, 프레임, 샘플 코드 세 가지로 구성되어 아두이노로 구현하고자 하는 아이디어를 안정적 결과물로 개발할 수 있게 도와준다.
3.2. 개발 환경
① 개발언어: 아두이노
② Tool: 아두이노, 3D 프린터
3.3. 전체 시스템 구성
4. 단계별 제작과정
4.1. 개발방향수립
아두이노 모듈화를 통해서 아두이노 프로젝트 결과물의 기계적 안정성, 완성도를 제고한다. 누구나 3D 프린터를 통해서 출력해서 사용할 수 있어야 하며 회로연결작업과 코딩작업이 용의해야 한다. 가격이 너무 비싸지 않아야 한다.
4.2. 모듈개발준비
그림과 같이 모듈화 개발에 대한 컨셉을 정하였다. MCU로서 아두이노 우노를 선택하였다. 왜냐하면 아두이노 보드들 중에서 가장 대중적으로 이용되고 있기 때문이다. 또한 가격이 저렴하며 사용 가능한 핀의 개수도 수십개로 수 개의 센서 또는 액츄에이터 등을 연결하기에 적당했다.
4.3. 3D 프린터를 이용한 프레임의 개발
4.3.1. 아두이노 우노 프레임 개발
아두이노 우노를 장착할 수 있는 프레임을 사진과 같이 3D 프린터를 활용하여 개발하였다. 아두이노 우노는 M2 볼트를 이용해서 프레임에 고정되도록 하였다. 아두이노 우노 보드에는 네 개의 체결구멍이 뚫려있는데 이탈리아산 아두이노 우노 보드와 중국/대만산 아두이노 우노 보드의 구멍 위치가 조금씩 달랐으며 저렴한 호환보드에 맞추어서 프레임을 제작하였다.
하지만 출력 과정에서 전선구멍을 원형으로 하면 흠결이 생길 여지가 높았다. 그 부분을 수정하여 아래와 같은 2차 개발물을 완성하였다.
아두이노 우노를 장착할 수 있는 프레임을 사진과 같이 3D 프린터를 활용하여 개발하였다. 바닥의 환기 구멍은 슬롯형태로 설계하였다. USB 및 DC 전원잭이 연결될 구멍은 옆면에 내었다. 또한 센서와 액츄에이터 등 아두이노 우노에 연결될 부품들에서 나오게 될 전선은 정사각형 구멍을 통하도록 하였다. 마지막으로 바닥에는 고무재질 범폰을 붙여서 안정성을 높힐 수 있었다. 이렇게 아두이노 우노 프레임을 완성하였다.
4.3.2. 소형 센서/액츄에이터 하부 프레임 개발
각종 소형 센서 및 액츄에이터를 장착할 수 있는 프레임을 사진과 같이 3D 프린터를 활용하여 개발하였다. 그 결과 M3 볼트가 체결되는 구멍의 크기는 적당하여 볼트가 잘 체결되었다. 하지만 같은 금속재질의 너트가 없기 때문에 강한 힘으로 볼트를 체결할 시 구멍이 제 역할을 하지 못하고 망가져버릴 가능성이 있었다. 향후 금속너트를 넣는 방식을 쓰면 이 문제를 해결할 수 있겠지만 큰 힘을 받는 부분은 아니기 때문에 그대로 남겨두어 편의성을 제고하고자 하였다.
가장 큰 문제점은 윗면의 나사구멍이 아니라 밑면의 나사구멍이 너무 얕아서 체결의 강도가 감소한다는 것이었다. 그래서 기둥을 세워서 이 문제를 해결하는 방향으로 다음 버전의 형상을 설계하고 출력하였다.
각종 소형 센서 및 액츄에이터를 장착할 수 있는 프레임을 사진과 같이 3D 프린터를 활용하여 2차 개발하였다. 그 결과 밑면의 환기구멍은 적당히 공기를 통할 수 있게 하였지만 환기구멍의 크기는 너무 작아 출력의 질을 떨어트리는 요소로 작용하였다. 옆면 전선구멍의 크기는 AWG30의 래핑와이어나 AWG26의 점퍼와이어가 십 수개 정도는 널널히 드나들 수 있을만큼 컸으나 원형으로 FDM 방식 출력 시 출력물에 결함이 생길 가능성이 높았다. 옆면의 M3 나사구멍은 조금 좁아 나사가 부드럽게 통과하지 못했다. 이와 같은 사항을 고려하여 3차 설계와 출력을 진행하였다.
위와 같이 3D 프린터를 활용하여 프레임을 3차 개발하였다. 그 결과 밑면의 환기구멍은 적절한 크기와 숫자였고 잘 출력되었다. 옆면의 전선통과 구멍을 아두이노 우노 프레임과 마찬가지로 마름모꼴로 변경하여 마지막 형상을 확정하였다.
사진과 같이 3D 프린터를 활용하여 프레임을 최종개발하였다. 옆면의 마름모꼴 구멍은 3D프린터로 출력될 때의 결함을 최소화할 수 있었다.
4.3.3. 대형 센서/액츄에이터 하부 프레임 개발
사진과 같이 3D 프린터를 활용하여 소형센서보다 커서 프레임의 크기가 더 커야하는 대형센서 혹은 엑츄에이터를 담을 수 있는 프레임을 최종 개발하였다.
4.3.4. 센서/액츄에이터별 상부 프레임 개발
OLED 디스플레이를 부착할 수 있도록 설계된 상부 프레임을 위과 같이 제작하였다.
푸시 버튼모듈을 부착할 수 있도록 설계된 상부 프레임을 위와 같이 제작하였다.
위와 같이 네 개의 부품을 모듈화하였다.
4.4. 결과분석을 통한 모듈화 검증
개발된 아두이노 모듈을 이용해서 실제로 아두이노 우노에 4종의 부품을 부착해보면서 기능을 검증해보았다.
위와 같이 아두이노 우노를 하부 프레임에 M2 5mm 볼트를 이용해서 체결하였다. 예상과는 다르게 정품보드의 구멍과 호환보드의 구멍이 서로 위치가 동일하지 않았다. 그래서 호환보드의 구멍에 맞추어 하부 프레임을 제작하기로 하였다. 총 네 개의 볼트를 이용해서 아두이노 우노는 체결되었다.
위와 같이 센서/액츄에이터를 아두이노 우노와 연결하였다. 그 결과 완성도 높은 센서-아두이노 체결이 가능하였으며 따라서 기계적 안정성이 높아졌다. 래핑와이어를 통한 전선체결 또한 기존의 듀폰 점퍼와이어보다 안정적이라고 판단되었다.
그 다음 회로, 코딩작업의 용의성 검증하고자 하였다. 아두이노와 센서 등 부품을 연결하는데 통상적으로 듀폰 점퍼케이블을 이용하곤 하지만 그 경우의 단점은 아래와 같았다.
1. 쉽게 연결이 빠져버리며 다시 연결할 때 힘들다.
2. 한정된 아두이노 우노의 Power pin으로 여러 개의 센서에 전원공급이 힘들다.
3. 선이 두꺼워 뻣뻣한 힘으로 인해 좁은 공간에 구겨넣기 힘들다.
4. 다른 아두이노 보드로 그대로 옮겨 꽂기 힘들다.
그래서 듀폰 점퍼케이블로 회로를 구성하지 않고 래핑와이어를 이용한 회로구성을 선택하게 되었다.
래핑와이어를 이용해서 아두이노 우노의 회로연결 작업을 실제로 해 본 결과 듀폰 점퍼와이어를 사용했을 때 발생하는 문제들이 모두 해결됨을 확인할 수 있었다.
단점으로는 래핑와이어가 AWG30으로 가늘기 때문에 많은 양의 전류를 사용하지는 못한다는 점이었다. 하지만 아두이노 우노 자체가 큰 전류를 직접 사용하지는 않기 때문에 극복할 수 있는 단점이라고 판단되었다.
결과물이다. M3 볼트를 이용해서 아두이노 우노 프레임과 센서 프레임이 성공적으로 체결되었다. 개발을 진행하다보니 아두이노 우노보드에서 5V 핀을 여러개로 만드는 과정에서 허공에 떠있는 핀헤더가 다른 곳에 닿아서 합선될 가능성이 있었다. 이를 해결하기 위해서 아두이노 우노 보드에 핀헤더를 고정할 수 있는 구멍을 만들면 개선될 것으로 보인다.
5. 프로그램 활용가능성 모색
예시1. 3D 프린트용 온습도센서 개발
1. 회로
2. 소스코드
int selection = 0; //변수지정
#include “U8glib.h” //OLED 출력을 위한 라이브러리 호출
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_NO_ACK|U8G_I2C_OPT_FAST); //OLED 객체 지정
const uint8_t temp[] PROGMEM = {0×00, 0×00, 0×00, 0×00, 0×00, 0×00, 0×00, 0×00, 0×00, 0×00, 0×00, 0×00, 0×00, 0×00, 0×00, 0×00, (생략)}; //OLED 디스플레이에 내보낼 이미지
#include <AM2320_asukiaaa.h //온습도센서 라이브러리 호출>
AM2320_asukiaaa mySensor; //온습도센서 객체 지정
int temperature, humidity; //온도, 습도값 변수 지정
void setup() { //셋업함수 시작
{Serial.begin(115200); //시리얼통신 시작
while(!Serial); //시리얼통신 개발 실패시 대기할 것
Wire.begin(); //Wire 통신 시작
mySensor.setWire(&Wire); //온습도센서 통신 시작
u8g.setFont(u8g_font_fub14); //OLED 디스플레이 폰트 지정
u8g.setColorIndex(1); //OLED 디스플레이 글자색 지정
pinMode(2, OUTPUT); //LED 출력핀 지정
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, INPUT);} //버튼 입력핀 지정
void loop() { //루프함수 시작
Serial.println(selection); //시리얼 통신을 통해 selection 값을 출력
if (digitalRead(5)==1) {selection++; delay(150);} //만약 버튼이 눌러진다면 selection 값을 1만큼 증가
switch (selection) { //스위치문 시작
case 0: //selection이 0일 경우에
u8g.firstPage(); do {draw0();} while( u8g.nextPage() ); //OLED를 통해 첫번째 이미지를 출력
break; //스위치문 나가기
case 1: //selection이 1일 경우에
digitalWrite(2, 1); //첫번째 LED의 불을 켜고
u8g.firstPage(); do {draw1();} while( u8g.nextPage() ); //OLED를 통해 두번째 이미지를 출력
break; //스위치문 나가기
‘case 2: //selection이 2일 경우에
digitalWrite(2, 0); digitalWrite(3, 1); //첫번째 LED의 불을 끄고 두 번째 LED의 불을 켜고
u8g.firstPage(); do {draw2();} while( u8g.nextPage() ); //OLED를 통해 세번째 이미지를 출력
break; //스위치문 나가기
case 3: //selection이 3일 경우에
digitalWrite(3, 0); digitalWrite(4, 1); //두번째 LED의 불을 끄고 세번째 LED의 불을 켜고
u8g.firstPage(); do {draw3();} while( u8g.nextPage() ); //OLED를 통해 네번째 이미지를 출력
break; //스위치문 나가기
case 4: //selection이 4일 경우에
digitalWrite(4, 0); //세번째 LED의 불을 끄고
mySensor.update(); //온습도센서의 값을 불러오며
u8g.firstPage(); do {draw4();} while( u8g.nextPage() ); //OLED를 통해 다섯번째 이미지를 출력
delay(2000); //2초간 대기
selection=0; //selection을 다시 0으로
break;}} //스위치문 나가기
void draw0() {u8g.drawBitmapP(0, 0, 16, 64, temp);} //OLED 구동함수
void draw1() {u8g.drawStr(33, 32, “PC”);}
void draw2() {u8g.drawStr(33, 32, “ABS”);}
void draw3() {u8g.drawStr(33, 32, “PLA”);}
void draw4() {u8g.drawStr(20, 22, “T:”);
u8g.drawStr(20, 60, “H:”);
u8g.setPrintPos(50, 22);
u8g.print(mySensor.temperatureC);
u8g.setPrintPos(50, 60);
u8g.print(mySensor.humidity);}
3. 작동모습
개발된 디바이스의 작동 모습, 온습도가 잘 표시되고 버튼을 누르면 LED가 순차적으로 켜진다.
예시2. MP3 모듈 장착 예시
개발된 디바이스의 작동 모습. 음성파일 이름이 잘 출력되고 재생되었다.