본문 바로가기
프로젝트(My Project)

[프로젝트 : 주크패드] 라즈베리파이 4를 이용한 주크박스 & 런치패드

by 안한량 2023. 3. 21.
728x90

소개

본 글은 약 한 달간 팀장 글쓴이와 팀원 세 명으로 이루어져 진행한 'IoT  실습 및 응용' 프로젝트의 최종 보고서를 요약정리한 내용입니다.

각종 센서와 소프트웨어의 상호작용, 리눅스 기반 GCC 프로그래밍에 초점이 맞춰져있습니다.

목차

1. 제목

2. 연구목적

3. 필요성

4. 목표

5. 설계과정 (기능 블록도 및 순서도)

6. 제작과정 ( Programming 상세 설명 )

7. 시험 (동작 영상)

8. 평가

9. 시행착오 및 개선사항

10. 최종 소감(느낀 점과 배운 점)

11. 부록 (소스코드 깃허브 링크 등) 


1. 제목

라즈베리파이를 이용한 주크박스 및 런치패드 구현 []


2. 연구목적

1) 런치패드 회로 구성을 통한 상세 동작 이해

2) 사용자 목적에 따라 다양한 악기 소리를 넣을 수 있는 전자 악기의 구현

3) 리눅스 기반 GCC 프로그래밍으로 소리 출력 모드, 녹음 모드 구현 등을 통한 소프트웨어 프로그래밍 능력 향상

4) 다양한 형태의 파일 입출력 모듈과 상세 동작 이해

5) thread 함수 이해 및 적용

6) 하드웨어 외형을 구현하기 위한 회로 구성 및 회로 제작 능력 향상

7) 하드웨어 구현을 위한 CAD 3D 프린터 사용 이해 및 제작 시도

8) 기술 구현에 사용하는 라즈베리파이 4


3. 필요성

해가 다르게 거듭되는 공학의 발전에 반도체 공정이 세밀화되고 소형화되어 소자의 형태로 공급되었다.
이 소자를 통하여 주변의 환경을 민감하게 감지하여 적절한 정보를 주고받는 센서(Sensor)’의 종류에는 여러 가지가 있으며 소프트웨어 공학의 정보 기술 영역과 융합하여 ‘IoT(Internet of Things)’ 분야에서 다양하게 사용된다.

 

학예와 기술을 뜻하는 예술 또한 우리의 삶에 가까이 공존한다.
예술은 창의 공학과도 깊은 연관을 가져 단순한 가창과 그림을 넘어서 설계 및 제작, 창의적인 모든 활동이다.

삶을 풍요롭게 만드는 예술은 우리의 삶에서 언제나 함께하며 앞으로도 다양한 형태로 공존할 것이다.

 

이러한 배경을 바탕으로 우리 팀은 위와 같은 다양한 소자 등을 사용하여 임베디드 환경에서 통신하는 악기를 제작하는 프로젝트를 기획한다.

기존의 입력값에 맞는 출력뿐만 아니라, 연주한 입력값을 기억하여 재생해주는 편의 기능을 더하고 오락적 요소인 랜덤 재생까지 포함하여 기획하였다.

 

궁극적으로 팀 측면에서 소프트웨어 분야의 진로를 준비하기 위한 희망,
하드웨어 분야 경험 확보를 위해 IoT 융합 관점에서 역량을 향상할 수 있는 발판을 마련하고자 한다.


4. 목표

본 과제에서 달성하고자 하는 제품의 성능 목표는 다음과 같다.

예상 외형 그림

- 모형의 전체적인 크기 : 가로 32cm × 세로 20cm × 높이 16cm

- 구현하고자 하는 기능 : 주크패드 메뉴 선택 기능 (LCD에 표시)

: 런치패드 연주 기능 (드럼, 피아노 등 각종 악기 소리)

: 랜덤 음악 재생 기능

: 사용자가 직접 연주한 곡 녹음 & 저장 후 재생 기능

- 구현하고자 하는 시스템의 규모 : 사용자가 직접 연주할 수 있는 런치패드 설계

파일 입출력을 통한 연주, 녹음 및 곡 재생


설계과정 (전체 기능 블록도 및 순서도)

5.1 설계 기초이론

 

5.1.1 Linux 환경에서의 C 프로그래밍

1) system() 함수 (Linux 환경)

부모 프로세스가 원하는 기능의 자식 프로세스를 불러올 수 있게 해주는 함수

근본적으로는 fork함수(자신과 똑같은 프로세스를 생성) + exec계열 함수(프로세스를 원하는 역할로 변경)의 원리를 가진다. (차이점 제어권이 자식 프로세스에게 있음)

