Arduino MicroでシリアルMIDI

2021.10.19

小ネタです。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命令があって、シリアルモニタが開いている時だけ点滅します。