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

저가용 Arduino Breath 컨트롤러(USB-MIDI)

구성품 및 소모품

Arduino Micro
클론으로 비용을 낮출 수도 있지만 원본을 추천합니다. 기본 USB 기능으로 인해 Micro(ATmega32U4)만 작동합니다.
× 1
납땜 브레드보드 절반 크기
× 1
MPS20N0040D-D 압력 센서
싸고 찾기 쉬운 먼지
× 1
LM358-N 연산 증폭기
인기 있는 LM358 연산 증폭기를 사용하여 센서의 신호를 증폭하겠습니다.
× 1
저항 1M 옴
× 2
후크업 와이어 키트, 22AWG
물론 전체 키트는 필요하지 않으며 단 몇 cm의 단단한 심선만 있으면 됩니다.
× 1
아기 비강 흡인기
예, 올바르게 읽으셨습니다. 우리는 부모 쪽 마우스 피스와 아기 쪽 흡입기를 사용할 것입니다. 같은 유형의 수동 흡인기 수십 개가 있습니다(예:Physiomer Nasal Aspirator, Chicco Physioclean 등). 더 편안하다고 생각되는 마우스피스 유형을 선택하십시오.
× 1
5mm 수족관 항공 튜브
흡인기의 튜브가 충분히 길지 않은 경우 선택 사항입니다. 표준 수족관 항공 튜빙이 가능합니다.
× 1
3방향 공기 튜브 커넥터
이 특정 중국 OEM 제품은 수족관 상점에서 다른 이름으로 쉽게 찾을 수 있습니다. 센서에 직접 맞습니다.
× 1

필요한 도구 및 기계

와이어 스트리퍼 및 절단기, 32-20 AWG / 0.05-0.5 mm² 단선 및 연선

앱 및 온라인 서비스

Arduino IDE

이 프로젝트 정보

소개

이 프로젝트에서 우리는 간단한 USB MIDI 플러그 앤 플레이 호흡 컨트롤러를 만들 것입니다. 저렴한 구성 요소를 쉽게 찾을 수 있도록 설계되어 총 비용이 저렴하고 상용 제품보다 훨씬 낮습니다. 기압 센서만 사용하는 기본 버전이지만 앞으로 물고 고개를 끄덕이거나 기울이는 센서를 포함하도록 업그레이드할 예정입니다.

이 프로젝트는 아주 기본적인 전자공학과 Arduino 지식을 전제로 하지만 납땜이 필요 없기 때문에 초보자도 만들 수 있습니다. 물론 고급 사용자는 perma-protoboard에서 모든 것을 납땜할 수 있습니다. 인터넷에 훌륭한 튜토리얼이 있으므로 IDE/라이브러리 설치 및 코드 업로드 지침에 대해서는 다루지 않습니다.

오버샘플링은 센서의 입력을 매끄럽게 하여 매우 좋은 결과를 얻는 데 사용됩니다. 원하는 대로 범위를 조정하고 사용자 정의 곡선을 다이얼로 조정하여 컨트롤러의 동작을 조정할 수도 있습니다.

센서는 음압도 측정할 수 있기 때문에 불어오는 대신 공기를 흡입할 때 출력되는 컨트롤러 메시지의 두 번째 스트림이 있습니다. 두 가지 유형의 메시지 모두 사용자가 설정할 수 있습니다. 예를 들어 블로우를 피치 벤드 업으로 설정하고 드로우 인을 피치 벤드 다운으로 설정할 수 있습니다. 기본적으로 둘 다 컨트롤러 번호로 설정됩니다. 2.

구축 단계

1. 사진/도식과 같이 브레드보드에 아두이노를 삽입합니다.

2. 센서와 연산 증폭기를 각각의 위치에 삽입하고 측면의 작은 들여쓰기를 기준으로 방향을 확인합니다.

3. 다리를 적당한 길이로 자른 후 저항을 삽입합니다.

