Có bất kỳ lý do tại sao sử dụng tốc độ baud là 31250 trong dự án Arduino MIDI có thể gây ra vấn đề không?


8

Tôi có một bộ mã hóa quang 600 xung trên mỗi vòng quay (và một số thứ khác) được kết nối với Arduino Uno (đã thử trên r2 và r3) thông qua các chân ngắt 2 và 3.

Trong khi chờ giắc MIDI của tôi đến trong thư, tôi đã thử kết nối thiết lập của mình với máy tính thông qua cổng nối tiếp USB, cùng với midi không có lông và loopMidi. Loopmidi là một cổng MIDI ảo và midi không có cầu nối các cổng nối tiếp với các cổng MIDI - ảo hoặc cách khác. Tôi đã sử dụng tốc độ baud là 115200, vì tôi cho rằng nó không thể bị tổn thương khi đi quá cao. Mọi thứ dường như hoạt động khá tốt trong Mixxx. Thực sự tốt, thực sự. Nó có vẻ rất nhạy và chính xác. Bộ mã hóa đã không bỏ lỡ một nhịp nào, bất kể tôi vượt qua điều đó nhanh như thế nào.

Vì vậy, tôi đã rất vui mừng khi jack MIDI đến. Tôi đặt nó vào trong bánh mì của tôi và thay đổi

Serial.begin(115200);

đến

Serial.begin(31250);

và đã thử nghiệm nó trong Mixxx. Bây giờ, nếu tôi quay bộ mã hóa nhanh vừa phải theo một hướng, bản ghi ảo sẽ di chuyển theo hướng đó và sau đó đột nhiên quay theo hướng khác và sau đó quay lại. Tôi giả sử rằng bộ mã hóa bị thiếu xung?

Tôi đã thử nó trong hai cáp usb-midi 6 đô la khác nhau cũng như trong M-Audio Fast Track Ultra của tôi.

Sau đó, tôi nghĩ rằng có lẽ nó có liên quan đến tốc độ truyền thấp hơn (115200 so với 31250). Tôi đã thay đổi tỷ lệ thành 38400 và đi qua USB nối tiếp. Nó đã làm việc tuyệt vời. Tôi thậm chí đã thử 19200. Hoàn hảo. Ngay cả ở 9600, nó đã làm việc.

Tại sao chuyện này đang xảy ra? Là mạch nối tiếp usb trong Arduino, cùng với một số phần mềm miễn phí, có thực sự đáng tin cậy hơn cáp midi và giao diện âm thanh $ 300, ngay cả khi arduino được đặt ở tốc độ truyền rất thấp? Hoặc có điều gì đó về tốc độ baud kỳ lạ 31250 gây ra vấn đề trong Arduino?

Tôi chưa có cơ hội thử sử dụng tốc độ 31250 thông qua nối tiếp usb, vì midi không có tóc không cho phép tốc độ đó.

EDIT: Đây là phần có liên quan của mã và phần có liên quan của mạch. Có một vài thành phần khác, có thể làm cho vấn đề trở nên tồi tệ hơn, nhưng ngay cả khi không có các thành phần đó, bộ mã hóa quang học không hoạt động ở mức 31250.

    enum PinAssignments {
  encoderPinA = 2,   // rigth
  encoderPinB = 3,   // left
};

volatile int encoderPos = 0;  // a counter for the dial
unsigned int lastReportedPos = 0;   // change management

boolean A_set = false;              
boolean B_set = false;

void setup() {

  pinMode(encoderPinA, INPUT_PULLUP); 
  pinMode(encoderPinB, INPUT_PULLUP); 

// encoder pin on interrupt 0 (pin 2)
  attachInterrupt(0, doEncoderA, CHANGE);
// encoder pin on interrupt 1 (pin 3)
  attachInterrupt(1, doEncoderB, CHANGE);
    Serial.begin(31250);
}

void loop() {

 if (encoderPos != lastReportedPos){
   Serial.write(0xB0);
   Serial.write(0x27);
   Serial.write(64 + encoderPos - lastReportedPos);
   encoderPos = 0;
   lastReportedPos = encoderPos;

 }


}

// Interrupt on A changing state
void doEncoderA(){

    A_set = !A_set;

    // adjust counter + if A leads B
    if ( A_set && !B_set ) 
      encoderPos += 1;




}

// Interrupt on B changing state, same as A above
void doEncoderB(){

    B_set = !B_set;
    if( B_set && !A_set ) 
      encoderPos -= 1;

  }

mạch cơ bản

Thật lạ. Một khả năng khác: tốc độ baud kỳ lạ bằng cách nào đó có gây rối với các phần cứng bị gián đoạn không?

