Arduino Micro/Leonardo用 USB-MIDIアダプタキット – 完全パーツリストと実装ガイド
部品と材料
| 部品 | 数量 | 備考 |
|---|---|---|
| Arduino Micro (または Leonardo) | 1 | ATmega32U4搭載 (ネイティブUSB必須) |
| 6N137 オプトカプラ (高速) | 1 | MIDI入力絶縁用 |
| 1N4148 高速スイッチングダイオード | 1 | MIDI出力保護用 |
| コンデンサ 100nF (0.1µF) | 1 | 電源バイパス |
| 抵抗 220Ω | 3 | LED電流制限、MIDI OUT駆動等 |
| 抵抗 10kΩ | 1 | オプトカプラ プルアップ |
| 抵抗 470Ω | 1 | MIDI OUT 系列抵抗 |
| LED (汎用、電源表示用) | 1 | |
| LEDホルダ | 1 | ケース取り付け用 |
| DIN 5ピンコネクタ (MIDI用) | 2 | MIDI IN / OUT 用、取り付けネジ付き推奨 |
| プラスチックケース | 1 | 全部品が収まるサイズ |
| ユニバーサル基板 | 1 | |
| 基板スペーサー (ナイロン等) | 1式 | ケース固定用 |
アプリとオンラインサービス
- Arduino IDE
- Control Surface ライブラリ – GitHub からインストール (MIDIプロトコル完全実装)
プロジェクト概要
Arduino Leonardo/Micro (ATmega32U4) のネイティブUSB機能を活用し、PCから見ると標準的な **USB-MIDIインターフェイス** として認識されるアダプタを自作します。市販品の代替として、また独自コントローラー拡張のベースとして最適です。
ハードウェア設計のポイント
- MIDI規格準拠の絶縁: 入力側に6N137オプトカプラでカレントループを完全絶縁。グランドループによるノイズ/機器破損を防止。
- MIDI OUT ピン2接地: 規格通り、OUT側コネクタのピン2のみシールド接地 (IN側は接地しない)。
- 6N137選定理由: 高速 (10Mbps)、広温度範囲、入手性良好。標準的なMIDIボーレート 31.25kbps に十分対応。
- 電源LED: 動作確認用に搭載 (D10制御)。
ソフトウェア: Control Surface ライブラリ採用
自前実装や他ライブラリでは扱いきれないMIDIプロトコルの複雑さ (SysEx、リアルタイムメッセージ、ランニングステータス等) を正しく処理。さらに以下の拡張が容易:
- ポテンショメータ/ペダル/ボタンをアナログ/デジタルピンに接続 → MIDI CC出力
- コールバック登録で MIDI↔USB 間のデータ加工・フィルタリング可能
実用例: Roland D-50 の「All Notes Off」問題を修正
D-50は最後の鍵を離すたびに All Notes Off (0xB0, 0x7B) を送出しますが、多くの現代VSTはこれを「全音即座にミュート」と解釈し、サステインが不自然に切れます。コールバックでこのメッセージを除去することで、D-50をマスターキーボードとして実用可能に。
既知の制約と回避策
大容量SysExの扱い: Control Surface 1.x ではSysExバッファが128バイト固定で、D-50エディタ/ライブラリアン等の大容量SysEx転送が失敗します。以下の修正で暫定対応可能 (2.xで修正予定)。
// 修正箇所 (Control Surfaceライブラリ内)
/* src/MIDI_Parsers/MIDI_MessageTypes.hpp */
uint8_t length; → size_t length;
/* src/Settings/Settings.hpp */
constexpr size_t SYSEX_BUFFER_SIZE = 128; → constexpr size_t SYSEX_BUFFER_SIZE = 320;
USBデバイス名の変更 (任意)
Arduino IDEインストールフォルダ内 hardware/arduino/avr/boards.txt (管理者権限必要) で:
leonardo.build.usb_product="Arduino Leonardo"
→ leonardo.build.usb_product="My USB-MIDI Adapter"
書き込み後は元に戻すことを推奨。
スケッチ
1. 基本版: MIDI⇔USB 双方向透過
/* USB MIDI Adapter - Basic Version */
#include <Control_Surface.h>
USBMIDI_Interface midiusb;
// USBDebugMIDI_Interface midiusb; // デバッグ用: 全MIDIをシリアル出力
HardwareSerialMIDI_Interface midiser = {Serial1, MIDI_BAUD};
MIDI_PipeFactory<5> pipes;
const int ledPin = 10;
void setup() {
Serial.begin(115200);
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, HIGH);
// MIDIパイプ接続: USB ⇄ Serial1 双方向
midiusb >> pipes >> midiser;
midiser >> pipes >> midiusb;
// Control Surface経由のメッセージはUSBのみへ
Control_Surface >> pipes >> midiusb;
// 両インターフェイスをControl Surfaceにも接続
midiser >> pipes >> Control_Surface;
midiusb >> pipes >> Control_Surface;
Control_Surface.begin();
}
void loop() {
Control_Surface.loop();
}
2. 拡張版: 「All Notes Off」フィルタ + Note On(Vel=0)→Note Off 変換
/* USB MIDI Adapter - with All Notes Off Filter */
#include <Control_Surface.h>
USBMIDI_Interface midiusb;
HardwareSerialMIDI_Interface midiser = {Serial1, MIDI_BAUD};
MIDI_PipeFactory<4> pipes;
const int ledPin = 10;
// カスタムコールバック
struct MyMIDI_Callbacks : MIDI_Callbacks {
void onChannelMessage(Parsing_MIDI_Interface &midi) override {
ChannelMessage cm = midi.getChannelMessage();
if (cm.header == 0xB0 && cm.data1 == 0x7B) {
// All Notes Off (0x7B) を無視
return;
} else if (cm.header == 0x90 && cm.data2 == 0x00) {
// Note On (Velocity=0) → Note Off に変換
cm.header = 0x80;
}
midiusb.send(cm);
}
void onSysExMessage(Parsing_MIDI_Interface &midi) override {
midiusb.send(midi.getSysExMessage()); // SysExはそのまま転送
}
void onRealTimeMessage(Parsing_MIDI_Interface &midi) override {
midiusb.send(midi.getRealTimeMessage()); // リアルタイムメッセージもそのまま
}
} callbacks;
void setup() {
Serial.begin(115200);
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, HIGH);
midiusb >> pipes >> midiser;
Control_Surface >> pipes >> midiusb;
midiser >> pipes >> Control_Surface;
midiusb >> pipes >> Control_Surface;
Control_Surface.begin();
midiser.setCallbacks(callbacks); // コールバック登録
}
void loop() {
Control_Surface.loop();
}
回路図

