Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Arduino Breath Controller barato (USB-MIDI)

Componentes e suprimentos

Arduino Micro
Você provavelmente poderia reduzir o custo com um clone, mas recomendo o original. Apenas o Micro (ATmega32U4) funcionará devido aos recursos USB nativos.
× 1
Tábua de pão sem solda meio tamanho
× 1
Sensor de pressão MPS20N0040D-D
Sujeira barata e muito fácil de encontrar.
× 1
LM358-N Op Amp
Usaremos o popular amplificador operacional LM358 para amplificar o sinal do sensor.
× 1
Resistor 1M ohm
× 2
Kit de conexão de cabo, 22 AWG
Você não precisa de um kit completo, é claro, apenas alguns cm de fio de núcleo sólido.
× 1
Aspirador Nasal Infantil
Sim, você leu certo. Usaremos o bocal dos pais e o aspirador do lado do bebê. Existem dezenas de aspiradores manuais do mesmo tipo (por exemplo, Physiomer Nasal Aspirator, Chicco Physioclean etc.). Escolha o tipo de bocal que você achar mais confortável.
× 1
Tubo para aquário de 5 mm para aviões
Opcional, se o tubo do aspirador não for longo o suficiente. Um tubo padrão para aviões de aquário serve.
× 1
Conector de tubo de ar de 3 vias
Este OEM chinês específico pode ser encontrado facilmente em lojas de aquários com nomes diferentes. Ele se encaixa diretamente no sensor.
× 1

Ferramentas e máquinas necessárias

Decapador e cortador de fio, 32-20 AWG / 0,05-0,5 mm² Fios sólidos e trançados

Aplicativos e serviços online

Arduino IDE

Sobre este projeto





Introdução


Neste projeto, construiremos um controlador de respiração plug-and-play USB MIDI simples. Ele é projetado com componentes baratos e fáceis de encontrar, de modo que o custo total permanece acessível e bem abaixo dos equivalentes comerciais. Esta é a versão básica que usa apenas o sensor de pressão de ar, mas o plano é atualizá-lo para incluir um sensor de mordida e inclinação / inclinação no futuro.

O projeto pressupõe alguns conhecimentos básicos de eletrônica e Arduino, mas mesmo um iniciante pode construí-lo, pois não há solda envolvida. É claro que usuários mais avançados podem soldar tudo em um protoboard permanente. Não estou cobrindo a instalação do IDE / bibliotecas e instruções para fazer upload de código, pois há excelentes tutoriais na Internet.

A sobreamostragem é usada para suavizar a entrada do sensor com resultados muito bons. Você também pode ajustar a faixa de acordo com sua preferência e até mesmo marcar curvas personalizadas para ajustar o comportamento do controlador.

Como o sensor também pode medir a pressão negativa, há um segundo fluxo de mensagens do controlador que é emitido quando você puxa o ar em vez de soprar. Ambos os tipos de mensagens podem ser definidos pelo usuário. Por exemplo, você pode definir o sopro para a curvatura do pitch para cima e o draw in para a curvatura do pitch para baixo. Por padrão, ambos são definidos como controlador nº. 2





Etapas para construir


1. Insira o Arduino na placa de ensaio conforme mostrado na foto / esquema.

2. Insira o sensor e o amplificador operacional em suas respectivas posições, observe a orientação com base nas pequenas reentrâncias em seus lados.

3. Insira os resistores depois de cortar suas pernas nos comprimentos apropriados.

4. Corte / descasque os cabos de núcleo sólido e coloque-os em suas respectivas posições. Usei vermelho para 5V, preto para terra e amarelo para sinal para tornar isso mais fácil de entender, mas você pode usar o que tiver disponível.

5. Conecte o bocal, tubo, conector de 3 vias e aspirador conforme mostrado na foto. Você precisará cortar um pedaço do tubo para a "exaustão".

6. Pressione o conector de 3 vias para que ele se encaixe no sensor. Deve ficar parado.

7. Instale o Arduino IDE e instale as duas bibliotecas necessárias (Oversampling e USB-MIDI) em Ferramentas-> Gerenciar bibliotecas. Conecte o Arduino com um cabo USB ao seu computador. Faça upload do código em anexo.

8. Você deve estar configurado, o Arduino agora deve aparecer como um dispositivo MIDI em seu software DAW / Music. Habilite-o e direcione-o junto com seu teclado para um plug-in compatível com controlador de respiração.






Informações avançadas