4. 솔리드 코어 케이블을 자르거나 벗겨내고 각각의 위치에 놓습니다. 이해를 돕기 위해 5V에는 빨간색, 접지에는 검은색, 신호에는 노란색을 사용했지만 사용 가능한 모든 것을 사용할 수 있습니다.

5. 사진과 같이 마우스피스, 튜브, 3-way 커넥터, 흡인기를 연결하세요. "배기"용 튜브를 절단해야 합니다.

6. 3방향 커넥터를 눌러 센서에 맞춥니다. 그대로 있어야 합니다.

7. Arduino IDE를 설치하고 도구->라이브러리 관리에서 필요한 두 라이브러리(오버샘플링 및 USB-MIDI)를 설치합니다. USB 케이블로 Arduino를 컴퓨터에 연결하십시오. 첨부된 코드를 업로드하세요.

8. 설정해야 합니다. 이제 Arduino가 DAW/음악 소프트웨어에 MIDI 장치로 나타나야 합니다. 활성화하고 키보드와 함께 호흡 컨트롤러를 지원하는 플러그인으로 라우팅합니다.

고급 정보

이 디자인의 물리적인 단점 중 하나는 타액이 튜브에서 불가피하게 흐르고 눈에 띄는 공기 흐름 변동을 일으킬 수 있다는 것입니다. 3방향 커넥터는 타액을 "배기" 튜브로 라우팅하여 이 문제를 해결하는 데 사용됩니다. 튜브에 갇힌 타액을 최소화하려면 튜브 길이를 조정하여 마우스피스에서 3방향 커넥터까지 연속적인 경사가 있는지 확인합니다. 튜브가 3방향 커넥터 레벨 아래에 걸리면 타액이 낮은 지점에 갇혀 변동을 일으킵니다. 필터를 포함한 흡인기의 베이비 사이드 부분을 배기구에 부착하여 물방울과 소음을 최소화하고 센서로의 공기 흐름을 증가시킵니다.

코드에는 사용자 정의 곡선을 포함하여 원하는 대로 조정할 수 있는 값이 있습니다. 주석은 이를 수행하는 방법을 설명합니다. 127포인트에 도달하기 어렵다면 최대 범위를 줄이고, 너무 쉽다면 늘리십시오. 값을 변경할 때마다 코드를 다시 업로드해야 합니다.

Arduino 부팅 후 처음 몇 번 판독값은 나머지 위치를 보정하기 위해 평균을 냅니다. 장치를 연결/재설정하는 동안 튜브에 바람을 불어넣지 마십시오.

boards.txt 파일을 편집하여 MIDI 장치의 이름을 변경할 수 있습니다(각 플랫폼에 대해 수행하는 방법에 대한 정보는 인터넷에서 볼 수 있음).

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

코드