라즈비안의 사운드 플레이어인 omxplayer를 통해 각종 음원 파일을 재생시키는 목적으로 사용

 

2) gcc 컴파일러

GNU 프로젝트의 일환으로 개발되어 널리 쓰이고 있는 컴파일러

다양한 컴파일 옵션이 존재하지만, IoT 실습과 응용 수업과 프로젝트에서는 o 옵션을 붙여 사용 (지정한 파일명으로 실행파일을 저장하는 옵션)


5.1.2 GPIO 프로그래밍

1) wiringPi 라이브러리

라즈베리파이에서 GPIO 프로그래밍을 할 때 사용하는 라이브러리로서, 속도가 다른 라이브러리에 비해 비교적 빠르기 때문에 많이 사용

wiringPi 라이브러리를 사용하기 위해 프로그래밍 시 <wiringPi.h>를 추가하여 프로그래밍 실시

Pin을 지정, 핀 번호에 값 전달, delay주기 등 wiringPi 라이브러리의 다양한 함수를 활용하여 프로그래밍

컴파일 시 lwiringPi를 꼭 붙여주어야 함

 

2) 백그라운드 동작 처리를 위한 pthread

리눅스 기반 GCC 프로그래밍으로 기존의 windows.h와 같은 강력한 라이브러리가 없음.

이에 백그라운드로 LED, 음성 파일 입출력을 제어하기 위한 멀티 쓰레드 사용 'pthread'


5.1.3 회로 구성

1) GPIO 핀 연결

라즈베리파이 version4 version4의 핀 맵을 참고 하여 프로그래밍 시 지정한 pin 번호 그대로 연결

UART, SPI 인터페이스 등 특수한 기능을 하는 핀들이 따로 존재, GPIO pin으로 사용 가능한 핀 개수 총 26

5V 출력 2, 3.3V 출력 2, GND 8개로 회로 구성에 따라 맞춰서 사용 (라즈베리파이의 GPIO핀은 3.3V의 전압으로 구동되므로 3.3V를 넘어가게 되면 GPIOGPIO 핀이 망가질 가능성이 있음)

 

2) 배선

브레드보드를 이용하여 라즈베리파이 핀의 전압과 GND를 밖으로 빼주어 각종 부품들을 연결할 수 있음

LED 연결 시 저항을 사용 (라즈베리파이 출력 전압 때문에 LED가 망가질 수 있기 때문)

부품의 극성을 주의하여 연결 (과도한 전압이 인가되어 회로가 탈 수 있음)


5.2.1 소프트웨어 기능블록도 (개념설계)

전체 기능 순서도

주크패드는 총 네 가지 기능으로 연주할 수 있는 런치패드 기능, 랜덤으로 음악을 재생하는 주크박스 기능, 사용자가 연주한 음을 녹음하고, 녹음을 재생할 수 있는 기능으로 구성되어있다.

4가지의 기능을 나타내 주는LCD display에서 1Push Button을 누르면 런치패드 기능을 실행한다.

그 후 LED 아케이드 버튼을 누르면 각종 악기 소리가 출력되며 런치패드 연주를 가능하게 한다.

그리고 2Push Button을 누르면 랜덤 노래 재생인 주크박스 기능이 실행된다.

3Push Button을 누르면 3초 후 사용자가 LED 아케이드 버튼을 누르는 대로 배열에 저장하며

마지막 4Push Button을 누르면 이전에 연주한 곡이 play된다.


 

그림 01. 런치패드 기능 순서도

 

1Push Button을 누르면 런치패드 모드가 실행되고 LED 아케이드 버튼의 키 입력을 받기 위한 루프에 들어간다.
런치패드 모드에서 다른 모드(메뉴)로 이동하기를 원한다면 2, 3, 4번 메뉴 버튼 (Push Button)을 누른다.
만약 2, 3, 4Push Button이 아니라면, LED 아케이드 버튼을 통해 입력을 받는다.
원하는 LED 아케이드 버튼을 누르게 되면 키값을 받아 해당하는 버튼이 눌려있는 동안 LED ON 동작을 하고
누르는 동안 여러 번 입력을 방지하기 위해 중복 방지 코드가 들어가서 play_drum()play_drum() 함수가 한 번만 실행된다
.


그림 02. play_drum 함수 순서도

 
해당하는 키 값에 맞춰 omxplayer (음성파일) 명령이 들어가있는 system함수가 실행되는 함수이다. 
누른 아케이드 버튼의 키값을 받아 key_value 5~12일 때 (아케이드 버튼 총 8개) system( ) 함수가 실행되어 버튼마다 특정 악기 소리가 출력된다. 이때, 시스템 함수의 background 명령어를 포함해 모든 소리를 동시에 재생할 수 있다.

