USB MIDI Keyboard to Legacy MIDI Conversion
質問: 1
回答 1:
USB Host Shield (UHS) を使って USB MIDI キーボードをレガシーな MIDI に変換する方法について、5V で動作する Pro Micro を使用する場合の手順を以下にまとめました。レベルシフターを使って 3.3V と 5V の信号を変換する方法も含めています。
必要なハードウェア
- Arduino Pro Micro 5V
- USB Host Shield 3.3V
- USB MIDI キーボード
- MIDI 出力用の 5 ピン DIN コネクタ
- レベルシフター(3.3V から 5V への変換)
- ジャンパーワイヤー
手順
- USB Host Shield の準備: USB Host Shield を Pro Micro に接続します。USB Host Shield は 3.3V で駆動するため、SPI 信号も 3.3V で動作します。
- レベルシフターの接続: レベルシフターを使って、Pro Micro の 5V 信号を USB Host Shield の 3.3V 信号に変換します。以下のように接続します。
- Pro Micro の MOSI, MISO, SCK, SS ピンをレベルシフターの HV(High Voltage)側に接続。
- レベルシフターの LV(Low Voltage)側を USB Host Shield の対応するピンに接続。
- レベルシフターの HV ピンを Pro Micro の 5V ピンに、LV ピンを USB Host Shield の 3.3V ピンに接続。
- ソフトウェアの設定: Arduino IDE をインストールし、以下のライブラリを追加します。
- コードの作成: USB MIDI キーボードからの信号を受け取り、レガシー MIDI 信号に変換するコードを作成します。以下は基本的なサンプルコードです。
#include
#include
USB Usb;
USBH_MIDI Midi(&Usb);
MIDI_CREATE_INSTANCE(HardwareSerial, Serial1, MIDI);
void setup() {
Serial.begin(115200);
if (Usb.Init() == -1) {
Serial.println("USB Host Shield initialization failed");
while (1); // Halt
}
MIDI.begin(MIDI_CHANNEL_OMNI);
}
void loop() {
Usb.Task();
if (Midi) {
uint8_t size;
uint8_t outBuf[3];
while ((size = Midi.RecvData(outBuf)) > 0) {
MIDI.send(outBuf[0], outBuf[1], outBuf[2]);
}
}
}
- ハードウェアの接続: Arduino Pro Micro の TX ピンをレベルシフターを介して 5 ピン DIN コネクタの MIDI OUT ピンに接続します。
- 動作確認: USB MIDI キーボードを接続し、Arduino を起動します。MIDI 信号が正しく変換されているか確認します。
この方法で、5V で動作する Pro Micro を使って USB MIDI キーボードをレガシーな MIDI に変換できます。詳細な手順やコードのカスタマイズについては、以下の参考リンクを参照してください
MIDI 5ピンDINコネクタの接続方法
MIDI 5ピンDINコネクタの各ピンの接続方法は以下の通りです:
ピン配置
コネクタを正面から見た場合のピン配置は以下のようになります:
2
1 3
4 5
各ピンの役割
- ピン1: 未接続 (NC)
- ピン2: グランド (GND)
- ピン3: 未接続 (NC)
- ピン4: +5V (電源)
- ピン5: 信号 (MIDIデータ)
接続例
以下に、MIDI OUTからMIDI INへの接続例を示します:
MIDI OUT (送信側) MIDI IN (受信側)
-----------------------------------------
ピン4 (+5V) ----------> ピン4 (+5V)
ピン5 (信号) ----------> ピン5 (信号)
ピン2 (GND) ----------> ピン2 (GND)
注意点
- ピン1とピン3は未接続(NC)とします。
- 信号の伝送にはピン4とピン5を使用します。
- グランドはピン2に接続します。
以下の図は、USB Host Shield (UHS) から Pro Micro を経由して 5ピンDIN コネクタまでの接続方法を示しています。
接続図
USB Host Shield (UHS) Pro Micro (5V) 5ピンDIN コネクタ
--------------------------------------------------------------
MOSI (Pin 11) ----------> MOSI (Pin 16) ----------> (未接続)
MISO (Pin 12) ----------> MISO (Pin 14) ----------> (未接続)
SCK (Pin 13) ----------> SCK (Pin 15) ----------> (未接続)
SS (Pin 10) ----------> SS (Pin 10) ----------> (未接続)
GND (GND) ----------> GND (GND) ----------> ピン2 (GND)
3.3V (3.3V) ----------> VCC (3.3V) ----------> (未接続)
(未接続) ----------> TX (Pin 1) ----------> ピン5 (信号)
(未接続) ----------> (未接続) ----------> ピン4 (+5V)
各ピンの役割
- ピン1: 未接続 (NC)
- ピン2: グランド (GND)
- ピン3: 未接続 (NC)
- ピン4: +5V (電源)
- ピン5: 信号 (MIDIデータ)
注意点
- Pro Micro の TX ピンを 5ピンDIN コネクタのピン5(信号)に接続します。
- 5ピンDIN コネクタのピン4(+5V)には、適切な電源を供給します。
- グランドは Pro Micro と 5ピンDIN コネクタのピン2に接続します。
質問:レベルシフターについて
回答 2:
レベルシフターは、異なる電圧レベル間で信号を変換するためのデバイスです。具体的には、以下のような形態があります:
1. IC(集積回路)としてのレベルシフター
レベルシフターは多くの場合、IC(集積回路)として提供されます。これらのICは、異なる電圧レベルの信号を変換するために設計されています。例えば、3.3Vの信号を5Vに変換する、またはその逆を行うことができます。代表的なICには、TXB0108や74LVC245などがあります。
2. コンポーネントとしてのレベルシフター
レベルシフターは、個別のコンポーネントとしても利用できます。例えば、MOSFETを使って簡単なレベルシフター回路を構成することができます。この方法は、特定の用途に合わせてカスタマイズが可能です。
3. デバイスとしてのレベルシフター
レベルシフターは、特定のデバイスやモジュールとしても提供されることがあります。これらは、特定のアプリケーションに最適化されており、簡単に使用できるように設計されています。
具体的な例
例えば、Arduino Pro Micro 5VとUSB Host Shield 3.3Vを接続する場合、以下のようなレベルシフターICを使用することが一般的です:
- TXB0108: 双方向のレベルシフターで、3.3Vと5Vの間で信号を変換できます。
- 74LVC245: 単方向のレベルシフターで、特定の方向に信号を変換するのに適しています。
これらのICは、電子部品店やオンラインショップで購入することができます。
質問 3:
質問: この場合のレベルシフターは双方向ですか。単方向ですか。単方向の場合はどのデバイスからどのディバイスへですか。
回答:
この場合、レベルシフターは 単方向 で十分です。具体的には、Pro Micro(5V)から USB Host Shield(3.3V)への信号変換が必要です。以下のように接続します:
必要な接続
1. Pro Micro(5V)から USB Host Shield(3.3V)への信号変換:
- MOSI(Master Out Slave In): Pro Micro の MOSI ピンをレベルシフターの HV(High Voltage)側に接続し、LV(Low Voltage)側を USB Host Shield の MOSI ピンに接続します。
- MISO(Master In Slave Out): Pro Micro の MISO ピンをレベルシフターの HV 側に接続し、LV 側を USB Host Shield の MISO ピンに接続します。
- SCK(Serial Clock): Pro Micro の SCK ピンをレベルシフターの HV 側に接続し、LV 側を USB Host Shield の SCK ピンに接続します。
- SS(Slave Select): Pro Micro の SS ピンをレベルシフターの HV 側に接続し、LV 側を USB Host Shield の SS ピンに接続します。
レベルシフターの選択
- 74LVC245: このICは単方向のレベルシフターとして使用できます。Pro Micro から USB Host Shield への信号変換に適しています。
接続例
Pro Micro (5V) レベルシフター (74LVC245) USB Host Shield (3.3V)
--------------------------------------------------------------
MOSI (Pin 16) ----> HV1 (Pin 2) ----> LV1 (Pin 18) ----> MOSI (Pin 11)
MISO (Pin 14) ----> HV2 (Pin 3) ----> LV2 (Pin 17) ----> MISO (Pin 12)
SCK (Pin 15) ----> HV3 (Pin 4) ----> LV3 (Pin 16) ----> SCK (Pin 13)
SS (Pin 10) ----> HV4 (Pin 5) ----> LV4 (Pin 15) ----> SS (Pin 10)
質問 4:
質問: 抵抗分圧をつかった簡易なレベルシフタのケースでもおしえてください。
回答:
抵抗分圧を使った簡易なレベルシフターは、特に低速のデジタル信号やアナログ信号のレベル変換に便利です。以下に、5Vから3.3Vへの信号変換を行う場合の具体的な例を示します。
必要な部品
- 2つの抵抗(例えば、10kΩと20kΩ)
回路図
5V ---- R1 (10kΩ) ----+---- 3.3V 出力
|
R2 (20kΩ)
|
GND
計算方法
抵抗分圧の原理を使って、出力電圧を計算します。出力電圧 \( V_{out} \) は次の式で求められます:
$$ V_{out} = V_{in} \times \frac{R2}{R1 + R2} $$
ここで、\( V_{in} \) は入力電圧(5V)、\( R1 \) は上側の抵抗(10kΩ)、\( R2 \) は下側の抵抗(20kΩ)です。
計算すると:
$$ V_{out} = 5V \times \frac{20kΩ}{10kΩ + 20kΩ} = 5V \times \frac{2}{3} ≈ 3.3V $$
注意点
- 高周波数信号: 抵抗分圧回路は高周波数信号には適していません。高周波数では信号が歪む可能性があります。
- 負荷: 抵抗値が低すぎると、前段の回路に過度の負荷をかける可能性があります。適切な抵抗値を選ぶことが重要です。
- ノイズ: 電源グラウンドのノイズに弱い場合があります。必要に応じてデカップリングコンデンサを追加することを検討してください。
質問 5:以下の内容は嘘っぽい!
質問: MIDIに変換後、さらにCVへ変換する方法を教えて。
回答:
MIDI信号をCV(コントロールボルテージ)に変換する方法について説明します。以下に、MIDI信号をCVに変換するための一般的な手順と必要なハードウェアを示します。
必要なハードウェア
- MIDI to CV コンバーター: これはMIDI信号をCV信号に変換するデバイスです。市販のものを使用するか、自作することも可能です。
- Arduino: 自作する場合、Arduinoを使用してMIDI信号を読み取り、CV信号を生成することができます。
- DAC(デジタル-アナログコンバーター): CV信号を生成するために使用します。例えば、MCP4725などのDACが一般的です。
手順
- MIDI信号の受信: MIDI信号をArduinoで受信します。MIDI INポートを使用して、MIDIキーボードなどから信号を受け取ります。
- MIDI信号の解析: 受信したMIDI信号を解析し、ノートオン/オフ、ピッチ、ベロシティなどの情報を取得します。
- CV信号の生成: 解析したMIDI信号に基づいて、DACを使用して対応するCV信号を生成します。例えば、ノートオン信号に対応するピッチCVを生成します。
サンプルコード
#include
#include
#include
MIDI_CREATE_DEFAULT_INSTANCE();
Adafruit_MCP4725 dac;
void setup() {
MIDI.begin(MIDI_CHANNEL_OMNI);
dac.begin(0x60); // I2Cアドレス
}
void loop() {
if (MIDI.read()) {
byte type = MIDI.getType();
byte note = MIDI.getData1();
byte velocity = MIDI.getData2();
if (type == midi::NoteOn && velocity > 0) {
int cvValue = map(note, 0, 127, 0, 4095); // 0-5Vにマッピング
dac.setVoltage(cvValue, false);
} else if (type == midi::NoteOff || (type == midi::NoteOn && velocity == 0)) {
dac.setVoltage(0, false); // ノートオフ時にCVを0に設定
}
}
}
市販のMIDI to CV コンバーター
市販のMIDI to CVコンバーターも多く存在します。例えば、以下のような製品があります:
- Doepfer MCV4: シンプルで使いやすいMIDI to CVコンバーター。
- Expert Sleepers FH-2: 高機能なMIDI to CVコンバーターで、複数のCV出力を持ち、様々なMIDIメッセージに対応。
質問 6:
質問: このケースのArduinoはUHSからMIDIへの変換に使ったPro microを使う(Pro Microに2つの役割を持たせる)ことはできますか?
回答:
はい、Pro Microを使ってUSB Host Shield (UHS) からMIDIへの変換と、さらにMIDIからCVへの変換を同時に行うことが可能です。以下に、その接続方法とサンプルコードを示します。
必要なハードウェア
- Arduino Pro Micro 5V
- USB Host Shield 3.3V
- USB MIDI キーボード
- MIDI 出力用の 5 ピン DIN コネクタ
- DAC(デジタル-アナログコンバーター)(例:MCP4725)
- レベルシフター(3.3V から 5V への変換)
- ジャンパーワイヤー
Pro Microのピン配置
- VCC: 5V
- GND: グランド
- RAW: 未使用
- RST: リセット
- TX0: デジタルピン 1 (TX)
- RX1: デジタルピン 0 (RX)
- SDA: デジタルピン 2 (I2Cデータ)
- SCL: デジタルピン 3 (I2Cクロック)
- MOSI: デジタルピン 16
- MISO: デジタルピン 14
- SCK: デジタルピン 15
- SS: デジタルピン 10
USB Host Shield (UHS)のピン配置
- MOSI: ICSP 4
- MISO: ICSP 1
- SCK: ICSP 3
- SS: デジタルピン 10
- GND: グランド
- 3.3V: 3.3V電源
MCP4725のピン配置
- VOUT: ピン 1
- VSS: ピン 2 (グランド)
- SDA: ピン 3 (I2Cデータ)
- SCL: ピン 4 (I2Cクロック)
- VDD: ピン 5 (電源)
- A0: ピン 6 (I2Cアドレス選択)
以下の図は、USB Host Shield (UHS) から Pro Micro を経由して 5ピンDIN コネクタおよびDACまでの接続方法を示しています。
接続図
USB Host Shield (UHS) Pro Micro (5V) 5ピンDIN コネクタ DAC (MCP4725)
--------------------------------------------------------------
MOSI (ICSP 4) ----------> MOSI (Pin 16) ----------> (未接続) (未接続)
MISO (ICSP 1) ----------> MISO (Pin 14) ----------> (未接続) (未接続)
SCK (ICSP 3) ----------> SCK (Pin 15) ----------> (未接続) (未接続)
SS (D10) ----------> SS (Pin 10) ----------> (未接続) (未接続)
GND (GND) ----------> GND (GND) ----------> ピン2 (GND) GND (Pin 2)
3.3V (3.3V) ----------> (未接続) ----------> (未接続) VDD (Pin 5)
(未接続) ----------> TX (Pin 1) ----------> ピン5 (信号) (未接続)
(未接続) ----------> (未接続) ----------> ピン4 (+5V) (未接続)
(未接続) ----------> (SDA, Pin 2) ----------> (未接続) SDA (Pin 3)
(未接続) ----------> (SCL, Pin 3) ----------> (未接続) SCL (Pin 4)
(未接続) ----------> (未接続) ----------> (未接続) VOUT (Pin 1)
(未接続) ----------> (未接続) ----------> (未接続) A0 (Pin 6)
各ピンの役割
- MCP4725 SDA (Pin 3): Pro Microのデジタルピン 2 (SDA) に接続
- MCP4725 SCL (Pin 4): Pro Microのデジタルピン 3 (SCL) に接続
- MCP4725 VOUT (Pin 1): アナログ出力(接続先は用途に応じて)
- MCP4725 A0 (Pin 6): I2Cアドレス選択ピン(通常はGNDまたはVCCに接続)
MCP4725はI2C通信を使用し、USB Host Shield (UHS)はSPI通信を使用します。
- I2CはSDA(データ)とSCL(クロック)の2本の線を使用し、
- SPIはMOSI、MISO、SCK、SSの4本の線を使用します。
- VOUT: アナログ出力
- VSS: グランド (GND)
- SDA: I2Cデータライン
- SCL: I2Cクロックライン
- VDD: 電源 (2.7V - 5.5V)
- A0: I2Cアドレス選択ピン
サンプルコード
#include
#include
#include
#include
USB Usb;
USBH_MIDI Midi(&Usb);
MIDI_CREATE_INSTANCE(HardwareSerial, Serial1, MIDI);
Adafruit_MCP4725 dac;
void setup() {
Serial.begin(115200);
if (Usb.Init() == -1) {
Serial.println("USB Host Shield initialization failed");
while (1); // Halt
}
MIDI.begin(MIDI_CHANNEL_OMNI);
dac.begin(0x60); // I2Cアドレス
}
void loop() {
Usb.Task();
if (Midi) {
uint8_t size;
uint8_t outBuf[3];
while ((size = Midi.RecvData(outBuf)) > 0) {
MIDI.send(outBuf[0], outBuf[1], outBuf[2]);
if (outBuf[0] == 0x90 && outBuf[2] > 0) { // Note On
int cvValue = map(outBuf[1], 0, 127, 0, 4095); // 0-5Vにマッピング
dac.setVoltage(cvValue, false);
} else if (outBuf[0] == 0x80 || (outBuf[0] == 0x90 && outBuf[2] == 0)) { // Note Off
dac.setVoltage(0, false); // ノートオフ時にCVを0に設定
}
}
}
}