모든 코딩의 기본이 되는 ‘hello world’를 시작해보자. 보통 처음 ‘hello world’를 접하게 되는 경우는 화면이 달려 있다. 하지만 여기서는 아직 화면이 없으니 시리얼 통신으로 대체하기로 한다. 시리얼 통신은 각 산업 분야에 다양하게 적용되어 있다. 그리고 시리얼 통신은 아두이노 개발 과정에서는 필수라고 봐도 과언이 아니다.

 

*MAC에서 Arduino 개발 환경 준비 및 LED 제어 관련 내용은 이전 글에서 확인한다.

 

2020.10.20 - [BerryMixLab/Arduino Tutorial] - Arduino Tutorial - 1. GPS Logger 개발 준비

 

Arduino Tutorial - 1. GPS Logger 개발 준비

 이 글에서는 Arduino ESP32를 활용한 GPS Logger 개발에 따른 모든 과정을 기술한다. 개인적인 기록을 위해 남기는 목적도 있으므로 튜토리얼이라 하기엔 내용상 다소 부족한 부분이 있을 수 있다. 순

berrymixstreet.tistory.com

1. 시리얼 통신으로 MAC Address 출력해보기

예제를 실행하기 전에 ESP32 보드와 PC를 USB 케이블로 연결한다. 이후 다음 경로에서 예제를 선택한다.

파일 > 예제 > ESP32 > ChipID > GetChipID

 

다음과 같이 예제가 열린다.

와이파이 통신을 위한 MAC address를 출력하는 예제이다. 아래 코드 설명을 참고한다.

uint64_t chipid;  
/**
setup은 초기화 함수로 보드 부팅시에 한번만 실행된다.
*/
void setup() {
	Serial.begin(115200); // 115200bps의 보드레이트 속도로 시리얼 통신을 시작한다.
}

/**
loop는 말 그대로 루프 함수로 setup 함수 수행 이후에 보드 전원이 유지되는 동안 반복해서 수행된다.
이 예제에서는 내장된 고유 MAC address를 불러오고 출력하는 것이 전부다.
*/
void loop() {
	chipid=ESP.getEfuseMac();
    //The chip ID is essentially its MAC address(length: 6 bytes).
    /*
    ESP 라이브러리에서 제공하는 기본 함수로 총 6 bytes의 고유 MAC address를 받아 온다.
    */
	Serial.printf("ESP32 Chip ID = %04X",(uint16_t)(chipid>>32));
    //print High 2 bytes
    /*
    상위 2bytes를 먼저 출력한다. MAC address가 AABBCCDDEEFF라면 AABB까지만 출력한다.
    */
	Serial.printf("%08X\n",(uint32_t)chipid);
    //print Low 4bytes.
    /*
    하위 4bytes를 출력한다. 
    */

	delay(3000); //3초간 대기한다.
}

실제 와이파이 통신을 통해 제대로 된 MAC address를 확인해보면 좋겠지만 여기서는 MAC address만 출력해보도록 한다.

*MAC address는 이더넷 통신을 위한 하드웨어 고유 주소로 흔히 알고 있는 IP address와 함께 통신이 가능하도록 한다. (와이파이는 무선 이더넷 통신.)

 

이제 다음 경로를 참고하여 시리얼 모니터를 실행하자.

툴 > 시리얼 모니터
시리얼 모니터를 실행하면 위와 같은 화면이 출력된다.

보드 레이트가 9600으로 설정되어 있을 것이다. 보드 레이트를 예제에서 설정된 값과 동일하게 115200으로 변경하자. 원하는 속도로 변경 가능하지만 여기서는 변경 없이 진행하도록 한다.

*보드 레이트는 시리얼 통신의 속도로 PC<->Arduino(장치 <-> 장치) 양쪽 모두 동일하게 맞춰주어야 한다.

변경하면 ESP32에서 기본적으로 출력하는 내용만 나타난다.

이제 좌측 상단의 화살표를 클릭해 코드를 write 하자

코드를 정상적으로 write 했다면 다음과 같이 MAC address가 출력된다.

MAC address는 고유값이기 때문에 보드마다 달라야 한다.

 


2. Hello world

여기까지 확인했다면 hello world를 출력해볼 차례다. 아래 코드를 참고해서 setup 부분에 Hello world를 입력한다.