그림 03. 주크박스 기능 순서도

2 Push Button을 누를을 때마다 노래가 재생되고 정지되는 것을 반복하기 위하여 정수 u 2로 나머지 연산으로써 해당 기능을 구현하였다. 
먼저 나머지가 0일 때는 오류 방지를 위해 system() 함수를 통하여 재생 중인 모든 노래를 정지시킨다. 
그 후, 랜덤으로 노래를 출력하기 위하여 pre_val 변수의 값과 val 변수의 값이 같을 때마다 다시 val 변수에 랜덤으로 들어가는 값을 변경해준다. (이 과정의 실제 제작은 오류 방지를 위해 While 루프를 사용하였다.)
그리고 val 값에 들어있는 숫자(0~곡 수)를 통해 조건문을 실행하여 해당하는 노래를 system에서 재생해준다. 


그림 04. 녹음 기능 순서도

 

3Push Button을 누르면 녹음 모드가 실행된다.

사용자는 녹음 중에도 자신의 연주를 들어야 하기에 런치패드 모드에 있는 기능과 동일한 기능이 함께 실행되도록 설계하였다.
3
번 모드인 녹음 모드에 정상적으로 들어오면, I값을 3부터 1씩 감소시켜 3초 후에 녹음이 시작되는 것을 LCD로 출력한다.
3
초가 흐른 뒤 녹음이 시작되면, LED 아케이드 버튼을 눌러 사용자가 녹음을 진행할 수 있다.
LED
아케이드 버튼을 누르면 play_drum() 함수를 통해 특정 악기 소리가 출력되도록 하고, 누른 버튼의 키값을 키배열에 저장, 다음 버튼을 누를 때까지의 딜레이를 딜레이 배열에 저장시킨다.
녹음을 끝내고 싶을 때 3Push Button을 다시 눌러 녹음을 종료한다.


그림 04. 재생 기능 순서도

4Push Button을 누르면 3번 녹음 모드에서 녹음을 진행했던 사용자의 연주를 들을 수 있는 재생모드가 실행된다.

재생 모드가 실행되면, key_value0이 아닐 때, 즉 녹음한 내용이 존재할 때, 변수 k값을 0에서부터 1씩 증가시켜 녹음모드에서 키배열에 저장시켜놓았던 키값, 딜레이 배열의 딜레이 값을 순서대로 가져온다.
가져온 키값을 매개변수로 하여 play_drum() 함수를 실행시켜 사용자가 연주했던 그대로 재생한다.

버튼을 누르는 중간중간 있었던 딜레이는, 키 배열에서 한 음을 가져올 때마다 딜레이 배열에 있는 값들 또한 가져와 사용자가 연주했던 그대로 delay를 시켜주어 연주했던 박자 그대로 재생이 가능하다.

배열에서 모든 값들을 불러오면 비어있는 배열 값 (0) 이므로 continue를 통해 빠르게 재생이 종료된다.

+ 총 100번으로 키 연주를 설정했지만 숫자를 수정할 경우 더 많은 길이의 녹음도 가능할 것으로 예상한다.
 

5.2.2 기능적 요구사항 명세서

ID 요구사항 내용 설명 우선순위
R_01 LCD 메뉴
화면
구성
기능을 선택할 때,
사용자에게 메뉴
화면을 띄워준다.
LCD display를 사용하여
사용자가 제품을 편리하게
이용할 수 있도록 기능별로
메뉴 화면을 구현한다.
(1. 런치패드 / 2. 주크박스 /
3. 녹음 / 4. 녹음 재생)
6
R_02 런치패드
연주 기능
사용자의 입력값을
받아 런치패드를
연주한다.
Mode 1.
사용자가 연주할 때 사용하는 LED 아케이드 버튼을 누르면,
눌러지는 값에 해당하는
각종 악기 소리를 출력한다.
1
R_03 주크패드
기능 선택
런치패드, 주크박스, 그리고 녹음 기능
하나를 선택할 수 있다.
기능을 선택할 때 사용하는
Push Button을 누르면,
사용자가 원하는 기능의
모드로 전환한다.
3
R_04 주크박스
(랜덤 음악) 재생
및 정지 기능
사용자의 입력값을
받아 랜덤으로
제품에 담겨있는
음악이 재생된다.
Mode 2.
Push Button 2번에
해당하는 버튼을 누르면
주크패드속에 담겨있는
여러 곡 중 한 곡이 재생된다.
2
R_05 사용자 연주
녹음 및 재생 기능
사용자가 런치패드로
연주한 곡을 저장 및
재생할 수 있다.
Mode 3 / 4.
Push Button 3번을 누르면
사용자가 연주하는 것을
저장할 수 있으며,
4번을 누르면 전에 사용자가
연주한 곡이 재생된다.
4
R_06 Push Button +Led 런치패드 연주와
녹음 기능에서
아케이드 버튼을
눌렀을 때와 뗐을 때
동작이 다르다.
Mode 1 / 3.
아케이드 버튼을 누르면
LED가 켜지고,
아케이드 버튼을 누르고 떼면
LED가 꺼지는 동작을 한다.
5
R_07 LED
랜덤 점멸
아케이드 버튼의 LED가 랜덤으로 반짝거린다. 제품을 처음 실행할 때와
주크박스 재생 기능 도중에는
랜덤으로 아케이드 버튼의
LED가 하나씩 불이 켜지고 꺼지며 랜덤으로 반짝거린다.
8
R_08 주크박스
(랜덤 음악) 재생
+ 런치패드 연주
기능
주크박스 기능을 실행하면서 런치패드의 기능도 동작한다. 주크박스(랜덤 음악) 재생을 background로 실행시키고,
런치패드에 해당하는 Push Button을 누르면 LED 아케이드 버튼으로 연주가 가능하다.
7

