Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Arduino Breath Controller Murah (USB-MIDI)

Komponen dan persediaan

Arduino Micro
Anda mungkin dapat menurunkan biaya dengan tiruan tetapi saya merekomendasikan yang asli. Hanya Mikro (ATmega32U4) yang akan berfungsi karena kemampuan USB asli.
× 1
Ukuran Setengah Papan Tempat Memotong Roti Tanpa Solder
× 1
Sensor Tekanan MPS20N0040D-D
Murah dan cukup mudah ditemukan.
× 1
LM358-N Op Amp
Kami akan menggunakan op amp LM358 yang populer untuk memperkuat sinyal sensor.
× 1
Resistor 1M ohm
× 2
Kit Kawat Penghubung, 22 AWG
Tentu saja Anda tidak memerlukan kit lengkap, hanya beberapa cm kabel inti padat.
× 1
Aspirator Hidung Bayi
Yup, Anda membaca dengan benar. Kami akan menggunakan corong sisi orang tua dan aspirator sisi bayi. Ada lusinan aspirator manual dengan tipe yang sama (misalnya Physiomer Nasal Aspirator, Chicco Physioclean, dll.). Pilih jenis corong yang menurut Anda lebih nyaman.
× 1
Tabung maskapai akuarium 5mm
Opsional, jika selang aspirator tidak cukup panjang. Tabung maskapai akuarium standar bisa digunakan.
× 1
Konektor pipa udara 3 arah
OEM Cina khusus ini dapat ditemukan dengan mudah di toko akuarium dengan nama berbeda. Cocok langsung di sensor.
× 1

Alat dan mesin yang diperlukan

Pemotong &Pemotong Kawat, 32-20 AWG / 0,05-0,5 mm² Kabel Solid &Terdampar

Aplikasi dan layanan online

Arduino IDE

Tentang proyek ini

Pendahuluan

Dalam proyek ini kami akan membangun pengontrol nafas plug-and-play USB MIDI sederhana. Ini dirancang menggunakan komponen murah yang mudah ditemukan sehingga total biaya tetap terjangkau dan jauh di bawah ekuivalen komersial. Ini adalah versi dasar yang hanya menggunakan sensor tekanan udara tetapi rencananya akan ditingkatkan untuk menyertakan sensor gigitan dan anggukan/miring di masa mendatang.

Proyek ini mengasumsikan beberapa pengetahuan elektronik dan Arduino yang sangat mendasar, tetapi bahkan seorang pemula dapat membangunnya karena tidak ada penyolderan yang terlibat. Tentu saja pengguna yang lebih mahir dapat menyolder semuanya di perma-protoboard. Saya tidak membahas pemasangan IDE/pustaka dan instruksi untuk mengunggah kode karena ada tutorial yang sangat bagus di internet.

Oversampling digunakan untuk menghaluskan input sensor dengan hasil yang sangat baik. Anda juga dapat menyesuaikan rentang sesuai keinginan Anda dan bahkan memutar di kurva khusus untuk menyesuaikan perilaku pengontrol.

Karena sensor dapat mengukur tekanan negatif juga, ada aliran kedua pesan pengontrol yang dikeluarkan saat Anda menarik udara alih-alih meniup. Kedua jenis pesan tersebut dapat diatur oleh pengguna. Misalnya Anda dapat mengatur pukulan untuk pitch membungkuk dan menarik untuk pitch membungkuk. Secara default keduanya diatur ke pengontrol no. 2.

Langkah-langkah untuk membangun

1. Masukkan Arduino ke breadboard seperti yang ditunjukkan pada foto/skema.

2. Masukkan sensor dan op amp ke posisinya masing-masing, perhatikan orientasinya berdasarkan lekukan kecil di sisinya.

3. Masukkan resistor setelah memotong kakinya dengan panjang yang sesuai.

