아두이노 피아노 만들기(아두이노)
아두이노 피아노 만들기(아두이노)
- 온라인 가상시뮬레이터 : https://www.tinkercad.com
- 참고자료 :
피에조부저 제어(아두이노)
곰세마리멜로디(피에조부저-아두이노) - 공개회로도 : https://www.tinkercad.com/things/g5QXVJIzass
예전 post를 정리하면서 피에조부저의 응용 예제로 빼먹었던 아두이노 피아노 만들기를 이번에 post로 작성하게 되었습니다. 원리는 피에조부저 제어편에서 "도레미파솔라시도" 음을 순서대로 FOR문을 통해 멜로디를 출력했던 소스에서 이 멜로디 음을 스위치버턴을 이용하여 아두이노 피아노로 구현해 보았습니다. 실험은 가상시뮬레이터에서 이루어 집니다.
이제 어떻게 만들는지 살펴보도록 하죠.
1. 피아노 이해

피아노의 건반을 아두이노를 이용하여 표현을 해 볼까요. 피아노는 건반과 사운드로 나눌 수 있습니다. 건반을 누르면 해당 음으로 소리로 출력이 됩니다. 이 부분을 아두이노로 표현한다면 다음과 같습니다.
- 건반 = 스위치 버턴
- 사운드 = 피에조부조

스위치 버턴을 누르면 피에조부저로 해당 음을 출력하면 간단히 아두이노 피아노를 만들 수 있겠죠.
2. 아두이노 피아노 회로도
준비물 : 스위치버턴 8개, 피에조부저 1개, 아두이노우노
내용 : 스위치 버턴을 2,3,4,5,6,7,8,9번 핀에 연결하고 피에조부저는 12번에 연결하시오.

9번부터 2번까지 "도레미파솔라시도"의 건반핀으로 사용 할 예정입니다.
3. 코딩
- 사전학습 : 피에조부저 제어(아두이노)
피에조부저 제어편에 가시면 기본 멜로디 "도레미파솔라시도" 출력 예제가 있습니다. 그 소스를 기반으로 실험합니다.
- 기본음계
#define NOTE_C5 523 //도 (5옥타브 음계 데이터)
#define NOTE_D5 587 //레
#define NOTE_E5 659 //미
#define NOTE_F5 698 //파
#define NOTE_G5 784 //솔
#define NOTE_A5 880 //라
#define NOTE_B5 988 //시
#define NOTE_C6 1047 //도
- 스위치버턴 변수
const byte melodyPin[] = {9,8,7,6,5,4,3,2}; //스위치버턴
- 멜로디 출력 변수
const byte tonepin = 12; //피에조부저
- 음계 변수
const int melody[] = { NOTE_C5, NOTE_D5, NOTE_E5, NOTE_F5, NOTE_G5, NOTE_A5, NOTE_B5, NOTE_C6 }; //도레미파솔라시도
int noteDurations = 50; //톤길이
- 스위치버턴 누름 동작
for(int i=0;i<8;i++){ //8개의 건반을 빠르게 체크
if(digitalRead(melodyPin[i])==LOW){ //내부풀업스위치버턴 누르면
tone(tonepin, melody[i],noteDurations); //해당 스위치 버턴 음 출력
delay(noteDurations); //음길이 최소
noTone(tonepin); //음 중단
}
}
총 0~7까지의 배열위치의 스위치버턴 상태를 체크합니다. 8개의 스위치 버턴 상태를 체크하기 때문에 위에서 for문을 이용하여 순차적으로 체크를 하게 됩니다. 해당 스위치 버턴이 눌르게 되면 최소 누른 음과 길이를 50만큼 음이 울리게 지정했습니다. 이렇게 한 이유는 2개 이상의 스위치 버턴을 누를 때 2개이상의 음이 동시에 울리는 착시음 효과를 나타내기 위해 최소음길이로 지정했네요. 이 원리는 예전에 여러개의 LED를 하나의 제어선을 이용하여 시간차로 동시에 서로 다른 LED에 불이 들어오게 하는 원리와 비슷합니다.
종합해보면,
#define NOTE_C5 523 //도 (5옥타브 음계 데이터)
#define NOTE_D5 587 //레
#define NOTE_E5 659 //미
#define NOTE_F5 698 //파
#define NOTE_G5 784 //솔
#define NOTE_A5 880 //라
#define NOTE_B5 988 //시
#define NOTE_C6 1047 //도
const byte melodyPin[] = {9,8,7,6,5,4,3,2}; //스위치버턴
const byte tonepin = 12; //피에조부저
const int melody[] = { NOTE_C5, NOTE_D5, NOTE_E5, NOTE_F5, NOTE_G5, NOTE_A5, NOTE_B5, NOTE_C6 }; //도레미파솔라시도
int noteDurations = 50; //톤길이
void setup()
{
for (int i = 0; i < 8; i++) {
pinMode(melodyPin[i], INPUT_PULLUP); //내부풀업스위치 지정
}
}
void loop()
{
for(int i=0;i<8;i++){ //8개의 건반을 빠르게 체크
if(digitalRead(melodyPin[i])==LOW){ //내부풀업스위치버턴 누르면
tone(tonepin, melody[i],noteDurations); //해당 스위치 버턴 음 출력
delay(noteDurations); //음길이 최소
noTone(tonepin); //음 중단
}
}
}
4. 결과
간단히 "학교종"을 연주해 보았습니다.
마무리
오늘은 예전에 피에조부저에 대해서 post하면서 빼먹은 피에조부저 응용 예제로 아두이노 피아노를 간단히 실험을 하였습니다.
아두이노 에뮬레이터로 실제 아두이노 없이 시뮬레이션이 가능하군요! 재밌는 실함 잘 봤습니다 ㅎㅎ
저는 처음에 아두이노 입문 할 때 이 가상시뮬레이터로 신나게 놀고 나서 아두이노를 실제 구매해서 실험했어요. 키트같은 것 세트로 구매해서 딱 한시간 반정도의 시간으로 가상시뮬레이터에서 실험한 모든 실험을 실제로 다 구현 했었죠. 그뒤 할게 없어서 서랍장 속으로 아두이노가 들어 갔다가 몇년이 지난 후 최근에 post하면서 서납장에서 나오게 되었죠.
놀랍습니다
혹시 소리에 놀라셨나 보군요.
post는 초창기 때 응용 예제로 추가했어야 post데 빼먹었던 부분이라 이제서야 올려서 놀라울 정도는 아니고 유튜브 소리에 놀라셨을지 모르겟네요. ^^
아뇨 좋은 내용에 ^^
피에조가 어떤 특정 주파수에 동기되지 않나요? 신기하네요.
그냥 원리만 테스트 했어요. 피에조부저 말고 다른거로 하면 진짜 전자키보드 같은 걸로 구현 될텐에 아쉽네요.
pairplay 가 kr-dev 컨텐츠를 응원합니다! :)
응원에 감사합니다.
오잉~ 여기도 신세계~
아두이노가 진짜 재미있지요.
(jjangjjangman 태그 사용시 댓글을 남깁니다.)
[제 0회 짱짱맨배 42일장]5주차 보상글추천, 1,2,3,4주차 보상지급을 발표합니다.(계속 리스팅 할 예정)
https://steemit.com/kr/@virus707/0-42-5-1-2-3-4
5주차에 도전하세요
그리고 즐거운 스티밋하세요!
짱짱맨 방문에 감사합니다.