산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

3D 프린터가 포함된 최소 MIDI 드럼 키트

구성품 및 소모품

Arduino UNO
× 1
Adafruit Standard LCD - 파란색 바탕에 16x2 흰색
× 1
SparkFun 피에조
× 1
Adafruit FSR(포스 감지 저항기)
× 1
저항 10k 옴
× 1
저항 1M 옴
× 1
SparkFun 제너 다이오드 - 5.1V 1W
× 1
SparkFun 푸시버튼 스위치 12mm
× 1
슬라이드 스위치
× 1
TRS 소켓
× 1
USB-A-B 케이블
× 1
Apple Lightning-USB 카메라 어댑터
× 1

필요한 도구 및 기계

3D 프린터(일반)
레이저 커터(일반)
필요하지 않음, 추가
납땜 인두(일반)
서클 커터

앱 및 온라인 서비스

Arduino IDE

이 프로젝트 정보

안녕하세요.

arduino UNO를 사용한 최소한의 드럼 키트입니다.

우선, 이 instructables 페이지를 확인하십시오.

https://blog.arduino.cc/2017/01/19/a-3d-printed-e-drum-pad/

이것을 만들기 시작했을 때부터 저는 피에조와 전자 드럼에 매료되었습니다.

저는 전자 드럼의 매우 간단한 메커니즘과 MIDI라는 위대한 발명품에 매료되었습니다.

즉, 패드만 만드는 것만으로는 만족할 수 없습니다.

이 드럼 키트는 크게 두 가지 프로덕션으로 나뉩니다.

1.3D프린터와 두꺼운 종이로 만든 패드.

2. arduino UNO로 미디 컨버터를 트리거합니다.

"1"의 패드에서 보낸 신호는 "2"의 arduino에서 처리되어 MIDI 신호로 변환됩니다. 그리고 MIDI 신호는 arduino에서 iPhone, 노트북 등으로 전송되어 소리가 나옵니다.

스마트폰이나 PC 이외의 전원을 준비할 필요가 없습니다.

필요한 것

도구

・3D 프린터

・레이저 커터(추가)

・육각 렌치

・커터 나이프

・서클 커터

・납땜 인두

파이프 절단기

・드라이버 드릴

・드릴 비트 9mm / 10mm

자료

・1mm 두께의 종이

・PLA 필라멘트

・스폰지 폼 시트 5mm / 10mm

・MDF 2.5mm / 5.5mm(추가)

・M6 - 70mm 볼트 및 너트

・M6 - 50mm 볼트 및 너트

・M3 - 10mm 볼트 및 너트

・M3 - 15mm 볼트 및 너트

・M3 - 25mm 볼트 및 너트

・M2나사

・직경 13mm 스테인리스 강관

드럼 하드웨어

・메쉬 헤드 10인치 / 8인치

・스네어 스탠드(무엇이든 OK. 저는 YAMAHA SS662를 사용하고 있습니다.)

・하이햇 스탠드(무엇이든 OK. 저는 YAMAHA HS650A를 사용하고 있습니다)

・킥 페달(무엇이든 OK. 저는 YAMAHA FP7210A를 사용하고 있습니다)

・드럼 스틱

1단계:3D 프린팅

모든 데이터는 Thingiverse와 GitHub에 있습니다.

림은 Ver.2를 이용해주세요.

20%로 충전재로 부품을 인쇄했습니다. 레이어의 두께는 0.3mm입니다.

또한 레이저 커터를 사용하여 패드를 만들 수도 있습니다.

https://github.com/RyoKosaka/drums/tree/master/vector

2단계:조립

M3-10mm 볼트와 너트를 사용하여 부품을 함께 연결합니다.

중앙 부분에 M3-15mm 또는 M3-25mm 볼트를 사용하여 바닥 부분을 서로 고정하십시오.

3단계 :쉘 만들기

먼저 쉘의 높이는 55mm입니다.

폭 55mm의 띠를 3개 만들어주세요.

길이는 패드를 덮는 길이보다 약간 깁니다.

바닥에 틈이 있으니 그 틈에 밴드 하나를 넣어보세요.

완벽한 원 길이가 되도록 밴드를 자릅니다.

이것을 3회 반복하고 접착제를 사용하여 오버레이합니다.

쉘이 마르면 메쉬 헤드를 고정한 상태에서 소켓용 직경 9mm의 구멍을 뚫습니다.

버터플라이 너트를 사용해도 되지만 일반 너트로도 조일 수 있는 튜닝 키도 만들어 놓았으니 부디 이용해주세요.