Text 출력이 가능한 Print 관련 함수는 몇 가지가 있지만 그중에서도 println을 사용한다. 자동으로 줄 바꿈이 가능한 함수다.

다시 코드를 write 하고 시리얼 모니터에서 확인하면 Hello world가 잘 출력된다.

 

 


3. 응용

이제 응용을 해볼 차례다. 앞서 진행했던 tutorial 코드를 다시 불러 오자.

LED 제어 시 사용한 코드

그다음 아래 그림을 참고하여 각 위치에 print 함수를 추가해보자.

코드 작성을 완료한 후에 좌측 상단의 화살표를 클릭하여 write를 진행한다.

 

코드 write 후 시리얼 모니터에 위와 같은 화면이 출력되어야 한다.

 코드를 디버깅하는 여러 가지 방법이 있지만 디버거를 사용할 수 없는 환경이라면 print 함수나 LED를 활용하는 편이 유용하다고 생각된다. 물론 코드를 완벽하게 이해하고 있어야 하지만.

 

이렇게 LED 제어, 코드 디버깅을 위한 시리얼 통신까지 확인해봤다. 여기까지 아무런 문제가 없다면 다음 단계로 넘어가자.

 

 

 지난번 수유등 만들기 프로젝트에서 밝기 조절 기능을 빼서 눈부심에 시달렸던 문제가 있었다. 그래서 이번 프로젝트에서는 밝기 조절 기능을 추가했다. 밝기 조절이 가능한 애플 스타일 수유등 만들기 프로젝트는 다음의 순서로 진행했다. 개선 프로젝트이므로 기존 진행 단계에서 몇 가지 단계를 제외했다.

 

●사양 정의

●구현

●제품 디자인

●제작 및 시연

 

*지난번 수유등 만들기 프로젝트는 다음 글을 참고한다.

2020/10/16 - [BerryMixLab/Arduino Project] - 아두이노 프로젝트 - 간단한 수유등(무드등) 만들기

 

아두이노 프로젝트 - 간단한 수유등(무드등) 만들기

“이거 왜 이러지?”  아내가 물었다. 잘 쓰던 수유등에 불이 들어오지 않는다. 아내는 USB 케이블을 의심했지만 여지없이 침대에 달린 USB 포트가 나갔다. 수유등도 망가졌다. 수유등이 USB 포트

berrymixstreet.tistory.com


* Version1 : 이전 프로젝트에서 진행한 ON/OFF 기능만 있는 무드등

**Version2 : 이번 프로젝트에서 밝기 조절 기능을 추가한 무드등

 

1. 사양 정의

 

Version1에서 사용했던 사용했던 모든 부품을 재사용했다. 거기에 밝기 제어를 위한 touch 센서를 추가했다. 아래는 사용한 부품 목록이다.

 

· Arduino Uno

· WS2812B LED(원형)

· 18650 배터리(3.7V)

· USB 충방전 보드

· Switch

· Touch sensor


2. 구현

 각 센서 배선은 별도로 명시하지 않는다. 관련 내용은 다른 블로그에 상세하게 잘 설명되어 있다. 구현이 필요한 기능은 아래와 같다. 실 사용 환경이 수유등(무드등)에만 의존한 환경임을 고려했다.

 

● 4단계 밝기 조절 (수유 시에 사용자 편의에 따라 변경)

● 최소 <-> 최대 밝기 조절 (기저귀 교체 등에 빠른 변경이 필요할 경우 사용)

 

다음 코드를 참고한다.

 

