Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Controlador de respiración Arduino barato (USB-MIDI)

Componentes y suministros

Arduino Micro
Probablemente podrías reducir el costo con un clon, pero recomiendo el original. Solo el Micro (ATmega32U4) funcionará debido a las capacidades nativas de USB.
× 1
Protoboard sin soldadura de tamaño medio
× 1
Sensor de presión MPS20N0040D-D
Muy barato y bastante fácil de encontrar.
× 1
Amplificador operacional LM358-N
Usaremos el popular amplificador operacional LM358 para amplificar la señal del sensor.
× 1
Resistencia 1M ohm
× 2
Kit de cables de conexión, 22 AWG
Por supuesto, no necesitas un kit completo, solo unos pocos cm de alambre de núcleo sólido.
× 1
Aspirador nasal para bebés
Sí, leíste bien. Usaremos la boquilla del lado de los padres y el aspirador del lado del bebé. Hay docenas de aspiradores manuales del mismo tipo (por ejemplo, Physiomer Nasal Aspirator, Chicco Physioclean, etc.). Elija el tipo de boquilla que le resulte más cómodo.
× 1
Tubería de aire para acuarios de 5 mm
Opcional, si el tubo del aspirador no es lo suficientemente largo. La tubería estándar de la línea de aire para acuarios servirá.
× 1
Conector de tubo de aire de 3 vías
Este OEM chino específico se puede encontrar fácilmente en tiendas de acuarios con diferentes nombres. Encaja directamente en el sensor.
× 1

Herramientas y máquinas necesarias

Pelacables y cortador, 32-20 AWG / 0.05-0.5 mm² Cables sólidos y trenzados

Aplicaciones y servicios en línea

Arduino IDE

Acerca de este proyecto

Introducción

En este proyecto, construiremos un controlador de respiración plug-and-play MIDI USB simple. Está diseñado con componentes baratos fáciles de encontrar, de modo que el costo total sigue siendo asequible y muy por debajo de los equivalentes comerciales. Esta es la versión básica que solo usa el sensor de presión de aire, pero el plan es actualizarlo para incluir un sensor de mordida y cabeceo / inclinación en el futuro.

El proyecto asume algunos conocimientos básicos de electrónica y Arduino, pero incluso un principiante puede construirlo ya que no requiere soldadura. Por supuesto, los usuarios más avanzados pueden soldar todo en un perma-protoboard. No estoy cubriendo la instalación del IDE / bibliotecas e instrucciones para cargar código, ya que hay excelentes tutoriales en Internet.

El sobremuestreo se utiliza para suavizar la entrada del sensor con muy buenos resultados. También puede ajustar el rango a su gusto e incluso marcar en curvas personalizadas para ajustar el comportamiento del controlador.

Dado que el sensor también puede medir la presión negativa, hay un segundo flujo de mensajes del controlador que se emite cuando aspira aire en lugar de soplar. El usuario puede configurar ambos tipos de mensajes. Por ejemplo, puede configurar Blow para pitch bend up y dibujar para pitch bend down. De forma predeterminada, ambos están configurados como controlador no. 2.

Pasos para construir

1. Inserte el Arduino en la placa de pruebas como se muestra en la foto / esquema.

2. Inserte el sensor y el amplificador operacional en sus respectivas posiciones, observe la orientación basada en las pequeñas muescas en sus lados.

3. Inserte las resistencias después de cortar sus patas a la longitud adecuada.

4. Corte / pele los cables de núcleo sólido y colóquelos en sus respectivas posiciones. He usado rojo para 5V, negro para tierra y amarillo para señal con el fin de hacer esto más fácil de entender, pero por supuesto puede usar lo que tenga disponible.

5. Conecte la boquilla, el tubo, el conector de 3 vías y el aspirador como se muestra en la foto. Deberá cortar un trozo de tubería para el "escape".

6. Presione el conector de 3 vías para que encaje en el sensor. Debería quedarse.

7. Instale el IDE de Arduino e instale las dos bibliotecas necesarias (sobremuestreo y USB-MIDI) desde Herramientas-> Administrar bibliotecas. Conecte el Arduino con un cable USB a su computadora. Sube el código adjunto.

8. Debería estar configurado, el Arduino ahora debería aparecer como un dispositivo MIDI en su DAW / Software de música. Habilítelo y enrutelo junto con su teclado a un complemento que admita el controlador de respiración.

Información avanzada