메쉬 헤드를 고정할 때는 M6-70mm 볼트를 사용하십시오.

구멍을 만들면 메쉬 헤드를 다시 제거하여 피에조를 끼웁니다.

4단계 :피에조 부착

스네어

스네어의 경우 그림과 같이 2개의 피에조를 사용하세요.

피에조의 빨간색 케이블을 팁과 링에 각각 연결합니다.

두 검정색 케이블 모두 슬리브에 연결됩니다.

납땜할 때 센서 플레이트의 구멍에 케이블을 끼우는 것을 잊지 마십시오.

헤드용 피에조(팁에 연결된 피에조)는 그림과 같이 10mm 두께의 스폰지 폼으로 샌드위치해야 합니다.

아래에 하나, 위에 세 개. 그리고 위 3개의 원뿔을 그림과 같이 만듭니다.

그런 다음 센서 플레이트에 올려 놓습니다.

킥패드는 하나의 피에조만을 사용하기 때문에 팁만 사용할 수 있습니다.

센서 플레이트가 필요하지 않습니다.피에조 아래에 두 개의 스폰지 폼

중심에서 오프셋 센서를 배치합니다.

비터가 센서를 직접 치면 arduino가 명중의 세기를 판단할 수 없기 때문입니다.

하이햇

회로는 킥패드와 동일합니다.

피에조 아래에 10mm 두께의 스폰지 폼 조각을 놓습니다.

피에조는 섬세합니다. 구부리거나 다치지 않도록 주의하세요.

5단계:10인치 스네어 패드

먼저 림용 센서를 부착합니다.

센서 플레이트를 고정합니다. 단단히 고정하십시오. 측면에서 볼 때 원뿔의 끝이 2-3mm 보이도록 합니다.

물론 8인치 패드를 스네어로 사용하는 경우에도 동일한 절차가 사용됩니다.

6단계 :8인치 킥패드

먼저 직경 13mm의 스테인레스 스틸 파이프를 자릅니다.

200mm 2개와 365mm 2개를 만드십시오.

길이 조절이 가능해서 약간의 길이 오차가 있어도 OK입니다.

사진을 참고하여 조립하세요.

배관 고정을 위해 부품 내부에 M3너트를 장착할 수 있도록 설계하였습니다.

파이프를 단단히 고정하십시오. M3-15mm 볼트와 너트를 사용하십시오.

7단계:12인치 하이햇

두꺼운 종이로 쉘을 제작한 후 두꺼운 종이를 사용하면 심벌즈를 만들 수 있다고 생각했습니다.

첫 번째. 두꺼운 종이를 지름 300mm의 원으로 자릅니다. 이것을 3개 만드세요.

그런 다음 중앙에서 노치를 만듭니다.

마지막으로 첫 번째 노치와 평행하게 10mm 떨어진 지점에서 두 번째 노치가 만들어집니다.

이렇게 해서 입을 작게 벌린 팩맨 3마리가 만들어집니다.

그런 다음 테이프로 팩맨의 입을 조심스럽게 닫아 심벌즈 모양으로 만듭니다.

접착제를 바르고 덮어줍니다. 접착제를 깨끗하고 얇게 펴주는 것 잊지 마세요.

손으로 단단히 잡고 무게추를 주변에 놓고 말리세요.

침묵을 위해 5mm 두께의 스폰지를 놓고 구멍을 뚫습니다. 구멍을 깔끔하게 열 수는 없지만 구멍을 숨길 수 있으므로 괜찮습니다.

센서 마운트와 케이블 가이드를 양면테이프로 부착하여 완성. 글루건을 사용하면 더 쉬울 수 있습니다.

8단계:하이햇 컨트롤러

하이햇 컨트롤러는 하이햇의 개폐를 arduino로 보냅니다.

회로는 매우 간단합니다.

세 부분을 결합하여 만들어집니다.

FSR을 바닥 부분에 부착하고 소켓을 고정합니다. FSR은 구멍이 열려 있어도 사용할 수 있습니다.

10mm 스펀지를 FSR에 사진처럼 부착하세요.

M3 - 10mm 볼트로 커버를 고정합니다.

HIGH와 LOW만 있어도 왜 FSR을 사용했는지 궁금하실 겁니다.

Roland나 Yamaha와 같은 사운드 모듈에 대응하기 위해 FSR을 사용합니다.

그리고 EZ DRUMMER 2와 같은 드럼 전용 음원에는 하이햇이 열리는 정도에 여러 단계가 있습니다.

FSR이라면 코드를 수정하는 것만으로 대응이 가능할 수도 있다. 그러나 나는 그것을 시도하지 않았습니다.