/** 타이머 인터럽트로 이벤트를 처리하는 게 깔끔하지만 
어차피 touch sensor 값만 읽을 것이기 때문에 별도로 고려하지 않았다. 
*/ 
void loop() 
{ 
	buttonState = digitalRead(buttonPin); //PWM PIN에 달린 touch sensor 값을 읽는다. 
/** 
1. touch가 일정 시간 이상 지속되면 최소 <-> 최대 밝기 조절을 처리한다. 
최소 LED 1 ON 나머지 OFF 
최대 LED 8 ON 일정 시간 : 약 3초.
(최초 시간 계산에서는 시간이 더 짧았지만 코드 수정 중에 애매하게 시간이 변경되었다.) 
*/ 
	if (buttonState == HIGH) 
    { 
    	loopCnt++; 
        if(loopCnt>8) // 일정 시간 이상 touch가 지속되었을 경우 
        { 
        	switch(ledCnt) 
            { 
            	case 1: 
                	ledCnt=8; 
                break; 
                case 8: 
                	ledCnt=1; 
                break; 
                default : 
                	ledCnt=1; 
                break; 
            } 
            //LED ON 
            for(int i=0; i<ledCnt; i++) 
            { 
            	strip.setPixelColor(i, 0xf5, 0x7f, 0x17); 
                // (A,R,G,B) A번째 LED를 RGB (0~255) 만큼의 밝기로 켭니다. 
            } 
            //LED OFF 
            for(int j=ledCnt; j<8; j++) 
            { 
            	strip.setPixelColor(j, 0x00, 0x00, 0x00); 
                // (A,R,G,B) A번째 LED를 RGB (0~255) 만큼의 밝기로 켭니다. 
            } 
            strip.show(); //LED 변경 사항 반영 
            loopCnt=0; 
            delay(250); //touch 해제 후 불필요한 동작을 막기 위한 딜레이 
        } 
    } 
    /** 2. touch 동작을 해제할때 4단계 밝기 조절을 처리한다. 
    1 단계 LED 1 ON 나머지 OFF 
    2 단계 LED 3 ON 나머지 OFF 
    3 단계 LED 6 ON 나머지 OFF 
    4 단계 LED 8 ON 
    */ 
    else 
    { 
    	if(loopCnt>1 && loopCnt<=4) // 오동작을 막기 위해 일정 시간 touch가 유지되었을 경우에만 
    	{ 
    		switch(ledCnt) 
            { 
            	case 1: 
                	ledCnt=3; 
                break; 
                case 3: 
                	ledCnt=6; 
                break; 
                case 6: 
                	ledCnt=8; 
                break; 
                case 8: 
                	ledCnt=1; 
                break; 
                default : 
                	ledCnt=1; 
                break; 
            } 
            //LED ON 
            for(int i=0; i<ledCnt; i++) 
            { 
            	strip.setPixelColor(i, 0xf5, 0x7f, 0x17); 
                // (A,R,G,B) A번째 LED를 RGB (0~255) 만큼의 밝기로 켭니다. 
            } 
            //LED OFF 
            for(int j=ledCnt; j<8; j++) 
            { 
            	strip.setPixelColor(j, 0x00, 0x00, 0x00); 
                // (A,R,G,B) A번째 LED를 RGB (0~255) 만큼의 밝기로 켭니다. 
            } 
            strip.show(); //LED 변경 사항 반영 
            loopCnt=0; 
            delay(250); //touch 해제 후 불필요한 동작을 막기 위한 딜레이 
         } 
     } 
     delay(400); 
     /* touch 제어 처리를 위한 딜레이다. 
     딜레이가 없으면 불필요하게 짧은 시간 동안 touch 값을 읽는다. 
     */ 
 }

3. 제품 디자인

Version1의 기와 디자인에서 다음과 같이 디자인을 변경했다.

 하지만 사용 중에 부분 파손이 발생했고 광확산 아크릴이 빠지는 문제가 있어 디자인을 일부 변경했다. 다음은 현재 최종 디자인으로 예전 맥북의 로고를 오마주 했다.

 


4. 제작 및 시연

https://youtu.be/jF1ggOwn3ow

 

수유등을 완성한 후 아내를 불렀다.

“진짜 예쁘다. 그런데 이제 좀 쓸만하다.”

이제 좀?


 

Trouble shooting

밝기 1단계에서 불규칙한 주기로 LED가 깜빡인다.

▶ LED가 깜박일 때 USB 충방전 보드의 전원 LED가 깜박이는 것으로 보아 배터리 전원 계통의 문제로 생각된다.

▶ 정확한 이유는 알 수 없지만 밝기 2단계 이후로는 정상 동작하므로 개선할 계획은 없다.

 

 

세상을 바꾼 아이디어들은 형태에 변형에 따라 다양한 모습으로 진화해왔다. 기존에 있는 것들에 새로운 기능을 추가하거나 아니면 빼거나. 그것도 아니라면 완전하게 다른 시각에서 접근하기도 했다. 이 모든 것은 작은 시도에서 출발한다. 이 작은 출발도 그러하기를 바라본다. 프로젝트는 다음의 순서에 따라 진행했다.

*전통적인 프로젝트 진행 방식과는 다를 수 있다.

 

●제품컨셉구상

●사양 정의

●구현

●제품 디자인

●제작 및 시연