제작과정

6.1 제작과정

6.1.1 소프트웨어 제작과정

· LINE 1 ~ 6

전체 프로그램 진행에 필요한 헤더 파일이다..

wiringPi와 쓰레드 기능 등이 포함되어있다.

 

· LINE 8 ~ 38

여러 개의 버튼과 LED에 해당하는 GPIO 포트번호를 정의하고 저장된 상수 값을 각각 LED, KEYPAD 테이블을 만들어 편하게 관리할 수 있도록 준비한다.

 

 

· LINE 40 ~ 122

키패드, LED 제어를 위한 기본 함수들이다.

 

· LINE 54
특별히 추가한 상수로 이루어진 Keylist 배열은 키 값을 버튼 순서와 통일하여 편리하게 제어하기 위한 변수이다.

 

· LINE 124 ~ 151

play_drum 함수는 매개변수로 keylist 키 값을 받아 Switch-case 제어를 통해 해당 키패드의 사운드를 출력한다. 이 때 Case : 5부터 시작하는 이유는 위의 4개 버튼은 메뉴 선택 버튼이며, LED 런치패드 연주 버튼은 5번부터 12까지 8개이다.

· LINE 153 ~ 166

count_lcd는 녹음 기능을 사용할 때 유저에게 LCD를 통해 카운트다운 안내를 위한 함수이다.

 

· LINE 168 ~ 172

led_off는 프로그램 내 모든 LED를 끄는 동작을 하는 함수이다.

 

두 가지 모두 다양한 상황에 반복적으로 사용되어 함수로 만들어 놓았다.

 

· LINE 174 ~ 205

t_function은 쓰레드 함수로 주크박스(랜덤 음악 재생) LED 점멸을 해주기 위한 함수이다. LED 제어를 위한 delay가 필수인 상황에 프로그램 진행을 멈추지 않으며 백그라운드에서 LED 동작을 해준다.

· LINE 176

쓰레드의 취소동작이 가능하도록 하는 명령을 주었다.

 

· LINE 179 ~ 202

while문 무한 루프를 통해 쓰레드 종료 전까지 계속되고
rand값을 delay함수에 넣어주어 최소 0.3초부터 최대 1초 사이의 delay로 점멸 동작한다.

 

· LINE 207 ~ 232

메인 함수가 시작되며 필요한 모든 변수 선언과 매번 다른 랜덤 값을 위한 라이브러리 함수 선언이다.

 

· LINE 234 ~ 245

미리 만들었던 핀과 LED 테이블이 있으므로 반복문을 통해 키패드는 INPUT 모드로, LEDOUTPUT 모드로 설정해주었다.
초기 LED 설정 시 문제없는 동작 확인을 위해 순차 점멸까지 진행되도록 한다.


· LINE 247 ~ LINE 460

지금부터는 while 무한 루프를 통해 하드웨어 전력이 종료될 때까지 다양한 기능을 반복 선택할 수 있는 메뉴가 제공되는 프로그램을 설명한다.

메뉴 선택 후 다시 돌아왔을 때 프로그램이 종료되지 않고 다른 메뉴를 선택, 혹은 반복적으로 녹음 및 재생이 가능하다.

 

· LINE 247 ~ 285

while 루프가 시작되면 LCD에 메뉴 선택 안내문을 출력하며

