회로

Arduino, 일명 AIRduino 기타로 에어 기타를 만드는 방법 : 5 단계

What is Arduino? Arduino Projects? Arduino Vs Raspberry Pi?

What is Arduino? Arduino Projects? Arduino Vs Raspberry Pi?

차례:

Anonim

  • 여기서 아이디어는 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);
    }
    ------------------------------------------------------