1. 제품 컨셉 구상

 

 지난번 프로젝트에서 기능을 축소해 시간만 표시하는 작은 인테리어 소품을 고민했다. 가장 중요한 점은 시간 설정 및 유지에 불편함이 없어야 한다는 점. 이를 기술적으로 해결하기 위한 방법은 있다.

하나, GPS 모듈을 통해 GPS의 시간을 받아 온다.
둘, 네트워크를 통해 타임 서버에서 시간을 받아 온다.
셋, 직접 시간을 입력하고 RTC(Real Time Clock)으로 시간을 유지한다.

 이중 가장 간편한 방법은 GPS 모듈을 통해 GPS의 시간을 받아 오는 것이다. 하지만 이 프로젝트의 이름이 GPS Clock이 아닌 이유는 ‘사양 정의’ 부분에서 자세하게 설명한다. 이 프로젝트의 정확한 이름은 다음과 같다.

GPS Logger

 


 

2. 사양 정의

 

 인터페이스를 결정하기에 앞서 GPS 모듈에 대한 사전 시험을 진행했다. 그리고 당황을 금치 못했다. 처음 써보는 부품이니 당연한 일이었다.

‘실내에서는 GPS 신호가 도달하기 어렵다.’

 어차피 손에 들어온 GPS 모듈이었다. 이참에 제대로 해보자는 생각이 들었다. 스마트 워치가 제공하는 운동 기능을 모방한 형태의 제품을 만들어 보면 좋겠다고 생각했다. 이미 이전 프로젝트를 진행하면서 보유한 부품을 최대한 활용하기로 했다. 사양은 다음과 같다.

 

·하드웨어

MCU : ESP32 (WiFi, Bluetooth 내장)

공식 홈페이지

LCD : TFT LCD 2.4인치 (SD card 인터페이스 포함)

ILI 9341

GPS : GY-NEO6MV2

Power : 3.7V 배터리(18650) * 2EA

ESP32 동작 전압을 확인하지 않고 구매했다가 추가 구매하여 용량이 다르다. 추가 구매 시에도 확인을 못해서 참사가 벌어졌다.

 

 Weather clock에서 지원해야 하는 기능은 다음과 같다.

 

구분

설명

·필수 기능

GPS 모듈 통신

GPS 시간 및 정보 화면 출력(JPG 이미지 출력)

GPS 데이터 기록을 위한 화면 터치 제어

GPS 데이터 저장을 위한 SD 카드 제어

··부가 기능

서버 통신 중 로고 띄우기(GIF 이미지 출력)


 

3. 구현

 

 구현 내용은 추후 각 단계별로 상세하게 정리해서 올릴 예정이다. 실제 구현은 라이브러리 내에서 제공하는 모든 예제를 활용했다. 사용한 라이브러리만 기능 별로 간단하게 정리한다.


·필수 기능

 

ㄱ. GPS 모듈 통신 : Tiny GPS

 GPS 통신은 모듈의 칩에서 자동으로 해준다. ESP32에서 할 일은 시리얼 통신으로 데이터를 받아오는 것이다. 데이터 파싱도 제공하는 라이브러리에서 자동으로 해준다.

 

ㄴ. GPS 시간 및 정보 화면 출력(JPG 이미지 출력) : TFT_eSPI

 JPG 출력은 예제만으로 문제없다. 다만 화면 구성 및 이미지 버튼 처리가 조금 성가셨다. 프로젝트 진행 중에 아두이노에 적용 가능한 GUI 라이브러리가 있는 것을 확인했다. 추후 다른 프로젝트 진행 시에 적용해볼까 한다.

 

ㄷ. GPS 데이터 기록을 위한 화면 터치 제어 : Adafruit TouchScreen

 이 부분이 조금 성가시다. 구글의 도움을 받아 터치 동작까지는 확인했으나 Arduino Uno(아두이노 우노)에서 동작과 다르다. 핀맵에도 문제가 없었다. 며칠을 헤매고 나서야 원인을 찾을 수 있었다.

ADC 해상도

Arduino Uno ADC 해상도 : 10bit(0 ~ 1023)
ESP32 ADC 해상도 : 12bit(0 ~ 4095)

 

*여기서 기술적인 이야기를 잠시 짚고 넘어가 보자.

 

