小ネタです。Arduino MicroでシリアルMIDI、UART通信の31.25kbpsのMIDIのこと、を出力しようとしてハマったので記載しておきます。Arduino IDEのスケッチ例 4.Communication->Midi をMicroで実行してもTX RX Pinを使ったシリアル通信はできません。
void setup() { // Set MIDI baud rate: Serial.begin(31250); } 【中略】 // plays a MIDI note. Doesn't check to see that cmd is greater than 127, or that // data values are less than 127: void noteOn(int cmd, int pitch, int velocity) { Serial.write(cmd); Serial.write(pitch); Serial.write(velocity); }
MicroのSerial命令は、UART通信では無くUSB通信のシリアルに使われています。Arduono UNOの場合UARTとシリアル通信は同じピンを使っています。ですのでSerial命令でwriteするとTX Pinと、USBのシリアル通信(Arduino IDEのシリアルモニタ)の両方に出力されます。MicroではUART通信するにはSerial1命令を使います。以下のようにSerialをSerial1と書き換えれば動作します。
void setup() { // Set MIDI baud rate: Serial1.begin(31250); } 【中略】 // plays a MIDI note. Doesn't check to see that cmd is greater than 127, or that // data values are less than 127: void noteOn(int cmd, int pitch, int velocity) { Serial1.write(cmd); Serial1.write(pitch); Serial1.write(velocity); }
ちなみに、以下のボードに付いているTX RXと書かれたLEDはUSBのシリアル通信をモニタしているようで、UARTの通信では点滅しません。TXのLEDはUSB通信が発生した時、例えばSerial.write命令があって、シリアルモニタが開いている時だけ点滅します。