工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

Arduino Micro/Leonardo用 USB-MIDIアダプタキット – 完全パーツリストと実装ガイド

部品と材料

部品数量備考
Arduino Micro (または Leonardo)1ATmega32U4搭載 (ネイティブUSB必須)
6N137 オプトカプラ (高速)1MIDI入力絶縁用
1N4148 高速スイッチングダイオード1MIDI出力保護用
コンデンサ 100nF (0.1µF)1電源バイパス
抵抗 220Ω3LED電流制限、MIDI OUT駆動等
抵抗 10kΩ1オプトカプラ プルアップ
抵抗 470Ω1MIDI OUT 系列抵抗
LED (汎用、電源表示用)1
LEDホルダ1ケース取り付け用
DIN 5ピンコネクタ (MIDI用)2MIDI IN / OUT 用、取り付けネジ付き推奨
プラスチックケース1全部品が収まるサイズ
ユニバーサル基板1
基板スペーサー (ナイロン等)1式ケース固定用

アプリとオンラインサービス

プロジェクト概要

Arduino Leonardo/Micro (ATmega32U4) のネイティブUSB機能を活用し、PCから見ると標準的な **USB-MIDIインターフェイス** として認識されるアダプタを自作します。市販品の代替として、また独自コントローラー拡張のベースとして最適です。

ハードウェア設計のポイント

ソフトウェア: Control Surface ライブラリ採用

自前実装や他ライブラリでは扱いきれないMIDIプロトコルの複雑さ (SysEx、リアルタイムメッセージ、ランニングステータス等) を正しく処理。さらに以下の拡張が容易:

実用例: 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();
}

回路図

Arduino Micro/Leonardo用 USB-MIDIアダプタキット – 完全パーツリストと実装ガイド

usb_midi_interface_twiE32gvR3.fzz (Fritzing形式、回路図タブのみ記入済み)

トラブルシューティング

拡張アイデア

まとめ

数百円〜数千円の部品で、市販品並みの信頼性を持つUSB-MIDIインターフェイスが自作可能です。Control Surfaceライブラリのおかげでプロトコル実装の負担が劇的に減り、独自機能追加にも集中できます。MIDI機器をお持ちの方、自作コントローラーを作りたい方におすすめのプロジェクトです。

製造プロセス

  1. スマート渇きアラート植物アラーム – 最適な水やりタイミングを知らせるDIYセンサー
  2. イタリア語ワードクロック自作:Arduino Nano、NeoPixel、LCD、RTCで時刻を文字で表示
  3. アナログ3ピンで4×3キーパッドを接続 - Arduinoピン節約テクニック
  4. 3Dプリントで作るコンパクトMIDIドラムキット
  5. Arduino MKR Fox 1200で作る信頼性の高いSigfox kWhメーター
  6. Bluetooth対応温度モニター:Arduino NanoとHC-06でスマホ監視
  7. 自動レンジ切替対応 静電容量メーター (10pF〜10µF) - Arduino Nano で簡単自作
  8. 非接触ジェスチャー錠: APDS-9960とArduinoでセキュアアクセス
  9. Arduino Nanoコンパニオンキット – 電子工作に必須の部品とツールを搭載した多機能IC型デバイス
  10. Arduino用絶縁アナログ入力回路の設計:LM331 V-F変換+フォトカプラでノイズ耐性を確保
  11. Arduino UNOで作る精密反応速度テスター