/** 
감압식 터치 값은 각 ADC 핀을 통한 전압 차로 확인한다. 
LCD에 공급되는 3.3V를 기준으로 변환된 디지털 값을 map 함수를 통해 실제 좌표 값으로 변환하게 된다. 
그렇다. Arduino Uno 나 ESP32 나 LCD에 공급되는 3.3V 값은 달라지지 않기 때문에 
0 ~ 1023의 디지털 값이 발생하게 된다. 
ESP32는 0 ~ 4095 영역의 공간 중 0 ~ 1023 공간만 사용하게 되는 것이다. 

해결할 수 있는 방법은 하나다. 
ESP32 ADC 해상도를 제한하는 것. 
친절하게도 기본으로 제공되는 간단한 함수로 해결이 가능하다. 

*/ 

analogReadResolution(10); // ADC 해상도 범위를 10bit로 설정.

 

ㄹ. GPS 데이터 저장을 위한 SD 카드 제어 : ESP32 Dev Module 예제.

ESP32에서 SD카드를 사용하려면 FAT32로 포맷해야 한다. SD 인식 및 제어는 예제를 활용하면 어렵지 않다.

 

··부가 기능.

ㄱ. 서버 통신 중 로고 띄우기(GIF 이미지 출력) : AnimatedGIFs_SD_Master

별도의 변경 없이 지난번 프로젝트에 적용한 부분을 그대로 적용했다.

 

* GIF 이미지 출력에 대한 이야기는 아래 Weather clock 만들기 참고.

2020/09/17 - [BerryMixLab/Arduino Project] - 아두이노 프로젝트 - Weather clock 만들기

 

아두이노 프로젝트 - Weather clock 만들기

 바야흐로 아두이노 세상에 살고 있다. 초등생, 혹은 유치원생부터 청장년층에 이르기까지 코딩 좀 한다 하면 아두이노의 경험이 있다. 예외도 있지만, 이렇게 많은 사람들의 관심과 노력 속에

berrymixstreet.tistory.com


 

4. 제품 디자인

 Fusion 360을 사용하여 제품을 디자인했다. 별도로 참고한 디자인은 없으며 크기를 최소화하는데 집중했다. 쓸 데 없이 큰 배터리를 구매한 덕분에 케이스 크기가 커진 감이 있다. 달려있는 커넥터만 변경했어도 더 줄일 수 있었을 텐데.

 출력은 보유 중인 유일한 3D 프린터인 Ender 5 Plus를 사용했다.

 

 

 

 

5. 제작 및 시연

https://youtu.be/7X0HEIJEBuk

완성 후 아내를 불러 GPS Logger의 기능을 설명하며 자세히 보여주었다.

“빨간색에 뒤에 검은색 버튼 달려 있으니까 코카콜라 굿즈 같다.
그런데 무슨 말인지는 하나도 모르겠다.”


▶ Trouble shooting.

1. 실내에서 GPS 신호가 잡히지 않는다.

 저층이나 개방된 공간이라면 상황이 달랐겠지만 이와 같은 이유로 테스트에 어려움을 겪었다. 중간중간 마스크를 착용하고 밖으로 나가는 것 말고는 다른 방법이 없었다.

2. GPS Logger 동작 중 jpg 이미지가 깨진다.

 아직까지 이유는 확인하지 못했다. draw string 등 함수가 반복해서 동작할 때 jpg로 그려놓은 메모리 영역을 일부 침범하는 게 아닐까 한다.

 

“이거 왜 이러지?”

 아내가 물었다. 잘 쓰던 수유등에 불이 들어오지 않는다. 아내는 USB 케이블을 의심했지만 여지없이 침대에 달린 USB 포트가 나갔다. 수유등도 망가졌다. 수유등이 USB 포트를 잡아먹으며 같이 죽은 모양이다. 그래서 시작했다. 아두이노를 활용한 간단한 수유등(무드등) 만들기 프로젝트는 다음의 순서로 진행했다.

 

●제품 컨셉 구상

●사양 정의

●구현

●제품 디자인

●조립 및 시연


1. 제품 컨셉 구상

 

불만 들어오면 됐다. 다른 것은 고민할 게 없었다. 놀고 있는 Arduino Uno(아두이노 우노)가 최선의 선택지였다. 최대한 빠른 시간 내에 불편함을 해소해야 했다. 그냥 하나 사자는 말이 나오기 전에 말이다.


2. 사양 정의

 

기존에 쓰던 수유등의 기능을 그대로 제공해야 했다.