9단계:USB - MIDI

이 단계에서 우리는 무엇을 할 수 있습니까?

USB 케이블만 있으면 arduino에서 미디 신호를 보낼 수 있습니다.

즉, 별도의 하드웨어 없이 arduino가 iPhone 등에서 미디 기기로 인식되도록 하는 것입니다.

먼저 이 페이지를 확인하세요.

http://morecatlab.akiba.coocan.jp/lab/index.php/aruino/midi-firmware-for-arduino-uno-moco/

https://github.com/kuwatay/mocolufa

일반 arduino UNO를 iPhone에 직접 연결하면 "Arduino UNO가 호환되지 않습니다"와 같은 오류 메시지가 나타납니다.

따라서 arduino UNO에서 사용하는 USB 칩(ATmega16U2)을 다시 작성해야 합니다.

https://www.arduino.cc/en/Hacking/DFUProgramming8U2

hex 파일을 다시 작성하는 방법입니다.

아래 설명까지 본 사이트에 따라 진행해주세요.

sudo dfu-프로그래머 atmega16u2 플래시 Arduino-usbserial-uno.hex

"Arduino-usbserial-uno.hex"를 "dualMoco.hex"로 바꾸기만 하면 됩니다.

따라서

sudo dfu-프로그래머 atmega16u2 플래시 dualMoco.hex

다시 작성하면 Arduino가 MIDI 장치로 인식됩니다.

그림과 같이 핀을 단락시키면 일반 아두이노로 인식됩니다.

그렇지 않은 경우(단락되지 않은 경우) arduino UNO는 MIDI 장치로 인식됩니다.

즉, arduino IDE를 이용하여 코드를 작성할 때 그림과 같이 핀을 단락시켜야 합니다.

10단계:MIDI 변환기로 트리거

상자에 arduino UNO와 쉴드가 있습니다.

쉴드 회로는 프리징 이미지를 참고하세요.

다이오드는 보호용이지만 arduino UNO에는 보호 회로가 있으므로 다이오드가 필요하지 않을 수 있다는 정보를 보았습니다. 이에 대해 아는 사람이 있습니까?

케이스와 커버의 모델을 먼저 출력한 후 그에 맞게 쉴드를 만들어주면 좋습니다.

표지의 3D 모델도 있지만 레이저 커터로 표지를 만들었습니다. 원하는 것을 선택하십시오.

11단계:GarageBand로 재생

Garageband를 시작하고 연결하기만 하면 됩니다. 특별히 어려운 설정은 없습니다.

GarageBand를 포함하여 이 드럼 세트에서 사용할 수 있는 PC용 DAW가 많이 있습니다.

그 중 Hydrogen은 무료이며 사운드를 추가할 수 있습니다.

12단계:설정

코드를 만들 때마다 값이 바뀔 때마다 코드를 다시 작성해야 하는 번거로움이 있어 arduino만으로 값을 변경할 수 있도록 하고 싶었습니다.

즉, 디버깅 코드를 위한 것이므로 변경할 필요가 없는 항목이 있습니다.

다만, 피에조의 크기, 패드의 크기, 스펀지폼의 경도에 따라 설정이 필요합니다.

INC / DEC 버튼으로 악기를 선택하고 NEXT / BACK 버튼으로 설정 항목을 선택합니다. 설정하려는 악기와 항목이 표시된 상태에서 EDIT 버튼을 누르면 INC / DEC 버튼으로 값을 변경할 수 있습니다. 그런 다음 EDIT 버튼을 다시 누르면 변경 사항이 확인됩니다.

영상 후반부를 보시면 조작법이 이해가 되실 겁니다.

임계값

소리가 나오는 가장 낮은 값

감도

센서 감도. 낮추면 약하게 치더라도 높은 벨로시티를 얻게 됩니다.

참고

메모의 번호입니다. 변경함으로써 악기를 변경할 수 있습니다. 이미지를 참고해주세요.

플래그

구타가 끝났다고 판단하는 값. 너무 많이 변경할 필요는 없습니다. 1부터 10까지 값을 설정하는 것이 좋을 것입니다. 값을 너무 높이면 한 번의 타격으로 두 번 소리가납니다. 너무 낮추면 반복적으로 치면 소리가 안날 수 있습니다.

스캔 시간

피크를 검색할 때 임계값을 초과한 후 몇 밀리초 동안 값을 연속적으로 취합니다. 그 중 가장 높은 값이 정점에 도달합니다. 이 몇 밀리초는 SCANTIME입니다. 변경할 필요가 없습니다.