4. Potong/kupas kabel inti padat dan letakkan di posisinya masing-masing. Saya telah menggunakan merah untuk 5V, hitam untuk ground dan kuning untuk sinyal agar lebih mudah dipahami, tetapi Anda tentu saja dapat menggunakan apa pun yang tersedia.

5. Hubungkan corong, tabung, konektor 3 arah dan aspirator seperti yang ditunjukkan pada foto. Anda perlu memotong bagian pipa untuk "knalpot".

6. Tekan konektor 3 arah agar pas dengan sensor. Itu harus tetap di tempatnya.

7. Instal Arduino IDE dan instal dua library yang dibutuhkan (Oversampling dan USB-MIDI) dari Tools->Manage Libraries. Hubungkan Arduino dengan kabel USB ke komputer Anda. Unggah kode terlampir.

8. Anda harus mengatur, Arduino sekarang akan muncul sebagai perangkat MIDI di Perangkat Lunak DAW/Musik Anda. Aktifkan dan rutekan bersama keyboard Anda ke plugin yang mendukung pengontrol pernapasan.

Info Lanjut

Salah satu kelemahan fisik dari desain ini adalah air liur yang pasti akan mengalir di dalam tabung dan dapat menyebabkan fluktuasi aliran udara yang nyata. Konektor 3 arah digunakan untuk mengatasi masalah ini dengan mengarahkan air liur ke tabung "knalpot". Untuk meminimalkan air liur yang terperangkap di dalam tabung, pastikan ada kemiringan yang terus menerus dari corong ke konektor 3 arah dengan menyesuaikan panjang tabung. Jika tabung menggantung di bawah level konektor 3 arah, air liur akan terperangkap di titik bawahnya yang menyebabkan fluktuasi. Bagian sisi bayi dari aspirator termasuk filternya dipasang ke knalpot untuk meminimalkan tetesan serta kebisingan dan meningkatkan aliran udara ke sensor.

Di dalam kode tersebut terdapat nilai-nilai yang bisa Anda sesuaikan dengan keinginan Anda, termasuk custom curves. Komentar menjelaskan bagaimana melakukan ini. Jika Anda merasa sulit untuk mencapai 127 poin, kurangi jangkauan maksimum, atau jika terlalu mudah, tingkatkan. Setiap kali Anda mengubah nilai, Anda harus mengunggah ulang kode.

Beberapa pembacaan pertama setelah Arduino boot dirata-ratakan untuk mengkalibrasi posisi istirahat. Jangan meniup ke dalam tabung saat menghubungkan/menyetel ulang perangkat.

Anda dapat mengubah nama perangkat MIDI dengan mengedit file boards.txt (info tentang cara melakukannya untuk setiap platform tersedia di internet).

Kode

  • Kode pengontrol napas