EDIT một lần nữa: Tôi đã chạy mixxx ở chế độ mididebug và mở rộng bản ghi theo một hướng. Điều này đã có trong nhật ký:

Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x41" 
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x41" 
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x3F" 
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x41" 
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x3F" 
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x3F" 
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x3F" 
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x3F" 
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x3F" 
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x3E"
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x3F"
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x3F"
... for a while and then ...
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x3F" 
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x41" 
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x41" 
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x41" 
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x41"
...
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x41" 
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x41" 
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x3F" 
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x3F" 
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x3F" 
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x3F" 
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x3F" 
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x3F" 
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x3F" 
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x3F"

Vì vậy, nó đi từ lặp lại 63 với 62 thỉnh thoảng đến đột ngột lặp lại 65 với thỉnh thoảng 66. Vận tốc 64 có nghĩa là bánh xe không di chuyển. 63 có nghĩa là di chuyển ngược chiều kim đồng hồ một xung. 65 là chiều kim đồng hồ một xung. Hoặc ngược lại tùy thuộc vào cách thức điều có dây.

Điều đó có nghĩa là vấn đề nằm ở arduino chứ không phải ở bộ chuyển đổi midi?


Vui lòng thêm sơ đồ mạch bạn sử dụng để kết nối Arduino với cáp MIDI. Cáp bạn sử dụng là bao lâu?
jippie

Tôi không có dây cáp trước mặt, nhưng một dây cáp dài khoảng 12 inch. Cái kia khoảng 30, inch. Các bộ chuyển đổi USB-Midi giá rẻ có cáp MIDI tích hợp có thể dài dưới 12 inch.
Phil Lee

Bạn có một phạm vi để xem dạng sóng? Bạn có thể kiểm tra điện áp nguồn cho ATmega trên Arduino không?
jippie

@jippie Tôi không có phạm vi. Bạn có muốn tôi kiểm tra điện áp trên 5V và pin mặt đất không? Hoặc giữa các chân cụ thể trên chính chip (7 và 20; hoặc 22 và 20)? Trước khi đăng câu hỏi, tôi đã thử một vài bộ nguồn khác nhau với cùng kết quả. Nguồn USB, bộ chuyển đổi DC 5V và bộ chuyển đổi DC DC đều có kết quả tương tự.
Phil Lee

1
Làm thế nào về việc gửi một chuỗi byte được lập trình sẵn và xem điều đó có thành công đến đích không. Cố gắng loại trừ bộ mã hóa. Điện áp trên các chân nguồn của bộ điều khiển là tốt nhất, bot cẩn thận không để ngắn bất cứ thứ gì. Tôi đoán đo chân 5V và GND sẽ ổn và an toàn.
jippie

Câu trả lời:


6

Tốc độ truyền của bạn không phải là ước số nguyên của đồng hồ MCU. Tốc độ truyền được chia từ đồng hồ của MCU. Thật dễ dàng để có được 9600, 19200 và các tỷ lệ khác với ước số nguyên của đồng hồ. ví dụ: nếu bạn có một tinh thể 6.144 MHz, để có được 19200, bạn cần chia cho 3200.

Đối với tốc độ dữ liệu lẻ trong các ứng dụng khác nhau (Audio, video analog và nhiều loại khác), các tinh thể cụ thể được sử dụng để lấy ước số nguyên, ví dụ, mạch NTSC có thể có tinh thể 5.034963 MHz để tạo các tín hiệu đồng bộ khác nhau, xem

Tần số dao động tinh thể - WikiPedia

Nếu MCU của bạn có bộ tạo đồng hồ bên trong, hãy thử điều chỉnh nó thành một giá trị khác để lấy ước số nguyên, nếu không, lỗi bit sẽ quá cao.


4
Tôi vừa xem và Uno chạy ở tốc độ 16 MHz, ở 16 chu kỳ mỗi bit cho UART 1M / 31250 = 32, vì vậy, đặt UBRR thành 31 không nên đưa ra bất kỳ lỗi nào. Trong khi 31250 là tốc độ truyền bất thường theo tiêu chuẩn truyền thống, nó phân chia thành các tần số MHz thậm chí có thể là lý do tại sao họ sử dụng nó.
PeterJ

1
Giá trị của UBRRn phải là 31 (16MHz / 31250) -1, một giá trị chính xác là tối ưu cho USART. Lạ thật.
Lior Bilia

Tôi đã thấy một cái gì đó về điều này trong các tìm kiếm của tôi. Tôi nghĩ rằng nó có thể là nguyên nhân của các vấn đề của tôi, nhưng tôi không chắc làm thế nào để làm toán. Vì vậy, đây không phải là một vấn đề sau đó? Toán kiểm tra ra?
Phil Lee

