Buat Piano Sentuh Kapasitif Portabel dengan Arduino – Panduan Langkah demi Langkah
Komponen dan Perlengkapan
Kotak Pelindung ProtoStax untuk Arduino
ProtoStax untuk Arduino - Kotak Pelindung Tumpuk, Modular
×
1
Shield Sentuh Kapasitif 12 x Adafruit untuk Arduino - MPR121
×
1
Buzzer Piezo Adafruit - PS1240
×
1
Arduino UNO
×
1
Tembaga Foil dengan Lem Konduktif
×
1
Kit Kabel Penghubung, 22 AWG
×
1
Tentang Proyek Ini
Dalam proyek ini, saya menjelaskan cara membuat piano sentuh kapasitif portabel dengan
sebuah Arduino,
sebuah Shield Sentuh Kapasitif untuk Arduino menggunakan MPR121,
sebuah buzzer piezo,
tembaga foil dengan lem konduktif (dipotong dalam bentuk kunci piano),
semua dibungkus dalam kotak akrilik jernih (ProtoStax untuk Arduino) dengan kunci sentuh kapasitif ditempel pada permukaan atasnya. Ini membuatnya menjadi piano kecil yang kompak yang dapat Anda bawa kemana saja dan bermusik sambil menulis kode lagu baru!
Untuk penginderaan sentuh kapasitif, saya menggunakan 12 x Shield Sentuh Kapasitif Adafruit untuk Arduino menggunakan MPR121, bersama dengan library Adafruit_MPR121 yang memudahkan untuk mendeteksi dan merespons sentuhan pada hingga 12 permukaan konduktif yang berbeda.
Tunggu sebentar! Ada 12 nada semi dalam satu Oktaf - C, C#, D, D#, E, E#, F, G, G#, A, A#, B! Sempurna! Tapi akan bagus jika MPR121 menangani 13 input - itu akan memungkinkan kita pergi dari C ke C dari oktaf yang lebih tinggi, tetapi masih ada banyak lagu yang dapat dimainkan! (dan saya juga menawarkan saran di bawah tentang bagaimana Anda dapat membawa proyek ini lebih jauh dengan memperluas rentang oktaf)
Selain itu, Anda juga dapat memprogram urutan sentuhan Anda sendiri ("Kunci Rahasia" atau kombinasi kunci) untuk memainkan lagu acak mana pun yang dapat mencakup sebanyak mungkin oktaf yang Anda inginkan (terbatas hanya oleh kemampuan telinga Anda untuk mendengar nada, atau piezo/speaker Anda untuk memainkannya!).
Untuk output, saya menggunakan library tone Arduino untuk memainkan suara melalui buzzer piezo. Anda juga dapat menggunakan speaker - hanya ingat untuk menggunakan resistor untuk membatasi arus sesuai yang dapat disediakan oleh pin Arduino!
Untuk kunci piano, saya menggunakan tembaga foil dengan lem konduktif. Penting untuk mendapatkan yang dengan lem konduktif karena Anda akan menempelkan foil tersebut ke kabel yang terhubung ke shield.
Terakhir adalah kotak pelindung. Beberapa dari Anda mungkin tahu bahwa saya telah membuat sistem kotak pelindung tumpuk, modular baru yang disebut ProtoStax. Ini adalah gatal pribadi yang harus saya gores - saya ingin kotak pelindung yang mendukung berbagai tahap prototyping, menawarkan perlindungan dan akses terbuka saat memulai, dengan kemampuan untuk menambahkan dinding sisi dan atas nanti, tetapi juga memiliki kemampuan untuk menumpuk beberapa unit berdampingan atau satu di atas yang lain, sehingga memiliki kemampuan untuk memperluas dengan kebutuhan prototyping dan penambahan papan serta komponen lainnya.
Dalam contoh ini saya menggunakan ProtoStax untuk Arduino, kotak pelindung akrilik jernih untuk Arduino -- ini cocok untuk footprint Uno/Leonardo serta footprint yang lebih besar Mega/Due -- yang juga dapat ditumpuk dan modular serta memiliki tempat yang nyaman untuk kedua Shield (dengan beberapa modifikasi kecil, yang akan saya garis besar). Kotak ini jernih dan kokoh dan juga memiliki karet kaki untuk sedikit mengangkatnya dan melindungi permukaan meja Anda. Permukaan atas kotak pelindung juga berfungsi sebagai papan kunci untuk piano sentuh Anda - ini di tempat Anda akan menempelkan tembaga foil konduktif Anda! Pada akhirnya, Anda akan memiliki piano sentuh kecil yang cerdas yang dapat Anda bawa dengan mudah dan dipamerkan dan bermain bersama! 😊
Oke, mari kita mulai, ya? 😊
Langkah 1 - Pasang Arduino ke Papan Dasar Kotak Pelindung
Mari kita pasang Arduino (Uno dalam contoh kami) ke papan dasar kotak pelindung terlebih dahulu. Ini memberikan perlindungan sambil menawarkan akses penuh untuk mengonfigurasi dan mengatur Arduino dan mencoba-cobanya. Saat Anda siap untuk menutupnya, mudah untuk menambahkan dinding sisi dan papan atas dan mengamankan semuanya dengan sekrup.
Pasang Arduino ke papan dasar, dan tambahkan kaki serta perangkat keras lainnya untuk menyiapkan kotak pelindung di Platform Configuration. Lihat langkah-langkah di bawah ini dalam slideshow - keterangan untuk setiap gambar diurutkan dan memberikan penjelasan tambahan untuk setiap langkah.
Berikut semua langkah dalam bentuk gif animasi:
Langkah 2 - Siapkan Shield MPR121 untuk Arduino
Saya memotong 12 potongan kabel stranded 22 AWG sesuai panjang. Kemudian saya men-solder kabel-kabel ini ke Shield MPR121. Shield Adafruit memiliki dua lubang besar untuk masing-masing 12 input untuk diceklepi dengan klip aligator. Di antara dua lubang ini ada lubang reguler yang lebih kecil yang akan menampung kabel 22 AWG.
Shield MPR121 juga mengekspos semua pin melalui lubang di sisi header. Saya juga men-solder Buzzer Piezo PS1240, dengan satu kaki dimasukkan ke pin 12 dan yang lain ke GND.
Saya memastikan untuk mencabut ujung lain (bebas) dari setiap kabel. Saya menggunakan pola berulang dari 6 warna berbeda untuk 12 input, untuk mengkode warna, sehingga urutan dapat dipertahankan nanti saat merakit.
Langkah 3 - Siapkan Kotak Pelindung
Selanjutnya, kita perlu menyiapkan kotak pelindung. Kami mulai dengan memasukkan shield ke Arduino yang dipasang di Papan Dasar. Kemudian kita memasukkan Elemen Penopang Atas, dan Dinding Sisi ke dalam slot dinding.
Saya telah mengambil stock atas kotak pelindung ProtoStax untuk Arduino dan menambahkan 12 lubang di dalamnya untuk memasukkan kabel dari input shield melalui. Saya menggunakan pemotong laser untuk memotong lubang yang cocok dengan templat kunci piano, tetapi Anda juga dapat dengan mudah menggunakan bor (pastikan untuk menggunakan selembar masking tape pada plat akrilik sebelum bor). Lubang kecil 1/8" sudah cukup.
Saya kemudian dengan hati-hati memasukkan kabel dari shield ke lubang di Papan Atas - saya memastikan untuk memasukkan kabel dari lubang 0 ke lubang paling kiri, dan memasukkan kabel yang diurutkan secara progresif (mereka diurutkan pada shield) ke lubang dari kiri ke kanan. Saya kemudian menambahkan Spacer Atas di bawah Papan Atas, dan memasang sekrup atas untuk menyelesaikan kotak pelindung.
Selanjutnya, saya mendorong kabel kembali hingga hanya bagian logam yang mengepul di luar.
Saya kemudian memotong potongan dari gulungan Tembaga Foil dengan Lem Konduktif dalam bentuk Kunci Piano dari templat (lihat di bawah untuk templat). Saya kemudian dengan hati-hati melepaskan tembaga foil dan menempelkannya di posisi masing-masing di Papan Atas kotak pelindung, memastikan bahwa lem tembaga menempel pada kabel yang menggepul dari lubang yang sesuai.
Ini adalah templat untuk Kunci Piano dan lubang. Anda seharusnya dapat mencetaknya pada kertas Letter 8.5x11 dan memiliki ukuran yang benar (beritahu saya jika Anda mengalami masalah!)
Pada akhirnya, terlihat seperti ini: (Saya mungkin bisa melakukan pekerjaan yang lebih baik dengan lem tembaga foil, tetapi ini adalah kali pertama saya menggunakannya, jadi semoga saya akan lebih mahir dalam menanganinya di masa depan! 😊)
Langkah 4 - Kode Demo
Pertama Anda perlu menginstal library Adafruit_MPR121. Setelah itu, Anda dapat mengompilasi dan mengunggah sketch contoh, yang mengubah ciptaan Anda menjadi piano sentuh, dan menyertakan kombinasi kunci rahasia untuk memainkan beberapa jingle.
Tekan C E G B untuk memainkan "Twinkle Twinkle Little Stars"
Tekan C D E F G untuk memainkan skala naik dan turun
Tekan C D A B untuk memainkan "Oh Susanna!"
Tekan C C# A# B untuk memainkan "Frere Jacques/Brother John"
Saya juga telah memudahkan Anda untuk mentranskripsi lagu pilihan Anda sendiri dari partitur lagu Anda.
Jika Anda tertarik untuk membaca lebih banyak tentang kode (dan saya tahu Anda tertarik!), baca lanjut!
Mari kita periksa cepat bagian utama kode. Anda dapat dengan cepat merujuk ke kode demo di sini - https://github.com/protostax/ProtoStax_CapacitiveTouch_Piano_Demo/blob/master/ProtoStax_CapacitiveTouch_Piano_Demo.ino
Kode dapat dibagi menjadi 3 bagian:
Mendapatkan data sentuh dari MPR121 menggunakan library Adafruit_MRP121.
Memutuskan apa yang akan dilakukan dengan data sentuh - yaitu memainkan nada yang sesuai seperti piano, atau mendeteksi sentuhan multi dan kemudian memainkan jingle rahasia, keduanya menggunakan library tone bawaan.
Memrogram lagu, termasuk cara menambahkan lagu Anda sendiri
Ini adalah sekilas tentang bagian sentuh kapasitif dari kode. Seperti biasanya, Anda mendeklarasikan objek dari kelas Adafruit_MPR121. Dalam setup(), Anda memanggil metode begin() untuk menginisialisasinya, dan Anda dapat mendapatkan pad yang sedang disentuh di loop() menggunakan metode cap.touched(). Sederhana!
Adafruit_MPR121 cap = Adafruit_MPR121(); void setup() { ... // Default address is 0x5A, if tied to 3.3V its 0x5B // If tied to SDA its 0x5C and if SCL then 0x5D if (!cap.begin(0x5A)) { Serial.println("MPR121 not found, check wiring?"); while (1); } ... } void loop() { // Get the currently touched pads currtouched = cap.touched(); }
Dengan data sentuh, Anda dapat merespons sentuhan dengan memainkan nada yang sesuai, dan menghentikan nada ketika tombol tidak ditekan:
// if it *is* touched and *wasnt* touched before, play the corresponding tone! if ((currtouched & _BV(i)) && !(lasttouched & _BV(i)) ) { // Serial.print("currtouched = "); Serial.print(currtouched); Serial.print(" lasttouched = "); Serial.print(lasttouched); Serial.print(" "); Serial.print(i); Serial.println(" touched"); tone(TONE_PIN, scale[i]); } // if it *was* touched and now *isnt*, and additionally, no button is being pressed, then stop the tone // This allows for smooth transitions between notes as you slide you finger over the keys // This also allows for sustain of a given note, by touching any key and keeping it touched - you can press another key and it will play that key, but won't stop playing it // until you let go of your first key - kind of like the sustain pedal of the piano! if (!(currtouched & _BV(i)) && (lasttouched & _BV(i)) && !currtouched) { //if (!(currtouched & _BV(i)) && (lasttouched & _BV(i))) { // Serial.print("currtouched = "); Serial.print(currtouched); Serial.print(" lasttouched = "); Serial.print(lasttouched); Serial.print(" "); Serial.print(i); Serial.println(" released"); noTone(TONE_PIN); }
Kami menangani sentuhan multi kunci khusus dengan memainkan lagu yang sesuai:
// Play tunes if our 'secret' combination of keys is pressed! if (currtouched == 2193) { // C E G B playTune(melody, MELODY_LENGTH(melody), 2); // Play Twinkle Twinkle Little Star } else if (currtouched == 181) { // C D E F G playTune(melody2, MELODY_LENGTH(melody2), 48); // Play scale slide up and down } else if (currtouched == 2565) { // C D A B playTune(melody3, MELODY_LENGTH(melody3), 1); // Play Oh Susanna! } else if (currtouched == 3075) { // C C# A# B playTune(melody4, MELODY_LENGTH(melody4), 1); // Play Frere Jacques } else { ...
playTune() digunakan untuk memainkan sebuah lagu, yang merupakan array dari "Note"s
void playTune(Note *m, int mSize, int speedUp) { noTone(TONE_PIN); // Start with a clean slate for (int thisNote = 0; thisNote < mSize; thisNote++) { // to calculate the note duration, take one second multiplies by the note type. //e.g. quarter note = 1000.0 * 0.25, eighth note = 1000 * 1/8 (0.125), etc. // reduce the duration by the speedup factor to increase the speed of playing // by an appropriate amount int noteDuration = 1000.0 * m[thisNote].duration / speedUp; tone(TONE_PIN, m[thisNote].frequency, noteDuration); // to distinguish the notes, set a minimum time between them. // the note's duration + 30% seems to work well: int pauseBetweenNotes = noteDuration * 1.30; delay(pauseBetweenNotes); // stop the tone playing: noTone(TONE_PIN); } delay(100); }
Mari kita lihat sebuah melodi - ini terdiri dari array dari Notes. Setiap Note memiliki frekuensi dan durasi. =
typedef struct Note { int frequency; float duration; } Note; // This melody is playing all the notes of the octave from C up to B and back down to C Note melody2[] = { {NOTE_C, NOTE_WHOLE}, {NOTE_CS, NOTE_WHOLE}, {NOTE_D, NOTE_WHOLE}, {NOTE_DS, NOTE_WHOLE}, {NOTE_E, NOTE_WHOLE}, {NOTE_F, NOTE_WHOLE}, {NOTE_FS, NOTE_WHOLE}, {NOTE_G, NOTE_WHOLE}, {NOTE_GS, NOTE_WHOLE}, {NOTE_A, NOTE_WHOLE}, {NOTE_AS, NOTE_WHOLE}, {NOTE_B, NOTE_WHOLE}, {NOTE_AS, NOTE_WHOLE}, {NOTE_A, NOTE_WHOLE}, {NOTE_GS, NOTE_WHOLE}, {NOTE_G, NOTE_WHOLE}, {NOTE_FS, NOTE_WHOLE}, {NOTE_F, NOTE_WHOLE}, {NOTE_E, NOTE_WHOLE}, {NOTE_DS, NOTE_WHOLE}, {NOTE_D, NOTE_WHOLE}, {NOTE_CS, NOTE_WHOLE}, {NOTE_C, NOTE_WHOLE} };
Inilah tempat #defines di pitches.h dan noteDurations.h berguna. Anda dapat menggunakan ini alih-alih frekuensi dan durasi aktual. Misalnya, gunakan NOTE_C untuk memainkan nada C, dan gunakan NOTE_WHOLE untuk memainkannya sebagai whole note (NOTE_HALF, NOTE_QUARTER, NOTE_EIGHTH adalah beberapa durasi nada lainnya). Anda juga dapat menggunakan makro DOTTED() untuk menentukan nada "dotted" - seperti DOTTED(NOTE_QUARTER).
[Catatan: Nada dotted adalah nada yang durasinya diperpanjang dengan nada setengah dari durasinya - misalnya, nada half dotted setara dengan 3/4 whole note (1/2 note plus 1/2 dari 1/2note). ]
Ini akan memungkinkan Anda untuk mengambil partitur mana pun dan mentranskripsinya ke dalam array melodi Anda!
Dalam demo, saya telah mentranskripsi "Twinkle Twinkle Little Star", "Frere Jacques/Brother John" dan "Oh Susanna!" jadi Anda memiliki sesuatu untuk dimainkan (tidak bermaksud bercanda?! 😜) - semua lagu ini berada dalam satu oktaf, yang adalah batasan keyboard kami yang saya coba patuhi. Tentu saja, saat memainkan lagu rahasia, Anda tidak dibatasi oleh batas ini dan dapat menggunakan beberapa oktaf. "Oh Susanna!" juga sedikit lebih kompleks, menggunakan whole, quarter dan eighth notes dan juga quarter dan half notes "dotted" - semoga ini akan membantu Anda mendapatkan pemahaman yang baik tentang cara mentranskripsi lagu lain dengan mudah.
Mari kita lihatnya dalam aksi, ya? 😊
Langkah 5 - Mengembangkan Lebih Lanjut!
Berikut beberapa ide untuk membawa proyek ini lebih jauh!
1. Buat jingle/lagu Anda sendiri (atau mentranskripsi yang ada) dan tetapkan "Kunci Rahasia" Anda sendiri untuk mengaktifkannya!
2. Tambahkan buzzer piezo kedua untuk mendapatkan suara polifonik 2 level! Library tone menggunakan Timer2 untuk mengirim persegi ke buzzer piezo untuk memainkan nada. Arduino Uno memiliki 3 timer, meskipun Timer 0 khusus dan digunakan untuk hal-hal seperti millis() dan pwm. Itu masih menyisakan Timer1 untuk digunakan. Library NewTone adalah penulisan ulang yang lebih teroptimasi dari library tone, yang menggunakan Timer1. Anda dapat memiliki dua nada pada saat yang sama, satu menggunakan tone dan yang lain menggunakan NewTone, misalnya.
3. Tambahkan satu atau dua tombol tambahan untuk menambahkan fungsionalitas tambahan - seperti menggunakan penekanan tombol untuk memperluas oktaf ke yang lebih tinggi atau lebih rendah. Dengan menekan tombol ini bersamaan dengan kunci sentuh kapasitif Anda, Anda dapat memiliki rentang yang lebih besar pada keyboard Anda!
Bisakah Anda memikirkan yang lainnya? Tulis komentar di bawah untuk memberi tahu kami! 😊 Silakan juga bertanya apapun yang ingin Anda tanyakan! 😊
Selamat membuat! 😊
Kode
ProtoStax_CapacitiveTouch_Piano_Demo
Demo untuk ProtoStax Piano dengan Kotak Pelindung ProtoStax untuk Arduino, Shield Sentuh Kapasitif 12 x Adafruit untuk Arduino - MPR121, Buzzer Piezo, dan Arduino https://github.com/protostax/ProtoStax_CapacitiveTouch_Piano_Demo.git
Bagian Khusus dan Kotak Pelindung
Templat untuk memotong kunci piano untuk ProtoStax Capacitive Touch Piano dan untuk bor lubang di Papan Atas