헤드/림

림의 용이함을 설정합니다. 올리면 소리가 나기 어렵습니다. 너무 세게 내리면 머리를 칠 때 림에서 소리가 납니다. 헤드와 림의 판단에 관해서는 코드 개선이 필요할 수도 있습니다

페달 벨로

다른 패드와 달리 페달의 속도는 일정합니다. 초기값은 100입니다. 원하는 값으로 변경해주세요.

마스크 시간

FLAG와 관련된 값입니다. 변경할 필요가 없습니다. 올리면 계속 치면 소리가 안날 수 있습니다.

13단계:Fusion 360

일부 부품은 치수가 변경되지 않으면 사용할 수 없습니다. STL 데이터를 편집하는 것은 어렵습니다. 그래서 퓨전 360 데이터를 올렸습니다. 하지만 시행착오를 겪으면서 데이터를 편집하고 있기 때문에 히스토리 기능에 너무 의존하지 않는 것이 좋습니다.

https://github.com/RyoKosaka/drums/tree/master/Fusion360

추가

추가 단계는 지침에 있습니다.

https://www.instructables.com/id/Arduino-Minimal-Drum-Kit/

그리고 자세한 제작 과정은 이 블로그에 공개되어 있습니다.

관심이 있다면 확인하십시오.

무엇이든 물어보세요.

즐거운 시간 보내세요!

<섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

코드