· USB 충전

· 편리한 전원 ON/OFF

· 밝기 제어.

 

이 중에 밝기 제어 기능은 제외했다. 크게 필요 없을 것 같다는 것이 그 이유였다. 아래는 사용한 부품 목록이다.

 

· Arduino Uno

· WS2812B LED(원형)

· 18650 배터리(3.7V)

· USB 충방전 보드

· Switch


3. 구현

 

 구현이랄 게 없다. 전원이 인가되면 LED를 전부 켜면 그걸로 끝이다. 코드랄 것도 없다. RGB 값은 구글링으로 기존 불빛과 가장 비슷한 색을 찾아 넣었다.

#include <Adafruit_NeoPixel.h>    

#define PIN 6                     // PWM 디지털핀
#define LEDNUM 8                  // 연결된 네오픽셀의 개수
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LEDNUM, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  strip.begin();                           
}

void loop() {                              
  strip.setPixelColor(0, 0xf5, 0x7f, 0x17);     
  strip.setPixelColor(1, 0xf5, 0x7f, 0x17);     
  strip.setPixelColor(2, 0xf5, 0x7f, 0x17);     
  strip.setPixelColor(3, 0xf5, 0x7f, 0x17);     
  strip.setPixelColor(4, 0xf5, 0x7f, 0x17);     
  strip.setPixelColor(5, 0xf5, 0x7f, 0x17);   
  strip.setPixelColor(6, 0xf5, 0x7f, 0x17);   
  strip.setPixelColor(7, 0xf5, 0x7f, 0x17);

  strip.show();  
  delay(1000);  // 이 부분에 delay가 없으면 눈이 아플 수 있다.
/*  
어차피 LED 점등만 시킬 것이라서 setup부분에서 동작 시켰어야 했다는 후회가 밀려온다.
쓸데 없이 LED 설정을 반복할 필요는 없었는데.
하지만 아무렴 어떠한가?
불만 들어오면 되는데!
*/
}

 


4. 제품 디자인

 최대한 간단하며 반복 사용에도 모든 부품이 제자리에 있어야 했다. 제작 중에 수정을 가하긴 했지만 일부분 개선이 필요해 보인다.

 

 

5. 제작 및 시연

https://youtu.be/H8alClHi6RY

 

수유등을 완성한 후 아내를 불렀다. 그리고 '기와지붕 같다.'라는 답변을 기대하며 동작하는 모습을 보여주었다.

“오, 괜찮네. 근데 바람개비 같다.”

그래도 괜찮다는 말은 기분이 좋다.


Trouble shooting

밝기 조절 기능을 뺀 관계로 아내와 아이 모두 눈부심에 시달렸다.

▶ 안경 닦이를 덮어두어 임시 조치를 취했다.

▶ Version2에서 해결할 예정.

 

 

나 때는 말이야.

 이 글은 이렇게 시작한다. 처음 직장 생활을 시작했을 때, 스마트폰의 물결이 시작되고 있었다. 옴니아가 아이폰의 대항마로 등장했을 즈음 말이다. 그때만 해도 개발 보드 같은 것은 포럼에서나 찾아볼 수 있었다. 요즘은 아두이노, 라즈베리파이를 비롯해 무수히 많은 개발 보드들이 있으니 참 편리한 세상이 아닌가 한다. 적은 비용, 조금의 시간, 조금의 열정만 있으면 무엇이든 만들어 낼 수 있으니 말이다.

 

 개발자라면 개발자, 그것도 아니라면 회사원으로 10년. 드디어 내 손으로 무언가 만들 결심을 했다. 단순한 토이 프로젝트로 끝내고 싶진 않았다. 모든 토이 프로젝트 진행자들의 바람이 아닐까 싶다. 제품화를 염두에 두고 단가에 신경을 좀 써봤다. 실제 제품화를 했을 때 팔릴지 알 수는 없지만. 프로젝트는 다음의 순서로 진행했다. 전통적인 개발 순서와는 맞지 않을 수 있다.

 

●보드 선택

●제품 컨셉 구상

●사양 정의

●구현

●제품 디자인

●제작 및 시연


보드 선택

아두이노 공식 홈페이지 캡처

 선택은 아두이노다. 가격도 가격이지만, 예전에 UDP 통신으로 릴레이 원격제어 기능을 구현해 본 경험이 결정에 큰 영향을 주었다. 라즈베리파이며 기타 등등 여러 파생 보드도 있지만 아두이노만큼 저렴하지 않다. 또한 아두이노에 비해 고사양이다. 몸 푼다는 생각으로 간단하게 시작해보고자 하는 생각도 있었다.