Kode pengontrol nafasArduino
Unggah kode ini ke pengontrol napas Anda melalui Arduino IDE
/* Breath Controller*///Libraries used - instal dari Tools->Manage Libraries#include #include // Mode debug (batalkan komentar untuk mengaktifkan)//#define DEBUG 1//Pembuatan antarmuka MIDI USBUSBMIDI_CREATE_DEFAULT_INSTANCE();//Oversampling initOversampling adc(10, 13, 6);// *********** ****** Pengaturan Pengguna ***************** // Nilai yang diakhiri dengan 1 sesuai dengan hembusan sementara yang diakhiri dengan 2 untuk menggambar di udara// Pengaturan pinconst int sensorPin1 =A0; // pilih pin input Arduino untuk output Sensor/Op Amp// Range Calibration. Sesuaikan ini secara manual sehingga Anda dapat mencapai maksimum tetapi tidak terlalu mudah.int sensorRange1 =800;int sensorRange2 =800;// Nomor pengontrol keluaran. Pilih dari tabel di bawah// 0-127:pesan perubahan kontrol reguler// 128:aftertouch monofonik// 129:Pitch Bend Up // 130:Pitch Bend Down int controllerNumber1 =2; // Kontroler terkirim saat blowingint controllerNumber2 =2; // Kontroler dikirim saat menggambar di udara// Output controller channelsint controllerChannel1 =1;int controllerChannel2 =1;// Ambang keamanan untuk nilai terendah dan tertinggi untuk menghindari fluktuasi saat istirahat atau maks. // Jika beberapa pesan dikirim saat istirahat, tingkatkan lowThreshold. // Jika banyak pesan terkirim saat maksimal, tingkatkan ambang batas. const int lowThreshold1 =5;const int lowThreshold2 =5;const int highThreshold1 =0;const int highThreshold2 =0;// Definisi kurva. Tabel dapat memiliki panjang yang sama atau lebih besar dari 2. Nilai dapat berupa 0-127 . Tabel harus memiliki jumlah elemen yang sama dan tabel "dalam" harus dalam urutan menaik.// Konversi dilakukan pada tingkat pembacaan sehingga kehilangan definisi diminimalkan.int in1[] ={0, 127};int out1[] ={0, 127};int in2[] ={0, 127};int out2[] ={0, 127};// Contoh kurva (modifikasi nomor sensor yang sesuai)//Soft//int in1[] ={ 0, 6,24,78,127};//int out1[] ={0,32,64,96,127};// Rentang yang dikurangi//int in1[] ={50, 100};//int out1[] ={50, 100};// Siklus Segarkan (milidetik). Nilai yang lebih rendah berarti lebih banyak pesan yang dikirim selama operation.int refreshCycle =0;// ***************** Implementasi *************** ** // Jangan ubah dari titik ini dan seterusnya jika Anda tidak bermaksud mengubah pengoperasian sensor.// Nilai Internal Sensorsint sensorValue1 =0;int sensorValue2 =0;// Nilai sensor minimum int sensorMin1;int sensorMin2;// Nilai pengontrol keluaranint controllerValue1 =0;int controllerValue2 =0;// Nilai siklus sebelumnya digunakan untuk menghindari pengulangan pesan identikint sebelumnyaControllerValue1 =0;int sebelumnyaControllerValue2 =0;// Variabel konversi rentang initin outputRange1;int outputRange2;int sensorLow1; int sensorLow2;int sensorHigh1;int sensorHigh2;void setup() { MIDI.begin(1);#ifdef DEBUG Serial.begin (115200); //Hanya untuk mode debug#endif// Kalibrasi titik istirahat sensor dengan rata-rata 10 nilai pertama. Jangan gunakan sensor saat mem-boot perangkat. sensorMin1 =adc.read(sensorPin1); sensorMin2 =0;// Tentukan rentang output untuk pengontrol yang dipilih outputRange1 =outputRange(controllerNumber1); outputRange2 =outputRange(controllerNumber2);}void loop() {// membaca nilai dari sensor:sensorValue1 =adc.read(sensorPin1); // Meniup nilai sensor udara2 =sensorMin1 - sensorValue1; // Menggambar di udara// Menyimpan nilai sebelumnya PreviousControllerValue1 =controllerValue1; sebelumnyaControllerValue2 =controllerValue2; // Batas jangkauan yang dapat digunakan untuk sensor atas/bawah sensorLow1 =sensorMin1 + lowThreshold1; sensorLow2 =sensorMin2 + lowThreshold2; sensorHigh1 =sensorLow1 + sensorRange1 - highThreshold1; sensorHigh2 =min(sensorMin1,sensorRange2) - highThreshold2;// Mengonversi nilai internal ke rentang output (0..127 untuk pengontrol/aftertouch 0..+/-8191 untuk Pitchbend Atas/Bawah) menggunakan kurva yang ditentukan dalam "dalam" dan tabel "keluar". controllerValue1 =peta(mapToCurve(constrain(sensorValue1,sensorLow1,sensorHigh1),sensorLow1,sensorHigh1,in1,out1,sizeof(in1)/sizeof(int)),sensorLow1,sensorHigh1,0,outputRange1); controllerValue2 =peta(mapToCurve(constrain(sensorValue2,sensorLow2,sensorHigh2),sensorLow2,sensorHigh2,in2,out2,sizeof(in2)/sizeof(int)),sensorLow2,sensorHigh2,0,outputRange2);// Kirim pesan MIDI jika ( controllerValue1 !=PreviousControllerValue1) sendSensorOutput(controllerNumber1, controllerValue1, controllerChannel1); if (controllerValue2 !=PreviousControllerValue2) sendSensorOutput(controllerNumber2, controllerValue2, controllerChannel2);// Debug#ifdef DEBUG// Nilai sensor (input) (batalkan komentar untuk debug)// Serial.print (sensorValue1);// Serial.print (" ,");// Serial.print (sensorValue2);// Serial.print (","); // Controller (output) nilai Serial.print (controllerValue1); Serial.print(","); Serial.println (controllerValue2);#endif // menghentikan program selama  milidetik:delay(refreshCycle);}// Fungsi yang digunakan untuk mengirim pesan MIDI sesuai dengan nomor pengontrolvoid sendSensorOutput (angka int, nilai int, saluran int) { if (angka <128) MIDI.sendControlChange(angka, nilai, saluran); else if (angka ==128) MIDI.sendAfterTouch(nilai, saluran); else if (angka ==129) MIDI.sendPitchBend(nilai, saluran); else if (number ==130) MIDI.sendPitchBend(-value, channel);}// Fungsi yang digunakan untuk menentukan rentang pengontrol tertentu. Hal ini disebabkan oleh fakta bahwa pitch bend memiliki jangkauan yang lebih besar dari controllers.int biasa outputRange (int number) { if (number> 128) return 8191; else return 127;}// Fungsi multiMap yang dimodifikasi digunakan untuk membuat kurva. Asli oleh Rob Tillaart.int mapToCurve(int val, int sensorLow, int sensorHigh, int* _in, int* _out, uint8_t size){ // berhati-hatilah agar nilainya dalam jangkauan // val =constrain(val, _in[0] , _dalam[ukuran-1]); if (val <=map(_in[0],0,127,sensorLow,sensorHigh)) mengembalikan peta(_out[0],0,127,sensorLow,sensorHigh); if (val>=map(_in[size-1],0,127,sensorLow,sensorHigh)) mengembalikan peta(_out[size-1],0,127,sensorLow,sensorHigh); // cari interval kanan uint8_t pos =1; // _in[0] sudah diuji while(val> map(_in[pos],0,127,sensorLow,sensorHigh)) pos++; // menyesuaikan rentang dari ..127 ke rentang sensor int inPos =map(_in[pos],0,127,sensorLow,sensorHigh); int outPos =map(_out[pos],0,127,sensorLow,sensorHigh); int inPrv =peta(_in[pos-1],0,127,sensorRendah,sensorTinggi); int outPrv =peta(_out[pos-1],0,127,sensorRendah,sensorTinggi); // ini akan menangani semua "poin" yang tepat dalam array _in jika (val ==inPos) mengembalikan outPos; // interpolasi di segmen kanan untuk pengembalian sisanya ((panjang)val - (panjang)inPrv) * ((panjang)outPos - (panjang)outPrv) / ((panjang)inPos - (panjang)inPrv) + (panjang) outPrv;}

Skema

Skema Fritzing Skema Circuitlab

Proses manufaktur

  1. Panel LCD dengan Arduino untuk Simulator Penerbangan
  2. Pengontrol DMX yang Dioperasikan Web
  3. Pengontrol Game Arduino
  4. Unopad - Pengontrol MIDI Arduino dengan Ableton
  5. Teleporter Teks
  6. Pengontrol Tampilan Fluorescent Vakum
  7. Arduino Home Controller Diaktifkan oleh Alexa
  8. Pemantauan Suhu CERDAS untuk Sekolah
  9. Input Analog Terisolasi untuk Arduino
  10. Robot untuk navigasi dalam ruangan yang sangat keren