nKeypadstate 변수를 통해 키 값을 받아들여 어떤 위치의 버튼이 눌렸는지 알아낸다.

 

· LINE 264 ~ 285

1번 메뉴 버튼이 선택되면 실행되는 첫 번째 기능 런치패드이다.

다른 메뉴를 선택하기 전까지 while 루프를 돌며 눌리는 키패드 위치에 해당하는 음악파일을 void play_drum을 통해 백그라운드로 재생한다.

백그라운드 재생의 이점은 다양한 키를 연속으로 눌러도 소리가 끊기지 않으며 지속된다. if문을 통한 중복 재생 방지는 정상적으로 작동하여 음원은 1번만 재생한다.

그리고 LED 제어는 중복 방지를 하지 않아 해당하는 버튼이 눌려있는 동안 LED가 점등된다.

사용자가 체감하기 어려운 수준의 delay(1)을 사용하여 LED 점멸이 너무 빠르게 되어 꺼진 상태로 보이는 현상을 방지한다.

· LINE 264 ~ 385

2번 메뉴 버튼이 선택되면 실행되는 두 번째 기능 주크박스이다.

반복 제어 변수 u%2 제어를 통해 재생, 종료 Toggle이 가능하도록 제작하였다.

 

- 재생

while 루프를 통해 랜덤 노래 재생이 연속으로 같은 노래가 나오는 것을 방지하였다.

LED 점멸 thread가 생성되어 background로 랜덤 주기 LED 점멸을 반복하며

val 변수의 값에 맞는 노래가 if, else-if를 통하며 해당하는 곡을 출력하고 2번 메뉴 기능이 종료된다.

 

- 정지

Toggle을 통해 정지상태의 else문에서는 실행하고 있던 thread를 취소하고

모든 led를 꺼주며 LCD 종료 안내와 함께 2번 메뉴 기능이 종료된다.

이때 재생, 정지 모두 실행 이후 다시 메인 메뉴로 돌아가게 되어 background로 음원과 LED 점멸이 지속된다. background 재생 상태로 1번 런치패드로 가서 연주할 수 있다.

· LINE 387 ~ 438

3번 메뉴 버튼이 선택되면 실행되는 세 번째 기능 녹음이다.

코드의 원활한 설명을 위해 1. 변수 선언과 LCD 부분 2. 녹음 시작으로 나눠 설명한다.

- 변수 선언과 LCD

먼저 안내 LCD 문구를 출력 후에 background로 재생되고 있는 음악이 있다면 모두 종료한다. 이후 녹음이 바로 시작되지 않도록 3초의 카운트다운을 해주며 LCD에 상태를 표시한다.

녹음 시작 LCD 안내 후 back-end에서 녹음을 위한 반복문 변수, 중복 방지 변수들을 선언한다.

 

- 녹음 시작

녹음이 시작되면 다른 메뉴 버튼이 눌리기 전까지 동작되는 while 루프가 열린다.

이때 계속해서 while문 끝에 delay(1)과 변수 j의 증가 연산을 통해 delay된 milliSecondj의 정수 값이 동일하도록 한다.

 

그리고 버튼이 입력되면 기본 런치패드, LED 기능에 추가로 미리 선언된 Key 저장 배열에 입력된 키의 값을, delay 저장 배열에 입력이 없던 동안 추가되던 j값을 넣어준다.

 

다른 메뉴를 선택하면 녹음이 강제로 종료되며 다른 메뉴로 넘어가고, 3번을 눌러 정상 종료 시 LCD 안내와 함께 메뉴 선택으로 돌아간다.

 

· LINE 440 ~ EOF

4번 메뉴 버튼이 선택되면 실행되는 네 번째 기능 녹음 재생이다.

버튼이 눌리면 LCD 안내와 함께 먼저 재생 중이던 노래를 정지해준다.

 

3번 메뉴 녹음 기능을 통해 배열에 저장되어있는 값을 for 루프를 통해 순차적으로 출력해준다. ex) 1key 재생 -> delay(300) -> 2key 재생 -> delay(500) ...

이때 최대 100개의 키를 입력받을 수 있도록 설정되었고 이는 추가하거나 감소시킬 수 있는 값이다. key 값과 delay 값이 없는 배열은 0으로 초기화되어있으므로 조건문을 통해 0이면 continuecontinue 하여 재생하지 않고 빠르게 넘어간다.

 

LINE 454for 루프는 전체 메뉴 while 제어의 중복 입력 방지를 위한 동기화이며

이후 프로그램 종료 시, thread의 자원을 회수, intmain함수가 0을 returnreturn 하며 프로그램이 종료된다.

 


 

6.1.2 하드웨어 제작과정