Uma desvantagem física desse design é a saliva que inevitavelmente fluirá no tubo e pode causar flutuações perceptíveis no fluxo de ar. O conector de 3 vias é usado para resolver esse problema, direcionando a saliva para o tubo de "exaustão". Para minimizar a saliva presa no tubo, certifique-se de que haja uma inclinação contínua do bocal ao conector de 3 vias, ajustando o comprimento do tubo. Se o tubo ficar pendurado abaixo do nível do conector de 3 vias, a saliva ficará presa em seu ponto inferior, causando flutuações. A parte do lado do bebê do aspirador, incluindo seu filtro, é conectada ao exaustor para minimizar o gotejamento, bem como o ruído, e aumentar o fluxo de ar para o sensor.

No código, existem valores que você pode ajustar ao seu gosto, incluindo curvas personalizadas. Os comentários descrevem como fazer isso. Se você achar que é difícil chegar ao ponto 127, diminua o alcance máximo, ou se for muito fácil, aumente-o. Sempre que você alterar os valores, precisará recarregar o código.

As primeiras leituras após a inicialização do Arduino são calculadas para calibrar a posição de repouso. Não sopre no tubo enquanto conecta / reinicializa o dispositivo.

Você pode alterar o nome do dispositivo MIDI editando o arquivo boards.txt (informações sobre como fazer isso para cada plataforma estão disponíveis na internet).

Código

  • Código do controlador de respiração