Un inconveniente físico de este diseño es la saliva que inevitablemente fluirá en el tubo y puede causar fluctuaciones notables en el flujo de aire. El conector de 3 vías se utiliza para abordar este problema al enrutar la saliva al tubo de "escape". Para minimizar la saliva atrapada en el tubo, asegúrese de que haya una pendiente continua desde la boquilla hasta el conector de 3 vías ajustando la longitud del tubo. Si el tubo cuelga por debajo del nivel del conector de 3 vías, la saliva quedará atrapada en su punto inferior causando fluctuaciones. La parte del lado del bebé del aspirador, incluido su filtro, está unida al escape para minimizar el goteo y el ruido y aumentar el flujo de aire al sensor.

En el código hay valores que puedes ajustar a tu gusto, incluidas curvas personalizadas. Los comentarios describen cómo hacer esto. Si le resulta difícil alcanzar el punto 127, disminuya el rango máximo, o si es demasiado fácil, auméntelo. Siempre que cambie los valores, deberá volver a cargar el código.

Las primeras lecturas después del arranque de Arduino se promedian para calibrar la posición de reposo. No sople en el tubo mientras conecta / reinicia el dispositivo.

Puede cambiar el nombre del dispositivo MIDI editando el archivo boards.txt (la información sobre cómo hacer esto para cada plataforma está disponible en Internet).

Código

  • Código del controlador de respiración