<울>
  • 호흡 조절기 코드
  • 호흡 컨트롤러 코드Arduino
    Arduino IDE
    /* Breath Controller*///Libraries used - Tools->Manage Libraries에서 설치#include #include //를 통해 이 코드를 호흡 컨트롤러에 업로드합니다. 디버그 모드(활성화하려면 주석 해제)//#define DEBUG 1//USB MIDI 인터페이스 생성USBMIDI_CREATE_DEFAULT_INSTANCE();//오버샘플링 initOversampling adc(10, 13, 6);// *********** ****** 사용자 설정 ***************** // 1로 끝나는 값은 블로잉에 해당하고 2로 끝나는 값은 공기 중 그리기에 해당 // Pin setupconst int sensorPin1 =A0; // Sensor/Op Amp 출력을 위한 Arduino 입력 핀을 선택합니다.// Range Calibration. 최대값에 도달할 수 있지만 너무 쉽게 도달할 수 없도록 수동으로 조정합니다.int sensorRange1 =800;int sensorRange2 =800;// 출력 컨트롤러 번호. 아래 표에서 선택// 0-127:일반 컨트롤 변경 메시지// 128:모노포닉 애프터터치// 129:피치 벤드 업 // 130:피치 벤드 다운 int controllerNumber1 =2; // 블로잉시 컨트롤러 전송 controllerNumber2 =2; // 공기를 그릴 때 컨트롤러가 전송됨 // 출력 컨트롤러 채널int controllerChannel1 =1;int controllerChannel2 =1;// 정지 또는 최대일 때 변동을 피하기 위한 최저 및 최고 값에 대한 안전 임계값. // 휴지 상태에서 여러 메시지가 전송되면 lowThreshold를 높입니다. // 최대일 때 여러 메시지가 전송되면 highThreshold를 높입니다. const int lowThreshold1 =5;const int lowThreshold2 =5;const int highThreshold1 =0;const int highThreshold2 =0;// 곡선 정의. 테이블의 길이는 2보다 크거나 같을 수 있습니다. 값은 0-127입니다. 테이블에는 동일한 수의 요소가 있어야 하고 "in" 테이블은 오름차순이어야 합니다.// 변환은 판독 수준에서 수행되므로 정의 손실이 최소화됩니다.int in1[] ={0, 127};int out1[] ={0, 127};int in2[] ={0, 127};int out2[] ={0, 127};// 예제 곡선(따라서 센서 번호 수정)//Soft//int in1[] ={ 0, 6,24,78,127};//int out1[] ={0,32,64,96,127};// 축소된 범위//int in1[] ={50, 100};//int out1[] ={50, 100};// 새로 고침 주기(밀리초). 낮은 값은 operation.int refreshCycle =0;// ***************** 구현 중 더 많은 메시지가 전송됨을 의미합니다. *************** ** // 센서의 동작을 변경할 의도가 없다면 이 시점부터 수정하지 마십시오. // Sensorsint sensorValue1의 내부 값 =0;int sensorValue2 =0;// 최소 센서 값 int sensorMin1;int sensorMin2;// 출력 컨트롤러 값int controllerValue1 =0;int controllerValue2 =0;// 동일한 메시지의 반복을 피하기 위해 사용된 이전 주기 값int previousControllerValue1 =0;int previousControllerValue2 =0;// 범위 변환 변수 initint outputRange1;int outputRange2;int sensorLow1; int sensorLow2;int sensorHigh1;int sensorHigh2;void setup() { MIDI.begin(1);#ifdef DEBUG Serial.begin(115200); //디버그 모드만 해당#endif// 10개의 첫 번째 값을 평균하여 센서의 정지점을 보정합니다. 장치를 부팅하는 동안 센서를 사용하지 마십시오. sensorMin1 =adc.read(sensorPin1); sensorMin2 =0;// 선택한 컨트롤러의 출력 범위를 결정합니다. outputRange1 =outputRange(controllerNumber1); outputRange2 =outputRange(controllerNumber2);}void loop() {// 센서에서 값을 읽습니다. sensorValue1 =adc.read(sensorPin1); // 날리는 공기 sensorValue2 =sensorMin1 - sensorValue1; // 공중에서 그리기 // 이전 값 저장 previousControllerValue1 =controllerValue1; 이전컨트롤러값2 =컨트롤러값2; // 센서 업/다운에 대한 사용 가능한 범위 제한 sensorLow1 =sensorMin1 + lowThreshold1; sensorLow2 =sensorMin2 + lowThreshold2; sensorHigh1 =sensorLow1 + sensorRange1 - highThreshold1; sensorHigh2 =min(sensorMin1,sensorRange2) - highThreshold2;// "in" 및 "in"에 정의된 곡선을 사용하여 내부 값을 출력 범위로 변환 "아웃" 테이블. controllerValue1 =map(mapToCurve(constrain(sensorValue1,sensorLow1,sensorHigh1),sensorLow1,sensorHigh1,in1,out1,sizeof(in1)/sizeof(int)),sensorLow1,sensorHigh1,0,outputRange1); controllerValue2 =map(mapToCurve(constrain(sensorValue2,sensorLow2,sensorHigh2),sensorLow2,sensorHigh2,in2,out2,sizeof(in2)/sizeof(int)),sensorLow2,sensorHigh2,0,outputRange2);// 다음 경우 MIDI 메시지 전송 컨트롤러값1 !=이전컨트롤러값1) sendSensorOutput(컨트롤러번호1, 컨트롤러값1, 컨트롤러채널1); if (controllerValue2 !=previousControllerValue2) sendSensorOutput(controllerNumber2, controllerValue2, controllerChannel2);// Debug#ifdef DEBUG// 센서(입력) 값(디버그에 대한 주석 해제)// Serial.print(sensorValue1);// Serial.print(" ,");// Serial.print(sensorValue2);// Serial.print(","); // 컨트롤러(출력) 값 Serial.print(controllerValue1); Serial.print(","); Serial.println (controllerValue2);#endif //  밀리초 동안 프로그램 중지:delay(refreshCycle);}// 컨트롤러 번호에 따라 MIDI 메시지를 보내는 데 사용되는 함수void sendSensorOutput(int number, int value, int channel) { if (숫자 <128) MIDI.sendControlChange(숫자, 값, 채널); else if (숫자 ==128) MIDI.sendAfterTouch(값, 채널); else if (숫자 ==129) MIDI.sendPitchBend(값, 채널); else if (number ==130) MIDI.sendPitchBend(-value, channel);}// 특정 컨트롤러의 범위를 결정하는 데 사용되는 함수입니다. 이는 피치 벤드가 일반 컨트롤러보다 범위가 더 넓기 때문입니다. int outputRange (int number) { if (number> 128) return 8191; else return 127;}// 커브 생성에 사용되는 수정된 multiMap 함수. 원본:Rob Tillaart.int mapToCurve(int val, int sensorLow, int sensorHigh, int* _in, int* _out, uint8_t size){ // 값이 범위 내에 있어야 합니다. // val =constrain(val, _in[0] , _in[크기-1]); if (val <=map(_in[0],0,127,sensorLow,sensorHigh)) return map(_out[0],0,127,sensorLow,sensorHigh); if (val>=map(_in[size-1],0,127,sensorLow,sensorHigh)) return map(_out[size-1],0,127,sensorLow,sensorHigh); // 검색 오른쪽 간격 uint8_t pos =1; // _in[0]은 이미 테스트되었습니다. while(val> map(_in[pos],0,127,sensorLow,sensorHigh)) pos++; // ..127에서 센서 범위로 범위 조정 int inPos =map(_in[pos],0,127,sensorLow,sensorHigh); int outPos =map(_out[pos],0,127,sensorLow,sensorHigh); int inPrv =map(_in[pos-1],0,127,sensorLow,sensorHigh); int outPrv =map(_out[pos-1],0,127,sensorLow,sensorHigh); // 이것은 _in 배열의 모든 정확한 "점"을 처리합니다. if (val ==inPos) return outPos; // 나머지를 위해 오른쪽 세그먼트에서 보간합니다. return ((long)val - (long)inPrv) * ((long)outPos - (long)outPrv) / ((long)inPos - (long)inPrv) + (long) outPrv;}

    회로도

    프리징 도식 Circuitlab 회로도

    제조공정

    1. 비행 시뮬레이터용 Arduino가 있는 LCD 패널
    2. 웹 운영 DMX 컨트롤러
    3. Arduino 게임 컨트롤러
    4. Unopad - Ableton이 포함된 Arduino MIDI 컨트롤러
    5. 텍스트 텔레포터
    6. 진공 형광 디스플레이 컨트롤러
    7. Alexa에 의해 활성화된 Arduino 홈 컨트롤러
    8. 학교를 위한 SMART 온도 모니터링
    9. Arduino용 절연 아날로그 입력
    10. 멋진 실내 내비게이션용 로봇