Código do controlador de respiração Arduino
Carregue este código para seu controlador de respiração via Arduino IDE
 / * Controlador de respiração * /// Bibliotecas usadas - instale-as em Ferramentas-> Gerenciar bibliotecas # include  #include  // Modo de depuração (descomente para ativar) // # define DEBUG 1 // Criação da interface USB MIDIUSBMIDI_CREATE_DEFAULT_INSTANCE (); // Oversampling initOversampling adc (10, 13, 6); // *********** ****** Configuração do usuário ***************** // Os valores que terminam em 1 correspondem a sopro, enquanto os que terminam em 2 a desenhar no ar // Pin setupconst int sensorPin1 =A0; // selecione o pino de entrada do Arduino para a saída Sensor / Op Amp // Calibração de faixa. Ajuste manualmente para que você possa atingir o máximo, mas não muito facilmente.int sensorRange1 =800; int sensorRange2 =800; // Número do controlador de saída. Selecione na tabela abaixo // 0-127:mensagens regulares de alteração de controle // 128:aftertouch monofônico // 129:Pitch Bend Up // 130:Pitch Bend Down int controllerNumber1 =2; // Controlador enviado ao soprarint controllerNumber2 =2; // Controlador enviado ao desenhar no ar // Controlador de saída channelsint controllerChannel1 =1; int controllerChannel2 =1; // Limites de segurança para valores mais baixos e mais altos para evitar flutuações quando em repouso ou máx. // Se várias mensagens forem enviadas em repouso, aumente o limite inferior. // Se várias mensagens forem enviadas no máximo, aumente o limite alto. const int lowThreshold1 =5; const int lowThreshold2 =5; const int highThreshold1 =0; const int highThreshold2 =0; // Definição da curva. As tabelas podem ter qualquer legth igual ou maior que 2. Os valores podem ser 0-127. As tabelas devem ter o mesmo número de elementos e as tabelas "em" devem estar em ordem crescente.// As conversões são feitas em um nível de leituras, de modo que a perda de definição é minimizada.int in1 [] ={0, 127}; int out1 [] ={0, 127}; int in2 [] ={0, 127}; int out2 [] ={0, 127}; // Curvas de exemplo (modificar o número do sensor de acordo) // Soft // int in1 [] ={ 0, 6,24,78,127}; // int out1 [] ={0,32,64,96,127}; // Intervalo reduzido // int in1 [] ={50, 100}; // int out1 [] ={50, 100}; // Ciclo de atualização (milissegundos). Valores mais baixos significam que mais mensagens são enviadas durante operation.int refreshCycle =0; // ****************** Implementation *************** ** // Não modifique a partir deste ponto se você não tiver a intenção de alterar a operação do sensor.// Valor interno dos sensoresint sensorValue1 =0; int sensorValue2 =0; // Valores mínimos do sensor int sensorMin1; int sensorMin2; // Output controller valuesint controllerValue1 =0; int controllerValue2 =0; // Valores de ciclo anteriores usados ​​para evitar a repetição de mensagens idênticasint previousControllerValue1 =0; int previousControllerValue2 =0; // Variável de conversão de intervalo initint outputRange1; int outputRange2; int sensorLow1; int sensorLow2; int sensorHigh1; int sensorHigh2; configuração vazia () {MIDI.begin (1); # ifdef DEBUG Serial.begin (115200); // Apenas para o modo de depuração # endif // Calibra o ponto de descanso do sensor calculando a média dos 10 primeiros valores. Não use o sensor durante a inicialização do dispositivo. sensorMin1 =adc.read (sensorPin1); sensorMin2 =0; // Determina as faixas de saída para os controladores escolhidos outputRange1 =outputRange (controllerNumber1); outputRange2 =outputRange (controllerNumber2);} void loop () {// ler o valor do sensor:sensorValue1 =adc.read (sensorPin1); // Soprando sensorValue2 =sensorMin1 - sensorValue1; // Desenhando no ar // Armazena os valores anteriores previousControllerValue1 =controllerValue1; previousControllerValue2 =controllerValue2; // Limites da faixa utilizável para aumentar / diminuir o sensor sensorLow1 =sensorMin1 + lowThreshold1; sensorLow2 =sensorMin2 + lowThreshold2; sensorHigh1 =sensorLow1 + sensorRange1 - highThreshold1; sensorHigh2 =min (sensorMin1, sensorRange2) - highThreshold2; // Converte os valores internos para a faixa de saída (0..127 para controladores / aftertouch 0 .. + / - 8191 para Pitchbend Up / Down) usando as curvas definidas em "in" e tabelas "fora". 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); // Enviar mensagens MIDI se ( controllerValue1! =previousControllerValue1) sendSensorOutput (controllerNumber1, controllerValue1, controllerChannel1); if (controllerValue2! =previousControllerValue2) sendSensorOutput (controllerNumber2, controllerValue2, controllerChannel2); // Debug # ifdef DEBUG // Sensor (input) values ​​(sem comentário para debug) // Serial.print (sensorValue1); // Serial.print (" , "); // Serial.print (sensorValue2); // Serial.print (", "); // Valores do controlador (saída) Serial.print (controllerValue1); Serial.print (","); Serial.println (controllerValue2); # endif // parar o programa por por  milissegundos:delay (refreshCycle);} // Função usada para enviar mensagens MIDI de acordo com o número do controladorvoid sendSensorOutput (número int, valor int, canal interno) {if (número <128) MIDI.sendControlChange (número, valor, canal); else if (número ==128) MIDI.sendAfterTouch (valor, canal); else if (número ==129) MIDI.sendPitchBend (valor, canal); else if (number ==130) MIDI.sendPitchBend (-value, channel);} // Função usada para determinar a faixa de um controlador específico. Isso ocorre porque o pitch bend tem uma faixa maior do que os controladores regulares.int outputRange (int number) {if (number> 128) return 8191; else return 127;} // Função multiMap modificada usada para criar curvas. Original por Rob Tillaart.int mapToCurve (int val, int sensorLow, int sensorHigh, int * _in, int * _out, uint8_t size) {// tome cuidado para que o valor esteja dentro do intervalo // val =constrain (val, _in [0] , _in [tamanho-1]); if (val <=map (_in [0], 0,127, sensorLow, sensorHigh)) mapa de retorno (_out [0], 0,127, sensorLow, sensorHigh); if (val> =map (_in [size-1], 0,127, sensorLow, sensorHigh)) mapa de retorno (_out [size-1], 0,127, sensorLow, sensorHigh); // pesquisa intervalo direito uint8_t pos =1; // _in [0] já testado while (val> map (_in [pos], 0,127, sensorLow, sensorHigh)) pos ++; // ajustando o intervalo de ..127 ao intervalo do sensor 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); // isto tratará todos os "pontos" exatos na matriz _in if (val ==inPos) return outPos; // interpolar no segmento certo para o resto return ((longo) val - (longo) inPrv) * ((longo) outPos - (longo) outPrv) / ((longo) inPos - (longo) inPrv) + (longo) outPrv;} 

Esquemas

Esquema de Fritzing Circuitlab esquemático

Processo de manufatura

  1. Painel LCD com Arduino para o simulador de vôo
  2. Controlador DMX operado pela web
  3. Controlador de jogo Arduino
  4. Unopad - Controlador Arduino MIDI com Ableton
  5. Teletransportador de texto
  6. Controlador de display fluorescente a vácuo
  7. Arduino Home Controller ativado por Alexa
  8. Monitoramento de temperatura SMART para escolas
  9. Uma entrada analógica isolada para Arduino
  10. Robô para navegação interna supercool