● 제품 컨셉 구상

엄청난 프로젝트들이 많다.

 유튜브와 구글에서 어떤 아두이노 프로젝트가 있는지 찾아보았다. 많다. 엄청 많다. 해외에도 많다. 심지어 교육용 키트 튜토리얼에서도 대부분의 센서 연결 방법을 다룬다. 그러다 문득 그런 생각이 들었다.

노래를 들려주면 반응하는 무드 등을 만들어 보자.

 청승 떨기 좋아하는 나에게 안성맞춤인 DIY 제품이었다. 유튜브와 구글에서는 비슷한 컨셉의 제품이나 프로젝트가 보이지 않았다.

이런 무드 등은 본 적이 없었다. 하지만 이제 있다. 내가 만들었으니까.


● 사양 정의

 무드 등 제작을 위해 필요한 기능은 세 가지였다. LED 제어, 음향 음역대 분리를 위한 마이크. 센서 총 2개, 아두이노 그리고 케이스면 무드 등 만들기에 충분했다. 물론 단순한 무드 등이라면 아두이노 사는 비용으로 구매가 가능하다.

 

아두이노 Mega 2560
LED 보드 : WS2812B 네오픽셀
마이크 : S235 MAX4466

 


● 구현

 실제 구현한 코드는 기록하지 않는다. 라이브러리 적용 방법 및 예제 코드는 다른 블로그에서 손쉽게 찾아볼 수 있기 때문이다. 필자도 다른 블로그의 예제를 참조해서 기능을 구현했다. 구현은 다음 순서로 진행했다. 터치 제어는 구현 중에 기능에서 제외했다.

 

1. LED 제어

 

사용 라이브러리 : Adafruit_NeoPixel

 

PWM 출력에 따라 LED 어레이를 제어할 수 있다. 처음엔 원형 타입의 WS2812B 보드를 구매했다. 실제 구현 및 컨셉 설계 시 막대 타입으로 WS2812B 보드를 추가 구매했다. 라이브러리를 사용하지 않았다면 꽤나 어려운 작업이 되었을 것이다. 음향 음역대에 따라 반응하도록 할 것이라 전체 8개 LED에 대해 점등 소등 정도만 확인했다.


2. 음향 음역대 분리

 

사용 라이브러리 : arduinoFFT

 

마이크로 입력된 신호를 analog 채널을 통해 아두이노로 전달한다. 음향을 대역 별로 분리해 시리얼을 통해 출력되는 것을 확인했다. 수정할 부분이 없어 기본 라이브러리에서 샘플링만 조정했다.


3. 음향에 따른 LED 제어

 

LED가 많았으면 대역별로 일일이 LED를 제어했겠지만 허락된 LED는 8개뿐이었다. 그래서 대역을 구간별로 나눠서 각 LED가 반응하도록 구현했다. 클럽 조명처럼 현란하지 않도록 점등과 소등을 부드럽게 처리했다. 무드 등의 본질에서 벗어나지 않도록 신경 썼다.


● 제품 디자인

 무드 등의 소재에 대한 지식이 전무한 상태였다. 집에 있는 모든 재료를 시험해보고 일대 전등 가게와 이케아를 돌아본 후에야 소재에 대한 확신이 들었다. 3D 프린터가 간절히 필요했다. 하지만 집에 남은 강화 마루 판자가 눈길을 끌었다. 그리고 ‘방망이 깎는 노인’이 떠올랐다.

밥 아저씨의 가르침이 생각난다.

 


● 제작 및 시연

30cm 자의 영역은 30cm 안에 국한되지 않는다.
세상 모든 것은 어딘가에 쓸모가 있다.

 보드 치수와 실제 조립을 고려해서 설계 도면을 그렸다. 30cm 자와 버니어 캘리퍼스면 충분했다. 스티브 잡스가 ‘손가락이 최고의 스타일러스’라고 했던가. 그렇다면 손은 위대한 도구이다. 무드 등을 완성한 후 아내를 불렀다.

“오, 생각보다 괜찮다.”

생각보다.

 

¿무드등 동작 영상

 

¿무드등 제작 영상

 

 

 

 

+ Recent posts