Thiết kế giao thức truyền thông nối tiếp Arduino


8

Tôi tạo một giao diện trống sequencer cho nhạc điện tử .

nhập mô tả hình ảnh ở đây

Nó sử dụng một siêu vi arduino như bộ vi xử lý của nó và hiện tại nó giao tiếp với một chương trình Xử lý mà tôi đã viết cho giao tiếp nối tiếp. Từ đó, các tin nhắn OSC được gửi đến một chương trình Max / MSP mà đối tác cộng tác của tôi đã viết để tạo ra một luồng dữ liệu midi.

Vì thế:

nhập mô tả hình ảnh ở đây

Giao diện vật lý của tôi -> Arduino Mega -> I / O nối tiếp -> Đang xử lý -> OSC -> Max / MSP -> Midi (-> ứng dụng âm nhạc)

Tôi đã chọn con đường này một phần vì không đủ thông minh để loại bỏ bất kỳ bước nào, nhưng cũng để phù hợp với việc có thể cập nhật giao diện vật lý theo cách chúng tôi muốn, có thể tạo giao diện vật lý đa mục đích (nhiều chế độ cho fader, núm và nút chọn giọng nói) và có thể đảm bảo nhiệm vụ điều chỉnh thời gian và nhịp điệu quan trọng (hay còn gọi là "swing").

Tin nhắn nối tiếp của tôi được thiết lập như thế này:


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)

Vì vậy, bạn có thể thấy rằng dựa trên số dấu phẩy trên mỗi dấu chấm phẩy, tôi có thể xác định cách phân tích dữ liệu nối tiếp từ arduino trong chương trình xử lý. Từ Xử lý, các loại thông báo này được chuyển thành OSC như thế này:


/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

Và tất cả đều hoạt động tốt, nhưng nó cảm thấy không hiệu quả. Tôi có thực sự cần ứng dụng xử lý ở giữa không?

nhập mô tả hình ảnh ở đây

Bây giờ, tôi đã cố gắng loại bỏ phần Xử lý và các phần OSC khỏi phương trình, nhưng tôi thiếu một số kiến ​​thức liên quan đến thiết kế giao thức dữ liệu nối tiếp.

Tôi biết rằng có một udpreceiveđối tượng trong Max. Và nó hoạt động ok tôi đoán? Có lẽ tôi đang sử dụng nó sai.

Tại một thời điểm, tôi đã chuyển tất cả mã arduino của mình sang không gửi dòng mới vào cuối mỗi tin nhắn nối tiếp vì điều đó không có ý nghĩa gì đặc biệt với udpreceiveđối tượng của Max . Trong thực tế, nếu tôi nhớ lại một cách chính xác, nó sẽ chỉ chấp nhận tin nhắn đầu tiên cho đến dòng mới đầu tiên và sau đó nó sẽ dừng xử lý dữ liệu. Vì vậy, để giải quyết vấn đề đó, tôi đã loại bỏ tất cả các ký tự dòng mới và sau đó nó sẽ xuất hiện thành max / msp liên tục.

Sau đó, vấn đề tiếp theo với phương thức này là udpreceiveđối tượng chỉ chấp nhận một ký tự tại một thời điểm. Vì vậy, tôi đã cố gắng sử dụng một jsđối tượng javascript để ghép các ký tự đến và sau đó phân tích chúng trên dấu chấm phẩy và dấu phẩy. Vấn đề tôi gặp phải là nó không thể đoán trước và không ổn định. Các ký tự sẽ rơi ra và tin nhắn sẽ không thể xử lý. Vì vậy, nó thực sự khiến tôi tự hỏi liệu tôi có nên thay đổi giao thức dữ liệu nối tiếp của mình sang một thứ gì đó mạnh mẽ hơn không? Hoặc nếu tôi chỉ làm sai hoàn toàn?

Tôi có nên loại bỏ tất cả và bắt đầu lại từ đầu bằng cách sử dụng firmware Firmata không? Tôi đã thấy một số hướng dẫn sử dụng Firmata với Max / MSP và tôi đoán rằng tôi có thể có một cái nhìn mới về những gì mã trên hộp đang làm và nếu nó cần phải làm điều đó. Công ty có thể chấp nhận dữ liệu chuỗi trên pin để gửi đến màn hình LCD nối tiếp trên tàu không? nếu tôi có thể điều khiển LCD từ max / msp, điều đó có thể hoạt động tốt.

Có lời khuyên nào không?


1
+1 chỉ cho OMGWTFnút, nhưng cũng suy nghĩ rất kỹ và câu hỏi chi tiết quá!
Đa thức

1
Bạn đã thấy trang này ? Có một số cách giao tiếp với Max / MSP không liên quan đến việc xử lý. Bất kỳ trong số họ làm việc / không làm việc cho bạn?
angelatlarge

@eachatlarge Vâng, kinda. Không được. Tôi hy vọng sẽ nhận được một số lời khuyên về việc liệu tôi đang thực hiện giao thức nối tiếp đúng hay sai, nhưng tôi sẵn sàng làm lại với một phương thức giao tiếp thay thế nếu cuối cùng tôi vẫn có thể có được chức năng tương tự.
Steve Cooley

Câu trả lời:


1

Có thể vấn đề của bạn là do Arduino? Tôi biết điều đó nghe có vẻ lạ, bởi vì Arduino phụ thuộc rất nhiều vào giao tiếp nối tiếp và nó thường không thất bại. Nhưng tôi sẽ đề nghị bạn thử Arduino của bạn với tốc độ khác nhau, bỏ dữ liệu có thể đọc được của con người và theo dõi bằng một chương trình đầu cuối. Tôi đã có cùng một vấn đề và đó là do vấn đề cơ bản của arduino của tôi. Ngoài ra, một giải pháp khác có thể là sử dụng thiết kế arduino tùy chỉnh với tốc độ xung nhịp thân thiện nối tiếp như 14.7456 MHz hoặc bất kỳ bội số giá trị nào của 3.6864 MHz. Hy vọng nó giúp...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.