Desain protokol komunikasi serial Arduino

8

Saya membuat antarmuka sequencer drum untuk musik elektronik .

masukkan deskripsi gambar di sini

Ini menggunakan arduino mega sebagai mikroprosesor, dan saat ini antarmuka untuk program Pemrosesan yang saya tulis untuk komunikasi serial. Dari sana, pesan OSC dikirim ke program Max / MSP yang ditulis oleh mitra saya untuk membuat aliran data midi.

Begitu:

masukkan deskripsi gambar di sini

Antarmuka fisik saya -> Arduino Mega -> serial I / O -> Pemrosesan -> OSC -> Max / MSP -> Midi (-> aplikasi musik)

Saya memilih jalur ini sebagian karena tidak cukup pintar untuk menghapus langkah apa pun, tetapi juga untuk mengakomodasi kemampuan memperbarui antarmuka fisik seperti yang kita inginkan, mampu membuat antarmuka fisik multi-tujuan (beberapa mode untuk fader, kenop, dan tombol pilih suara), dan dapat memastikan waktu kritis misi dan modifikasi ritme (alias "swing").

Pesan berseri saya diatur seperti ini:


PL,1;        // transport control: play
PL,0;        // transport control: stop
SW,30;       // swing value 30
TM,130;      // tempo value 130
SD,1,8,04,0; // Step sequencer data, pattern 1, voice 8 (of 8), step 04 (of 16), off
MU,8,1;      // Mute, voice 8 (of 8), on
SO,4,0;      // Solo, voice 4 (of 8), off
VL,3,127;    // Velocity, voice 3 (of 8), value 127
CC,1,127;    // Midi CC, controller 1, value 127
NN,1,36;     // Note number, voice 1 (of 8), value 36 (usually a kick drum)

Jadi, Anda dapat melihat bahwa berdasarkan jumlah koma per titik koma, saya dapat menentukan cara mengurai data serial dari arduino dalam program pemrosesan. Dari Memproses, jenis pesan ini diubah menjadi OSC seperti ini:


/beatseqr/play 1
/beatseqr/play 0
/beatseqr/swing 30
/beatseqr/tempo 130
/beatseqr/matrix/1/8/04 0
/beatseqr/mute/8 1
/beatseqr/solo/4 0
/beatseqr/velocity/3 127
/beatseqr/midicc/1 127
/beatseqr/midinn/1 36

Dan semuanya bekerja ok, tetapi rasanya tidak efisien. Apakah saya benar-benar membutuhkan aplikasi pemrosesan di tengah?

masukkan deskripsi gambar di sini

Sekarang, saya telah mencoba untuk memotong Pemrosesan dan bagian-bagian OSC dari persamaan, tapi saya kehilangan beberapa pengetahuan mengenai desain protokol data serial.

Saya sadar bahwa ada udpreceiveobjek di Max. Dan itu berhasil, saya kira? Mungkin saya salah menggunakannya.

Pada satu titik saya telah mengganti semua kode arduino saya untuk tidak mengirim baris baru di akhir setiap pesan serial karena itu tidak berarti sesuatu yang istimewa pada objek Max udpreceive. Bahkan, jika saya ingat dengan benar, itu hanya akan menerima pesan pertama hingga baris baru pertama dan kemudian akan berhenti memproses data. Jadi untuk menyiasatinya, saya mengeluarkan semua karakter baris baru dan kemudian akan memuntahkan ke max / msp terus menerus.

Maka masalah selanjutnya dengan metode ini adalah bahwa udpreceiveobjek hanya menerima satu karakter pada satu waktu. Jadi saya mencoba menggunakan jsobjek javascript untuk menggabungkan karakter yang masuk, dan kemudian menguraikannya pada titik koma dan koma. Masalah yang saya temui di sana adalah bahwa itu tidak dapat diprediksi dan tidak stabil. Karakter akan keluar dan pesan tidak dapat diproses. Jadi itu benar-benar membuat saya bertanya-tanya apakah saya harus mengubah protokol data serial saya menjadi sesuatu yang lebih kuat? Atau jika saya melakukan kesalahan sepenuhnya?

Haruskah saya memo semuanya dan mulai lagi dari awal menggunakan firmware firmata? Saya telah melihat beberapa tutorial untuk menggunakan firmata dengan Max / MSP , dan saya kira saya bisa melihat segar apa yang dilakukan oleh kode pada kotak dan jika perlu melakukannya sama sekali. Bisakah firmata menerima data string pada pin untuk dikirim ke LCD serial terpasang? jika saya dapat mengontrol LCD dari maks / msp, itu mungkin berhasil ok.

Ada saran?

Steve Cooley
sumber
1
+1 hanya untuk OMGWTFtombol, tetapi pertanyaan yang dipikirkan dengan sangat baik dan terperinci juga!
Polinomial
1
Sudahkah Anda melihat halaman ini ? Ada beberapa cara untuk berinteraksi dengan Max / MSP yang tidak melibatkan pemrosesan. Adakah di antara mereka yang bekerja / tidak bekerja untuk Anda?
angelatlarge
@angelatlarge Ya, agak. Agak tidak. Saya berharap mendapatkan saran tentang apakah saya melakukan hal protokol serial dengan benar atau salah, tetapi saya terbuka untuk melakukan perbaikan dengan metode komunikasi alternatif jika saya masih bisa mendapatkan fungsionalitas yang sama pada akhirnya.
Steve Cooley

Jawaban:

1

Apakah mungkin masalah Anda disebabkan oleh Arduino? Saya tahu itu terdengar aneh, karena Arduino sangat bergantung pada komunikasi serial dan biasanya tidak gagal. Tetapi saya akan menyarankan Anda untuk mencoba Arduino Anda dengan kecepatan yang berbeda, membuang data yang dapat dibaca manusia dan memantau dengan program terminal. Saya memiliki masalah yang sama dan itu disebabkan oleh masalah tanah Arduino saya. Juga, solusi lain mungkin menggunakan desain arduino khusus dengan kecepatan clock ramah-seri seperti 14.7456MHz atau kelipatan nilai apa pun dari 3.6864MHz. Semoga ini bisa membantu ...

superkeci
sumber