<울>
  • Hello Drum v2
  • Hello Drum v2Arduino
    수정:George Brotherston<사전>/* Drum MIDI Controller 작성:2017/06/28 Ryo Kosaka " HELLO DRUM " Ver.1.0 수정:George Brotherston이 2019/05/12*/// 라이브러리 포함// #include // Arduino 라이브러리(자동으로 포함됨) // LOW(라인 41) // HIGH(라인 40) // INPUT_PULLUP(라인 47) // digitalRead()(라인 177) / / analogRead() (라인 178) #include // MIDI 라이브러리 - 버전:4.3.1 // 포함 // 클래스 MIDI (라인 30) // 클래스 메서드 'begin'(라인 55) #include // LiquidCrystal - 버전:1.0.7 // LiquidCrystal 클래스(라인 45)에서 인스턴스화된 lcd 개체(아래 변수 섹션)// 변수 - 선언 및 초기화 // 변수 - 프로그램 부울 bSnareFlag =거짓; 부울 bHihatFlag =거짓; 부울 bKickFlag =거짓; 부울 bPedalFlag =거짓; 부울 bButtonState =true; 부울 bButtonState_set =true; 정수 iUPDOWN =0; 정수 iNEXTBACK =0; // 배열 - 프로그램 // InstrumentSensor[6] ={threshold, sensitivity, note, flag, velocity, iPeakValue} // 'iPeakValue' 및 'velocity'는 모든 InstrumentSensor 배열에 대해 0이어야 합니다. // 모든 'aHIHAT[]' 및 'aHIHAT_CLOSE[]' 배열 요소는 'note' 요소를 제외하고 동일한 값을 가져야 합니다. int aSNARE[6] ={150, 950, 38, 3, 0, 0}; int aSNARE_RIM[6] ={5, 500, 37, 3, 0, 0}; int aHIHAT[6] ={100, 800, 46, 1, 0, 0}; int aHIHAT_CLOSE[6] ={100, 800, 42, 1, 0, 0}; int aKICK[6] ={200, 700, 36, 1, 0, 0}; // Instrument_ContinuousController[4] ={스캔타임, 스네어/림, 페달벨로시티, 마스크타임} int aHIHAT_PEDAL[4] ={600, 0, 44, 0}; // InstrumentSensor_ParameterValue[4] ={임계값, 민감도, 메모, 플래그} int aSETTING[4] ={4, 500,100,1}; // 라이브러리 // LiquidCrystal.h // 상수(라이브러리에 이미 정의되어 있고 아직 범위에 있습니까? 그렇지 않은 경우 아래에 정의) // const int rs =12, en =11, d4 =5, d5 =4, d6 =3 , d7 =2; // LiquidCrystal 클래스에서 인스턴스화된 lcd 객체(LiquidCrystal.h Line 45) LiquidCrystal lcd(rs, en, d4, d5, d6, d7); // LCD 인터페이스 핀을 연결된 Arduino 핀 번호에 연결 // MIDI.h // 라이브러리 초기화 MIDI_CREATE_DEFAULT_INSTANCE();// 프로그램 코드 // 프로그램 실행 - 초기(프로그램 설정) void setup() { MIDI.begin(10); // 시작(MIDI.h 55행) lcd.begin(16, 2); // 시작(LiquidCrystal.h 62행) lcd.print("INITIALIZING..."); // 인쇄(LiquidCrystal.h 45행) lcd.setCursor(0, 1); // setCursor(LiquidCrystal.h 82행) lcd.print("DRUM MIDI CONTROLLER"); 핀모드(6, INPUT_PULLUP); // pinMode (Arduino.h 라인 175); INPUT_PULLUP(Arduino.h 라인 47) pinMode(7, INPUT_PULLUP); 핀모드(8, INPUT_PULLUP); 핀모드(9, INPUT_PULLUP); 핀모드(10, INPUT_PULLUP); } // 프로그램 실행 - 안정 상태(전원이 끊길 때까지 계속 루프) void loop() { // 드럼 MIDI 컨트롤러 회로 // 변수 선언 및 초기화 int iButton_set =digitalRead(6); // 버튼 설정 // digitalRead() (Arduino.h Line 177) int iButton_up =digitalRead(7); // 위로 버튼 int iButton_down =digitalRead(8); // 아래로 버튼 int iButton_next =digitalRead(9); // 다음 버튼 int iButton_back =digitalRead(10); // 뒤로 버튼 int iPiezoValue_A0 =analogRead(A0); // 피에조 - 스네어 헤드 // analogRead() (Arduino.h 라인 178) int iPiezoValue_A1 =analogRead(A1); // 피에조 - 스네어 림 int iPiezoValue_A2 =analogRead(A2); // 하이햇 int iPiezoValue_A3 =analogRead(A3); // 킥 드럼 int iFSRValue_A4 =analogRead(A4); // 하이햇 페달 // 편집 모드 int aUP[4] ={5, 50, 1,1}; // {임계값, 민감도, 참고, 플래그} int aUP_ADVANCE[4] ={1, 50, 1,1}; // {scantime, rim/head, pedal velocity, masktime} // 참고:aINSTRUMENT[] 배열은 char* 위의 'Arrays'에서 선언되지 않았습니다. aINSTRUMENT[] ={ "SNARE HEAD", "SNARE RIM", "HIHAT OPEN ", "HIHAT CLOSE", "HIHAT PEDAL", "킥", "고급 설정" }; // 참고:aSETTING[] 배열은 char* 위의 '배열'에 선언되었습니다. aSETTING[] ={ "THRESHOLD", "SENSITIVITY", "NOTE", "FLAG" }; // 참고:aSETTING_ADVANCE[]는 char* 위의 '배열'에서 선언되지 않았습니다. aSETTING_ADVANCE[] ={ "SCAN TIME", "HEAD / RIM ","PEDAL VELO", "MASK TIME" }; if (iUPDOWN <0) { iUPDOWN =6; } if (iUPDOWN> 6) { iUPDOWN =0; } if (iNEXTBACK <0) { iNEXTBACK =3; } if (iNEXTBACK> 3) { iNEXTBACK =0; } // 푸시버튼 EDIT // LOW(Arduino.h Line 41) if (iButton_set ==LOW &&bButtonState ==true &&bButtonState_set ==true) { lcd.clear(); lcd.print("편집"); bButtonState =거짓; bButtonState_set =거짓; 지연(500); } if (iButton_set ==LOW &&bButtonState ==true &&bButtonState_set ==false) { lcd.clear(); lcd.print("수정 완료"); bButtonState =거짓; bButtonState_set =true; 지연(500); } if (iButton_up ==LOW &&bButtonState ==true &&bButtonState_set ==false) { switch (iUPDOWN) { 경우 0:aSNARE[iNEXTBACK] =aSNARE[iNEXTBACK] + aUP[iNEXTBACK]; 부서지다; 사례 1:aSNARE_RIM[iNEXTBACK] =aSNARE_RIM[iNEXTBACK] + aUP[iNEXTBACK]; 부서지다; 사례 2:스위치 (iNEXTBACK) { 사례 2:aHIHAT[iNEXTBACK] =aHIHAT[iNEXTBACK] + aUP[iNEXTBACK]; 부서지다; 기본값:aHIHAT_CLOSE[iNEXTBACK] =aHIHAT_CLOSE[iNEXTBACK] + aUP[iNEXTBACK]; aHIHAT[iNEXTBACK] =aHIHAT[iNEXTBACK] + aUP[iNEXTBACK]; } 부서지다; 사례 3:스위치 (iNEXTBACK) { 사례 2:aHIHAT_CLOSE[iNEXTBACK] =aHIHAT_CLOSE[iNEXTBACK] + aUP[iNEXTBACK]; 부서지다; 기본값:aHIHAT_CLOSE[iNEXTBACK] =aHIHAT_CLOSE[iNEXTBACK] + aUP[iNEXTBACK]; aHIHAT[iNEXTBACK] =aHIHAT[iNEXTBACK] + aUP[iNEXTBACK]; } 부서지다; 경우 4:스위치 (iNEXTBACK) { 경우 0:aHIHAT_PEDAL[iNEXTBACK] =aHIHAT_PEDAL[iNEXTBACK] + aUP[iNEXTBACK]; 부서지다; 사례 2:aHIHAT_PEDAL[iNEXTBACK] =aHIHAT_PEDAL[iNEXTBACK] + aUP[iNEXTBACK]; 부서지다; } 부서지다; 경우 5:aKICK[iNEXTBACK] =aKICK[iNEXTBACK] + aUP[iNEXTBACK]; 부서지다; 사례 6:aSETTING[iNEXTBACK] =aSETTING[iNEXTBACK] + aUP_ADVANCE[iNEXTBACK]; 부서지다; } bButtonState =거짓; 지연(30); } if (iButton_down ==LOW &&bButtonState ==true &&bButtonState_set ==false) { switch (iUPDOWN) { case 0:aSNARE[iNEXTBACK] =aSNARE[iNEXTBACK] - aUP[iNEXTBACK]; 부서지다; case 1:aSNARE_RIM[iNEXTBACK] =aSNARE_RIM[iNEXTBACK] - aUP[iNEXTBACK]; 부서지다; case 2:switch (iNEXTBACK) { case 2:aHIHAT[iNEXTBACK] =aHIHAT[iNEXTBACK] - aUP[iNEXTBACK]; 부서지다; default:aHIHAT_CLOSE[iNEXTBACK] =aHIHAT_CLOSE[iNEXTBACK] - aUP[iNEXTBACK]; aHIHAT[iNEXTBACK] =aHIHAT[iNEXTBACK] - aUP[iNEXTBACK]; } break; case 3:switch (iNEXTBACK) { case 2:aHIHAT_CLOSE[iNEXTBACK] =aHIHAT_CLOSE[iNEXTBACK] - aUP[iNEXTBACK]; 부서지다; default:aHIHAT_CLOSE[iNEXTBACK] =aHIHAT_CLOSE[iNEXTBACK] - aUP[iNEXTBACK]; aHIHAT[iNEXTBACK] =aHIHAT[iNEXTBACK] - aUP[iNEXTBACK]; } break; case 4:switch (iNEXTBACK) { case 0:aHIHAT_PEDAL[iNEXTBACK] =aHIHAT_PEDAL[iNEXTBACK] - aUP[iNEXTBACK]; 부서지다; case 2:aHIHAT_PEDAL[iNEXTBACK] =aHIHAT_PEDAL[iNEXTBACK] - aUP[iNEXTBACK]; 부서지다; } break; case 5:aKICK[iNEXTBACK] =aKICK[iNEXTBACK] - aUP[iNEXTBACK]; 부서지다; case 6:aSETTING[iNEXTBACK] =aSETTING[iNEXTBACK] - aUP_ADVANCE[iNEXTBACK]; 부서지다; } bButtonState =false; delay(30); } // Pushbuttons UP; DOWN; NEXT; BACK if (iButton_up ==LOW &&bButtonState ==true &&bButtonState_set ==true) { iUPDOWN =++iUPDOWN; bButtonState =false; delay(30); } if (iButton_down ==LOW &&bButtonState ==true &&bButtonState_set ==true) { iUPDOWN =--iUPDOWN; bButtonState =false; delay(30); } if (iButton_next ==LOW &&bButtonState ==true &&bButtonState_set ==true) { iNEXTBACK =++iNEXTBACK; bButtonState =false; delay(30); } if (iButton_back ==LOW &&bButtonState ==true &&bButtonState_set ==true) { iNEXTBACK =--iNEXTBACK; bButtonState =false; delay(30); } if (bButtonState ==false &&iButton_up ==HIGH &&iButton_down ==HIGH &&iButton_next ==HIGH &&iButton_back ==HIGH &&iButton_set ==HIGH) { // HIGH is defined in Arduino.h Line 40 switch (iUPDOWN) { case 0:lcd.clear(); lcd.print(aINSTRUMENT[iUPDOWN]); lcd.setCursor(0, 1); lcd.print(aSETTING[iNEXTBACK]); lcd.setCursor(12, 1); lcd.print(aSNARE[iNEXTBACK]); 부서지다; case 1:lcd.clear(); lcd.print(aINSTRUMENT[iUPDOWN]); lcd.setCursor(0, 1); lcd.print(aSETTING[iNEXTBACK]); lcd.setCursor(12, 1); lcd.print(aSNARE_RIM[iNEXTBACK]); 부서지다; case 2:lcd.clear(); lcd.print(aINSTRUMENT[iUPDOWN]); lcd.setCursor(0, 1); lcd.print(aSETTING[iNEXTBACK]); lcd.setCursor(12, 1); lcd.print(aHIHAT[iNEXTBACK]); 부서지다; case 3:lcd.clear();lcd.print(aINSTRUMENT[iUPDOWN]); lcd.setCursor(0, 1); lcd.print(aSETTING[iNEXTBACK]); lcd.setCursor(12, 1); lcd.print(aHIHAT_CLOSE[iNEXTBACK]); 부서지다; case 4:lcd.clear(); lcd.print(aINSTRUMENT[iUPDOWN]); lcd.setCursor(0, 1); lcd.print(aSETTING[iNEXTBACK]); lcd.setCursor(12, 1); lcd.print(aHIHAT_PEDAL[iNEXTBACK]); 부서지다; case 5:lcd.clear(); lcd.print(aINSTRUMENT[iUPDOWN]); lcd.setCursor(0, 1); lcd.print(aSETTING[iNEXTBACK]); lcd.setCursor(12, 1); lcd.print(aKICK[iNEXTBACK]); 부서지다; case 6:lcd.clear(); lcd.print(aINSTRUMENT[iUPDOWN]); lcd.setCursor(0, 1); lcd.print(aSETTING_ADVANCE[iNEXTBACK]); lcd.setCursor(12, 1); lcd.print(aSETTING[iNEXTBACK]); 부서지다; } bButtonState =true; } // Instrument Sensors // Snare Drum if (iPiezoValue_A0> aSNARE[0] &&bSnareFlag ==false) { for (int i =0; i aSNARE[4]) { aSNARE[4] =iPeak_A0; } if (iPeak_A1> aSNARE_RIM[4]) { aSNARE_RIM[4] =iPeak_A1; } } aSNARE[5] =aSNARE[4]; aSNARE_RIM[5] =aSNARE_RIM[4]; aSNARE[4] =map(aSNARE[4], aSNARE[0], aSNARE[1], 0, 127); aSNARE_RIM[4] =map(aSNARE_RIM[4], aSNARE_RIM[0], aSNARE_RIM[1], 0, 127); aSNARE[4] =(aSNARE[4] * aSNARE[4]) / 127; // Curve setting //aSNARE_RIM[4] =(aSNARE_RIM[4] * aSNARE_RIM[4]) / 127; if (aSNARE[4] <=1) { aSNARE[4] =1; } if (aSNARE[4]> 127) { aSNARE[4] =127; } if (aSNARE_RIM[4] <=0) { aSNARE_RIM[4] =0; } if (aSNARE_RIM[4]> 127) { aSNARE_RIM[4] =127; } if (aSNARE_RIM[5]> aSETTING[1]) { MIDI.sendNoteOn(aSNARE_RIM[2], aSNARE_RIM[4], 1); //(note, velocity, channel) MIDI.sendNoteOn(aSNARE_RIM[2], 0, 1); lcd.clear(); lcd.print("SNARE RIM"); lcd.setCursor(0, 1); lcd.print(aSNARE_RIM[4]); bSnareFlag =true; } //else if (aSNARE[5]> aSNARE_RIM[5]) else { MIDI.sendNoteOn(aSNARE[2], aSNARE[4], 1); //(note, velocity, channel) MIDI.sendNoteOn(aSNARE[2], 0, 1); lcd.clear(); lcd.print("SNARE HEAD"); lcd.setCursor(0, 1); lcd.print(aSNARE[4]); //lcd.setCursor(10, 1); //lcd.print(aSNARE_RIM[5]); bSnareFlag =true; } } // Hi-Hat Cymbal if (iPiezoValue_A2> aHIHAT[0] &&bHihatFlag ==false) { for (int i =0; i aHIHAT[4]) { aHIHAT[4] =iPeak_A2; } } aHIHAT[5] =aHIHAT[4]; aHIHAT[4] =map(aHIHAT[4], aHIHAT[0], aHIHAT[1], 0, 127); aHIHAT[4] =(aHIHAT[4] * aHIHAT[4]) / 127; if (aHIHAT[4] <=1) { aHIHAT[4] =1; } if (aHIHAT[4]> 127) { aHIHAT[4] =127; } if (iPiezoValue_A0 =aHIHAT_PEDAL[0]) { MIDI.sendNoteOn(aHIHAT_CLOSE[2], aHIHAT[4], 1); MIDI.sendNoteOn(aHIHAT_CLOSE[2], 0, 1); lcd.clear(); lcd.print("HIHAT CLOSE"); lcd.setCursor(0, 1); lcd.print(aHIHAT[4]); bHihatFlag =true; } } // Hi-hat Pedal if (iPiezoValue_A0> aHIHAT_PEDAL[0] &&bPedalFlag ==false) { MIDI.sendNoteOn(aHIHAT_PEDAL[2], aSETTING[2], 1); // (note, velocity, channel) MIDI.sendNoteOn(aHIHAT_PEDAL[2], 0, 1); lcd.clear(); lcd.print("HIHAT PEDAL"); lcd.setCursor(0, 1); lcd.print(aSETTING[2]); bPedalFlag =true; } // Kick Drum if (iPiezoValue_A3> aKICK[0] &&bKickFlag ==false) { for (int i =0; i aKICK[4]) { aKICK[4] =iPeak_A3; } } aKICK[5] =aKICK[4]; aKICK[4] =map(aKICK[4], aKICK[0], aKICK[1], 0, 127); aKICK[4] =(aKICK[4] * aKICK[4]) / 127; if (aKICK[4] <=1) { aKICK[4] =1; } if (aKICK[4]> 127) { aKICK[4] =127; } MIDI.sendNoteOn(aKICK[2], aKICK[4], 1); MIDI.sendNoteOn(aKICK[2], 0, 1); lcd.clear(); lcd.print("KICK"); lcd.setCursor(0, 1); lcd.print(aKICK[4]); bKickFlag =true; }// --- BEGIN 'Code in Progress' --- //// --- I could be wrong, but this is what it appears to be --- and out of curiousity what is purpose of this sequence? -- // // I=(A0); // Previous Code // -- DOES iSensorValue_A0 need to be declared as an integer? How does this relate to iPiezoValue_A0? -- // if (iSensorValue_A0 <(aSNARE[5] * (0.01 * aSNARE[3]))) { bSnareFlag =false; } if (iPiezoValue_A0 <=aHIHAT_PEDAL[0] &&iPiezoValue_A2 <(aHIHAT[5] * (0.01 * aHIHAT[3])) &&bHihatFlag ==true) { delay(aSETTING[3]); // iSensorValue_A1 is reading analogRead(A2), but this is aHIHAT_PEDAL (which is analogRead(A2) int iSensorValue_A1 =analogRead(A2); if (iSensorValue_A1 <(aHIHAT[5] * (0.01 * aHIHAT[3]))) { bHihatFlag =false; } } if (iPiezoValue_A0>=aHIHAT_PEDAL[0] &&iPiezoValue_A2 <(aHIHAT[5] *(0.01 * aHIHAT[3])) &&bHihatFlag ==true) { delay(aSETTING[3]); int iSensorValue_A2 =analogRead(A2); if (iSensorValue_A2 <(aHIHAT[5] * (0.01 * aHIHAT[3]))) { bHihatFlag =false; } } if (iPiezoValue_A3 <(aKICK[5] * (0.01 * aKICK[3])) &&bKickFlag ==true) { delay(aSETTING[3]); // -- Should declared iSensorValue_A3 be iPiezoValue_A3? iSensorValue_A3 is declared but not used anywhere?? int iSensorValue_A3 =analogRead(A3); if (iPiezoValue_A3 <(aKICK[5] * (0.01 * aKICK[3]))) { bKickFlag =false; } } if (iPiezoValue_A0 <=aHIHAT_PEDAL[0] &&bPedalFlag ==true) { bPedalFlag =false; }// --- END 'Code in Progress' --- // }
    Hello Drum

    회로도

    circuit_nZotR7rJMM.fzz

    제조공정

    1. 드럼
    2. 중국 외과 의사가 3D 프린터로 티타늄 뼈를 제작합니다
    3. 광학 센서로 혈압을 측정하는 디자인 키트
    4. GrabCAD Print를 Stratasys 3D 프린터와 연결하는 방법
    5. 3D 프린터로 무엇을 만들 수 있습니까?
    6. NeoPixel Ring으로 재미있는 자이로스코프
    7. 구름 의상
    8. Unopad - Ableton이 포함된 Arduino MIDI 컨트롤러
    9. Arduino를 사용한 간단한 장애물 센서
    10. Arduino를 사용한 음성 인식 및 합성