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;
}
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?