그림 1. 주크패드 하드웨어 전체 회로 및 구성도

1) 라즈베리파이 (4)

- GPIO : 점퍼선을 사용하여 브레드보드와 연결

- 브레드보드 : 26개의 GPIO pinGND pin, Vcc pin을 모두 사용하여 연결

 

2) Push Button

- 라즈베리파이 3.3V (DC Power)10kΩ 저항을 브레드보드에 연결

- 라즈베리파이 GND와 브레드보드의 (-) 단자에 연결

- Push Button 1 : 라즈베리파이 GPIO 2

- Push Button 2 : 라즈베리파이 GPIO 3

- Push Button 3 : 라즈베리파이 GPIO 4

- Push Button 4 : 라즈베리파이 GPIO 17

 

3) LED 아케이드 버튼

- 우리가 사용하는 LED 아케이드 버튼에는 Push Buttonleg 2(GND & GPIO),

LEDleg 2(GND, GPIO)로 총 4개의 pin이 존재

- 회로도 제작 사용하는 아케이드 버튼이 존재하지 않아 회로도 상에서는

Push ButtonLEDGPIO pin만 연결하여 표현

- LED Arcade Button 1 : 라즈베리파이 GPIO 27 & GPIO 24 (Push Button & LED)

- LED Arcade Button 2 : 라즈베리파이 GPIO 22 & GPIO 25 (Push Button & LED)

- LED Arcade Button 3 : 라즈베리파이 GPIO 10 & GPIO 8 (Push Button & LED)

- LED Arcade Button 4 : 라즈베리파이 GPIO 9 & GPIO 7 (Push Button & LED)

- LED Arcade Button 5 : 라즈베리파이 GPIO 11 & GPIO 14 (Push Button & LED)

- LED Arcade Button 6 : 라즈베리파이 GPIO 5 & GPIO 15 (Push Button & LED)

- LED Arcade Button 7 : 라즈베리파이 GPIO 6 & GPIO 19 (Push Button & LED)

- LED Arcade Button 8 : 라즈베리파이 GPIO 13 & GPIO 26 (Push Button & LED)

 

4) Text LCD

- RS : 라즈베리파이 GPIO 18

- E (strb) : 라즈베리파이 GPIO 23

- R/W : GND

- D4 : 라즈베리파이 GPIO 12

- D5 : 라즈베리파이 GPIO 16

- D6 : 라즈베리파이 GPIO 20

- D7 : 라즈베리파이 GPIO 21

- 라즈베리파이 3.3V (DC Power)와 연결

 

6.1.3 하드웨어 제작 구현 모습

1) 회로

왼쪽부터 라즈베리파이, LCD, LED버튼, PUSH버튼, 마지막 브레드보드
 

2) 제품 외관

 

3) 제품 외관 제작과정

3D 모델링

3-1) 3D 프린터 출력 과정

 

4) 제품 외관 제작과정

학과 3D 프린터 크기의 한계로 1/4씩 나눠 출력

3D 프린터의 깔끔한 외형을 위해 사포, 락카 스프레이를 통해 마감처리

 

5) 제품 회로도 구현 과정

 

회로 연결 이후 동작 확인


7. 시험

보고서 내부 자세한 시험에 대한 결과는 블로그에서 영상으로 요약한다.
 

8. 평가

8.1 정량적/정성적 목표 달성도 평가

항목 목표값 달성률 (%) 비고
모형 크기 320mm × 200mm × 160mm 100% 디자인과 부착되는 부품들로 인한 외형 크기 대폭 증가
런치패드 LED 아케이드 버튼을 이용해 드럼 및 피아노 등 각종 악기 소리를 출력한다. 100%  
주크박스 랜덤 음악을 재생한다. 100%  
녹음 및 재생 사용자가 런치패드 기능을 이용해 연주한 곡을 저장하며 저장한 곡을 재생한다. 80% 부정확한 딜레이
메인 메뉴 LCD display에 가시적으로 주크패드의 기능을 담은
메인 메뉴를 띄운다.
100% GPIO PIN 부족으로 기능들을 더 추가하지 못했다.
시스템 규모 제품 1 100% 1개 런치패드에
대한 제작 완료

8.2 기능적 요구사항 달성도 평가