Código del controlador Breath Arduino
Cargue este código en su controlador de respiración a través de Arduino IDE
 / * Breath Controller * /// Bibliotecas utilizadas:instálelas desde Herramientas-> Administrar bibliotecas # incluya  #include  // Modo de depuración (descomentar para habilitar) // # definir DEBUG 1 // Creación de la interfaz MIDI USBUSBMIDI_CREATE_DEFAULT_INSTANCE (); // Sobremuestreo initOversampling adc (10, 13, 6); // *********** ****** Configuración de usuario ***************** // Los valores que terminan en 1 corresponden a soplar mientras que los que terminan en 2 a dibujar en el aire // Pin setupconst int sensorPin1 =A0; // seleccione el pin de entrada Arduino para la salida del sensor / amplificador operacional // Calibración de rango. Ajústelo manualmente para que pueda alcanzar el máximo, pero no demasiado fácilmente.int sensorRange1 =800; int sensorRange2 =800; // Número de controlador de salida. Seleccione de la siguiente tabla // 0-127:mensajes de cambio de control regulares // 128:aftertouch monofónico // 129:Pitch Bend Up // 130:Pitch Bend Down int controllerNumber1 =2; // Controlador enviado cuando soplando controllerNumber2 =2; // Controlador enviado al aspirar en aire // Controlador de salida channelsint controllerChannel1 =1; int controllerChannel2 =1; // Umbrales de seguridad para los valores más bajos y más altos para evitar fluctuaciones en reposo o máx. // Si se envían varios mensajes cuando está en reposo, aumente el umbral bajo. // Si se envían varios mensajes cuando está al máximo, aumente el umbral alto. const int lowThreshold1 =5; const int lowThreshold2 =5; const int highThreshold1 =0; const int highThreshold2 =0; // Definición de la curva. Las tablas pueden tener cualquier longitud igual o mayor que 2. Los valores pueden ser 0-127. Las tablas deben tener el mismo número de elementos y las tablas "in" deben estar en orden ascendente.// Las conversiones se realizan a un nivel de lecturas para minimizar la pérdida de definición.int in1 [] ={0, 127}; int out1 [] ={0, 127}; int in2 [] ={0, 127}; int out2 [] ={0, 127}; // Curvas de ejemplo (modifique el número de sensor en consecuencia) // Soft // int in1 [] ={ 0, 6,24,78,127}; // int out1 [] ={0,32,64,96,127}; // Rango reducido // int in1 [] ={50, 100}; // int out1 [] ={50, 100}; // Ciclo de actualización (milisegundos). Los valores más bajos significan que se envían más mensajes durante la operación .int refreshCycle =0; // ***************** Implementación *************** ** // No modifique desde este punto en adelante si no tiene la intención de alterar el funcionamiento del sensor .// Valor interno de Sensorsint sensorValue1 =0; int sensorValue2 =0; // Valores mínimos del sensor int sensorMin1; int sensorMin2; // Valores del controlador de salidaint controllerValue1 =0; int controllerValue2 =0; // Valores del ciclo anterior utilizados para evitar la repetición de mensajes idénticosint previousControllerValue1 =0; int previousControllerValue2 =0; // Variable de conversión de rango initint outputRange1; int outputRange2; int sensorLow1; int sensorLow2; int sensorHigh1; int sensorHigh2; void setup () {MIDI.begin (1); # ifdef DEBUG Serial.begin (115200); // Solo para el modo de depuración # endif // Calibrar el punto de reposo del sensor promediando los 10 primeros valores. No use el sensor mientras arranca el dispositivo. sensorMin1 =adc.read (sensorPin1); sensorMin2 =0; // Determinar rangos de salida para los controladores elegidos outputRange1 =outputRange (controllerNumber1); outputRange2 =outputRange (controllerNumber2);} void loop () {// leer el valor del sensor:sensorValue1 =adc.read (sensorPin1); // Aire soplado sensorValue2 =sensorMin1 - sensorValue1; // Dibujar en el aire // Almacenar valores anteriores previousControllerValue1 =controllerValue1; previousControllerValue2 =controllerValue2; // Límites de rango utilizables para sensor arriba / abajo sensorLow1 =sensorMin1 + lowThreshold1; sensorLow2 =sensorMin2 + lowThreshold2; sensorHigh1 =sensorLow1 + sensorRange1 - highThreshold1; sensorHigh2 =min (sensorMin1, sensorRange2) - highThreshold2; // Convertir los valores internos al rango de salida (0..127 para controladores / aftertouch 0 .. + / - 8191 para Pitchbend Up / Down) usando las curvas definidas en "in" y tablas "fuera". controllerValue1 =map (mapToCurve (constriñe (sensorValue1, sensorLow1, sensorHigh1), sensorLow1, sensorHigh1, in1, out1, sizeof (in1) / sizeof (int)), sensorLow1, sensorHigh1,0, outputRange1); controllerValue2 =map (mapToCurve (constrin (sensorValue2, sensorLow2, sensorHigh2), sensorLow2, sensorHigh2, in2, out2, sizeof (in2) / sizeof (int)), sensorLow2, sensorHigh2,0, outputRange2); // Enviar mensajes MIDI si ( controllerValue1! =previousControllerValue1) sendSensorOutput (controllerNumber1, controllerValue1, controllerChannel1); if (controllerValue2! =previousControllerValue2) sendSensorOutput (controllerNumber2, controllerValue2, controllerChannel2); // Debug # ifdef DEBUG // Sensor (input) values ​​(descomentar para debug) // Serial.print (sensorValue1); // Serial.print (" , "); // Serial.print (sensorValue2); // Serial.print (", "); // Valores del controlador (salida) Serial.print (controllerValue1); Serial.print (","); Serial.println (controllerValue2); # endif // detiene el programa durante  milisegundos:delay (refreshCycle);} // Función utilizada para enviar mensajes MIDI según el número de controlador void sendSensorOutput (int número, int valor, int canal) {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 (número ==130) MIDI.sendPitchBend (-value, channel);} // Función utilizada para determinar el rango de un controlador específico. Esto se debe al hecho de que la inflexión de tono tiene un rango mayor que los controladores normales.int outputRange (int número) {if (número> 128) return 8191; else return 127;} // Función multimapa modificada utilizada para crear curvas. Original de Rob Tillaart.int mapToCurve (int val, int sensorLow, int sensorHigh, int * _in, int * _out, uint8_t size) {// tenga cuidado de que el valor esté dentro del rango // val =constrain (val, _in [0] , _en [tamaño-1]); if (val <=map (_in [0], 0,127, sensorLow, sensorHigh)) return map (_out [0], 0,127, sensorLow, sensorHigh); if (val> =map (_in [tamaño-1], 0,127, sensorLow, sensorHigh)) return map (_out [size-1], 0,127, sensorLow, sensorHigh); // buscar intervalo derecho uint8_t pos =1; // _in [0] ya probado while (val> map (_in [pos], 0,127, sensorLow, sensorHigh)) pos ++; // ajustando el rango de ..127 al rango del 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); // esto manejará todos los "puntos" exactos en la matriz _in if (val ==inPos) return outPos; // interpolar en el segmento derecho para el resto return ((long) val - (long) inPrv) * ((long) outPos - (long) outPrv) / ((long) inPos - (long) inPrv) + (long) outPrv;} 

Esquemas

Esquema de Fritzing Esquema de Circuitlab

Proceso de manufactura

  1. Panel LCD con Arduino para Flight Simulator
  2. Controlador DMX operado por la web
  3. Controlador de juego Arduino
  4. Unopad - Controlador MIDI Arduino con Ableton
  5. Teletransportador de texto
  6. Controlador de pantalla fluorescente al vacío
  7. Controlador Arduino Home activado por Alexa
  8. Monitoreo SMART de temperatura para escuelas
  9. Biblioteca de puertos IO de 8 bits para Arduino
  10. Una entrada analógica aislada para Arduino
  11. Robot para navegación interior supercogedora