Arduino는 전자 공학 배경이 아닌 사람들이 쉽게 물건을 만드는 데 도움이되었습니다. 이것은 훌륭한 프로토 타이핑 도구이거나 멋진 것을 시도하기위한 도구였습니다.이 프로젝트 에서는 Arduino를 사용하여 작지만 재미있는 피아노 를 만들 것 입니다. 이 피아노는 8 개의 푸시 버튼과 부저만으로 매우 평범합니다. Arduino 의 tone () 함수를 사용하여 스피커에서 다양한 유형의 피아노 음표를 만듭니다. 좀 더 멋지게 꾸미기 위해 프로젝트에 녹음 기능 을 추가했습니다.이를 통해 곡을 녹음하고 필요할 때 반복해서 재생할 수 있습니다. 흥미 롭군요! 그러니 건물을 짓자….
필요한 재료:
- Arduino Uno
- 16 * 2 LCD 디스플레이
- 부저
- 트리머 10k
- SPDT 스위치
- 푸시 버튼 (8Nos)
- 저항기 (10k, 560R, 1.5k, 2.6k, 3.9, 5.6k, 6.8k, 8.2k, 10k)
- 브레드 보드
- 전선 연결
회로도:
완전한 Arduino Piano Project 는 일부 연결 와이어를 사용하여 브레드 보드 위에 구축 할 수 있습니다. 프로젝트의 브레드 보드보기를 보여주는 fritzing을 사용하여 만든 회로도는 다음과 같습니다.
회로도에 따라 배선, 푸시 버튼, 부저를 PCB 모듈과 함께 사용하지만 실제 하드웨어에서는 스위치와 부저 만 사용 했으므로 동일한 유형의 핀 출력을 가지고 있기 때문에 많이 혼동하지 않아야합니다.. 아래의 하드웨어 이미지를 참조하여 연결할 수도 있습니다.
왼쪽에서 저항 값은 10k, 560R, 1.5k, 2.6k, 3.9, 5.6k, 6.8k, 8.2k 및 10k 순서 입니다. 동일한 DPST 스위치가없는 경우 위의 회로도에 표시된 것과 같은 일반 토글 스위치를 사용할 수 있습니다. 이제 다음과 같은 연결을 만든 이유를 이해하기 위해 프로젝트의 회로도를 살펴 보겠습니다.
회로도 및 설명:
위에 표시된 회로도의 회로도는 아래에 나와 있으며 Fritzing을 사용하여 만들어졌습니다.
우리가 이해해야 할 한 가지 주요 연결 은 아날로그 A0 핀을 통해 8 개의 푸시 버튼을 Arduino에 연결 하는 방법 입니다. 기본적으로 8 개의 입력 푸시 버튼에 연결할 수있는 8 개의 입력 핀이 필요하지만 이와 같은 프로젝트의 경우 나중에 사용하기 위해 필요할 수 있으므로 푸시 버튼에만 마이크로 컨트롤러의 8 핀을 사용할 수 없습니다. 우리의 경우 인터페이스 할 LCD 디스플레이가 있습니다.
그래서 우리는 Arduino의 아날로그 핀을 사용하고 다양한 저항 값으로 전위 분배기를 형성하여 회로를 완성합니다. 이렇게하면 각 버튼을 누를 때 다른 아날로그 전압이 아날로그 핀에 공급됩니다. 두 개의 저항과 두 개의 푸시 버튼 만있는 샘플 회로가 아래에 나와 있습니다.
이 경우 푸시 버튼을 누르지 않을 때 ADC 핀은 + 5V를 수신하고 첫 번째 버튼을 누르면 전위 분배기가 560R 저항을 통해 완료되고 두 번째 버튼을 누르면 전위 분배기가 1.5를 사용하여 경쟁합니다. k 저항. 이렇게하면 ADC 핀에 수신되는 전압이 전위 분배기의 공식에 따라 달라집니다. 전위 분배기가 어떻게 작동하는지 그리고 ADC 핀이 수신하는 전압 값을 계산하는 방법에 대해 더 알고 싶다면이 전위 분배기 계산기 페이지를 사용할 수 있습니다.
이 외에도 모든 연결이 간단하고 LCD는 핀 8, 9, 10, 11 및 12 에 연결됩니다. 부저 는 핀 7 에 연결되고 SPDT 스위치 는 Arduino의 핀 6에 연결됩니다. 전체 프로젝트는 노트북의 USB 포트를 통해 전원이 공급됩니다. DC 잭을 통해 Arduino를 9V 또는 12V 전원에 연결할 수도 있으며 프로젝트는 여전히 동일하게 작동합니다.
이해
Arduino에는 부저를 사용하여 다양한 소리를 생성하는 데 사용할 수있는 다양한 주파수 신호를 생성하는 데 사용할 수있는 편리한 tone () 함수가 있습니다. 그럼이 기능이 어떻게 작동하는지 그리고 Arduino에서 어떻게 사용할 수 있는지 이해합시다.
그 전에 우리는 피에조 부저가 어떻게 작동하는지 알아야합니다. 우리 학교에서 피에조 크리스탈에 대해 배웠을 수도 있습니다. 그것은 기계적 진동을 전기로 또는 그 반대로 변환하는 크리스탈에 지나지 않습니다. 여기에서 크리스탈이 진동하여 소리를내는 가변 전류 (주파수)를 적용합니다. 따라서 Piezo 부저가 약간의 소음을 내기 위해서는 Piezo 전기 크리스탈이 진동하도록 만들어야합니다. 소음의 피치와 톤은 크리스탈이 얼마나 빨리 진동하는지에 따라 달라집니다. 따라서 전류의 주파수를 변경하여 톤과 피치를 제어 할 수 있습니다.
좋아요, Arduino에서 가변 주파수를 어떻게 얻습니까? 톤 () 기능이 들어오는 곳입니다. 톤 ()은 특정 핀에서 특정 주파수를 생성 할 수 있습니다. 필요한 경우 기간도 언급 할 수 있습니다. 톤 ()의 구문은 다음과 같습니다.
구문 tone (pin, frequency) tone (pin, frequency, duration) 매개 변수 pin: 톤 주파수를 생성 할 핀: 톤 주파수 (헤르츠 단위) – unsigned int 기간: 톤 기간 (밀리 초) (선택 사항 1) – unsigned long
핀 값은 디지털 핀이 될 수 있습니다. 여기에 8 번 핀을 사용했습니다. 생성 할 수있는 주파수는 Arduino 보드의 타이머 크기에 따라 다릅니다. UNO 및 대부분의 다른 일반 보드의 경우 생성 할 수있는 최소 주파수는 31Hz이고 생성 할 수있는 최대 주파수는 65535Hz입니다. 그러나 우리 인간은 2000Hz에서 5000Hz 사이의 주파수 만들을 수 있습니다.
Arduino에서 피아노 음색 연주:
좋아,이 주제에 대해 시작하기 전에 내가 음표 나 피아노를 사용하는 초보자라는 것을 분명히하자.이 제목 아래에 언급 된 내용이 횡설수설이면 용서해주세요.
이제 우리는 Arduino의 톤 기능을 사용하여 일부 사운드를 생성 할 수 있다는 것을 알고 있지만이를 사용하여 특정 음표의 톤을 어떻게 재생할 수 있습니까? 운 좋게도 Brett Hagman이 작성한 "pitches.h"라는 라이브러리 가 있습니다. 이 라이브러리에는 피아노의 각 음표와 동일한 주파수에 대한 모든 정보가 포함되어 있습니다. 저는이 라이브러리가 실제로 피아노의 거의 모든 음표를 연주하고 연주 할 수 있다는 사실에 놀랐습니다. 저는 똑같은 방식으로 캐리비안의 해적, 미친 개구리, 마리오, 심지어 타이타닉의 피아노 음표를 연주 할 수 있었는데 정말 훌륭하게 들렸습니다. 이런! 우리는 여기서 약간의 주제를 벗어 났으므로 관심이 있다면 Arduino 프로젝트를 사용하여 멜로디 연주를 확인하십시오. 해당 프로젝트 의 pitches.h 라이브러리에 대한 자세한 설명도 찾을 수 있습니다.
우리 프로젝트에는 8 개의 누름 버튼 만 있으므로 각 버튼은 하나의 특정 음표 만 연주 할 수 있으므로 완전히 8 개의 음표 만 연주 할 수 있습니다. 피아노에서 가장 많이 사용되는 음표를 선택했지만 8 개를 선택하거나 더 많은 푸시 버튼으로 프로젝트를 확장하고 더 많은 음표를 추가 할 수 있습니다.
이 프로젝트에서 선택한 음표는 C4, D4, E4, F4, G4, A4, B4 및 C5 이며 각각 버튼 1 ~ 8을 사용하여 연주 할 수 있습니다.
Arduino 프로그래밍:
충분한 이론으로 Arduino 프로그래밍의 재미있는 부분을 살펴 보겠습니다. 전체 아두 이노 프로그램은 당신이 열망하는 당신이 경우에 아래로 이동하는 방법 또는 코드 작품을 이해하는 것이 더 읽을 수있는이 페이지의 마지막에 제공됩니다.
Arduino 프로그램 에서 핀 A0에서 아날로그 전압 을 읽고 어떤 버튼이 눌 렸는지 예측하고 해당 버튼에 대한 각 톤을 재생해야합니다. 이 작업을 수행하는 동안 사용자가 눌렀 던 버튼과 눌렀 던 시간도 기록하여 나중에 사용자가 재생 한 톤을 다시 만들 수 있습니다.
논리 부분으로 가기 전에 우리가 연주 할 8 개의 음표 를 선언 해야합니다. 음표에 대한 각 주파수는 pitches.h 라이브러리 에서 가져온 다음 아래와 같이 배열이 형성됩니다. 여기에서 음 C4를 연주하는 주파수는 262입니다.
int 노트 = {262, 294, 330, 349, 392, 440, 494, 523}; // C4, D4, E4, F4, G4, A4, B4,
다음으로 LCD 디스플레이가 연결된 핀에 대해 언급해야 합니다. 위에 주어진 똑같은 회로도를 따르는 경우 여기에서 아무것도 변경할 필요가 없습니다.
const int rs = 8, en = 9, d4 = 10, d5 = 11, d6 = 12, d7 = 13; // LCD가 연결된 핀 LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
다음으로 설정 기능 내 에서 디버깅을 위해 LCD 모듈과 직렬 모니터를 초기화합니다. 또한 계획된대로 작동하는지 확인하기 위해 소개 메시지를 표시합니다. 다음으로 , 메인 루프 함수 안에 두 개의 while 루프가 있습니다.
SPDT 스위치가 더 많이 기록 되는 한 while 루프가 실행됩니다. 녹음 모드에서 사용자는 필요한 톤을 지불 할 수 있으며 동시에 재생중인 톤도 저장됩니다. 그래서 while 루프는 아래와 같습니다.
while (digitalRead (6) == 0) // 토글 스위치가 녹화 모드로 설정된 경우 {lcd.setCursor (0, 0); lcd.print ("녹화 중.."); lcd.setCursor (0, 1); Detect_button (); Play_tone (); }
눈치 채 셨겠지만 while 루프 안에는 두 개의 함수가 있습니다. 첫 번째 함수 Detect_button () 은 사용자가 어떤 버튼을 눌렀는지 찾는 데 사용되고 두 번째 함수 Play_tone () 은 각 톤을 재생하는 데 사용됩니다. 이 함수 외에도 Detect_button () 함수는 어떤 버튼이 눌 렸는지 기록 하고 Play_tone () 함수는 버튼이 눌린 시간을 기록합니다.
Detect_button () 함수 내에서 핀 A0에서 아날로그 전압을 읽고 미리 정의 된 값과 비교하여 어떤 버튼이 눌 렸는지 확인합니다. 위의 전압 분배기 계산기를 사용하거나 직렬 모니터를 사용하여 각 버튼에 대해 읽은 아날로그 값을 확인하여 값을 결정할 수 있습니다.
void Detect_button () { analogVal = analogRead (A0); // 핀 A0의 아날로그 전압 태그 읽기 pev_button = button; // 사용자 가 눌렀 던 이전 버튼을 기억합니다. if (analogVal <550) button = 8; if (analogVal <500) 버튼 = 7; if (analogVal <450) 버튼 = 6; if (analogVal <400) 버튼 = 5; if (analogVal <300) 버튼 = 4; if (analogVal <250) 버튼 = 3; if (analogVal <150) 버튼 = 2; if (analogVal <100) 버튼 = 1; if (analogVal> 1000) 버튼 = 0; / **** Rcord 의 누름 버튼 배열 *** / if (button! = pev_button && pev_button! = 0) { recorded_button = pev_button; button_index ++; recorded_button = 0; button_index ++; } / ** 녹화 프로그램 종료 ** / }
말했듯 이이 함수 안에는 버튼을 누르는 순서도 기록 됩니다. 기록 된 값은 recorded_button이라는 배열에 저장됩니다 . 먼저 새 버튼이 눌려 있는지 확인하고, 눌렀다면 버튼 0이 아닌지 확인합니다. 여기서 버튼 0은 아무 버튼도 누르지 않은 상태입니다. if 루프 내에서 변수 button_index에 의해 주어진 인덱스 위치에 값을 저장 한 다음 같은 위치에 덮어 쓰지 않도록이 인덱스 값도 증가시킵니다.
/ **** Rcord 의 누름 버튼 배열 *** / 만약 (버튼 = pev_button && pev_button = 0!) { recorded_button = pev_button; button_index ++; recorded_button = 0; button_index ++; } / ** 녹화 프로그램 종료 ** /
Play_tone () 함수 내에서 여러 if 조건 을 사용하여 누른 버튼에 대해 각각의 톤을 재생합니다. 또한 버튼이 눌린 시간을 저장하는 내부에 recorded_time 이라는 배열을 사용합니다. 이 작업은 millis () 함수를 사용하여 각 버튼이 눌린 시간을 결정하고 변수의 크기를 줄이기 위해 값을 10으로 나눈다 는 점에서 버튼 시퀀스를 기록하는 것과 유사합니다. 버튼 0의 경우 사용자가 그렇지 않음을 의미합니다. 아무거나 누르면 같은 시간 동안 아무 소리도 재생되지 않습니다. 함수 내부의 전체 코드는 다음과 같습니다.
void Play_tone () { / **** R 코드 배열에서 각 버튼 누르기 사이의 시간 지연 *** / if (button! = pev_button) { lcd.clear (); // 그런 다음 정리 note_time = (millis ()-start_time) / 10; 기록 _ 시간 = 주 _ 시간; time_index ++; start_time = millis (); } / ** 녹화 프로그램 종료 ** / if (button == 0) { noTone (7); lcd.print ("0-> Pause.."); } if (button == 1) { tone (7, notes); lcd.print ("1-> NOTE_C4"); } if (button == 2) { tone (7, notes); lcd.print ("2-> NOTE_D4"); } if (버튼 == 3) { tone (7, notes); lcd.print ("3-> NOTE_E4"); } if (button == 4) { tone (7, notes); lcd.print ("4-> NOTE_F4"); } if (button == 5) { tone (7, notes); lcd.print ("5-> NOTE_G4"); } if (button == 6) { tone (7, notes); lcd.print ("6-> NOTE_A4"); } if (button == 7) { tone (7, notes); lcd.print ("7-> NOTE_B4"); } if (button == 8) { tone (7, notes); lcd.print ("8-> NOTE_C5"); } }
마지막으로 녹음 후 사용자는 녹음 된 톤 을 재생하기 위해 DPST를 다른 방향으로 전환해야합니다. 이 작업이 완료되면 프로그램은 이전 while 루프 에서 벗어나 이전에 녹음 된 기간 동안 눌린 버튼 순서대로 음을 연주하는 두 번째 while 루프로 들어갑니다. 동일한 작업을 수행하는 코드는 다음과 같습니다.
while (digitalRead (6) == 1) // 재생 모드에서 토글 스위치가 설정된 경우 { lcd.clear (); lcd.setCursor (0, 0); lcd.print ("지금 재생 중.."); for (int i = 0; i <sizeof (recorded_button) / 2; i ++) { delay ((recorded_time) * 10); // 다음 곡을 지불하기 전에 기다 립니다 if (recorded_button == 0) noTone (7); // user dint touch any button else tone (7, notes-1)]); // 사용자가 터치 한 버튼에 해당하는 사운드 재생 } } }
재생, 녹음, 재생 및 반복!:
표시된 회로도에 따라 하드웨어를 만들고 Arduino 보드와 표시된 시간에 코드를 업로드합니다. 녹음 모드에 SPDT를 놓고 원하는 톤 연주를 시작하면 각 버튼을 누르면 다른 톤이 생성됩니다. 이 모드에서는 LCD에 " Recording…" 이 표시 되고 두 번째 줄에는 현재 누르고있는 음표의 이름이 아래와 같이 표시됩니다.
톤을 연주 한 후에는 SPDT 스위치를 반대쪽으로 전환하면 LCD에 " Now Playing.." 이 표시 되고 방금 연주 한 톤을 연주하기 시작합니다. 토글 스위치가 아래 그림과 같은 위치에 있으면 동일한 톤이 반복해서 재생됩니다.
프로젝트의 전체 작업은 아래 비디오에서 찾을 수 있습니다. 프로젝트를 이해하고 재미있게 만들었기를 바랍니다. 이 빌드에 문제가 있으면 댓글 섹션에 게시하거나 프로젝트에 대한 기술 지원을 위해 포럼을 사용하십시오. 또한 아래에 제공된 데모 비디오 를 확인하는 것을 잊지 마십시오.