ID 요구사항 내용 우선순위 달성률 비고
R_01 LCD 메뉴 화면
구성
기능을 선택할 때,
사용자에게 메뉴
화면을 띄워준다.
6 1  
R_02 런치패드
연주 기능
사용자의 입력값을
받아 런치패드를
연주한다.
1 1  
R_03 주크패드
기능 선택
런치패드, 주크박스, 그리고 녹음 기능
하나를 선택할 수 있다.
3 1  
R_04 주크박스
(랜덤 음악) 재생
및 정지 기능
사용자의 입력값을
받아 랜덤으로
제품에 담겨있는
음악이 재생된다.
2 1 음원 파일을 추가하면 더 많은 곡을 재생할 수 있다.
R_05 사용자 연주
녹음 및 재생 기능
사용자가 런치패드로
연주한 곡을 저장 및
재생할 수 있다.
4 0.8 녹음하고 재생하는 부분의 정확도에 관하여 개선할 필요가 있다.
R_06 Push Button +Led 런치패드 연주와
녹음 기능에서
아케이드 버튼을
눌렀을 때와 뗐을 때
동작이 다르다.
5 1  
R_07 LED 랜덤 반짝임 아케이드 버튼의 LED가 랜덤으로 반짝거린다. 8 1 개발자가 어디에 신호를 주느냐에 따라 반짝이는 위치는 달라질 수 있다.
R_08 주크박스
(랜덤 음악) 재생
+ 런치패드 연주 기능
주크박스 기능을 실행하면서 런치패드의 기능도 동작한다. 7 1  
 

9. 시행착오 및 개선사항

하드웨어

1) LED 아케이드 버튼

인두를 통한 납땜으로 GPIO선과 고정

- 처음 사용해보는 LED 아케이드 버튼이다 보니 극성 단자의 위치 별 의미를 파악해내는 데에 상당한 시간을 소비했다.

여러 경우의 수로 배선하는 시도를 해본 결과, GPIO GND 위치를 파악하고 대부분 버튼이 잘 동작하는 것을 확인했으나, 하나가 불량품이 배송되어 교환하는 일이 발생하기도 하였다.

위치와 회로 구현 방법을 숙지하였으나 GPIO 점퍼선을 연결하는 과정에 계속 빠져 제대로 접촉되지 않아 정상적인 동작을 하지 못하는 경우도 발생했었다.

이러한 문제점은 납땜으로 고정시켜 해결할 수 있었다.

 

2) 3D print

- 3D Printer 첫 시도 또한 다른 팀과의 차별점이었다.

제일 처음 CAD를 이용해 도면을 만드는 과정에서도 어떻게 제작하는지 몰라 따로 연구하며 만드는 시도를 했다.

처음 3D printing을 한 결과, 부품 크기와 제품의 총크기의 규격을 잘못 측정하여 사용하기에는 턱없이 작은 사이즈(오른쪽 위 사진)로 출력되어 사용하지 못하는 일이 발생했다.

그래서 모든 부품 길이와 폭을 측정하며 정밀하고 섬세하게 크기를 가늠해보니 생각보다 더 큰 크기로 모형화해야 하는 것을 깨닫고, 다시 CAD를 통해 도면을 제작하였다.

학과가 보유하고 있는 3D printer로는 한 번에 출력할 수 없는 사실을 깨닫고 제품을 1/4로 나누어 약 5~6일에 가까운 시간을 제품 printing 하는 데에 시간을 할애했다.

 
 

3) 라즈베리파이(4) GPIO PIN 부족

- 구현하고 싶은 기능이 더 많고 다양했으나 GPIO PIN이 부족해 기능을 축소화하였다.

라즈베리파이(4) 모델상의 기본 GPIO PIN만으로 모든 기능을 실행시키기에는 어려움이 발생했다.

팀이 사용하는 LED 아케이드 버튼과 LCD는 GPIO뿐만 아니라 GND도 굉장히 많이 필요한 것을 깨달았다.


소프트웨어

4) 라즈비안 운영체제 환경

raspi configuration GUI

- 경험이 적은 라즈비안 운영체제 환경 사용을 하며 다양한 문제에 부딪혔다.

와이파이를 설정할 수 있는 작업 창의 아이콘이 사라져 raspi-config 명령어를 통해 GUI 환경설정을 시도했는데
raspi-config의 중요한 모듈이 삭제되어버려 다시 install 명령을 했다. 

설상가상으로 와이파이 통신이 되지 않으니 모듈 다운도 안 됐다.

 

이러한 상황은 나노 에디터를 통해 wpa_config 파일에 직접 접근하여 연결할 WIFI 정보를 추가하여 통신에 성공했고,

이후 raspi config install을 통해 정상적으로 작동하는 GUI 화면을 볼 수 있었다.

- 기존의 노트북과 PC의 경우 전자공학의 빠른 발전에 맞춰 충분한 컴퓨팅이 되었겠지만, 라즈베리파이 4는 소형 PC로 기존의 환경보다 성능, 메모리 등이 제약됐다.

