여기서 아이디어는 Air Guitar를 연주하는 것과 같이 두 손으로 제어 할 수있는 착용 할 수있는 가상 기타를 만드는 것입니다. 2 주 프로젝트에서 제작되고 프로토 타입되었습니다.
목표는 실제 기타를 연주하는 느낌을 얻는 것입니다. AIRduino 기타는 장갑 하나와 막대 하나로 만들어져 있습니다.글로브는 음색을 설정하고 스틱을 사용하여 사운드를 트리거하는 데 사용됩니다.
이러한 트릭을 수행하기 위해 가속도계와 울트라 소닉 센서를 사용했습니다 (개념 설명은 1 단계 참조).
비디오 데모를보고 어떻게 작동하는지에 대한보다 정확한 아이디어를 얻고 직접 제작 해보십시오!
AIRduino 팀 :
David Fournier, Jean-Louis Giordano, Monireh Sanaei, Maziar Shelbaf, Gustav Sohtell 등이있다.
용품:
1 단계 : 개념 설명
에어 기타는 오른손 기타로 작동해야합니다.
기타 컨트롤러는 왼손 컨트롤러와 오른손 컨트롤러의 두 부분으로 나뉩니다.
왼손 컨트롤러로 플레이어는 손가락을 구부리고 장갑을 눌러 음조의 피치를 변경할 수 있습니다.
오른손 콘트롤러는 에어 - 기타의 소리를 발생시키기 위해 흔들려 야하는 스틱으로 표현됩니다.
플레이어는 오른손과 왼손 사이의 거리를 변경하여 기타 목에 다른 프렛을 시뮬레이션하여 음을 피치로 맞출 수 있습니다.
이러한 트릭을 수행하기 위해 주요 구성 요소는 스틱 쉐이크를 "느끼는"가속도계, 오른손과 스틱 사이의 거리를 측정하는 해킹 된 초음파 센서 및 장갑을 만들기위한 전도성 직물입니다.
대체로 장난감을 만드는 것은 상당히 쉽습니다. 유일한 까다로운 부분은 약간의 기민성을 필요로하는 초 - 음향 센서 해킹 일 것입니다. 지침을 이해하기 위해 몇 가지 기본적인 전자 기술이 필요하며, 뭔가를 엉망으로 만들었을 때 기타가 끝까지 작동하지 않을 때 잘못된 것을 발견해야합니다. 우리는 거기에 있었다. :-)
2 단계 : 쇼핑 목록
다음은 AIRduino 기타를 제작하는 데 필요한 목록입니다.
1. 전선 :이 프로토 타입 버전에는 불행히도 많은 것들이 있습니다. 그들은 두 개의 장갑과 Arduino 부품을 연결하는 데 사용되었습니다. 무선으로 디자인의이 부분을 자유롭게 개선하십시오!
2. Accelerometer : 흔들림을 감지하기 위해 오른손의 막대기에 사용됩니다. 우리는 3 축 가속도계를 사용했지만, 1 축만으로도 충분합니다.
3. 초음파 센서 : 플레이어의 양 손 사이의 거리를 측정하기 위해 Parallax # 28015를 사용했습니다.
4. 전도성 및 스트레치 직물 : 장갑을 만들기 위해,
5. Arduino : 모든 것을 다루는 기타의 핵심. Arduino Diecimila는 잘 작동합니다.
6. 전위차계 : 일부 설정을 조정하려면 1KOhm-1MOhm의 최대 값을 갖는 전위차계가 좋습니다.
7. 핫멜트 접착제 : 물건을 묶을 수있는 편리한 방법,
8. 3.5 mm female 잭 : 오디오 출력,
9. 고전적인 전자 재료 : 저항 (10k), 커패시터 (10uF), LED 및 arduino 용 전원 공급 장치의 일종. (9V 배터리는 괜찮습니다.)
3 단계 : 회로도
다음은 AIRduino 기타의 전자 회로도입니다.
보시다시피 이해하기 쉽고 따라서 빌드하기도 쉽습니다.
어떤 구성 요소가 어디에 있는지 생각하고 싶다면 이미지를보십시오. 아마 이해할 수 있듯이, 이것은 어떤 방식으로도 확장 할 수 없습니다. 케이블은 회로도에 표시된 것보다 훨씬 길다.
울트라 소닉 센서의 이미 터가 스틱에 있고 리시버가 왼손에 있음을 알 수 있습니다. 그것은 이전에 언급 한 까다로운 부분입니다. 초음파 센서를 센서 보드에서 분리하려면 울트라 소닉 센서 유닛에서 울트라 소닉 이미 터를 솔더 해제해야합니다.
이후 단계에서 이에 대해 자세히 설명합니다. 이제 일하러 가자!
4 단계 : 장갑 만들기
장갑에는 1 개의 초음파 수신기와 4 개의 버튼이 있습니다. 그게 다야!
울트라 소닉 수신기는 아래 그림 중 일부에 보이는 검은 색 상자에 있습니다.
장갑에는 Arduino 널에 지상에 다만 연결되는 1 개의 큰 지역이있다. 손가락을 손바닥에 대고 누르면 손가락의 전도성 천과 손바닥이 연결됩니다.
다음은 두 가지 장갑 모델의 그림입니다. 하나에는 분리 가능한 손가락이있어 매우 작고 매우 큰 손을 가진 두 선수를 허용합니다. 다른 모델은 표준 장갑 바로 바느질되어 있습니다. 두 번째 버전을 권하고 싶습니다. 빌드가 더 쉬우 며 설치하기 쉽습니다.
5 단계 : 코드
다음은 필요한 Arduino 코드입니다.
실시간 사운드 생성 부분은이 훌륭한 튜토리얼에서 가져온 것입니다.
------------------------------------------------------
// 파형을 포함하는 배열
// 기타 소리의
문자 파형 =
{125, 148, 171, 194, 209, 230, 252, 255,
253, 244, 235, 223, 207, 184, 169, 167,
163, 158, 146, 131, 126, 129, 134, 127,
105, 80, 58, 51,38, 22, 12, 2, 10, 35,
58, 75, 89, 103, 120, 141, 150, 148, 145,
144, 140, 129, 116, 105, 95, 86, 75, 72,
73, 76, 88, 103, 117, 121, 120, 115, 120,
143, 159, 162, 156, 155, 163, 184, 202,
214, 215, 211, 213, 212, 205, 196, 182,
162, 142, 118, 99, 84, 68, 54, 40, 28,
19, 10, 7, 0, 0, 5, 9, 14, 21, 33,
49, 59, 65, 75, 92, 110};
//이 파형을 사용하여
// 출력 볼륨
char waveformVolume =
{125, 148, 171, 194, 209, 230, 252, 255,
253, 244, 235, 223, 207, 184, 169, 167,
163, 158, 146, 131, 126, 129, 134, 127,
105, 80, 58, 51,38, 22, 12, 2, 10, 35,
58, 75, 89, 103, 120, 141, 150, 148, 145,
144, 140, 129, 116, 105, 95, 86, 75, 72,
73, 76, 88, 103, 117, 121, 120, 115, 120,
143, 159, 162, 156, 155, 163, 184, 202,
214, 215, 211, 213, 212, 205, 196, 182,
162, 142, 118, 99, 84, 68, 54, 40, 28,
19, 10, 7, 0, 0, 5, 9, 14, 21, 33,
49, 59, 65, 75, 92, 110};
// 피하기 위해 버퍼로 사용되는 배열
// 잘못된 시간 간격
// 측정치
부호없는 int distance_buffer = {16000,
16000, 16000, 16000, 16000, 16000, 16000,
16000, 16000, 16000, 16000, 16000, 16000,
16000, 16000, 16000};
const int distance_length = 3;
int distance_index = 0;
// 2 옥타브의 오버플로 값
int 주파수 = {39, 42, 44, 47,
50, 52, 56, 59, 63, 66, 70, 74, 79,
84, 89, 94, 100, 105, 112, 118, 126,
133, 141, 149};
// 초기 피치
int 피치 = 160;
// 초기 볼륨 및 가속도
// 매개 변수
int lastAcc = 0;
부피 부피 = 0;
// 핀 3의 오디오 재생
바이트 스피커 핀 = 3;
// position에 대한 변수 index
// 파형
휘발성 바이트 웨이브 인덱스 = 0
휘발성 바이트 currentvalue = 0;
// 울트라 소닉 센서에 사용되는 핀
const int pingPin = 7;
// 포텐셔미터 용 핀
const int sustainPin = 1;
const int sensitivityPin = 2;
// 왼쪽의 각 손가락에 핀
// 손
const int finger1 = 9;
const int finger2 = 10;
const int finger3 = 11;
const int finger4 = 12;
int fingerValue = 0;
긴 지속 시간, 인치, cm;
void setup () {
pinMode (3, OUTPUT); // 3 번 핀 스피커
pinMode (finger1, INPUT);
핀 모드 (finger2, 입력);
핀 모드 (finger3, 입력);
pinMode (finger4, 입력);
/**************************
PWM 오디오 구성
****************************/
// Timer2를 고속 PWM 모드로 설정
// (PWM 주파수를 두 배로 늘림)
비트 세트 (TCCR2A, WGM21);
비트 세트 (TCCR2B, CS20);
bitClear (TCCR2B, CS21);
bitClear (TCCR2B, CS22);
// 이제 레지스터를 인터럽트 할 수있게해라.
// 설정 됨
sei ();
/*************************
타이머 1 인터럽트 구성
*************************/
// 인터럽트를 비활성화합니다.
// 레지스터가 구성되었습니다.
cli ();
/ * 정상적인 포트 동작, 핀 연결 끊김
타이머 작동 (브레이킹 PWM) * /
bitClear (TCCR1A, COM1A1);
bitClear (TCCR1A, COM1A1);
bitClear (TCCR1A, COM1A1);
bitClear (TCCR1A, COM1A1);
/ * 모드 4, CTC 및 TOP와 레지스터 설정
OCR1A. 가변 타이밍을 설정할 수 있습니다.
새로운 값을 써서 인터럽트
OCR1A. * /
bitClear (TCCR1A, WGM10);
bitClear (TCCR1A, WGM11);
비트 세트 (TCCR1B, WGM12);
bitClear (TCCR1B, WGM13);
/ * 클럭 프리 스케일러를 / 8로 설정합니다. * /
bitClear (TCCR1B, CS10);
비트 세트 (TCCR1B, CS11);
bitClear (TCCR1B, CS12);
/ * 강제 출력 비교 사용 안 함
채널 A 및 B * /
bitClear (TCCR1C, FOC1A);
bitClear (TCCR1C, FOC1B);
/ * 출력 비교를 초기화합니다.
A를 160으로 설정하여
초기 피치 * /
OCR1A = 160;
// 입력 캡처 인터럽트를 비활성화합니다.
bitClear (TIMSK1, ICIE1);
// 출력을 비활성화합니다.
// B 매치 인터럽트 비교
bitClear (TIMSK1, OCIE1B);
// 출력 사용
// 일치 인터럽트 비교
bitSet (TIMSK1, OCIE1A);
// 오버플로 인터럽트 사용 안 함
bitClear (TIMSK1, TOIE1);
// 이제 인터럽트를 활성화하십시오.
// 레지스터가 설정되었습니다.
sei ();
}
// 타이머 오버 플로우 핸들러
ISR (TIMER1_COMPA_vect) {
/ * timer1 ISR. 매회
그것은 스피커 핀을
파형 의 다음 값. 회수
변조는
연속적인 호출 사이의 타이밍
이 기능, 예 : 1KHz 톤의 경우,
타이밍이 실행되도록 설정
through 파형 1000 회
1 초. * /
// 도달 한 경우 waveindex를 재설정합니다.
// 배열의 끝
if (waveindex> 102) {
waveindex = 0;
}
// 출력 값을 설정합니다.
if (볼륨> 0.03) {
아날로그 쓰기 (스피커 핀,
waveformVolume waveindex);
}
waveindex ++;
// 피치 업데이트
OCR1A = 피치;
}
void loop ()
{
// 인터럽트를 비활성화하고 핑을 보냅니다.
// 메시지를 읽고 응답을 기다립니다.
cli ();
pinMode (pingPin, OUTPUT);
digitalWrite (pingPin, LOW);
delayMicroseconds (2);
digitalWrite (pingPin, HIGH);
delayMicroseconds (5);
digitalWrite (pingPin, LOW);
duration = pulseIn (pingPin, HIGH, 2000);
sei ();
// 시간을 거리로 변환한다.
// 센티미터로
// 버퍼에 저장
distance_buffer distance_index ++
% distance_length = 지속 시간 / 20;
// 버퍼에서 가장 짧은 것을 찾습니다.
// 측정 된 거리
cm = 16000;
for (int i = 0; i <distance_length; i ++) {
cm = min (cm, distance_buffer i);
}
// 어떤 손가락이 눌려 졌는지 확인
fingerValue = 5;
if (! digitalRead (finger4)) {
fingerValue = 4;
}
if (! digitalRead (finger3)) {
fingerValue = 3;
}
if (! digitalRead (finger2)) {
fingerValue = 2;
}
if (! digitalRead (finger1)) {
fingerValue = 1;
}
// 서스테인과
// 민감도 값
플로트 서스테인 =
지도 (analogRead (sustainPin), 0,
1024, 101, 130) / 100.0;
int 민감도 =
지도 (analogRead (sensitivityPin),
0, 1024, 100, 200);
// 볼륨 업데이트
볼륨 = 볼륨 / 서스테인;
if (볼륨 <0) {
부피 = 0;
}
// 가속도계 확인
int acc = analogRead (0);
int accDiff = lastAcc - acc;
// 볼륨 값을 업데이트하십시오.
if (accDiff> 5 * (200 - 감도)) {
볼륨 + = (실수)
pow (accDiff,
감도 / 100.0) / 50000;
}
lastAcc = acc;
// 볼륨이 1보다 크지 않은지 확인하십시오.
if (볼륨> .95) {
volume = .95;
}
// 파형의 볼륨을 업데이트합니다.
for (int i = 0; i <= 102; i ++) {
waveformVolume i =
((파형 i - 127) * 체적) + 127;
}
// 거리에 따라 피치 설정
// 두 손 사이와
// 손가락을 눌렀다.
if (cm <102 &&> 0) {
if (cm> 30) {
피치 = 주파수 7+
((((cm-30) / 24) * 4 + fingerValue-1);
}그밖에{
pitch = map (cm, 0, 30, 39, 79);
}
}그밖에{
피치 = 주파수 7+
((((102 - 30) / 24) * 4 + fingerValue - 1);
}
// 신호가 튀는 것을 피하기 위해 지연
지연 (50);
}
------------------------------------------------------