Bộ chia là tối ưu, với sai số 0% (thường là các bộ chia đưa ra một lỗi nhỏ), tiếp theo tôi sẽ kiểm tra các thói quen USART, có lẽ chúng không hỗ trợ tốc độ truyền lẻ.
Lior Bilia

4

Một cách dứt khoát để kiểm tra là kết nối MIDI của bạn với MIDI của bạn và thiết lập hệ thống bằng cách sử dụng nối tiếp USB như trước, nhưng định tuyến nó (thông qua phần mềm 'cáp midi ảo' của bạn) đến cổng ra MIDI trên máy tính . Điều này sẽ kiểm tra xem phần cứng USB MIDI của bạn trên thực tế có hoạt động đáng tin cậy ở tốc độ dữ liệu mà thiết bị hoạt động không. Theo kinh nghiệm của tôi, nhiều thiết bị USB MIDI được thiết kế cơ bản cho bàn phím (chỉ gửi 3 byte hoặc hơn khi nhấn hoặc nhả phím) và gặp sự cố tràn lạ khi bạn truyền ở tốc độ 31,25 Kbit. Điều này cũng phụ thuộc rất nhiều vào hệ điều hành / trình điều khiển.

Tôi đoán bạn cũng muốn đảm bảo rằng trình điều khiển máy phát / đường truyền đang hoạt động. Xin vui lòng gửi một sơ đồ của mạch Arduino MIDI-out của bạn. Bạn đang sử dụng làm trình điều khiển đầu ra là gì?

Tôi đang đưa ra rất nhiều giả định, nhưng giả sử Arduino Uno ở mức 16 MHz, 31250 bps được hỗ trợ chính xác (lỗi 0%) với giá trị đăng ký UBBR là 31, theo cách này: máy tính tốc độ UART của AVR . Điều này cho tôi thấy rằng tốc độ bit của MIDI không phải là một vấn đề (thực tế, sự hiểu biết của tôi là 31250 phần lớn được chọn để dễ dàng làm việc với xung nhịp 1 MHz, không giống như tốc độ RS-232 của máy teletype).

Ngoài ra, việc kết xuất những thông điệp mà PC nhận được thông qua trình thám thính MIDI hoặc màn hình sẽ rất hữu ích trong việc gỡ lỗi.


Nếu bạn kết nối MIDI-out với MIDI-in, sẽ không có bất kỳ vấn đề về tốc độ truyền nào liên quan đến nền tảng trong tay vẫn bị ẩn, vì cả hai đều dùng chung một đồng hồ ??
Scott Seidman

1
Vâng, tôi đã muốn kiểm tra trình điều khiển với thông tin tỷ lệ đầy đủ hơn. Kinh nghiệm của tôi là một số cáp USB-MIDI sẽ bị nghẹt do tràn bộ đệm và như vậy khi được kết nối với thứ gì đó gửi nhiều dữ liệu hơn bàn phím.
Zuofu

Tôi sẽ thử kết nối MIDI vào MIDI ra và lấy lại cho bạn. Tôi cũng đã thử thực hiện 31250 thông qua nối tiếp và xem kết quả trong Putty. Nhưng màn hình tràn ngập quá nhiều thứ. Tôi sẽ làm lại khi tôi về nhà và lưu tập tin. Và tôi cũng sẽ thử xem nhật ký Mixxx, có thể được đặt để ghi nhật ký tin nhắn midi.
Phil Lee

Bạn có thể thay đổi serial.print để in sang bảng điều khiển (ascii) giá trị của biến mã hóa và xem xét nó thông qua RealTerm không? Thiết lập giải mã cầu phương của bạn là bất thường. Thông thường, không nên ngắt cả A và B. Ví dụ: nếu bạn ngắt bất kỳ thay đổi nào của A, nếu A == B thì B dẫn A, nếu A! = B thì A dẫn B. Cách bạn Nếu nó được viết có vẻ phức tạp hơn nhiều, tôi sẽ không nói rằng nó sẽ không hoạt động, nhưng có thể có một số tác dụng ngoài ý muốn ở đó.
Zuofu

Ngoài ra, logic chương trình của bạn có vẻ như bối rối. 'LastreportedPos' gần như luôn luôn là 0, ngoại trừ nếu một ngắt được bắn trong một khoảng thời gian nhỏ trước khi nó được chỉ định và cài đặt dòng trước đó 'encoderPos' thành 0 ..? Ngoài ra, tại sao LastreportedPos không được ký, trong khi encoderPos được ký? Cách điển hình để sử dụng bộ mã hóa là theo dõi vị trí (từ tín hiệu chỉ số, nếu bạn có hoặc từ một vị trí tùy ý khi bật nguồn). Nếu bạn muốn gửi một vị trí tương đối, bạn sử dụng delta-x như bạn đang làm, ngoại trừ bạn không đặt lại vị trí ngay trước khi ...
Zuofu
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.