하지만 이 부분은 IoT, 임베디드 환경 프로그램을 작성하기엔 충분한 환경이므로 더 간결하고 생산적인 코드를 만들기 위해 노력해야 한다는 점을 배웠다.

 

5) 소프트웨어 정밀도

오른쪽 사진은 gcc  – o 다양한 명령 옵션

- VS code, Visual Studio2019 등 윈도우 환경에서 사용되는 소스 코드 편집기에 익숙한 상황에서 gcc 표준 환경 프로그래밍에 어려움을 겪었다.

대표적으로 <Windows.h>를 포함하여 사용 가능한 multi-thread, background 동작 등 강력하게 프로그램을 제어할 수 있는 운영체제 환경이 아닌, 하드웨어에 조금 더 밀접한 환경이 어려웠다.

컴파일하여 object 파일을 만드는 과정에서도 사용되는 다양한 모듈에 맞춰 세밀하게 옵션까지 줘야 하는 gcc 환경은 하드웨어 자원을 절약하는 것에 유리하다는 점을 배웠다.

 

6) Sound Play 딜레이

 

- 음성 파일을 출력하기 위해서는 모듈이 필요한데, 이때 라즈비안에서 사용하기 위해선 python으로 이루어진 omxplayer를 사용한다.

하지만 omxplayer 모듈을 C 파일에서 재생할 수는 없어 간접적인 방식인 system 함수에 omxplayer 명령을 통해 음성 파일을 재생하게 되었다.

이 과정에서 오는 이점은 리눅스 명령어 ‘&’ 를 사용하여 간단하게 background로 재생할 수 있었다.

음성 모듈을 파일 내 포함하지 못하여 system함수에 omxplayer를 재생시키는 명령어를 전달하여 음성을 재생시키는 방식을 사용했는데, 이 부분에서 딜레이가 생기는 문제가 있다.
이러한 부분을 해결하기 위해 추후 
linux 환경에서 직접 음성을 플레이하는 Module을 만들어볼 예정이다.


10. 최종 소감

 

처음 나의 아이디어인 주크패드로 주제를 결정할 때, 다른 팀과 다르게 기존에 존재하는 예제를 찾아보지 않았다.

이유는 쉽게 예제를 찾아와서 재생시켜보고 따라 하는 것은 전혀 실력 향상에 도움이 되지 않을 것이라는 생각이었다.

물론 완성도 높은 작품 및 코드를 사용하여 좋은 평가를 받아 학점에 이익이 될 수 있겠지만, 도전적이지도, 창의적이지도 않고 심지어 몇 달 지나면 다 까먹어버릴 그런 프로젝트를 하고 싶지 않았다.

프로젝트 주제가 재밌고 배울 점 또한 많다는 생각이 들어 이론적으로 가능하니 강력하게 추진하여 시작했다.

 

소프트웨어를 계속해서 수정해나가고 동작을 신형 키트(학교 물품으로 다양한 센서 등이 통합된 장비) 내에서 확인했지만 외형을 위한 개별 키트 부품으로 결합했을 때는 결과가 달랐다.
라즈베리파이와 연결, 저항, GPIO선 배치 등 하드웨어적인 요소 또한 신경 써야 하는 부분이 매우 많았다.
3D
프린터 또한 처음 접하는 모델링 작업과 인쇄로 짧은 프로젝트 기간에 많은 시행착오를 겪었다.

이러한 부분들을 모든 팀원들이 끝까지 책임지고 노력하여 신뢰성 있는 회로 연결, 동작, 외형까지 만들어졌다.

 

소프트웨어를 만들 때 가장 어렵고 시간을 많이 쏟은 부분이 음악파일 출력과 녹음 부분이었다.
음악파일 출력이 윈도우 환경과 다르게 프로그램 내에 추가하고 쉽게 사용할 수 있는 모듈이 없었고, 이에 system 함수로 음악 플레이어를 간접적으로 재생시키는 방법을 채택하여 딜레이가 생긴다는 사실이 아쉬웠다.
나중에 직접 음성을 제어하는 모듈을 만들어 프로그램 내부에 삽입해본다면 뿌듯한 경험이 될 것이다.

하드웨어와 밀접한 프로그래밍을 하며 자원관리의 소중함을 깨달았고 얼마나 좋은 환경에서 프로그래밍을 하고 있었는지 깨달았다.

목표했던 과제를 성공적으로 이끌며 프로그래밍에 대한 자신감이 생겼고 이러한 경험들은 추후 프로그래밍 혹은 엔지니어링 실무에 토대가 될 것을 믿어 의심치 않는다.

 


11. 부록

 

728x90