Saya membangun sequencer musik ini .
Hanya saja itu bukan sequencer, itu adalah antarmuka fisik untuk sequencer. Sequencer adalah aplikasi yang berjalan pada laptop yang terhubung dengan sequencer, hal ini memungkinkan pengguna membuat drum loop dengan cepat. Ini cukup menyenangkan, tetapi membutuhkan laptop karena sequencer tidak 'on-board'.
Yang ingin saya lakukan adalah melakukan sequencing di perangkat saya.
Sekarang mari kita asumsikan saya tahu bagaimana menyelesaikan kepatuhan kelas untuk konektivitas USB MIDI, dan mari kita juga berasumsi saya bisa mencari cara untuk memasang arduino untuk mengirim catatan MIDI dari port DIN 5 pin. Yang paling saya pedulikan adalah tempo melayang dari waktu ke waktu karena waktu yang tidak konsisten dalam jumlah menit setiap kali putaran acara.
Beberapa hal yang saya tahu:
Anda seharusnya tidak mengandalkan
delay()
untuk mengontrol lingkaran tempo. Delay menghentikan semua operasi firmware, dan itu tidak dapat berfungsi karena saya perlu melakukan polling pada antarmuka pengguna fisik untuk perubahan ketika urutan sedang berjalan.Perhitungan berdasarkan
millis()
lebih baik karena firmware dapat terus beroperasi dan bertindak ketika jumlah tertentu telah berlalu.Meskipun tidak ada kontrol fisik saya yang memicu rutinitas interupsi, beberapa operasi dapat menunda operasi utama
loop()
. Jika saya mendesain fungsi yang menunggu input pengguna, itu jelas dapat menyebabkan masalah kehilangan "tenggat waktu" untuk bertindak jikamillis()
hitungannya sudah berakhir. Saya tahu masalah ini adalah desain saya sendiri ...
Pertanyaan:
A. Apakah Arduino berbasis AVR mikrokontroler yang tepat untuk polling antarmuka pengguna dan menjalankan loop waktu misi kritis? Saya tahu ada Arduino berbasis ARM sekarang jauh lebih cepat. Akankah Teensy 3.0 menjadi alternatif yang lebih baik? Kedua ini adalah papan 3.3V, jadi itu satu set masalah untuk dikerjakan ... tapi saya akan mengabaikannya untuk saat ini.
B. Haruskah saya membagi tugas menjadi dua mikroprosesor? Satu untuk menangani polling dan memperbarui antarmuka pengguna dan satu untuk loop timing misi kritis.
c. Sesuatu yang lain
Tujuan utama saya adalah tidak harus menggunakan komputer sama sekali. Saya juga ingin menghitung untuk ayunan, tetapi dalam kasus ini, ayunan tidak berarti apa-apa jika saya tidak mendapatkan tempo yang akurat dan tepat waktu. Terima kasih atas saranmu!
noInterrupts();
menghentikan jitter, tetapi juga menghentikan semua interupsi yang diinginkan.Jawaban:
Interupsi adalah teman Anda untuk tugas-tugas sensitif waktu, tetapi hanya jika Anda memasukkan aspek-aspek penting timing ke dalam interupsi, dan tidak ada interupsi lain yang terjadi yang memiliki prioritas lebih tinggi. Mikrokontroler pada Arduino "berbasis AVR" (mis. ATmega328P) telah memperbaiki prioritas interupsi sebagaimana dirinci pada halaman 58ff dari lembar data . Jadi jika Anda menggunakan TIMER2 COMPA sebagai interupsi waktu kritis Anda dan tidak ada interupsi lain, Anda harusnya OK (karena memiliki prioritas tertinggi). Jika Anda juga ingin menggunakan interupsi prioritas yang lebih rendah, Anda perlu memastikan bahwa semuanya mengaktifkan kembali interupsi global saat memasuki rutinitas layanan interupsi mereka:
(hal. 14 dari lembar data )
Ini sedikit berbeda pada Arduinos berbasis ARM karena inti Cortex-M3 mereka memiliki "Nested Vector Interrupt Controller", di mana prioritasnya tidak diperbaiki (dapat diatur dalam perangkat lunak), dan penanganan interupsi bersarang adalah norma. Jadi untuk aplikasi waktu kritis, Arduino berbasis ARM akan memberi Anda lebih banyak fleksibilitas. Namun, saya tidak berpikir itu benar-benar diperlukan untuk aplikasi Anda.
Pertanyaan yang lebih besar adalah betapa mudahnya hal-hal ini dapat diimplementasikan dengan perpustakaan Arduino. Untuk mendapatkan kinerja terbaik, Anda mungkin harus kode di luar perpustakaan sampai tingkat tertentu, setidaknya untuk bit waktu kritis, yaitu menghindari hal-hal seperti delay () atau millis () sama sekali.
Apakah Anda perlu membagi atau tidak tergantung pada seberapa banyak pemrosesan yang ingin Anda lakukan. Sekali lagi, pergi ke luar perpustakaan berpotensi memberi Anda kinerja yang lebih baik.
sumber
Ini bisa, dengan pemrograman yang sesuai, paling pasti dilakukan pada ATmega328P (agak tergantung pada kompleksitas drum-loop. Saya mengasumsikan ~ <50 kejadian drum dalam loop. Apakah itu masuk akal?).
Perhatikan bahwa saya mengatakan ATmega328P , belum tentu Arduino .
Lingkungan Arduino memiliki banyak hal standar yang terjadi di latar belakang, yang membuat pemrograman yang sangat deterministik (karena Anda akan membutuhkan sesuatu yang kritis-waktu) yang menantang.
Pertanyaan sebenarnya yang perlu Anda tanyakan di sini adalah seberapa tertarik Anda dalam pemrograman, vs seberapa tertarik Anda dalam mengembangkan instrumen?
Sementara saya cukup yakin itu mungkin untuk melakukan semua yang Anda inginkan pada ATmega tunggal (loop drum, beberapa input analog, LCD, tombol, antarmuka MIDI), pertanyaan sebenarnya adalah berapa banyak pekerjaan yang akan dilakukan untuk memeras semuanya? Sekali lagi, apakah Anda ingin belajar untuk mengoptimalkan kode MCU tertanam, atau membangun instrumen? Ini cukup mudah untuk hanya pergi ke cepat MCU jika diperlukan, tetapi Anda perlu menentukan kinerja MCU Anda perlu sekarang , sehingga enam bulan bekerja, Anda tidak sadar bahwa Anda tidak bisa cukup mendapatkan segala sesuatu untuk bekerja secepat Anda perlu.
Jika saya jadi Anda, hal pertama yang akan saya lakukan adalah membuatnya bekerja tanpa barang Arduino (pada dasarnya, memperlakukannya sebagai ATmega mentah, dan menggunakan AVR studio atau serupa). Kemudian, Anda dapat menganalisis secara lebih efektif kinerja seperti apa yang Anda butuhkan, dan jika ATmega dapat mengelolanya.
Setelah Anda bebas dari hal-hal Arduino, Anda akan jauh lebih bebas untuk menggunakan MCU yang berbeda (mereka umumnya lebih mirip daripada yang berbeda. Jika Anda dapat menemukan satu dari dokumentasi itu, Anda mungkin dapat melakukan hal yang sama untuk orang lain).
Saya telah bekerja dengan perangkat ATxmega BANYAK baru-baru ini, dan mereka sangat bagus. Anda mendapatkan tiga prioritas interupsi, yang membuat mengelola hal-hal penting waktu menjadi lebih mudah. Mereka juga sangat bagus untuk bekerja dengan (desain periferal Sane! Struct port Nyaman! Dll ...).
Ada juga perangkat LPC dari NXP, yang berbasis ARM, serta beberapa perangkat ARM Atmel (seperti yang digunakan pada Arduino Due), atau STM32 MCU dari ST. Semua ini akan memiliki kinerja yang lebih signifikan daripada ATmega, atau bahkan ATxmega.
Kelemahan utama dari prosesor yang lebih besar, lebih kuat adalah harga, tetapi kecuali jika Anda membuat ribuan unit tersebut, biaya perakitan per unit dan manufaktur akan jauh melebihi selisih biaya (yang kemungkinan hanya beberapa dolar saja) ) bahwa itu pada dasarnya tidak relevan.
sumber
Saya perlu membaca tentang penghitung waktu sebelum saya mulai berpikir tentang ketepatan waktu (juga membangun sequencer langkah midi dengan arduino, meskipun dijamin terlihat kurang keren daripada ^^). Seri artikel ini adalah yang paling informatif:
http://maxembedded.com/category/microcontrollers-2/atmel-avr/avr-timers-atmel-avr/
Saat ini saya berpikir bahwa solusi saya untuk mendapatkan waktu yang tepat adalah.
A. Gunakan Arduino AVR
B. Simpan tugas pada satu mikroprosesor
C. Dengan bijak gunakan prescaler, timer dan interupsi untuk mendapatkan presisi yang dibutuhkan.
MEMPERBARUI
Menggunakan tutorial dasar midi untuk Arduino dan setelah melihat artikel ini tentang timer dan prescaler, kode berikut adalah apa yang saya dapatkan. Kode ini menggunakan mode timer1 dan CTC untuk memainkan catatan midi pada setiap seperempat detik dan catatan dari setiap seperempat detik (yang harus tepat 120 bpm). Sayangnya, ini masih datang lebih lambat dari 120bpm meskipun ini adalah yang terdekat yang saya dapatkan ...
MEMPERBARUI
Saya telah berjuang dengan ini selama ~ 24 jam sekarang dan akhirnya mendapat jawaban dari forum. Saya pikir kode yang saya gunakan di atas ^^ cukup bagus. Menggunakan ISR, menggunakan mode CTC dan prescaler dll. Setelah menjangkau forum saya berpikir bahwa solusinya kurang tentang mendapatkan presisi pada sequencer midi, tetapi mendapatkan seluruh pengaturan perangkat keras saya (synthesizer dan sampler saya) dihubungkan dengan hal yang sama jam midi, apakah jam itu berasal dari Arduino atau tidak.
sumber
Bergantung pada seberapa bertahap Anda ingin melakukan transisi dari komputer yang ditambatkan ke sistem berbasis μC, Anda mungkin mempertimbangkan untuk meletakkan Raspberry Pi di dalam kotak itu ( ritel $ 25-35 ). Dengan begitu Anda dapat memiliki komputer berbasis linux penuh (walaupun berdaya rendah) dengan port USB dan pin GPIO.
sumber