usb_midi_interface_twiE32gvR3.fzz (Fritzing形式、回路図タブのみ記入済み)
トラブルシューティング
- 外部MIDI機器と通信できない: DINコネクタのピン4/5 (MIDI IN/OUT信号線) が逆になっていないか確認。コネクタ図面の「どちら側から見た図か」に注意。
- USBデバイスとして認識されない: ボード選択が Micro/Leonardo になっているか、ブートローダーモードで書き込みできているか確認。
- ノイズが乗る: オプトカプラ周りのグランド分離、電源ラインのバイパスコンデンサ、ケースのシールド接続をチェック。
拡張アイデア
- フットスイッチ/エクスプレッションペダル入力追加 (アナログピン + Control Surface
CCPotentiometer等) - MIDIマージ/スプリット/フィルタ機能をコールバックで実装
- 複数MIDIポート対応 (USB-MIDI + Serial1 + Serial2 等)
- OLEDディスプレイでメッセージモニタ表示
まとめ
数百円〜数千円の部品で、市販品並みの信頼性を持つUSB-MIDIインターフェイスが自作可能です。Control Surfaceライブラリのおかげでプロトコル実装の負担が劇的に減り、独自機能追加にも集中できます。MIDI機器をお持ちの方、自作コントローラーを作りたい方におすすめのプロジェクトです。
製造プロセス
- スマート渇きアラート植物アラーム – 最適な水やりタイミングを知らせるDIYセンサー
- イタリア語ワードクロック自作:Arduino Nano、NeoPixel、LCD、RTCで時刻を文字で表示
- アナログ3ピンで4×3キーパッドを接続 - Arduinoピン節約テクニック
- 3Dプリントで作るコンパクトMIDIドラムキット
- Arduino MKR Fox 1200で作る信頼性の高いSigfox kWhメーター
- Bluetooth対応温度モニター:Arduino NanoとHC-06でスマホ監視
- 自動レンジ切替対応 静電容量メーター (10pF〜10µF) - Arduino Nano で簡単自作
- 非接触ジェスチャー錠: APDS-9960とArduinoでセキュアアクセス
- Arduino Nanoコンパニオンキット – 電子工作に必須の部品とツールを搭載した多機能IC型デバイス
- Arduino用絶縁アナログ入力回路の設計:LM331 V-F変換+フォトカプラでノイズ耐性を確保
- Arduino UNOで作る精密反応速度テスター